Русское сообщество по скриптингу

Динамические состояния (state)

Статьи или фрагменты кода для новичков и уже опытных скриптеров по AMXX.

Модератор: Chuvi

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только обучающему материалу по AMX Mod X.

Динамические состояния (state)

Сообщение DJ_WEST » 26 ноя 2010, 15:37

Автор: 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 - уже выключен
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Динамические состояния (state)

Сообщение Radius » 18 июн 2014, 16:16

nato, здесь id используется для определения класса entity. Это значит что форвард будет вызываться для всех игроков, так как они все принадлежат к классу player. Читайте описания функций в include там все написано.
Аватара пользователя
Radius
 
Сообщения: 530
Зарегистрирован: 12 июн 2013, 12:15
Откуда: Казань
Забанен
Благодарил (а): 71 раз.
Поблагодарили: 369 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Динамические состояния (state)

Сообщение nato » 18 июн 2014, 16:24

Radius писал(а):nato, здесь id используется для определения класса entity. Это значит что форвард будет вызываться для всех игроков, так как они все принадлежат к классу player. Читайте описания функций в include там все написано.

Совсем ступил. Давно не занимался кодингом
Аватара пользователя
nato
 
Сообщения: 346
Зарегистрирован: 06 июл 2011, 17:45
Благодарил (а): 30 раз.
Поблагодарили: 91 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Пред.

Вернуться в Статьи / фрагменты кода

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11