Event override/ru

From Dragon Age Toolset Wiki
Jump to: navigation, search
Подмена обработки событий
Начало / Русская DA Builder Wiki / Поделиться ВКонтакте
Скрипты
все статьи категории
описание функций

Как подменить(переопределить) обработку события?

Посредством скрипта

Самый безопасный и распространённый способ подмены обработки события, это написание скрипта для объекта, обработку событий которого вы хотите подменить. Этот скрипт используется для обработки определённого события с последующей передачей события основному скрипту.

Для примера, если в вашем модуле есть существо по имени "Death Tyrant", которое должно реагировать определённым способом на получаемое им событие EVENT_TYPE_DEATH (en), вы можете написать скрипт "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 вы сможете глобализировать этот процесс, перехватывая и переопределяя больше событий в игре.

Создайте файл M2DA Таблица событий (en) - более подробную инструкцию смотрите Расширение игры с помощью M2DA (en):

Events.png

В данном случае я использую событие EVENT_TYPE_INVENTORY_ADDED (en) и обрабатываю его в определённом мною скрипте "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  • русский