Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 5 123 ... ПоследняяПоследняя
Показано с 1 по 10 из 48
  1. #1
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

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

    dc_kickfix.inc (Kick/Ban/BanEx)

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


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


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

    • Настраиваемое время задержки.
      По умолчанию при вызове Kick/Ban/BanEx производится задержка в 0.5 секунды (500 мс), но эту задержку можно изменить, выставив своё время перед подключением инклуда.
      Пример:
      PHP код:
      #define DC_KICK_FIX_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; 29.07.2017 в 12:46. Причина: v1.3.2
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

  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,467
    Репутация:
    265 ±
    А source выложить? (На гист или пастбин)

  4. #3
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,767
    Репутация:
    2256 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    А source выложить? (На гист или пастбин)
    Инклуд уже залит на Dropbox, можно просто скачать и открыть его. Это не какой-то там RGhost, на котором файлы удаляются через месяц после отсутствия скачиваний.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

  5. #4
    Аватар для $continue$
    Заблокирован

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,467
    Репутация:
    265 ±
    Скачать, что бы посмотреть сурс....

  6. #5
    Аватар для Desulaid
    Младший сержант

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

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

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

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

  8. 3 пользователя(ей) сказали cпасибо:
    Daniel_Cortez (17.02.2016)Nash_Brigers (24.07.2016)Profyan (19.11.2015)
  9. #7
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,767
    Репутация:
    2256 ±
    Инклуд обновлён до версии 1.1.
    В новой версии исправлено несколько багов, один из них описан здесь: http://pro-pawn.ru/showthread.php?13007
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

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

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

  11. #9
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,767
    Репутация:
    2256 ±
    Цитата Сообщение от 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 Посмотреть сообщение
    Вообщем всё обсуждение данного кода сводится к тому, что без всяких этих штучек можно реализовать чистый, понятный, оптимизированный код.
    Хорошо, попробуйте сделать свою "понятную и оптимизированную" реализацию, не имеющую всех тех изъянов, которые устранены в моём инклуде (все они описаны выше). Тогда и поговорим.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

  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
    Аватар для duck_123
    Пользователь

    Статус
    Оффлайн
    Регистрация
    27.01.2016
    Сообщений
    4
    Репутация:
    0 ±
    Ответил так ответил)
    Так-то вообще не плохо, но некоторые вещи были бы лишними в скрипте. Без фанатизма.

 

 
Страница 1 из 5 123 ... ПоследняяПоследняя

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

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

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

Ваши права

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