Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 20
  1. #1
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±

    Исправление функций Kick(), Ban()и BanEx()

    У меня как обычно едет крыша и я вновь решил переписать эту библиотеку лишь по одной весомой, как мне кажется, причине. Зачем создавать новые функции с аналогичными возможностями, если достаточно написать 3 новые функции за место 3 обновленных и 3 аналогичных прежним. Правда, это противоречит моим прежним убеждениям. Но человек меняется!

    Исправление функций Kick(), Ban()и BanEx()

    • Описание

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

    • Скачать

    Библиотека распространяется под лицензией ZLib.

    Скачать с сайта dropbox.com.

    • Использование

    Для начала подключите библиотеку:
    PHP код:
    #include "u_fixkick" 
    В библиотеке есть константа, значение которой является значением по-умолчанию, если функциям не установить дополнительный аргумент (он опциональный). Для установки своего значение вы должны перед подключением объявить свою константу DEFAULT_TIME_INTERVAL.
    Объявление константы MAX_REASON_TEXT отвечает за длину строки, используемой в PlayerBanEx().

    PHP код:
    #define DEFAULT_TIME_INTERVAL 200

    #include "u_fixkick 
    • Функции


    Функции

    PHP код:
    PlayerKick(playeridtime);
    PlayerBan(playeridtime);
    PlayerBanEx(playeridreason[], time); 
    ничем не отличаются в использовании от их аналогов. Аргумент time отвечает за время, через которое будет вызвана функция.

    • Совет

    Не ставьте врем меньше 200 и больше 1000.

    Копирование статьи разрешено только с личного разрешения автора.
    Последний раз редактировалось Desulaid; 30.08.2016 в 21:08. Причина: Добавил ссылку на загрузку инклуда

  2. Пользователь сказал cпасибо:
    NewGreen (15.11.2015)
  3. #2
    Аватар для L0ndl3m
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±
    Таких "решений" задач уже куча и на портале их тоже немало, я думаю подключать для этого инклуд совершенно не нужно, ИМХО.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Untonyst Посмотреть сообщение
    Мое решение - это затормозить функцию на доли секунды (0,2 секунды), чтобы функции, стоящие перед исправленной функцией успели проскочить.
    Другие решения работают точно так же. Я даже хотел выложить год назад свой инклуд для таких целей с кучей всяких настроек, но к тому времени было уже дофига похожих работ, особенно на sa-mp.com.


    Цитата Сообщение от Untonyst Посмотреть сообщение
    В интернете есть множество решений, которые есть не более чем большой костыль.
    А раз твоё решение работает точно так же, как и остальные, то это просто ещё один "большой костыль" среди кучи других.

    Btw, инклуд тестировался при одновременном бане нескольких игроков (с разными причинами)? Я про функцию BanEx.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Я видел не много решений на это "обновление", но все, которые я видел были примерно такими:

    PHP код:
    // "Основа new.pwn (MySQL R5)"
    stock KickFix(playeridcolormessage[], bool:toall=false)
    {
        if(
    toall == trueSendToAll(colormessage);
        else 
    SendMe(playeridcolormessage);
        
    SetTimerEx("KickPublic"2000"d"playerid);
        return 
    1;
    }

    forward KickPublic(playerid);
    public 
    KickPublic(playerid)
    {
        
    Kick(playerid);

    По мне, дак это муторно и сложно (скорее лень все аргументы заполнять =р) - большой костыль. Потом я увидел другое решение:

    PHP код:
    @_kick(playerid);
    @
    _kick(playerid) return Kick(playerid);

    #define    Kick(%0)    SetTimerEx("@_kick",500,false,"i",%0) 
    Опять же не совсем практично. Так как, если нам понадобится перехватить функцию Kick, у нас будут ошибки. Мне мне вам говорить почему они будут, все есть в уроке.

    На счет теста, я не думаю, что функция требует выделения двухмерного массива:
    • наврят ли функция будет вызвана для разных игроков точь-в-точь в плоть до доли секунд, и эта разница, я думаю сыграет в лучшую сторону.
    • саму по себе функцию я редко видел в модах. Обычно, сервера ограничиваются функциями Kick(), Ban() + сохранение результата куда-либо для дальнейшей загрузки.


    А тест провести надо бы :)

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

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    PHP код:
    forward OnPlayerKick(const id_player);
    public 
    OnPlayerKick(const id_player)
        return 
    Kick(id_player);

    stock fix_KickPlayer(const id_player)
        return 
    SetTimerEx("OnPlayerKick"1000false"i"id_player);

    #if defined _ALS_Kick
    #undef Kick
    #else
    #define _ALS_Kick
    #endif
    #define Kick fix_KickPlayer 
    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

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

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    PHP код:
    forward OnPlayerKick(const id_player);
    public 
    OnPlayerKick(const id_player)
        return 
    Kick(id_player);

    stock fix_KickPlayer(const id_player)
        return 
    SetTimerEx("OnPlayerKick"1000false"i"id_player);

    #if defined _ALS_Kick
    #undef Kick
    #else
    #define _ALS_Kick
    #endif
    #define Kick fix_KickPlayer 
    Константа? Ты серьезно?

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Untonyst Посмотреть сообщение
    На счет теста, я не думаю, что функция требует выделения двухмерного массива:
    • наврят ли функция будет вызвана для разных игроков точь-в-точь в плоть до доли секунд, и эта разница, я думаю сыграет в лучшую сторону.
    • саму по себе функцию я редко видел в модах. Обычно, сервера ограничиваются функциями Kick(), Ban() + сохранение результата куда-либо для дальнейшей загрузки.
    1. Баг есть баг и его редкость - не оправдание. Равно, как и отсутствие более адекватных реализаций.
    2. Совсем не обязательно хранить данные в двухмерном массиве.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    1. Баг есть баг и его редкость - не оправдание. Равно, как и отсутствие более адекватных реализаций.
    2. Совсем не обязательно хранить данные в двухмерном массиве.
    То есть при кике сразу обнулить массив?

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

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

  11. Пользователь сказал cпасибо:
    Desulaid (16.11.2015)
  12. #10
    Аватар для [ForD]
    Пользователь

    Статус
    Оффлайн
    Регистрация
    14.11.2013
    Адрес
    Свердловская обл.
    Сообщений
    688
    Репутация:
    103 ±
    Я в общем пропустил наверное что-то но в последних версиях эти костыли не нужны?
    PAWN Compiler делает то, что вы приказали ему сделать, а не то, что вы хотели, чтобы он сделал..

    25% времени в программировании уходит на размышления о том, что пользователь может сделать не так.[HR]/Брайан Хьюмс/





    #FIXSAMP

 

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

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

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

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

Ваши права

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