Диалоги в Pawn: создание и обработка

Активный
Статус
Сообщения
516
Лайки
32

8

месяц на сайте

Диалоги - важный элемент интерфейса для взаимодействия с игроками. Разберем все типы.

Типы диалогов:
- DIALOG_STYLE_MSGBOX - простое сообщение с кнопками
- DIALOG_STYLE_INPUT - ввод текста
- DIALOG_STYLE_LIST - список для выбора
- DIALOG_STYLE_PASSWORD - ввод пароля
- DIALOG_STYLE_TABLIST_HEADERS - таблица с заголовками
- DIALOG_STYLE_TABLIST - таблица

Простое сообщение (MSGBOX)
Код:
ShowPlayerDialog(playerid, DIALOG_WELCOME, DIALOG_STYLE_MSGBOX,
    "Добро пожаловать",
    "Добро пожаловать на сервер!\nНажмите OK для продолжения.",
    "OK", "");

Ввод текста (INPUT)
Код:
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT,
    "Вход в систему",
    "Введите ваш пароль:",
    "Войти", "Отмена");

Список (LIST)
Код:
new list[256] = "Оружие 1\nОружие 2\nОружие 3\nОружие 4";
ShowPlayerDialog(playerid, DIALOG_WEAPONS, DIALOG_STYLE_LIST,
    "Выбор оружия",
    list,
    "Выбрать", "Отмена");

Пароль (PASSWORD)
Код:
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD,
    "Регистрация",
    "Введите пароль для регистрации:",
    "Зарегистрироваться", "Отмена");

Обработка ответов
Код:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        case DIALOG_WELCOME:
        {
            if(response)
            {
                SendClientMessage(playerid, -1, "Добро пожаловать!");
            }
        }
        
        case DIALOG_LOGIN:
        {
            if(response)
            {
                if(strlen(inputtext) > 0)
                {
                    // Проверка пароля
                    if(CheckPassword(playerid, inputtext))
                    {
                        SendClientMessage(playerid, -1, "Успешный вход!");
                    }
                    else
                    {
                        SendClientMessage(playerid, -1, "Неверный пароль!");
                    }
                }
            }
        }
        
        case DIALOG_WEAPONS:
        {
            if(response)
            {
                new weapons[] = {24, 25, 26, 27};
                GivePlayerWeapon(playerid, weapons[listitem], 500);
                SendClientMessage(playerid, -1, "Оружие выдано!");
            }
        }
    }
    return 1;
}

Определение ID диалогов
Код:
#define DIALOG_WELCOME 1
#define DIALOG_LOGIN 2
#define DIALOG_REGISTER 3
#define DIALOG_WEAPONS 4

Динамические списки
Код:
ShowWeaponDialog(playerid)
{
    new list[512], count = 0;
    for(new i = 0; i < sizeof(WeaponList); i++)
    {
        if(PlayerHasAccess(playerid, WeaponList[i][wLevel]))
        {
            format(list, sizeof(list), "%s%s\n", list, WeaponList[i][wName]);
            count++;
        }
    }
    
    if(count > 0)
    {
        ShowPlayerDialog(playerid, DIALOG_WEAPONS, DIALOG_STYLE_LIST,
            "Доступное оружие", list, "Выбрать", "Отмена");
    }
}

Важные моменты:
- Всегда проверяйте response (нажата ли кнопка)
- Проверяйте длину inputtext перед использованием
- Используйте listitem для определения выбранного элемента
- Ограничение длины текста диалога - 4096 символов

Диалоги делают сервер интерактивным и удобным!
 

3 человек читают эту тему (Всего: 3, Пользователей: 0, Гостей: 3)

Сверху