PDA

Просмотр полной версии : [Include] ZL_DLG v1.1 | Движок диалогов



Zaur_Lumanov
07.05.2015, 21:57
Приветствую вас, обитатели портала.

Хочу представить вам процессор обработки диалогов ZL_DLG. Принцип работы схож с нестандартными командными процессорами.

Установка:
1. Скопировать файл zl_dlg.inc в папку "/pawno/include/".
2. Подключить инклуд:

#include <zl_dlg>
Важно: не прописывайте данную строчку до строчки "#include <a_samp>".
Пример:

#include <a_samp>
//другие инклуды
#include <zl_dlg>

Создание ответа на диалоговое окно:

DLG:<ид диалога>()
{
//...
return true;
}

Пример:

DLG:590()
{
if(response) return SendClientMessage(playerid,-1,"Вы нажали кнопку 'Выбрать' ");
else return SendClientMessage(playerid,-1,"Вы вышли из диалогового окна.");
return true;
}

Данному каллбеку передаются следующие значения:
playerid (int) - ID игрока.
dialogid (int) - ID диалога.
response (bool) - Статус
listitem (int) - Выбранный элемент.
inputtext (string) - Текст, введённый в текстовое поле диалога.

Скачать: http://rghost.ru/6tdMDVzS8

Автор: Zaur_Lumanov (http://vk.com/uid11111111).

Desulaid
07.05.2015, 21:58
Это как бы обычные диалоги, но вызываются по другому?

Zaur_Lumanov
07.05.2015, 22:00
Да. В обычных диалогах идет перебор по dialogid, а тут вызывается на прямую.

SonyDeathRu
07.05.2015, 23:33
Оптимизация для диалогов что-ль?)):mda:

Zaur_Lumanov
07.05.2015, 23:52
Да.

$continue$
07.05.2015, 23:53
cурсы на пастбин выложи)

Zaur_Lumanov
07.05.2015, 23:57
Открой инклуд - вот тебе сорурс.

Daniel_Cortez
08.05.2015, 00:23
3. Реклама.

...
Тем не менее, запрещено размещение ссылок, не несущех практической пользы касаемо темы разговора, ссылок на сервисы заработка на посещениях (adf.ly и пр.) и ссылок на скачивание файлов с сервисов, создающих искусственные препятствия для пользователей (например, всплывающая реклама, ожидание перед скачиванием и т.п., примеры таких сервисов: depositfiles.ru, letitbit.net, turbobit.net).


Выдал нарушение, ссылка из 1 поста удалена.

Zaur_Lumanov
08.05.2015, 00:26
Перезалил.

gangzone.ini
08.05.2015, 18:00
Не плохая идея :)

$continue$
08.05.2015, 18:10
Открой инклуд - вот тебе сорурс.

хм, а почему бы не выложить пастбин?
Зачем мне качать инклуд, ради просмотра кода?

Desulaid
08.05.2015, 19:31
хм, а почему бы не выложить пастбин?
Зачем мне качать инклуд, ради просмотра кода?

а лучше код на стол и под спойлер :hi:

Salvacore
08.05.2015, 21:33
Баян же ?
Londlem подобное юзает вроде.

- - - Добавлено - - -

Update.

L0ndl3m
08.05.2015, 21:41
Другой способ, схожий с этим, который я использую уже давно:

Сам паблик:


public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
new
dlg_rel[10],
dlgid_str[6]; // макс. ID диалога не может быть больше чем 32767, поэтому 6 ячеек ( +1 для нуль-символа: '\0' )

valstr(dlgid_str, dialogid, true);
dlg_rel = "dlg_", strcat(dlg_rel, dlgid_str);

return CallLocalFunction(dlg_rel, "iiis", playerid, response, listitem, (inputtext[0] == EOS) ? ("\1") : (inputtext));
}


Насчёт valstr можно не беспокоиться ( он вызывает зависание сервера при максимальных и минимальных значениях ): значение никогда не достигнет cellmax или cellmin, из-за тех же лимитов для ID диалогов: 0-32767.

Сам макрос:


#define DLG(%1) \
public dlg_%1(playerid, response, listitem, inputtext[]); \
public dlg_%1(playerid, response, listitem, inputtext[])

Как по мне, так макрос


const
DIALOG_REGISTER = 64;

DLG(DIALOG_REGISTER)
{
// some code...
}

лучше выглядит чем


const
DIALOG_REGISTER = 64;

DLG:DIALOG_REGISTER()
{
// some code...
}

Пустые скобки не очень смотрятся, лично для меня. Дело принципа.

Zaur_Lumanov
08.05.2015, 23:18
В новой версии подправлю. Если есть предложения, то я их готов учесть.

Daniel_Cortez
10.05.2015, 10:46
Пример:

DLG:590()
{
if(response) return SendClientMessage(playerid,-1,"Вы нажали кнопку 'Выбрать' ");
else return SendClientMessage(playerid,-1,"Вы вышли из диалогового окна.");
return true;
}

Параметры у диалоговой функции пропущены.
Из-за этого такое ощущение, будто параметры playerid и response берутся из ниоткуда, т.к. они нигде не объявлены.
Некоторые редакторы кода могут ругаться на такое.





const
DIALOG_REGISTER = 64;

DLG(DIALOG_REGISTER)
{
// some code...
}


Не прокатит, вместо dlg_64 получится функция dlg_DIALOG_REGISTER.
Тут только объявлять ID диалогов через #define, причём сразу можно ставить крест на составлении более удобного списка ID диалогов с помощью enum.
+ те же самые проблемы с необъявленными параметрами.

Да и вообще, зачем пытаться выдумать что-то своё, когда можно воспользоваться уже накатанной лыжнёй, взяв пример с ZCMD?
Многие пользуются им (или совместимым с ним DC_CMD) и поэтому привыкли к их синтаксису.
Там командные функции объявляются следующим образом:


CMD:cmdname(playerid, params[])
{
//...
}

Если же пользователю не нужен параметр params, его можно пропустить:


CMD:test(playerid)
return SendClientMessage(playerid, -1, "Sample text");

playerid тоже можно пропустить (но нельзя пропустить его, не пропустив params):


CMD:shutdown()
return SendRconCommand("exit");








public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
new
dlg_rel[10],
dlgid_str[6]; // макс. ID диалога не может быть больше чем 32767, поэтому 6 ячеек ( +1 для нуль-символа: '\0' )

valstr(dlgid_str, dialogid, true);
dlg_rel = "dlg_", strcat(dlg_rel, dlgid_str);

return CallLocalFunction(dlg_rel, "iiis", playerid, response, listitem, (inputtext[0] == EOS) ? ("\1") : (inputtext));
}


Для чего здесь две строковые переменные, когда можно использовать всего одну?


static dlg_func_name[4+5+1] = "dlg_";
valstr(dlg_func_name[4], dialogid, true);





Данному каллбеку передаются следующие значения:
playerid (int) - ID игрока.
dialogid (int) - ID диалога.
response (bool) - Статус
listitem (int) - Выбранный элемент.
inputtext (string) - Текст, введённый в текстовое поле диалога.
Раз параметры те же, что в OnDialogResponse, зачем ещё раз расписывать их здесь?
Можно было просто сделать ссылку на статью в SA:MP wiki.

OnDialogResponse



Важно: не прописывайте данную строчку до строчки "#include <a_samp>".
Очень просто лечится добавлением "#include <a_samp>" в самое начало вашего инклуда, после защиты от повторного подключения.

Кстати, про ту защиту...



#if defined _zl_dlg
#endinput
#else
#define _zl_dlg


Не закрыта директива #if. Вы вообще хоть как-то проверяли свой код перед релизом?
Нет, я конечно понимаю, многие с первого раза выкладывают багнутые работы, но чтобы релизить код, который не компилируется вообще...

seriu
26.05.2016, 03:40
static dlg_func_name[4+5+1] = "dlg_";
valstr(dlg_func_name[4], dialogid, true);

Пытался вывести, через printf, выводило только "dlg_";

static dlg_func_name[4+5+1] = "dlg_";
valstr(dlg_func_name[5], 233, true);
printf("TEST %s",dlg_func_name);