May 152013
 

Случайно наткнулся на старенькую статью, но решил что она всё же достойна внимания.

Автор: 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.