Случайно наткнулся на старенькую статью, но решил что она всё же достойна внимания.
Автор: joaquimandrade
Перевод и редактирование: DJ_WEST
Данная статья поможет Вам в работе с состояниями (state) в плагинах. С помощью состояний можно улучшить производительность плагина, к примеру, в таких ситуациях, когда вызов функции нужно делать один раз или если Вам необходимо включать/выключать forward’ы для каких-то событий.
Для более наглядного примера, рассмотрим следующий код:
#include <amxmodx> #include <hamsandwich> #define PLUGIN "Automaton" #define AUTHOR "Albernaz o Carniceiro Demoniaco" #define VERSION "1.0" new HamHook:HamHookSpawn public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) // Начальное состояние называется: unregistered // Это означает, что у нас еще нет никаких регистраций forward'ов state unregistered; } // Как видно из данной функции, после имя функции и ее структуры в скобках <> // указывается название состояния, при котором данная функция будет срабатывать public enableHam() <unregistered> { // Если текущее состояние = unregistered, то выполняем действия // Регистрируем хук на появление игрока и сохраняем указатель в HamHookSpawn HamHookSpawn = RegisterHam(Ham_Spawn, "player", "playerSpawn"); // Выставляем текущее состояние в enabled state enabled; } // Как видно данная функция имеет такое же имя и структуру, как вышеуказанная // только вызывается она при состоянии disabled public enableHam() <disabled> { // Если текущее состояние = disabled, то выполняем действия // Включаем forward - HamHookSpawn EnableHamForward(HamHookSpawn); // Выставляем текущее состояние в enabled state enabled; } // Вызывается при состоянии enabled, но никакой код выполняться не будет // Что-то вроде "заглушки" для определенного состояния public enableHam() <enabled> {} // Вызывается при состоянии unregistered или disabled public disableHam() <unregistered, disabled> {} public disableHam() <enabled> { // Если текущее состояние = enabled, то выполняем действия // Убираем forward - HamHookSpawn DisableHamForward(HamHookSpawn); // Выставляем текущее состояние в disabled state disabled; } // Функция, которая вызывается при появлении игрока public playerSpawn(id) { // код функции }
Имея данный код теперь мы можем использовать вызов enableHam() для включения forward на появления игрока и вызов disableHam() – для его выключения. Что же изменилось? Изменилось то, что нам не нужно в функциях enableHam и disableHam проверять существует ли указатель в переменной HamHookSpawn и текущее состояние forward (включен или выключен).
Упрощенная версия плагина:
#include <amxmodx> #include <hamsandwich> #define PLUGIN "Automaton" #define AUTHOR "Albernaz o Carniceiro Demoniaco" #define VERSION "1.0" new HamHook:HamHookSpawn public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) state unregistered; } public enableHam() <unregistered> state (HamHookSpawn = RegisterHam(Ham_Spawn,"player","playerSpawn") ) enabled; public enableHam() <disabled> state (EnableHamForward(HamHookSpawn)) enabled; public disableHam() <enabled> state (!DisableHamForward(HamHookSpawn)) disabled; public enableHam() <> {} public disableHam() <> {} public playerSpawn(id) { // код функции }
А теперь debug версия плагина для отладки его работы:
#include <amxmodx> #include <hamsandwich> #define PLUGIN "Automaton" #define AUTHOR "Albernaz o Carniceiro Demoniaco" #define VERSION "1.0" new HamHook:HamHookSpawn public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_clcmd("enable","enable"); register_clcmd("disable","disable"); state unregistered; } public enable() { enableHam() return PLUGIN_HANDLED; } public disable() { disableHam() return PLUGIN_HANDLED; } public enableHam() <unregistered> { HamHookSpawn = RegisterHam(Ham_Spawn,"player","playerSpawn"); state enabled server_print("Registering"); } public enableHam() <disabled> { EnableHamForward(HamHookSpawn); state enabled; server_print("Enabling"); } public disableHam() <enabled> { DisableHamForward(HamHookSpawn); state disabled; server_print("Disabling"); } public enableHam() <> { server_print("Already enabled"); } public disableHam() <> { server_print("Already disabled"); } public playerSpawn(id) { // код функции }
Результаты работы debug версии плагина через консоль сервера:
] enable Registering ] enable Already enabled ] disable Disabling ] disable Already disabled ] enable Enabling ] enable Already enabled
Пояснение статусов:
Registering – первичная регистрация и включение
Disabling – выключение
Enabling – включение
Already enabled – уже включен
Already disabled – уже выключен
Перевод оригинала: http://amx-x.ru/viewtopic.php?f=9&t=2025
Sorry, the comment form is closed at this time.