Город Джунов

Полная версия: Многократное использование рычагов
Вы просматриваете упрощённую версию нашего контента. Просмотр полной версии с полным форматированием.
Делаю свой мод. И в одном из квестов мне понадобилось сделать многократное использование рычагов ( в моём случае дверей ). Разбирался с 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)
)

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

Если тебе просто нужна дверь, которую можно открывать/закрывать, то в скрипте тебе ничего писать не надо, тебе надо только настроить саму дверь (собственно прописать ей 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() надо только тогда, когда ты хочешь из скрипта автоматически "переключить" состояние рычага. Поднять/опустить мост, например. Или открыть/закрыть дверь, как в этом примере.
Цитата:Так ты тут сделал рекурсивное автоматическое цикличное открывание-закрывание без участия игрока %)
Ну вообще-то дверь даже не шелохнётся без использования её игроком. Команда EnableLever делает рычаг доступным для повторного использования. Она бы постоянно хлопала только если бы я использовал команду SetLeverState.

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