Город Джунов
Многократное использование рычагов - Версия для печати

+- Город Джунов (https://www.gipat.ru/forum)
+-- Форум Обсуждение Проклятых Земель (https://www.gipat.ru/forum/forum-19.html)
+--- Форум MODный форум (https://www.gipat.ru/forum/forum-9.html)
+--- Темы: Многократное использование рычагов (/thread-3314.html)



Многократное использование рычагов - Devastator - 23.09.2009

Делаю свой мод. И в одном из квестов мне понадобилось сделать многократное использование рычагов ( в моём случае дверей ). Разбирался с Mob'Surgeon и с Mob Reversing Tool и в результате удалось реализовать это следующим образом:
В Mob Reversing Tool в разделе Lever на этот рычаг в параметре ID LEVER IS CYCLED установил значение 1( без этого после активации двери её можно было использовать, но при этом она не закрывалась).
В мобе прописал скрипт:

GlobalVars (
NULL : object,
VSS#i#val : object,
i : object,
Door : object
)

Script Door
(
if
(
IsEqual( GetLeverState( Dооr ) , 1 )
)
then
(
KillScript( )
EnableLever( GetObjectByID( "ID" ) , 1 )
Door#1#1( this )
)
)

Script Door#1#1
(
if
(
IsEqual( GetLeverState( Door ) , 0 )
)
then
(
KillScript( )
EnableLever( GetObjectByID( "ID" ) , 1 )
Door( this )
)
)

World Script(
Sleep(2)
Door = GetObjectByID( "ID" )
Door(NULL)
)

Всё бы хорошо но при этом дважды проигрывается звук открытиязакрытия двери.
Уважаемые может подскажете как сделать что бы звук проигрывался по одному разу.


Многократное использование рычагов - ALtair - 25.09.2009

Так ты тут сделал рекурсивное автоматическое цикличное открывание-закрывание без участия игрока %)

Если тебе просто нужна дверь, которую можно открывать/закрывать, то в скрипте тебе ничего писать не надо, тебе надо только настроить саму дверь (собственно прописать ей ID LEVER IS CYCLED = 1). Далее, если ты хочешь навесить на открытие/закрытие какие-то события, то делай так:
Код:
Script CheckDoor
(
 if
 (
   IsEqual(GetLeverState(Door), 1)
 )
 then
 (
   KillScript()
   DoSomethingOnDoorOpened()
 )
 if
 (
   IsEqual(GetLeverState(Door), 0)
 )
 then
 (
   KillScript()
   DoSomethingOnDoorClosed()
 )
)

Соответственно в обработчиках DoSomethingOnDoor[Opened/Closed]() можешь написать чо угодно. Однако там же прям переключать состояния этой же двери я бы крайне не рекомендовал. Пусть переключением занимается игрок, а не скрипт. Использовать SetLeverState() надо только тогда, когда ты хочешь из скрипта автоматически "переключить" состояние рычага. Поднять/опустить мост, например. Или открыть/закрыть дверь, как в этом примере.


Многократное использование рычагов - Devastator - 25.09.2009

Цитата:Так ты тут сделал рекурсивное автоматическое цикличное открывание-закрывание без участия игрока %)
Ну вообще-то дверь даже не шелохнётся без использования её игроком. Команда EnableLever делает рычаг доступным для повторного использования. Она бы постоянно хлопала только если бы я использовал команду SetLeverState.

А вообще Altair спасибо за совет. Дело в том, что если поставить лишь ID LEVER IS CYCLED = 1, то при попытке закрыть дверь курсор использования даже не появляется. Именно по этому я добавил данный скрипт. А проверку на состояние открытиязакрытия двери я осуществлял другим скриптом и там всё понятно.
Попробуй сам зациклить рычаг если не веришь.


Многократное использование рычагов - ALtair - 26.09.2009

Да, сорри, я перепутал EnableLever со SwitchLever. Флажок IsCycled говорит о том, что рычаг этот будет переключаться в начальное состояние при его использовании в случае, когда он уже находится в конечном. При ЛЮБОМ УСПЕШНОМ использовании рычага, он выключается (вызывается аналог EnableLever(LeverObject, 0)), поэтому его постоянно надо включать, да.
А по поводу звука - это глюки такие в движке. На любое изменение своего состояния (в том числе и enabled/disabled) рычаг может (даже должен) проиграть звук. С этим ниче не поделаешь %)