Event override/ru
Scripting |
---|
|
Как подменить(переопределить) обработку события?
Посредством скрипта
Самый безопасный и распространённый способ подмены обработки события, это написание скрипта для объекта, обработку событий которого вы хотите подменить. Этот скрипт используется для обработки определённого события с последующей передачей события основному скрипту.
Для примера, если в вашем модуле есть существо по имени "Death Tyrant", которое должно реагировать определённым способом на получаемое им событие EVENT_TYPE_DEATH, вы можете написать скрипт "death_tyrant_events" со следующим содержанием:
#include "utility_h" #include "wrappers_h" #include "events_h" void main() { event ev = GetCurrentEvent(); int nEventType = GetEventType(ev); string sDebug; object oPC = GetHero(); object oParty = GetParty(oPC); int nEventHandled = FALSE; switch(nEventType) { case EVENT_TYPE_DEATH: { ... nEventHandled = TRUE; //Установите значение в TRUE, если обработка этого события больше не нужна break; } } if (!nEventHandled) //Если событие ещё нуждается в обработке, переправляем его основному скрипту { HandleEvent(ev, RESOURCE_SCRIPT_CREATURE_CORE); } }
Далее назначаем его скриптом для нашего существа. Теперь, когда игра посылает нашему существу событие, оно сначала обрабатывается этим скриптом, и в случае, если событие не является EVENT_TYPE_DEATH, передаётся на обработку исходному скрипту обработки событий. Событие же EVENT_TYPE_DEATH перехватывается нашим скриптом и обрабатывается.
С помощью Events 2DA
C помощью 2DA вы сможете глобализировать этот процесс, перехватывая и переопределяя все события в игре.
Создайте файл Events M2DA - более подробную инструкцию смотрите Расширение игры с помощью M2DA:
В данном случае я использую событие "EVENT_TYPE_INVENTORY_ADDED" и обрабатываю его в определённом мною скрипте "my_event_override".
Теперь вы можете обрабатывать события, как вам будет угодно.
Для примера, каждый раз, когда мне в инвентарь что-либо попадает, я хочу увидеть над головой своего перса всплывающее сообщение о том, что же мне туда попало:
// --- script start --- // file: my_event_override.nss // author: Pheelon #include "utility_h" #include "wrappers_h" #include "events_h" void main() { event ev = GetCurrentEvent(); int nEvent = GetEventType(ev); object oOwner = GetEventCreator(ev); switch (nEvent) { case EVENT_TYPE_INVENTORY_ADDED: { object oItem = GetEventObject(ev, 0); if (IsPartyMember(oOwner)) // показывается только если предмет попадает в инвентарь игрока { DisplayFloatyMessage(oOwner, GetName(oItem) + " added", FLOATY_MESSAGE, 14654488, 10.0); } //Непосредственно событие мы здесь не обрабатывали, просто показали всплывающее сообщение, поэтому надо перенаправить событие дальше, в исходный скрипт HandleEvent(ev); // с помощью этой функции мы и перенаправим наше событие дальше break; } } } // --- script end ---
Язык: | English • русский |
---|