Функция ShowPlayerDialog через public
#1

В одном из модов на форуме я заметил код который меня заинтересовал. Кто знает, для чего он? Спасибо!

После инклудов:

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;
        }
    }
Reply
#2

С английского на русский - безопасный диалог.
Reply
#3

Quote:
Originally Posted by Optimus_Sprite
Посмотреть сообщение
С английского на русский - безопасный диалог.
Это понятно. Но от чего именно защита? Конкретнее можно
Reply
#4

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, роняют сервер.

И еще, не думаю то как это реализовано можно называть "своим стилем в программировании", это либо упоротость, либо стремление специально обфусцировать свой код до непонятного состояния с целью как-то выделиться и показать себя крутым красноглазиком.
Reply
#5

Тут просто сделали деревянную защиту от бага: когда в диалог вставляешь процент, большая часть серверов падает.
Суть в том что все считают что это проблема диалога, на самом деле сервера падают когда в дальнейшем данная строка попадает в функцию format, если данной функции по коду нет защита не нужна.
Reply
#6

Quote:

дальнейшем данная строка попадает в функцию format

не в format, а SendClientMessage
Reply
#7

Quote:
Originally Posted by DartfoL
Посмотреть сообщение
не в format, а SendClientMessage
Нет, данной функции без разницы что выводить. А для format это ключ.
Reply
#8

Хах, тракер ковыряете. Это обычный деревянный костыль от эксплойтов и им подобных.
Reply
#9

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) серв падает
Reply
#10

Поставил эту вещь себе в мод и перестали работать 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);
Раньше не замечал
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)