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

Динамические состояния (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)

Сообщение nato » 18 июн 2014, 11:32

Народ я вот думаю возможно ли сделать через state чтобы какой-нибудь форвард или функцию включать/выключать для определенного игрока ? т.е. допустим форвард я отключаю для игрока под номером 5, а для остальных игроков он работает. Поделитесь вашими мыслями на этот счет.
Аватара пользователя
nato
 
Сообщения: 346
Зарегистрирован: 06 июл 2011, 17:45
Благодарил (а): 30 раз.
Поблагодарили: 91 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

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

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

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

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

Сообщение nato » 18 июн 2014, 14:04

Radius писал(а): это всего лишь состояния, они не отключают форварды.

Да, но мы ведь можем управлять состояниями как нам надо, а поскольку функции зависят от состояния, то и вызываться будут когда нам надо.

Radius писал(а): Отсюда следует что задача фильтрования по id ложится всецело на Вас. Если что-то непонятно, пишите.

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

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

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

nato,

[pawn]
  1. if (id == 5) return
[/pawn]
Аватара пользователя
Radius
 
Сообщения: 530
Зарегистрирован: 12 июн 2013, 12:15
Откуда: Казань
Забанен
Благодарил (а): 71 раз.
Поблагодарили: 369 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

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

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

Radius писал(а):nato,

[pawn]
  1. if (id == 5) return
[/pawn]

Это не то что я хочу. У меня такие мысли: ловим заход игрока на сервер (putinserver) и создаем для данного игрока (допустим у игрока id == 5) свой state с названием к примеру player5 и так для каждого игрока свой state. Далее надо подумать чтобы функции форвардов вызывались для определенных state. В общем у меня сейчас каша в голове
Аватара пользователя
nato
 
Сообщения: 346
Зарегистрирован: 06 июл 2011, 17:45
Благодарил (а): 30 раз.
Поблагодарили: 91 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

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

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

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

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

Сообщение Mistrick » 18 июн 2014, 14:29

nato, плохой метод, делайте контроль либо до вызова форварда, либо в функции форварда.
Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2940
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1247 раз.
Языки программирования: PAWN
С/С++(few above zero)

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

Сообщение nato » 18 июн 2014, 14:43

Можно конечно по наставлять проверок в самих функциях, но это будет жрать ресурсы особенно если функция вызывается часто да еще если куча этих проверок и тяжелый мод вроде ZP, а так к примеру если игрок зомби (как условие), то для него отключаются определенные форварды/функции т.е. точнее будут вызываться, но там будет функция с заглушкой (пустота)
[pawn]
  1. public function(...) {}
[/pawn]
Аватара пользователя
nato
 
Сообщения: 346
Зарегистрирован: 06 июл 2011, 17:45
Благодарил (а): 30 раз.
Поблагодарили: 91 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

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

Сообщение Mistrick » 18 июн 2014, 14:45

nato, по мне вы хотите сделать дичайший быдлокод, а мы вам еще и помочь должны.
Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2940
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1247 раз.
Языки программирования: PAWN
С/С++(few above zero)

След.

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

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

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