Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 2 из 3 ПерваяПервая 1 2 3 ПоследняяПоследняя
Показано с 11 по 20 из 23
  1. #11
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    1) При этом всё работает Правда, как уже писал в теме, компилятор выплёвывает warning в случае, если попытаться параметром передать массив с неизвестным числом ячеек, но тогда sizeof просто ровна нулю, на чём и построена проверка
    И этого легко избежать, я даже вчера показывал в XMPP, как именно.


    Цитата Сообщение от DeimoS Посмотреть сообщение
    2) Так вставка происходит только если в массиве, переданном в функцию, имеется место, не?
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Именно для этого я и спрашивал у тебя насчёт sizeof и именно об этой проверке я написал в предыдущем пункте. Если длина текущей строки+1 новый символ не равно или больше размеру массива, полученного через sizeof - добавляем новый символ.
    sizeof возвращает 0, когда не может определить размер массива, поэтому в array_size всегда будет 0.
    Как результат, вставка никогда не будет производиться. Вместо этого символ "%" всегда будет заменяться на "#".


    Цитата Сообщение от DeimoS Посмотреть сообщение
    Иначе заменяем "%" на "#"
    ИМХО, _только_ такой вариант был бы куда проще и без нежелательных эффектов.


    PHP код:
    message[i] -= 0x2
    Попахивает понтокодом.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  2. #12
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    И этого легко избежать, я даже вчера показывал в XMPP, как именно.
    Хмм, что-то не могу найти :с


    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    sizeof возвращает 0, когда не может определить размер массива, поэтому в array_size всегда будет 0.
    Как результат, вставка никогда не будет производиться. Вместо этого символ "%" всегда будет заменяться на "#".
    Хмм, до меня, кажется, дошло о чём ты говоришь. Проверил (чего почему-то не сделал вчера) и действительно, если вызывать sizeof прямо внутри функции, а не в параметрах, sizeof отказывается работать :с Вернул код к изначальному состоянию.
    Но, как и писал ранее, сей манёвр всё равно не избавляет от предупреждения со стороны компилятора при попытке засунуть в функцию inputtext

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    ИМХО, _только_ такой вариант был бы куда проще и без нежелательных эффектов.
    Ну я в теме уже говорил для чего и почему я решил написать эту функцию :)

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Попахивает понтокодом.
    Этот кусок кода я просо скопировал с одной темы из интернета, где как раз и идёт замещение всех символов на "#"
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  3. #13
    Аватар для vovandolg
    Пользователь

    Статус
    Оффлайн
    Регистрация
    17.11.2015
    Адрес
    Stavropol
    Сообщений
    1,369
    Репутация:
    113 ±
      Открыть/закрыть
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Есть функция SendClientMessage в которой ещё с мезозойских времён имеется вот такой баг:







    То бишь, если в функцию передать спецификатор (спецификатор - это "%s", "%d" и т.п.), который не был форматирован до этого в том же format, то сервер из-за этого упадёт (точнее, падает он, вроде, только от спецификатора "%s". Но про это я в теме говорил).
    Куй исправил тему с OnPlayerText и OnPlayerCommandText, обрабатывая введённый игроком текст и заменяя все "%" на "#", но с диалогами он этого не сделал (а это самый распространённый пример. Авось ещё где-то можно подобный баг провернуть).

    Эта функция является более функциональным аналогом тех вариаций, что гуляют в интернете (опять же, я об этом писал в теме: про способы, которые заменяют все "%" на "#"). Хотя что те варианты, что мой - все рабочие, хотя логичнее использовать мой, ибо тогда обрабатываться будут не все диалоги, а только нужные.

    P.S. Если я неправильно понял вопроса и ты спрашивал о том, как работает сей баг, который исправляет функция, вставь этот код:
    PHP код:
    public OnPlayerSpawn(playerid)
    {
        
    ShowPlayerDialog(playerid1112DIALOG_STYLE_INPUT"Crash""Crash""Да""Нет (Да)");
        return 
    1;
    }
    public 
    OnDialogResponse(playeriddialogidresponselistiteminputtext[])
    {
        if(
    dialogid == 1112)
        {
            new 
    inputtext_buff[145];
            
    strcat(inputtext_buffinputtext128);
            
    //FindSpecifiersInString(inputtext_buff, true);
            
    format(inputtext_buffsizeof(inputtext_buff), "Написал: %s."inputtext_buff);
            return 
    SendClientMessage(playerid, -1inputtext_buff);
        }
        return 
    1;

    А после попробуй ввести в это диалоговое окно что-то подобное
    PHP код:
    %%   %%
    И смотри что будет :)
    А потом убери комментирование строки с вызовом функции + вставь код самой функции из урока и посмотри что выйдет после

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

    Да или просто в OnPlayerConnect добавь
    PHP код:
    SendClientMessage(playerid, -1"%s"); 
    И при первом вошедшем игроке на сервер, его просто крашнет


    Так есть же коротко строчные коды которые предотвращают это... я там в рлснике видел примеры с while
    Или то дичь полная что в рлс?
    [Anticheat]___Invisible Fly Hack
    [Anticheat]____Weapon/Ammo Hack
    [Function]______ResetPlayerWeaponSlot
    [Function]_______FIX_SetPlayerAmmo
    [ServerMod]______TDM | Zombie Apokalypse

  4. #14
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
      Открыть/закрыть


    Так есть же коротко строчные коды которые предотвращают это... я там в рлснике видел примеры с while
    Или то дичь полная что в рлс?
    Неужели я так плохо всё объяснил в шапке темы?
    Все подобные фиксы 100% заменяют все "%" на "#", без возможности оставить их в виде "%".
    Большинство из этих фиксов так же совершают ненужные действия тем, что обрабатывают все без разбору диалоги, которые были показаны игроку: будь то действительно диалог с inputtext, который нужно обработать, или же какой-нибудь DIALOG_STYLE_MSGBOX (ибо его содержимое будет передано как раз в inputtext) с текстов в 2000 символов - в обоих случаях этот цикл прогонит содержимое сквозь себя, что во втором случае вовсе не нужно (выход - либо перехватывать ShowPlayerDialog, записывать тип показанного игроку диалога и сверять его, либо прямо по ID ориентироваться, либо использовать мою функцию, расставив форматирование строки только в тех диалогах, где это нужно)

    Я же хотел сделать функцию, которая:
    Во-первых, позволит контролировать то, какие диалоги нужно исправлять, а какие не нужно (+ к оптимизации)
    Во-вторых, позволит сохранить сообщение в первозданном виде, если мне это требуется.
    Вот и всё
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  5. #15
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Хмм, что-то не могу найти :с
    Код HTML:
    (23:45:16) DeimoS: И тогда strlen не подойдёт
    (23:45:19) Daniel_Cortez: или сделать в функции опциональный параметр size
    (23:45:41) Daniel_Cortez: SomeFunction(string[], size = sizeof(string))
    (23:46:11) Daniel_Cortez: куй этого явно не знал, когда делал функции типа GetPlayerName
    (23:46:37) Daniel_Cortez: иначе мог бы сэкономить кучу времени и нервов скриптерам

    Цитата Сообщение от DeimoS Посмотреть сообщение
    Хмм, до меня, кажется, дошло о чём ты говоришь. Проверил (чего почему-то не сделал вчера) и действительно, если вызывать sizeof прямо внутри функции, а не в параметрах, sizeof отказывается работать :с Вернул код к изначальному состоянию.
    Но, как и писал ранее, сей манёвр всё равно не избавляет от предупреждения со стороны компилятора при попытке засунуть в функцию inputtext
    Он и не должен. Размер передаваемой строки можно узнать только через отдельный параметр size, который желательно сделать опциональным.


    Цитата Сообщение от DeimoS Посмотреть сообщение
    Ну я в теме уже говорил для чего и почему я решил написать эту функцию :)
    В таком случае кроме плюсов реализации напиши и про потерю последних символов в строке. Ты ж скриптер, а не маркетолог.


    Цитата Сообщение от DeimoS Посмотреть сообщение
    Этот кусок кода я просо скопировал с одной темы из интернета, где как раз и идёт замещение всех символов на "#"
    Дежавю какое-то...
    Код не мой, исправлять не буду!
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  6. #16
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Код HTML:
    (23:45:16) DeimoS: И тогда strlen не подойдёт
    (23:45:19) Daniel_Cortez: или сделать в функции опциональный параметр size
    (23:45:41) Daniel_Cortez: SomeFunction(string[], size = sizeof(string))
    (23:46:11) Daniel_Cortez: куй этого явно не знал, когда делал функции типа GetPlayerName
    (23:46:37) Daniel_Cortez: иначе мог бы сэкономить кучу времени и нервов скриптерам
    Ааа, так ты об этом. Я-то думал, что ты о предупреждении, которое выдаёт компилятор



    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Он и не должен. Размер передаваемой строки можно узнать только через отдельный параметр size, который желательно сделать опциональным.
    Таки уже


    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Дежавю какое-то...
    :D
    Вот новая, полностью переработанная версия. Что-то я вчера намудрил
    PHP код:
    stock FindSpecifiersInString(message[], array_size sizeof(message))
    {
        new 
    message_length strlen(message);

        for(new 
    imessage_lengthi++)
        {
            if(
    message[i] == '%')
            {
                if(
    message_length array_sizestrins(message"%"i++, message_length++);
                else 
    message[i] = '#';
            }
        }

    Тщательно её не тестировал, поэтому пока добавлять в шапку не буду. Чуть позже вечером или завтра займусь тестами, если никто раньше этого не ткнёт меня носом в мой кривой код :3
    Последний раз редактировалось DeimoS; 29.02.2016 в 18:38.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  7. #17
    Аватар для seriu
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.11.2013
    Сообщений
    69
    Репутация:
    6 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Попахивает понтокодом.
    Понтокодом попахивает тут http://pro-pawn.ru/showthread.php?79..._stringhash%29
    а тут всего лишь символ 0x25 (%) заменяется на 0x23(#)

  8. #18
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от seriu Посмотреть сообщение
    тут всего лишь символ 0x25 (%) заменяется на 0x23(#)
    ... в то время, как вместо понтов типа 0x25 или 0x23 можно написать '%' или '#'. Или вы тоже вместо 0 всегда пишете 0x0?
    И кстати, сможете сказать, какой символ скрывается под кодом 0xBA? Чур в таблицу ASCII-символов не подглядывать.
    Кроме того, можно было обойтись присваиванием значения '#' вместо вычитания. Что по-вашему сложнее: взять значение из ячейки, совершить над ним операцию и записать в ячейку или просто записать в ячейку уже известное нам значение (константу)? (Правильный ответ очевиден: просто записать - ОСТОРОЖНО, СПОЙЛЕРЫ.)


    Цитата Сообщение от seriu Посмотреть сообщение
    Понтокодом попахивает тут http://pro-pawn.ru/showthread.php?79..._stringhash%29
    Там чёрным по белому написано, что y_stringhash и таблица используются для достижения производительности и перекрытия потенциальной возможности перегрузить сервер. Потому смысл в этом коде есть, хоть его и трудно уловить для новичков.
    Считаете иначе - докажите, что это понтокод, если не хотите быть пустословом.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  9. #19
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    И пока тут назревает маленькая война, я всё же обновил тему, указав в ней финальный (я надеюсь) вариант сей функции. Из функции убран бесполезный аргумент + убрана попытка выискивать конкретные спецификаторы, ибо SendClientMessage всё равно не дружит с "%", если его указать в виде самостоятельного знака
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  10. #20
    Аватар для seriu
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.11.2013
    Сообщений
    69
    Репутация:
    6 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    в то время, как вместо понтов типа 0x25 или 0x23 можно написать '%' или '#'. Или вы тоже вместо 0 всегда пишете 0x0?
    И кстати, сможете сказать, какой символ скрывается под кодом 0xBA? Чур в таблицу ASCII-символов не подглядывать.
    Кроме того, можно было обойтись присваиванием значения '#' вместо вычитания. Что по-вашему сложнее: взять значение из ячейки, совершить над ним операцию и записать в ячейку или просто записать в ячейку уже известное нам значение (константу)? (Правильный ответ очевиден: просто записать - ОСТОРОЖНО, СПОЙЛЕРЫ.)
    В чем проблема? не вычитай заменяй сразу на 0x23
    При чем тут символ 0x0 ?
    0xBA - в душе не чаю, что это за символ, мне это даже не интересно.

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Там чёрным по белому написано, что y_stringhash и таблица используются для достижения производительности и перекрытия потенциальной возможности перегрузить сервер. Потому смысл в этом коде есть, хоть его и трудно уловить для новичков.
    Считаете иначе - докажите, что это понтокод, если не хотите быть пустословом.
    Можно было просто сделать /veh id color1 color2
    Или у тебя все команды такие и ты во всех командах перебираешь кучу строк что бы проверить на совпадение имен?
    по мойму гораздо проще к этому имени приравнять ид и по ид сравнивать 1 запрос.

 

 
Страница 2 из 3 ПерваяПервая 1 2 3 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •