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

    • ismailov
      By ismailov
      Привет! Что делать, если игрока выкинули из машины? как сделать так, чтобы не выкидывало из машины? из-за NOP выкидывает человека из машины. Если заменить на PutPlayerInVehicle, такая тема все равно будет.


    • YoungKaiser
      By YoungKaiser
      При заходе на сервер, не доходя до авторизации крашит

      Логи: 
      [21:02:24] Number of vehicle models: 0 [21:03:29] Error occured processing incomming packet: DecodingError(OrderingGuarantee) [21:03:30] Error occured processing incomming packet: DecodingError(OrderingGuarantee) [21:03:30] Error occured processing incomming packet: DecodingError(OrderingGuarantee) [21:03:32] Error occured processing incomming packet: DecodingError(OrderingGuarantee) [21:03:32] [connection] 188.233.12.12:47928 requests connection cookie. [21:03:32] Error occured processing incomming packet: DecodingError(OrderingGuarantee) [21:03:32] Error occured processing incomming packet: DecodingError(OrderingGuarantee) [21:03:33] Error occured processing incomming packet: DecodingError(OrderingGuarantee) [21:03:33] Error occured processing incomming packet: DecodingError(OrderingGuarantee) [21:03:33] [connection] incoming connection: 188.233.12.12:47928 id: 0 [21:03:33] [sv:dbg:network:connect] : connecting player (0) with address (188.233.12.12) ... [21:03:33] [sv:dbg:network:connect] : player (0) assigned key (c0ce9bc6330e042) [21:03:33] [join] Young_Kaiser has joined the server (0:188.233.12.12) [21:03:33] LoadMapping загрузился за 5 ms [21:03:33] CreateObject всего: 65535 [21:03:33] [sv:dbg:network:receive] : player (0) identified (port:48086) [21:03:34] Error occured processing incomming packet: DecodingError(OrderingGuarantee) [21:03:35] Error occured processing incomming packet: DecodingError(OrderingGuarantee) [21:03:35] Error occured processing incomming packet: DecodingError(OrderingGuarantee) [21:03:35] Error occured processing incomming packet: DecodingError(OrderingGuarantee) [21:03:35] Error occured processing incomming packet: DecodingError(OrderingGuarantee) [21:03:36] Error occured processing incomming packet: DecodingError(OrderingGuarantee) [21:03:36] Error occured processing incomming packet: DecodingError(OrderingGuarantee) [21:03:37] Error occured processing incomming packet: DecodingError(OrderingGuarantee) [21:03:37] Error occured processing incomming packet: DecodingError(OrderingGuarantee) [21:03:37] Error occured processing incomming packet: DecodingError(OrderingGuarantee) [21:03:38] Error occured processing incomming packet: DecodingError(OrderingGuarantee) [21:03:38] Error occured processing incomming packet: DecodingError(OrderingGuarantee) [21:03:41] Error occured processing incomming packet: DecodingError(OrderingGuarantee) [21:03:41] Error occured processing incomming packet: DecodingError(OrderingGuarantee) [21:03:41] Error occured processing incomming packet: DecodingError(OrderingGuarantee) [21:03:41] Error occured processing incomming packet: DecodingError(OrderingGuarantee) [21:03:41] Error occured processing incomming packet: DecodingError(OrderingGuarantee) [21:03:51] [sv:dbg:network:connect] : disconnecting player (0) ... [21:03:51] [part] Young_Kaiser has left the server (0:0)