z-Hunter Опубликовано 19 марта, 2010 Жалоба Поделиться Опубликовано 19 марта, 2010 (изменено) Как сделать такую дверь (не телепорт), которая бы будучи отперта и открыта игроком, через заданный интервал сама бы закрывалась и запиралась? P.S. В MSFD сказано, что переменная OnActivate не работает на дверях. Проверил и обнаружил что нет, всё в порядке, работает. Изменено 19 марта, 2010 пользователем z-Hunter Ссылка на комментарий Поделиться на другие сайты Поделиться
Цернон Опубликовано 19 марта, 2010 Жалоба Поделиться Опубликовано 19 марта, 2010 Это не сложно.Вот мой скрипт: Begin DWRVscript If ( OnActivate == 1 ) Activate lock 100 endif End правда он для сундука и потому запирает его сразу, но ты можешь добавить таймери чтобы дверь именно закрывалась добавь rotate z -90 (любая дверь при открывании разворачивается на +90) Ссылка на комментарий Поделиться на другие сайты Поделиться
Siberian Crab Опубликовано 19 марта, 2010 Жалоба Поделиться Опубликовано 19 марта, 2010 (изменено) Можно посмотреть скрипт на рычаге, открывающем двери Арктанда. Примерно вот что получилось (не тестил): begin A_doorfloat timershort start if ( MenuMode == 1 ) return ;don't run time in Menu Mode. Very bad.endif if ( OnActivate == 1) if ( start == 0 ) set start to 1 Activate endif returnendif if ( start == 0 ) returnendif if ( timer > 14 );дверь закрывается через 14 секунд - можно поменять if ( start == 1 ) Дверь->Rotate Z -90 lock 100 ;тут не уверен. Может лучше так: Дверь->lock 100 endifendif if ( timer > 15 ) set start to 0 set timer to 0endif set timer to ( timer + GetSecondsPassed ) end A_door Изменено 19 марта, 2010 пользователем Colt17 Ссылка на комментарий Поделиться на другие сайты Поделиться
Kane Опубликовано 19 марта, 2010 Жалоба Поделиться Опубликовано 19 марта, 2010 Я бы еще добавил в скрипт двери Арктанда дистанцию. А то дверь закрывающиеся прямо перед носом как-то не кашерно. Переменную дистанции надеюсь знают все. Ссылка на комментарий Поделиться на другие сайты Поделиться
Цернон Опубликовано 19 марта, 2010 Жалоба Поделиться Опубликовано 19 марта, 2010 Можно посмотреть скрипт на рычаге, открывающем двери Арктанда. Примерно вот что получилось (не тестил): begin A_doorfloat timershort start if ( MenuMode == 1 ) return ;don't run time in Menu Mode. Very bad.endif if ( OnActivate == 1) if ( start == 0 ) set start to 1 Activate endif returnendif if ( start == 0 ) returnendif if ( timer > 14 );дверь закрывается через 14 секунд - можно поменять if ( start == 1 ) Дверь->Rotate Z -90 lock 100 ;тут не уверен. Может лучше так: Дверь->lock 100 endifendif if ( timer > 15 ) set start to 0 set timer to 0endif set timer to ( timer + GetSecondsPassed ) end A_door set timer to ( timer + GetSecondsPassed ) нужно поставить после активации, а то он начнет вообще отсчитывать время Ссылка на комментарий Поделиться на другие сайты Поделиться
bi-666 Опубликовано 19 марта, 2010 Жалоба Поделиться Опубликовано 19 марта, 2010 set timer to ( timer + GetSecondsPassed ) нужно поставить после активации, а то он начнет вообще отсчитывать времяПозволю не согласиться:begin A_door float timer short start [...] if ( OnActivate == 1) if ( start == 0 ) set start to 1 Activate endif return endif [...] if ( start == 0 ) return endif [...] set timer to ( timer + GetSecondsPassed ) end A_door Ссылка на комментарий Поделиться на другие сайты Поделиться
z-Hunter Опубликовано 20 марта, 2010 Автор Жалоба Поделиться Опубликовано 20 марта, 2010 Позволю не согласиться: А ветка с return действительно помогает сэкономить ресурсы? Ссылка на комментарий Поделиться на другие сайты Поделиться
Serg9408 Опубликовано 20 марта, 2010 Жалоба Поделиться Опубликовано 20 марта, 2010 Ну, на длинных скриптах - действительно. А тут она просто обрубает (пока мы не активируем объект) ту часть, которая должна выполняться только после активациии. Ссылка на комментарий Поделиться на другие сайты Поделиться
z-Hunter Опубликовано 21 марта, 2010 Автор Жалоба Поделиться Опубликовано 21 марта, 2010 (изменено) Вот какой скрипт у меня получился: Begin Zh_Autodoor_60 ; Самозапирающаяся дверь float Timer short State If ( GetLocked ) ; если дверь заперта if ( OnActivate ) ; то надо позволить её отпереть Activate set State to 1 endif return else ; если не заперта... if ( OnActivate ) ; ... и при этом была активирована: Activate ; активируем set Timer to 0 ; обнуляем таймер set State to ( State + 1 ) ; определяем текущее состояние двери - откр/закр if ( State > 2 ) set State to 1 endif return endif ;... а если не активировано: set Timer to ( Timer + GetSecondsPassed ) if ( Timer >= 7 ) ; дожидаемся таймера и... ;MessageBox "%g", State if ( State == 1 ) ; если дверь открыта Activate ; то закрываем её set State to 2 ; и готовим к запиранию set Timer to ( Timer - 0.7 ) ; через долю секунды else ; а если дверь уже закрыта (State == 2) PlaySound3D, "LockedChest" Lock, 60 ; то запираем её set State to 0 set Timer to 0 ; обнуляем таймер и состояние endif return endif endif End Эту дверь можно как и обычную взломать отмычкой или магией, но она всёравно потом сама закроется и запрётся. Если игрок до этого её закрыл сам, то она просто запрётся. Интересно, что если из секции If ( GetLocked ) убрать Activate, то один раз (самый первый) дверь всё же можно отпереть. Изменено 21 марта, 2010 пользователем z-Hunter Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти