Функция ShowPlayerDialog через public -
stabker - 23.08.2012
В одном из модов на форуме я заметил код который меня заинтересовал. Кто знает, для чего он? Спасибо!
После инклудов:
pawn Код:
forward ShowPlayerSafeDialog(playerid, dialogid, style, caption[], info[], button_1[], button_2[]);
public ShowPlayerSafeDialog(playerid, dialogid, style, caption[], info[], button_1[], button_2[])
{
new i = -1;
while(caption[++i]) if(caption[i] == 0x25) caption[i] -= 0x2;
i = -1;
while(info[++i]) if(info[i] == 0x25) info[i] -= 0x2;
i = -1;
while(button_1[++i]) if(button_1[i] == 0x25) button_1[i] -= 0x2;
i = -1;
while(button_2[++i]) if(button_2[i] == 0x25) button_2[i] -= 0x2;
return ShowPlayerDialog(playerid, dialogid, style, caption, info, button_1, button_2);
}
в коллбэке OnDialogResponse:
pawn Код:
new b = -1;
while(inputtext[++b])
{
switch(inputtext[b])
{
case 0x12..0xFF: continue;
default: return 0;
}
}
Re: Функция ShowPlayerDialog через public -
Optimus_Sprite - 23.08.2012
С английского на русский - безопасный диалог.
Re: Функция ShowPlayerDialog через public -
stabker - 23.08.2012
Quote:
Originally Posted by Optimus_Sprite
С английского на русский - безопасный диалог.
|
Это понятно. Но от чего именно защита? Конкретнее можно
Re: Функция ShowPlayerDialog через public -
TRPG - 23.08.2012
Quote:
Originally Posted by stabker
В одном из модов на форуме я заметил код который меня заинтересовал. Кто знает, для чего он? Спасибо!
После инклудов:
pawn Код:
forward ShowPlayerSafeDialog(playerid, dialogid, style, caption[], info[], button_1[], button_2[]); public ShowPlayerSafeDialog(playerid, dialogid, style, caption[], info[], button_1[], button_2[]) { new i = -1; while(caption[++i]) if(caption[i] == 0x25) caption[i] -= 0x2; i = -1; while(info[++i]) if(info[i] == 0x25) info[i] -= 0x2; i = -1; while(button_1[++i]) if(button_1[i] == 0x25) button_1[i] -= 0x2; i = -1; while(button_2[++i]) if(button_2[i] == 0x25) button_2[i] -= 0x2; return ShowPlayerDialog(playerid, dialogid, style, caption, info, button_1, button_2); }
|
Функция обрабатывает все входящие данные и заменяет в них знак процента (0x25). Зачем? - й*х знает, понятия не имею зачем это нужно и как по мнению автора может навредить знак процента в диалоге отображаемому игроку. P.S.
http://s60.radikal.ru/i168/1208/b9/6198ef681ea4.png
Quote:
Originally Posted by stabker
в коллбэке OnDialogResponse:
pawn Код:
new b = -1; while(inputtext[++b]) { switch(inputtext[b]) { case 0x12..0xFF: continue; default: return 0; } }
|
тут стоит действительно нужный, но странно реализованный фильтр символов, которые, попадая вместе с inputtext в format, роняют сервер.
И еще, не думаю то как это реализовано можно называть "своим стилем в программировании", это либо упоротость, либо стремление специально обфусцировать свой код до непонятного состояния с целью как-то выделиться и показать себя крутым красноглазиком.
Re: Функция ShowPlayerDialog через public -
Stepashka - 23.08.2012
Тут просто сделали деревянную защиту от бага: когда в диалог вставляешь процент, большая часть серверов падает.
Суть в том что все считают что это проблема диалога, на самом деле сервера падают когда в дальнейшем данная строка попадает в функцию format, если данной функции по коду нет защита не нужна.
Re: Функция ShowPlayerDialog через public -
DartfoL - 23.08.2012
Quote:
дальнейшем данная строка попадает в функцию format
|
не в format, а SendClientMessage
Re: Функция ShowPlayerDialog через public -
Stepashka - 23.08.2012
Quote:
Originally Posted by DartfoL
не в format, а SendClientMessage
|
Нет, данной функции без разницы что выводить. А для
format это ключ.
Re: Функция ShowPlayerDialog через public -
eakwarp - 23.08.2012
Хах, тракер ковыряете. Это обычный деревянный костыль от эксплойтов и им подобных.
Re: Функция ShowPlayerDialog через public -
DartfoL - 23.08.2012
Quote:
Originally Posted by Stepashka
Нет, данной функции без разницы что выводить. А для format это ключ.
|
pawn Код:
new str[50];
format(str, 50, "%s lala", inputtext);
Введите в диалог %s - ничего не будет, format сработает как надо и без проблем. Добавьте SendClientMessageToAll(-1, str); и сервер упадёт, потому что в результате будет так: SendClientMessageToAll(-1, "%s lala");, а от %s в SCM(ToAll) серв падает
Re: Функция ShowPlayerDialog через public -
stabker - 27.08.2012
Поставил эту вещь себе в мод и перестали работать List диалоги, OnDialogResponse останавливается при ней.
Кстати, откопал у себя в моде вот такую вещь
pawn Код:
while(strfind(inputtext,"%s",true)!=-1) strdel(inputtext,strfind(inputtext,"%s",true),strfind(inputtext,"%s",true)+2);
while(strfind(inputtext,"%",true)!=-1) strdel(inputtext,strfind(inputtext,"%",true),strfind(inputtext,"%",true)+2);
Раньше не замечал