Главная | Комментарии | О проекте
Чтение RSS
Суперсайт
Главная Контакты Карта сайта Добавить в избранное
  • Кто OnLine

    Всего на сайте: 3
    Гостей: 1
    Пользователи: byantopo6633
    Роботы: crawl Bot

    Опрос пользователей

    Для какого мода Вы пишите плагины?

    • Популярное

    Рекомендуем

    • AMX Mod X
    • up.org.ua

    Наши друзья


  • Автор: Admin Дата: 5-11-2012, 21:38 Просмотров: 10019

    Коды возврата функций return PLUGIN_CONTINUE, return PLUGIN_HANDLED, return PLUGIN_HANDLED_MAIN

    В AMX Mod X существует 3 константы возврата функций:
    //Plugin passes through operation.  Whatever called it continues.
    #define PLUGIN_CONTINUE        0
    //Plugin halts continued operation (plugins following in the plugins.ini won't be called).
    //Whatever called it will eventually supercede.
    #define PLUGIN_HANDLED        1
    //Continue calling plugins but halt the operation
    #define PLUGIN_HANDLED_MAIN    2
    • PLUGIN_CONTINUE - Плагин продолжает работать.
    • PLUGIN_HANDLED - Плагин останавливает операцию и плагины следующих ниже в plugins.ini не будут вызваны.
    • PLUGIN_HANDLED_MAIN - Останавливает функцию, но остальные плагины будут вызваны

    Разберемся на примере двух простых плагинов:
    Плагин 1:
    #include <amxmodx>
    #include <amxmisc>

    #define PLUGIN "[http://amxxmodx.ru] return Pl1"
    //                    PLUGIN_HANDLED_MAIN                            
    //                    PLUGIN_HANDLED_MAIN
    //                    PLUGIN_CONTINUE

    #define VERSION "1.0"
    #define AUTHOR "Admin"

    public plugin_init() {
        register_plugin(PLUGIN, VERSION, AUTHOR)
        
        register_clcmd("say hand","FUNC_PLUGIN_HANDLED")
        register_clcmd("say handm","FUNC_PLUGIN_HANDLED_MAIN")
        register_clcmd("say cont","FUNC_PLUGIN_CONTINUE")

    }
    public FUNC_PLUGIN_HANDLED(id){
        
        client_print(id,print_chat,"1 plugin - handled")
        
        return PLUGIN_HANDLED
        
    }
    public FUNC_PLUGIN_HANDLED_MAIN(id){
        
        client_print(id,print_chat,"1 plugin - handled_main")
        
        return PLUGIN_HANDLED_MAIN
        
    }
    public FUNC_PLUGIN_CONTINUE(id){
        
        client_print(id,print_chat,"1 plugin - continue")
        
        return PLUGIN_CONTINUE
        
    }


    Плагин 2:
    #include <amxmodx>
    #include <amxmisc>

    #define PLUGIN "[http://amxxmodx.ru] return Pl2"
    //                    PLUGIN_HANDLED_MAIN                            
    //                    PLUGIN_HANDLED_MAIN
    //                    PLUGIN_CONTINUE

    #define VERSION "1.0"
    #define AUTHOR "Admin"

    public plugin_init() {
        register_plugin(PLUGIN, VERSION, AUTHOR)
        
        register_clcmd("say hand","FUNC_PLUGIN_HANDLED")
        register_clcmd("say handm","FUNC_PLUGIN_HANDLED_MAIN")
        register_clcmd("say cont","FUNC_PLUGIN_CONTINUE")

    }
    public FUNC_PLUGIN_HANDLED(id){
        
        client_print(id,print_chat,"2 plugin - handled")
        
        return PLUGIN_HANDLED
        
    }
    public FUNC_PLUGIN_HANDLED_MAIN(id){
        
        client_print(id,print_chat,"2 plugin - handled_main")
        
        return PLUGIN_HANDLED_MAIN
        
    }
    public FUNC_PLUGIN_CONTINUE(id){
        
        client_print(id,print_chat,"2 plugin - continue")
        
        return PLUGIN_CONTINUE
        
    }


    Описание:
    Самые внимательные заметили что плагины отличаются всего лишь парой знаков, но именно эти знаки дадут понимание происходящего.
    В обоих плагинах зарегистрированы 3 команды, они одинаковые это важно.
    При вводе команды say hand будет вызвана функция public FUNC_PLUGIN_HANDLED(id) в обоих плагинах (ключевое тут что одна и та же функция будет вызвана, название может быть любым, главное что вызываются от одного и того же.) Аналогично и для двух других команд say handm и say cont, как вы уже догадались это сокращения от имен констант возвратов.

    Если не ставить ни каких возвратов или PLUGIN_CONTINUE, то в обоих плагинах выполнится весь код и в чате будет такая картина:
    1 plugin - continue
    2 plugin - continue
    Admin :  cont

    Как видно прошло и сообщение в чат и выполнились полностью функции в каждом из плагинов.

    Теперь PLUGIN_HANDLED, команда say handm, результат такой:
    1 plugin - handle

    Как видно нет ни самго сообщения в чат ни сообщения из второго плагина, хотя оно там есть - проверьте сами.
    Это потому что PLUGIN_HANDLED блокирует не только операцию, но вызов плагинов следующих после него в списке plugins.ini

    И наконец редко встречающийся PLUGIN_HANDLED_MAIN, команда say handm:
    1 plugin - handled_main
    2 plugin - handled_main

    Как видите нету сообщения в чат handm, но зато выполнились все функции остальных плагинов.

    Надеюсь теперь вам понятны различия данных возвратов.


    Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
    Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
    Doombringer

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Мне совершенно непонятна ситуация с plugin.ini c PLUGIN_HANDLED. При чём вообще тут выполнение остальных сторонних плагинов? Понятно, что иногда требуется приостановить работу самого плагигна, но почему это должно затрагивать остальные плагины? Понимаю, что мой вопрос может показаться крайне глупым, до я действительно ничерта не понял.
    Maksovich

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Doombringer, Такая же фигня. Причем тут plugin.ini
    Admin

    30.07.2011
    ICQ: 980500
    Публикаций: 507
    Комментариев: 333
    Репутация: -  58  +

    Простой пример:
    Вы хотите что бы плагин переделывал определенное сообщение от какого то игрока.

    Игрок пишет: 2+2=4
    Ваш плагин берет и заменят на скажем 3+3=6
    Нижестоящий плагин не знает о том что сделал плагины выше и тоже изменяет сообщение игрока на 1+1=2

    в итоге в чат будет выведено:
    2+2=4 ( что написал игрок)
    3+3=6 ( изменения от первого плагина)
    1+1=2 ( изменения от второго плагина)

    А если бы в первом плагине заблокировали, то была бы выведена только его работа.
    то есть 3+3=6

    Теперь понятно?
    --------------------
    Valer4

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Как сделать, чтобы команды других плагинов выполнялись независимо каким в списке будет плагин перехватчик?
    Суть - один плагин перехватывает и заменяет сообщения в чат от игроков, эти сообщения могут содержать команды для других плагинов.
    PLUGIN_HANDLED_MAIN пробовал,с ним команды игроков выполняются другими плагинами, если плагин перехватчик в конце списка, но это создаст проблемы при использования многими пользователями.

    Admin

    30.07.2011
    ICQ: 980500
    Публикаций: 507
    Комментариев: 333
    Репутация: -  58  +

    Valer4, ни чего не перепутал?
    PLUGIN_HANDLED_MAIN - Останавливает функцию, но остальные плагины будут вызваны


    Для обсуждения проблем - есть форум.
    --------------------
    Rhyme

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    давно еще мучает вопрос в некоторых плагинах есть просто return а он что делает? и стоит ли им вообще пользоваться?
    Admin

    30.07.2011
    ICQ: 980500
    Публикаций: 507
    Комментариев: 333
    Репутация: -  58  +

    return - говорит что функция прекращает дальнейшее выполнение кода.
    а после ретурна стоит то - что фнукция возвращает.
    т.е. можно поставить туда
    return megaperemennaya
    или
    return 1
    или
    return 0

    пойми механизм работы функции, только тогда поймешь...
    --------------------
    Rhyme

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    public native_reset_player_maxspeed(plugin_id, num_params)
    {
        new id = get_param(1)
        
        if (!is_user_connected(id))
        {
            log_error(AMX_ERR_NATIVE, "[CS] Player is not in game (%d)", id)
            return false;
        }
        
        // Player doesn't have custom maxspeed, no need to reset
        if (!flag_get(g_HasCustomMaxSpeed, id))
            return true;
        
        flag_unset(g_HasCustomMaxSpeed, id)
        
        ExecuteHamB(Ham_Player_ResetMaxSpeed, id)
        return true;
    }

    то есть в данном случае тут есть "return false" и "return true" значит принцип работы очень похож на return PLUGIN_HANDLED и PLUGIN_CONTINUE ? или я не прав?
    Admin

    30.07.2011
    ICQ: 980500
    Публикаций: 507
    Комментариев: 333
    Репутация: -  58  +

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

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    А не поможете мне понять это? Где мне лучше прочитать про функции и вызов ее из другого места и ее возврат?

    Информация

    Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Наверх

Реклама