Перевод и редактирование: 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 - уже выключен