PDA

Просмотр полной версии : [Include] u_dialogs.inc



Desulaid
12.03.2016, 22:09
Описание:

Библиотека была написана для решения моей проблемы. Она заключалась в том, что мне нужно было разделять мод на модули, во многих из которых велась работа с диалогами, а каждый раз перехватывать OnDialogResponse желания совершенно нет.

Пример использования:


public OnPlayerConnect(playerid)
{
ShowPlayerDialogEx(playerid, #test_dialog, DIALOG_STYLE_INPUT,
"Сказать?",
"Сэр, что вы хотите нам сказать?",
"Сказать", "Все равно сказать"
);
return 1;
}

DialogResponse:test_dialog(playerid, response, listitem, inputtext[])
{
return SendClientMessage(playerid, -1, inputtext);
}


Автор: Антон Стяжкин
Скачать: загрузить можно перейдя на страницу проекта (https://github.com/ShapeGaz/samp-gamemode/blob/master/source/library/u_dialogs.inc).

Копирование данной статьи на других порталах без разрешения автора запрещено!

VVWVV
12.03.2016, 22:43
Можно было узнать адреса функций диалога ещё до момента вызова паблика OnDialogResponse. Например, в отдельной функции (желательно объявленную с помощью static), которая будет вызываться в пабликах OnGameModeInit или OnFilterScriptInit.

Вот что-то такое должно было получиться (возможны ошибки):

static
Dialog_Init()
{
new
num_publics,
offs_dat,
offs_pft, addr, _char, fn_name[32], prefix[4] = {'d','l','g'};
{
#emit lctrl 1
#emit neg
#emit stor.s.pri offs_dat
#emit add.c 32
#emit stor.s.pri addr
#emit lref.s.pri addr
#emit load.s.alt addr
#emit add
#emit const.alt 32
#emit sub
#emit stor.s.pri offs_pft
#emit load.s.pri offs_dat
#emit add.c 36
#emit stor.s.pri addr
#emit lref.s.pri addr
#emit load.s.alt addr
#emit add
#emit const.alt 36
#emit sub
#emit load.s.alt offs_pft
#emit sub
#emit shr.c.pri 3
#emit num_publics
}
new i, j;
do
{
#emit zero.pri
#emit stor.s.pri j
#emit load.s.pri i
#emit shl.c.pri 3
#emit load.s.pri offs_pft
#emit add
#emit add.c 4
#emit stor.s.pri addr
#emit lref.s.pri addr
#emit load.s.alt offs_dat
#emit add
#emit stor.s.pri addr
for (;;)
{
#emit lref.s.pri addr
#emit stor.s.pri _char
#emit load.s.pri addr
#emit inc.pri
#emit stor.s.pri addr
if (sizeof prefix > j)
if ((_char & 0xFF) != prefix[j++])
else if ((fn_name[j++ - sizeof prefix] = (_char & 0xFF)) == '\0')
{
#emit lctrl 1
#emit neg
#emit add.c 32
#emit stor.s.pri addr
#emit lref.s.alt addr
#emit lctrl 1
#emit neg
#emit add
#emit load.s.alt i
#emit shl.c.alt 3
#emit add
#emit stor.s.pri addr
#emit lref.s.pri addr
#emit const.alt TDW_g_sFunctionAddresses
#emit const.pri TDW_g_sDialogCount
#emit idxaddr
#emit move.alt
#emit stor.i
#emit push.c MAX_FUNCTION_NAME
#emit push.adr fn_name
#emit const.alt TDW_g_sDialogNames
#emit const.pri TDW_g_sDialogCount
#emit idxaddr
#emit push.pri
#emit push.c 12
#emit sysreq.c strpack
#emit stack 16
break;
}
}
} while (++i != num_publics);
}

$continue$
12.03.2016, 22:43
Прон, что ли любишь? (Работать с адресами в Pawn :sarcastic:)

Можно было узнать адреса функций диалога ещё до момента вызова паблика OnDialogResponse. Например, в отдельной функции (желательно объявленную с помощью static), которая будет вызываться в пабликах OnGameModeInit или OnFilterScriptInit.

Desulaid
12.03.2016, 22:54
Можно было узнать адреса функций диалога ещё до момента вызова паблика OnDialogResponse. Например, в отдельной функции (желательно объявленную с помощью static), которая будет вызываться в пабликах OnGameModeInit или OnFilterScriptInit.

Вот что-то такое должно было получится (возможны ошибки):

static
Dialog_Init()
{
new
num_publics,
offs_dat,
offs_pft, addr, _char, fn_name[32], prefix[4] = {'d','l','g'};
{
#emit lctrl 1
#emit neg
#emit stor.s.pri offs_dat
#emit add.c 32
#emit stor.s.pri addr
#emit lref.s.pri addr
#emit load.s.alt addr
#emit add
#emit const.alt 32
#emit sub
#emit stor.s.pri offs_pft
#emit load.s.pri offs_dat
#emit add.c 36
#emit stor.s.pri addr
#emit lref.s.pri addr
#emit load.s.alt addr
#emit add
#emit const.alt 36
#emit sub
#emit load.s.alt offs_pft
#emit sub
#emit shr.c.pri 3
#emit num_publics
}
new i, j;
do
{
#emit zero.pri
#emit stor.s.pri j
#emit load.s.pri i
#emit shl.c.pri 3
#emit load.s.pri offs_pft
#emit add
#emit add.c 4
#emit stor.s.pri addr
#emit lref.s.pri addr
#emit load.s.alt offs_dat
#emit add
#emit stor.s.pri addr
for (;;)
{
#emit lref.s.pri addr
#emit stor.s.pri _char
#emit load.s.pri addr
#emit inc.pri
#emit stor.s.pri addr
if (sizeof prefix > j)
if ((_char & 0xFF) != prefix[j++])
else if ((fn_name[j++ - sizeof prefix] = (_char & 0xFF)) == '\0')
{
#emit lctrl 1
#emit neg
#emit add.c 32
#emit stor.s.pri addr
#emit lref.s.alt addr
#emit lctrl 1
#emit neg
#emit add
#emit load.s.alt i
#emit shl.c.alt 3
#emit add
#emit stor.s.pri addr
#emit lref.s.pri addr
#emit const.alt TDW_g_sFunctionAddresses
#emit const.pri TDW_g_sDialogCount
#emit idxaddr
#emit move.alt
#emit stor.i
#emit push.c MAX_FUNCTION_NAME
#emit push.adr fn_name
#emit const.alt TDW_g_sDialogNames
#emit const.pri TDW_g_sDialogCount
#emit idxaddr
#emit push.pri
#emit push.c 12
#emit sysreq.c strpack
#emit stack 16
break;
}
}
} while (++i != num_publics);
}

Если бы я знал работу директивы emit, то может подобное сделал бы. Но я не знаю ее, да и с моим инглишем проблемно читать иноземные письмена.

Роуди.
13.03.2016, 12:45
Прон, что ли любишь? (Работать с адресами в Pawn :sarcastic:)

Для чего после слова "Прон" запятая?

$continue$
13.03.2016, 13:05
шобы ты спросил.

Для чего после слова "Прон" запятая?

Роуди.
13.03.2016, 13:51
шобы ты спросил.

Аргументный аргумент.

DeimoS
13.03.2016, 14:45
Аргументный аргумент.

Ему просто не интересен русский язык. Он программест (ака технарь), а не филолог (ака гуманитарий)

Тузик
07.01.2017, 13:37
Ты github удалил? :/

DeimoS
07.01.2017, 13:56
Автор немножко солдат теперь, так что вряд ли ответит в ближайшее время :)

Залил на Pastebin, вроде как, последнюю версию. Добавил в первый пост ссылку.