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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±

    dc_kickfix.inc (Kick/Ban/BanEx)

    Этот инклуд планировался к выпуску около года назад, но тогда я подумал, что кто-нибудь наверняка уже сделал что-то подобное, но с большим количеством фич. Как оказалось, нет, и было бы грех просто так выбрасывать старую работу.


    Описание:
    Как уже понятно из названия, этот инклуд исправляет досадную "фичу", связанную с тем, что функции Kick, Ban и BanEx начисто обрывают связь с игроком, из-за чего ему нельзя показать сообщение с причиной бана или сделать что-нибудь ещё.


    Преимущества реализации:
    • Прозрачная замена функций Kick, Ban и BanEx.
      От вас требуется лишь подключить инклуд, больше ничего изменять в моде не нужно.

    • Настраиваемое время задержки.
      По умолчанию при вызове Kick/Ban/BanEx производится задержка в 0.5 секунды (500 мс), но эту задержку можно изменить, выставив своё время перед подключением инклуда.
      Пример:
      PHP код:
      #define DC_KICKFIX_INTERVAL 1000
      #include "../include/dc_kickfix.inc" 
    • Сохранена возможность доступа к оригинальным функциям.
      Для этого зарезервированы имена ImmediateKick, ImmediateBan и ImmediateBanEx, с помощью которых можно вызвать оригинальные функции SA-MP, без задержки.
      Это может быть полезно для отражения атак на сервер, когда необходимо как можно быстрее избавиться от атакующего.


    Пример использования:
    PHP код:
    CMD:kick(playeridparams[])
    {
        if(
    == IsPlayerAdmin(playerid))
            return 
    1;
        new 
    targetid;
        if(
    sscanf(params"uS[126]"targetidparams))
            return 
    SendClientMessage(playerid, -1, !"Использование: /kick [ID/часть ника] {причина}");
        new 
    string[144], adm_name[MAX_PLAYER_NAME 1];
        
    GetPlayerName(playeridadm_namesizeof(adm_name);
        
    GetPlayerName(targetidstringsizeof(string);
        
    format(
            
    stringsizeof(string),
            
    "Администратор %s кикнул игрока %s, причина: %s",
            
    stringparams
        
    );
        for(new 
    GetMaxPlayers(); i-- != 0; )
            if(
    IsPlayerAdmin(i))
                
    SendClientMessage(i, -1string);
        
    format(
            
    stringsizeof(string),
            
    "Вы были кикнуты администратором %s, причина: %s",
            
    adm_nameparams
        
    );
        
    SendClientMessage(targetid, -1string);
        return 
    Kick(targetid);


    Скачать: https://www.dropbox.com/s/c54p003f2a...dc_kickfix.inc
    Автор: Daniel_Cortez


    Специально для Pro-Pawn.ru
    Копирование данной статьи на других ресурсах без разрешения автора запрещено!
    Последний раз редактировалось Daniel_Cortez; 12.11.2018 в 22:10. Причина: v1.3.4
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  2. 5 пользователя(ей) сказали cпасибо:
    Astrakhan30 (19.05.2016) Freaky (18.01.2017) Glant (31.07.2016) Salvacore (19.11.2015) vovandolg (09.03.2016)
  3. #2
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    А source выложить? (На гист или пастбин)
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    А source выложить? (На гист или пастбин)
    Инклуд уже залит на Dropbox, можно просто скачать и открыть его. Это не какой-то там RGhost, на котором файлы удаляются через месяц после отсутствия скачиваний.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  5. #4
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Скачать, что бы посмотреть сурс....
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

  6. #5
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    Скачать, что бы посмотреть сурс....
    Ну не качай. Правилами не оговаривается вылаживание кода для "показа".

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

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±
    "вылаживание", ну вы серьёзно?

    Действительно, сейчас все такие ленивые, что лень скачивать готовый файл, да ещё с высокой скоростью. Будьте по умнее и выложите сами данную работу на тот хостинг, который вам удобен. А далее поделитесь ссылкой со своими единомышленниками.

  8. 3 пользователя(ей) сказали cпасибо:
    Daniel_Cortez (17.02.2016) Nash_Brigers (24.07.2016) Profyan (19.11.2015)
  9. #7
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Инклуд обновлён до версии 1.1.
    В новой версии исправлено несколько багов, один из них описан здесь: http://pro-pawn.ru/showthread.php?13007
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    27.01.2016
    Сообщений
    3
    Репутация:
    0 ±
    Возникли вопросы.
    Зачем #emit?
    Зачем в ф-ии __dc_kickfix__DoBan(const playerid) аргумент указан как const? Как-будто playerid изменится во время выполнения.
    К чему столько земли в коде? Как буд-то у кого-то явно совпадут имена переменных или ф-ий.
    Далее. Зачем goto в таком казалось простом коде?
    __Pawn. Никто не запрещает использовать данную константу, но это просто пипец в данном случае).
    Почему в коде комментарии на английском? Ты же выложил сюда, понимая, что здесь больше половины пользователей английский могут и не знать.
    + Ещё заметил что-то про Kalcor_а было написано, переводчик мне перевёл слово "Blame" как "Обвинение", "Порицание".
    Вообщем всё обсуждение данного кода сводится к тому, что без всяких этих штучек можно реализовать чистый, понятный, оптимизированный код.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от duck_123 Посмотреть сообщение
    Зачем #emit?
    Как знал, что кто-нибудь про это спросит, и специально для таких случаев оставил чуть выше закомментированной строку "SetPVarString(...);".
    Ок, начнём. Скомпилируйте такой код:
    PHP код:
    #include <a_samp>
    #include "../include/dc_kickfix.inc"

    main()
    {
        static const 
    reason[] = "test";
        
    BanEx(0reason);

    С оригинальным dc_kickfix.inc никаких ошибок не будет (если вы храните инклуд в папке "include", а не в "pawno/include", разумеется, иначе можете просто указать "#include <dc_kickfix>").
    А теперь найдите те строки с #emit, к которым вы придираетесь, закомментируйте их и расскомментируйте чуть выше строку
    PHP код:
    //SetPVarString(playerid, str__dc_kickfix__reason, reason); 
    Попробуйте снова скомпилировать код. Не получилось? То-то и оно.
    Я специально поставил в параметре reason атрибут const, чтобы перехват работал во всех случаях, в которых работает оригинальная функция BanEx.
    Но функция SetPVarString не принимает строки с атрибутом const (компилятор выдаёт ошибку), поэтому пришлось сделать вызов этой функции через #emit.
    Btw, именно об этом уже написано в комментарии внутри функции-перехватчика:
    PHP код:
    // "reason" argument should be defined with a "const" qualifier,
    // as in original, but it can't be used in SetPVarString directly. 

    Цитата Сообщение от duck_123 Посмотреть сообщение
    К чему столько земли в коде? Как буд-то у кого-то явно совпадут имена переменных или ф-ий.
    Да, они могут совпасть, потому что никто и ничто этого не запрещает. У функций-перехватчиков должно быть своё уникальное имя, которое больше нигде не встретится (если только не сделать функцию с точно таким же именем намеренно).
    Я не хочу, чтобы мои работы создавали проблемы при совместном использовании с чужими работами, которые тоже могут перехватывать функции Kick/Ban/BanEx. И уж тем более, я не собираюсь наблюдать, как люди флудят в темах с моими работами логами ошибок от компилятора, и разъяснять индивидуально каждому, как исправить эти ошибки.
    У меня нет никаких рычагов перевентивного воздействия на тех, кто пользуются моими работами, поэтому вполне разумно перестраховываться самому.


    Цитата Сообщение от duck_123 Посмотреть сообщение
    Зачем в ф-ии __dc_kickfix__DoBan(const playerid) аргумент указан как const? Как-будто playerid изменится во время выполнения.
    Я работаю над проектами не только на Pawn, но и над другими, на C/C++, не связанными с SA:MP. Код в таких проектах куда сложнее, и можно ожидать чего угодно, поэтому логично перестраховываться и указывать атрибут const там, где это возможно (это уже помогло избежать нескольких ошибок, на которые компилятор не указал бы без const).
    Касаемо причины указания const в @__dc_kickfix__DoBan и других таймерных коллбэках, то это, скорее всего, привычка, приобретённая от работы над теми проектами, но на производительности это никак не сказывается (ИМХО, на читаемости кода тоже).


    Цитата Сообщение от duck_123 Посмотреть сообщение
    Далее. Зачем goto в таком казалось простом коде?
    Чтобы не тратить время на инициализацию массива reason нулями.
    PHP код:
        goto skip_array_init;
        new 
    reason[128];
    skip_array_init
    Подробно этот трюк описан здесь: http://pro-pawn.ru/showthread.php?52...ll=1#post62879
    Экономия не сильно большая, но для фикса всё же важно, чтобы он создавал как можно меньше дополнительной нагрузки.


    Цитата Сообщение от duck_123 Посмотреть сообщение
    __Pawn. Никто не запрещает использовать данную константу, но это просто пипец в данном случае).
    Как я уже сказал ранее, я вынужден был сделать вызов SetPVarString через #emit, но компилятор может крашнуть, если эту функцию не использовать ранее в коде на чистом Pawn.
    Именно поэтому я поставил if с условием, которое никогда не выполняется, и внутри этой конструкции сделал вызов SetPVarString без #emit, чтобы обойти проблему с багом компилятора.
    Тем не менее, в новой версии компилятора от Zeex этот баг был исправлен, поэтому там обход проблемы с sysreq.c не нужен, и я сделал его опциональным, добавив вокруг него "#if __Pawn < 0x030A" / "#endif", чтобы в новой версии в AMX не попадал лишний код.


    Цитата Сообщение от duck_123 Посмотреть сообщение
    + Ещё заметил что-то про Kalcor_а было написано, переводчик мне перевёл слово "Blame" как "Обвинение", "Порицание".
    Это связано с уже описанной выше проблемой в SetPVarString.
    И да, я виню Kalcor'а в том, что он даже раз в год не может исправить свои же баги, из-за которых мне (да и многим другим тоже) приходится костылизировать свой код. Что-то имеете против?


    Цитата Сообщение от duck_123 Посмотреть сообщение
    Вообщем всё обсуждение данного кода сводится к тому, что без всяких этих штучек можно реализовать чистый, понятный, оптимизированный код.
    Хорошо, попробуйте сделать свою "понятную и оптимизированную" реализацию, не имеющую всех тех изъянов, которые устранены в моём инклуде (все они описаны выше). Тогда и поговорим.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  12. 6 пользователя(ей) сказали cпасибо:
    $continue$ (27.01.2016) Astrakhan30 (19.05.2016) BadPawn (11.02.2016) Geebrox (27.07.2016) L0ndl3m (27.01.2016) VVWVV (28.01.2016)
  13. #10
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Инклуд обновлён до версии 1.3.
    Исправлен баг с крашем стокового (стандартного) компилятора Pawn от SA:MP team (спасибо DeimoS за багрепорт).
    Также добавлено больше комментариев для пояснения тех или иных фич в коде.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

 

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

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

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

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

Ваши права

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