хм, а почему бы не выложить пастбин?
Зачем мне качать инклуд, ради просмотра кода?
Вид для печати
Баян же ?
Londlem подобное юзает вроде.
- - - Добавлено - - -
Update.
Другой способ, схожий с этим, который я использую уже давно:
Сам паблик:
Насчёт valstr можно не беспокоиться ( он вызывает зависание сервера при максимальных и минимальных значениях ): значение никогда не достигнет cellmax или cellmin, из-за тех же лимитов для ID диалогов: 0-32767.PHP код:
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));
}
Сам макрос:
Как по мне, так макросPHP код:
#define DLG(%1) \
public dlg_%1(playerid, response, listitem, inputtext[]); \
public dlg_%1(playerid, response, listitem, inputtext[])
лучше выглядит чемPHP код:
const
DIALOG_REGISTER = 64;
DLG(DIALOG_REGISTER)
{
// some code...
}
Пустые скобки не очень смотрятся, лично для меня. Дело принципа.PHP код:
const
DIALOG_REGISTER = 64;
DLG:DIALOG_REGISTER()
{
// some code...
}
В новой версии подправлю. Если есть предложения, то я их готов учесть.
Параметры у диалоговой функции пропущены.
Из-за этого такое ощущение, будто параметры playerid и response берутся из ниоткуда, т.к. они нигде не объявлены.
Некоторые редакторы кода могут ругаться на такое.
Не прокатит, вместо dlg_64 получится функция dlg_DIALOG_REGISTER.
Тут только объявлять ID диалогов через #define, причём сразу можно ставить крест на составлении более удобного списка ID диалогов с помощью enum.
+ те же самые проблемы с необъявленными параметрами.
Да и вообще, зачем пытаться выдумать что-то своё, когда можно воспользоваться уже накатанной лыжнёй, взяв пример с ZCMD?
Многие пользуются им (или совместимым с ним DC_CMD) и поэтому привыкли к их синтаксису.
Там командные функции объявляются следующим образом:
Если же пользователю не нужен параметр params, его можно пропустить:PHP код:
CMD:cmdname(playerid, params[])
{
//...
}
playerid тоже можно пропустить (но нельзя пропустить его, не пропустив params):PHP код:
CMD:test(playerid)
return SendClientMessage(playerid, -1, "Sample text");
PHP код:
CMD:shutdown()
return SendRconCommand("exit");
Для чего здесь две строковые переменные, когда можно использовать всего одну?
PHP код:
static dlg_func_name[4+5+1] = "dlg_";
valstr(dlg_func_name[4], dialogid, true);
Раз параметры те же, что в OnDialogResponse, зачем ещё раз расписывать их здесь?
Можно было просто сделать ссылку на статью в SA:MP wiki.
Код HTML:[wiki]OnDialogResponse[/wiki]
Очень просто лечится добавлением "#include <a_samp>" в самое начало вашего инклуда, после защиты от повторного подключения.
Кстати, про ту защиту...
Не закрыта директива #if. Вы вообще хоть как-то проверяли свой код перед релизом?Цитата:
PHP код:
#if defined _zl_dlg
#endinput
#else
#define _zl_dlg
Нет, я конечно понимаю, многие с первого раза выкладывают багнутые работы, но чтобы релизить код, который не компилируется вообще...
Пытался вывести, через printf, выводило только "dlg_";Цитата:
PHP код:
static dlg_func_name[4+5+1] = "dlg_";
valstr(dlg_func_name[4], dialogid, true);
PHP код:
static dlg_func_name[4+5+1] = "dlg_";
valstr(dlg_func_name[5], 233, true);
printf("TEST %s",dlg_func_name);