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

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

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

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


Перейти к форуму:


Пользователи, просматривающие эту тему: 2 Гость(ей)