Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 19

Тема: FixKick

  1. #1
    Активный пользователь
    Регистрация
    06.10.2015
    Адрес
    Slobodskoy
    Возраст
    27
    Сообщений
    103
    Репутация: 93

    Звание: скоро придёт к известности

    fix_K2BEx.inc (Fix Func: Kick, Ban & BanEx)

    FIX_K2BEX.INC

    Этот инклуд исправляет "обновления" со времен SA-MP 0.3x, которые повлияли на работу функций Kick(), Ban() и BanEx(), путем вызова таймера перез дополнительный параметра этих функций.

    PHP код:
    /*
        Copyright (c) 2015-2016, Untonyst

        This software is provided 'as-is', without any express or implied
        warranty. In no event will the authors be held liable for any damages
        arising from the use of this software.

        Permission is granted to anyone to use this software for any purpose,
        including commercial applications, and to alter it and redistribute it
        freely, subject to the following restrictions:

        1. The origin of this software must not be misrepresented; you must not
           claim that you wrote the original software. If you use this software
           in a product, an acknowledgement in the product documentation would be
           appreciated but is not required.
        2. Altered source versions must be plainly marked as such, and must not be
           misrepresented as being the original software.
        3. This notice may not be removed or altered from any source distribution.
    */

    #if defined _untonysts_k2bex_included_
        #endinput
    #endif
    #define _untonysts_k2bex_included_

    #define FIX_PARAMS 1                // Параметр вызова функции из инклуда

    #define MAX_REASON_BANEX_TEXT 25;    // Размер строки причины бана

    #define TIME_CALL_FUNCTION 200;        // Через сколько функция сработает

    @__CallKickFunc(playerid);
    @
    __CallKickFunc(playerid) {
        
    Kick(playerid);
    }

    stock u_fix__Kick(playeridfix=0) {
        if (
    == IsPlayerConnected(playerid)) {
            return 
    0;
        }
        if (
    fix == 1) {
            
    SetTimerEx(!"@__CallKickFunc"TIME_CALL_FUNCTION0"i"playerid);
            return 
    1;
        }
        return 
    Kick(playerid);
    }
    #if defined _ALS_Kick
        #undef Kick
    #else
        #define _ALS_Kick
    #endif
    #define Kick u_fix__Kick

    @__CallBanFunc(playerid);
    @
    __CallBanFunc(playerid) {
        
    Ban(playerid);
    }

    stock u_fix__Ban(playerid, const fix=0) {
        if (
    == IsPlayerConnected(playerid)) {
            return 
    0;
        }
        if (
    fix == 1) {
            
    SetTimerEx(!"@__CallBanFunc"TIME_CALL_FUNCTION0"i"playerid);
            return 
    1;
        }
        return 
    Ban(playerid);
    }
    #if defined _ALS_Ban
        #undef Ban
    #else
        #define _ALS_Ban
    #endif
    #define Ban u_fix__Ban

    @__CallBanExFunc(playerid);
    @
    __CallBanExFunc(playerid) {
        goto 
    skip_array_init;
        new 
    reason[MAX_REASON_BANEX_TEXT];
        
    skip_array_init:
        
    GetPVarString(playerid, !"PLAYER_REASON_TEXT"reasonsizeof(reason));
        
    DeletePVar(playerid, !"PLAYER_REASON_TEXT");
        for (new 
    0; ((reason[i] &= 0xFF) != '\0') && (++!= sizeof(reason));) {}
        
    BanEx(playeridreason);
    }

    stock u_fix__BanEx(playeridreason[], fix=0)
    {
        if (
    == IsPlayerConnected(playerid)) {
            return 
    0;
        }
        if (
    fix == 1) {
            
    SetPVarString(playerid, !"PLAYER_REASON_TEXT"reason);
            
    SetTimerEx(!"@__CallBanExFunc"TIME_CALL_FUNCTION0"i"playerid);
            return 
    1;
        }
        return 
    BanEx(playeridreason);
    }
    #if defined _ALS_BanEx
        #undef BanEx
    #else
        #define _ALS_BanEx
    #endif
    #define BanEx u_fix__BanEx 


    Отсоединим игрока через n-миллисекунд*
    PHP код:
    Kick(playeridFIX_PARAMS); 
    Моментально отсоединим**
    PHP код:
    Kick(playerid); 


    * - настройку времени на вызов ответа от функции вы можете сами изменить в инклуде. Не стал добавлять значение по умолчанию и дефолтное значения из-за того, что не хочу засорять код лишними директивами :(
    * - целесообразно было оставить моментальное отсоединение игрока и не придумывать сложные названия новым функциям
    Последний раз редактировалось Untonyst; 12.03.2016 в 17:36. Причина: Обновил

  2. 3 пользователей сказали cпасибо Untonyst за это полезное сообщение:

    georJik (11.11.2015), MAY (12.11.2015), Фора (11.11.2015)

  3. #2
    Nothing Аватар для Privies
    Регистрация
    25.03.2011
    Адрес
    Рига
    Сообщений
    2,978
    Репутация: 411

    Звание: - очень-очень хороший человек
    А зачем столько кода? Разве обычный паблик не проще?

  4. #3
    Проверенный Аватар для georJik
    Регистрация
    07.07.2013
    Сообщений
    1,370
    Репутация: 427

    Звание: - очень-очень хороший человек
    Цитата Сообщение от Privies Посмотреть сообщение
    А зачем столько кода? Разве обычный паблик не проще?
    Это хук, чтобы пользователь просто вставил инклуд и ничего не прописывал

  5. #4
    Проверенный Аватар для georJik
    Регистрация
    07.07.2013
    Сообщений
    1,370
    Репутация: 427

    Звание: - очень-очень хороший человек
    Но самый лучший и простой вариант - это:

    После #include <a_samp>
    PHP код:
    @_kick(playerid);
    @
    _kick(playerid) return Kick(playerid);

    #define    Kick(%0)    SetTimerEx("@_kick",500,false,"i",%0) 

  6. 2 пользователей сказали cпасибо georJik за это полезное сообщение:

    Untonyst (11.11.2015), vasyok28 (11.11.2015)

  7. #5
    Активный пользователь
    Регистрация
    06.10.2015
    Адрес
    Slobodskoy
    Возраст
    27
    Сообщений
    103
    Репутация: 93

    Звание: скоро придёт к известности
    Цитата Сообщение от georJik Посмотреть сообщение
    Но самый лучший и простой вариант - это:

    После #include <a_samp>
    PHP код:
    @_kick(playerid);
    @
    _kick(playerid) return Kick(playerid);

    #define    Kick(%0)    SetTimerEx("@_kick",500,false,"i",%0) 
    Это чувство, когда 64 строки кода можно заменить на 3

  8. 1 пользователь сказал cпасибо Untonyst за это полезное сообщение:

    Фора (11.11.2015)

  9. #6
    Read-only Аватар для MacMailler
    Регистрация
    03.04.2012
    Адрес
    East Kazakhstan
    Возраст
    31
    Сообщений
    1,047
    Репутация: 211

    Звание: - весьма и весьма положительная личность

  10. #7
    Активный пользователь
    Регистрация
    06.10.2015
    Адрес
    Slobodskoy
    Возраст
    27
    Сообщений
    103
    Репутация: 93

    Звание: скоро придёт к известности
    Цитата Сообщение от MacMailler Посмотреть сообщение
    Реализация не очень:
    • Вот ты используешь оператор switch, зачем? if/else был бы быстрее.
    • "Перехваты". Ты не правильно функцию перехватил, если во время разработки понадобится перехватить эту функцию еще раз, то ошибки будут, придется использовать твой "перехват", а именно ползти в инклюд и там новые свойства функции давать > ошибки и прочее или геморой.
    • На счет массива, я бы лучше создал отельную функцию, ради экономии байтов (избавиться от массива). Ты же все равно все "перехваченные" функции в одну функцию направляешь ("onKicked"), почему бы не вызывать определенные функции в зависимости от условия? Плюс у тебя есть лишняя трата ресурсов, а именно массив с причиной бана, зачем его обнулять при каждом кике? Ни к чему.
    • Я бы добавил пару констант для удобства: причине бана менять кол-во ячеек; аргумент функций delay=100 вообще я считаю здесь лишним! Опять же я бы добавил макрос на время.
    • Вывод: если считать по байтам, то я бы у тебя сэкономил 304 байта.


  11. #8
    Активный пользователь
    Регистрация
    06.10.2015
    Адрес
    Slobodskoy
    Возраст
    27
    Сообщений
    103
    Репутация: 93

    Звание: скоро придёт к известности
    Апдейт.

  12. #9
    ex-Pawn developer Аватар для SHOROOP
    Регистрация
    28.05.2011
    Адрес
    St.Petersburg
    Возраст
    32
    Сообщений
    2,667
    Репутация: 306

    Звание: как роза среди колючек
    И чего бы вместо kick() просто SetTimerEx("Kick", 500, false, "I", playerid) не юзать.

  13. 1 пользователь сказал cпасибо SHOROOP за это полезное сообщение:

    Фора (12.11.2015)

  14. #10
    Активный пользователь
    Регистрация
    06.10.2015
    Адрес
    Slobodskoy
    Возраст
    27
    Сообщений
    103
    Репутация: 93

    Звание: скоро придёт к известности
    Цитата Сообщение от SHOROOP Посмотреть сообщение
    И чего бы вместо kick() просто SetTimerEx("Kick", 500, false, "I", playerid) не юзать.
    Не могу без порно.

    АДД:"Перехваты". Ты не правильно функцию перехватил, если во время разработки понадобится перехватить эту функцию еще раз, то ошибки будут, придется использовать твой "перехват", а именно ползти в инклюд и там новые свойства функции давать > ошибки и прочее или геморой.
    Последний раз редактировалось Untonyst; 12.11.2015 в 21:33.

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

Ваши права

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