Myxomop
Почетный форумчанин
- Регистрация
- 28 Май 2005
- Сообщения
- 3.239
- Благодарности
- 2.581
- Баллы
- 455
Решил переписать в отдельный развернутый урок, старый и частично поврежденный после переезда форума ответ.
Создание скриптовой зацикленной функции при помощи Trigger-Script (ZEN)
-----------------------------------
Зачем это нужно?
С помощью этой циклической связки скриптов игры и триггера мира (ZEN) можно в реальном времени отслеживать текущие параметры и состояния ГГ, ставить на них условия и возможные реакции, а также много чего другого.
Принцип действия.
После запуска игры (модификации) из скриптов игры вызывается триггер, расположенный в мире (ZEN) игры, который в свою очередь через установленный промежуток времени снова вызывает скриптовую функцию и выполняет все что в ней написано. И так по кругу, т.е. зациклено.
-----------------------------------
Работа в Spacer.
Создание скриптового триггера в Spacer.
Запускаем Spacer и грузим в него свой ZEN.
Входим в режим обзора (F3) и летим куда-нибудь в центр мира.
(Триггер можно разместить в ЛЮБОМ месте мира, например в небе, его все равно видно не будет.)
Выходим из режима обзора и заходим в панель Objects, выделяем вкладку Create.
Далее раскрываем: zCTriggerBase (abstract) -> zCTrigger и выделяем oCTriggerScript как на скриншоте ниже:
После этого на свободном пространстве мира жмем правой кнопкой мыши и в появившемся контекстном меню жмем на Insert[oCTriggerScript].
Если все получилось, панель Objects поменяет вкладку на Modify, в которой и будем настраивать наш свежесозданный Trigger-Script.
На данном скриншоте основные параметры обведены рамкой либо подчеркнуты, но в любом случае и остальные параметры лучше выставить также.
Рассмотрим более детально.
vobName: CYCLE_TRIGGER //Имя триггера.
Должно в точности соответствовать вызываемому триггеру из скриптовой функции B_CYCLE_FUNCTION, которая будет описана ниже.
ActivationFilter: //Фильтр срабатывания.
Поставить все значения в TRUE, иначе не будет работать, все остальные параметры в рамке тоже по скриншоту.
FireBehavior: //Скорость реакции
fireDelaySec:0.1 //Время ответа триггера для вызова скриптовой функции, т.е. время цикла, в данный момент 1/10 секунды.
sendUntrigger:TRUE
scriptFunc:B_CYCLE_FUNCTION //Собственно, сама вызываемая зацикленная функция, в скриптах может быть только типа void
После не забываем сохранить ZEN!
-----------------------------------
Работа со скриптами.
Создание функции, вызываемой триггером, можно разместить где-угодно, но не после startup.d
func void B_CYCLE_FUNCTION()
{
if(hero.attribute[ATR_HITPOINTS_MAX] == 0) //Проверка, загружен ли ГГ в мир игры. Если игра еще не загрузила ГГ в игру, значение максимальной жизни ГГ будет равно 0 и вызов триггера будет происходить до выполнения своих нужных функций. Это проверка необходима, т.к. если ГГ еще не загружен в игру и функция начнет полную отработку, возможен вылет из игры.
{
Wld_SendTrigger("CYCLE_TRIGGER"); //Вызов триггера c именем CYCLE_TRIGGER для зацикливания всей функции.
return; //Выход из функции.
};
//Если ГГ уже загружен в игру, дальше идет полная отработка цикла, куда можно вставлять множество своих нужных функций...
MyFunction1();
MyFunction2();
MyFunction3();
Wld_SendTrigger("CYCLE_TRIGGER"); //Вызов триггера c именем CYCLE_TRIGGER для зацикливания всей функции.
};
----
Запуск скриптовой функции из startup.d
func void init_world() //функция инициализации мира, срабатывает при каждой загрузке мира, в том числе из сохранения игры, где world является именем WORLD.ZEN.
{
B_CYCLE_FUNCTION(); //вызов описанной ранее скриптовой функции при инициализации мира.
};
Обновил скриншоты и немного дополнил комментарии для лучшего понимания работы цикла.
Создание скриптовой зацикленной функции при помощи Trigger-Script (ZEN)
-----------------------------------
Зачем это нужно?
С помощью этой циклической связки скриптов игры и триггера мира (ZEN) можно в реальном времени отслеживать текущие параметры и состояния ГГ, ставить на них условия и возможные реакции, а также много чего другого.
Принцип действия.
После запуска игры (модификации) из скриптов игры вызывается триггер, расположенный в мире (ZEN) игры, который в свою очередь через установленный промежуток времени снова вызывает скриптовую функцию и выполняет все что в ней написано. И так по кругу, т.е. зациклено.
-----------------------------------
Работа в Spacer.
Создание скриптового триггера в Spacer.
Запускаем Spacer и грузим в него свой ZEN.
Входим в режим обзора (F3) и летим куда-нибудь в центр мира.
(Триггер можно разместить в ЛЮБОМ месте мира, например в небе, его все равно видно не будет.)
Выходим из режима обзора и заходим в панель Objects, выделяем вкладку Create.
Далее раскрываем: zCTriggerBase (abstract) -> zCTrigger и выделяем oCTriggerScript как на скриншоте ниже:
После этого на свободном пространстве мира жмем правой кнопкой мыши и в появившемся контекстном меню жмем на Insert[oCTriggerScript].
Если все получилось, панель Objects поменяет вкладку на Modify, в которой и будем настраивать наш свежесозданный Trigger-Script.
На данном скриншоте основные параметры обведены рамкой либо подчеркнуты, но в любом случае и остальные параметры лучше выставить также.
Рассмотрим более детально.
vobName: CYCLE_TRIGGER //Имя триггера.
Должно в точности соответствовать вызываемому триггеру из скриптовой функции B_CYCLE_FUNCTION, которая будет описана ниже.
ActivationFilter: //Фильтр срабатывания.
Поставить все значения в TRUE, иначе не будет работать, все остальные параметры в рамке тоже по скриншоту.
FireBehavior: //Скорость реакции
fireDelaySec:0.1 //Время ответа триггера для вызова скриптовой функции, т.е. время цикла, в данный момент 1/10 секунды.
sendUntrigger:TRUE
scriptFunc:B_CYCLE_FUNCTION //Собственно, сама вызываемая зацикленная функция, в скриптах может быть только типа void
После не забываем сохранить ZEN!
-----------------------------------
Работа со скриптами.
Создание функции, вызываемой триггером, можно разместить где-угодно, но не после startup.d
func void B_CYCLE_FUNCTION()
{
if(hero.attribute[ATR_HITPOINTS_MAX] == 0) //Проверка, загружен ли ГГ в мир игры. Если игра еще не загрузила ГГ в игру, значение максимальной жизни ГГ будет равно 0 и вызов триггера будет происходить до выполнения своих нужных функций. Это проверка необходима, т.к. если ГГ еще не загружен в игру и функция начнет полную отработку, возможен вылет из игры.
{
Wld_SendTrigger("CYCLE_TRIGGER"); //Вызов триггера c именем CYCLE_TRIGGER для зацикливания всей функции.
return; //Выход из функции.
};
//Если ГГ уже загружен в игру, дальше идет полная отработка цикла, куда можно вставлять множество своих нужных функций...
MyFunction1();
MyFunction2();
MyFunction3();
Wld_SendTrigger("CYCLE_TRIGGER"); //Вызов триггера c именем CYCLE_TRIGGER для зацикливания всей функции.
};
----
Запуск скриптовой функции из startup.d
func void init_world() //функция инициализации мира, срабатывает при каждой загрузке мира, в том числе из сохранения игры, где world является именем WORLD.ZEN.
{
B_CYCLE_FUNCTION(); //вызов описанной ранее скриптовой функции при инициализации мира.
};
Обновил скриншоты и немного дополнил комментарии для лучшего понимания работы цикла.
Последнее редактирование модератором: