Sign in to follow this  
Followers 0
KlasterK

Диалоговые хуки

3 posts in this topic

Привет, форумчане. Не знаю, мб кто-то это уже придумал, но я вам представляю систему хукования диалогов.

Хукование может уменьшить производительность во время ответа на диалог, но зато предоставляет удобство для скриптера.

// Макрос-хук. Аргумент после двоеточия: dialogid.
// Аргументы в скобках: playerid, response, listitem, inputtext[]
#define DIA:%0(%1,%2,%3,%4) forward dia@%0(%1,%2,%3,%4); public dia@%0(%1,%2,%3,%4)

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]
{
    new callback[10]; // Строка для вызова хука. Размер: dia@ (4 символа) + ID диалога (максимум 32767, 5 символов) + \0
    format(callback, 10"dia@%d", dialogid); // Форматирование строки
    CallLocalFunction(callback, "ddds", playerid, response, listitem, inputtext); // Сам вызов хука
}

// Пример со списком
CMD:choice(playerid, params[]) // Команда на DC_CMD/ZCMD
    return ShowPlayerDialog(playerid, 100, DIALOG_STYLE_LIST, "Опрос""Партия За Правду\n\
    Партия Справедливый Сан Андреас""Выбрать""Отмена"); // Диалог 100 с двумя пунктами

DIA:100(playerid, resp, item, text[]) // Хук на диалог 100
{
    if(resp) // Если нажата первая кнопка
    {
        if(item == 0) SendClientMessage(playerid, 0x00FF00AA"Хороший выбор!"); // Ответ на 1 пункт
        else          SendClientMessage(playerid, 0xFF0000AA"Плохой выбор!" ); // Ответ на 2 пункт
    }
}

// Пример с вводом
CMD:input(playerid, params[])
{
    return ShowPlayerDialog(playerid, 200, DIALOG_STYLE_INPUT, "Ввод""Введите ваш отзыв о сервере!",
    "Отправить""Отмена"); // Диалог 100 с вводом строки
}

DIA:200(playerid, response, listitem, inputtext[]) // Хук на диалог 200
{
    if(response) // Если нажата первая кнопка
    {
        new query[100], name[24], ret; // Строка для запроса, имени игрока и 
        GetPlayerName(playerid, name, 24); // Получение имени
        format(query, 100"INSERT INTO comments ( name, review ) VALUES ( %s, %s )", name, inputtext); // Форматирование запроса
        ret = db_query(mainDB, query); // Отправка запроса a_sampdb
        db_free_result(ret); // Очистка запроса
    }
}

 

Share this post


Link to post
Share on other sites

@KlasterK, а чем библиотека mdialog вам не угодила (были еще некоторые, вроде edialog)?

Share this post


Link to post
Share on other sites

@Cawfee 

3 часа назад, KlasterK сказал:

мб кто-то это уже придумал

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content