Нужно объяснить что такое plugin_handled(_continue/_stop)

N

nightcore

Собственно, моя проблема понятна по названию темы. Я не понимаю, что будет происходить после return Plugin_Handled/return Plugin_Continue/return Plugin_Stop. То есть, не понимаю, что будет дальше происходить/какая часть кода будет выполняться, если указана та или иная команда(Не знаю как это правильно называется :D). Если расскажите с примерами, то буду очень-очень благодарен) Посмотрел на am, здесь посмотрел и что-то ничего не понял. Спасибо.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #2
PHP:
enum Action
{
 Plugin_Continue = 0, /**< Continue with the original action */
 Plugin_Changed = 1,  /**< Inputs or outputs have been overridden with new values */
 Plugin_Handled = 3,  /**< Handle the action at the end (don't call it) */
 Plugin_Stop = 4,  /**< Immediately stop the hook chain and handle the original */
};

Всё зависит от того, где это используется.
Например в повторяющемся таймере Plugin_Continue разрешит ему повторяться дальше, а Plugin_Stop остановит.
В событии получения урона (SDKHooks OnTakeDamage)
Plugin_Continue - разрешит нанесение урона с начальными значениями (как было(,
Plugin_Changed - разрешит нанесение урона но позволит изменить параметры (урон, атакера, оружие...)
Plugin_Handled и Plugin_Stop заблокируют урон
 

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,336
Я бы провел здесь параллель с получением печатей на мед. справку, после получения которых вы идете к глав. врачу (продолжение выполнения работы события, например). В данном случае роль врачей будут выполнять плагины, которые будут запрашивать это событие\команду. Цепочка, по которой вы будете получать печати на справку, может быть разной каждой раз (меняться порядок, в котором вы будете проходить врачей). Возвращаемое значение (Plugin_Handled, Plugin_Continue, т.д.) в данном случае будет означать то, что врач сделает со справкой. Если плагин всё устраивает и он ставит свою печать, он возвращает Plugin_Continue (продолжать дальше). Если плагин что-то изменил\дописал в вашей справке, он возвращает Plugin_Change, чтобы предупредить глав. врача, что были внесены изменения. Если справка вообще никак не нравится врачу и он понимает, что глав. врачу её видеть не надо (например, не нужно наносить урон игроку), плагин возвращает Plugin_Stop.
Если же в конце цепочки нет глав. врача (например, при регистрации команды), то последний плагин в цепочке обязан вернуть Plugin_Handled (последний плагин в такой цепочке как правило всегда известен, т.к. он и регистрирует команду), иначе игроку напишет в консоль, что такой команды нет. Так же часто Plugin_Stop и Plugin_Handled имеют одинаковый смысл, но для остановки работы скрипта всегда лучше вернуть Plugin_Stop, т.к. у него выше приоритет.
А в целом это лишь числа 0, 1, 2, 3. Описанный мной пример выше будет верным для части встроенных событий в игре, а вот для плагинов всё может быть иначе. Часто используют лишь два возвращаемых значения - Plugin_Continue когда всё хорошо (при этом он же будет означать и Plugin_Changed), и любое другое для остановки выполнения дальнейшего события (Plugin_Handled, Plugin_Changed, Plugin_Stop). Но важно ещё раз заметить, что если будет получен хоть один Plugin_Stop при вызове функции Call_Finish() (выполнении цепочки событий), то все последующие события не будут выполнены, поскольку врач отбирает справку и показывать следующим уже нечего (вас просто не примут).
 

ZirionNeft

Участник
Сообщения
188
Реакции
54
Спасибо, что разжевали. Всё понял =D
Тут на форуме есть что-то типа учебника, где все достаточно подробно, по моему мнению, описано. Советую почитать, там и по твоему вопросу материал имеется.
 
Сверху Снизу