Перейти к содержанию

Самозакрывающаяся дверь


Рекомендуемые сообщения

Как сделать такую дверь (не телепорт), которая бы будучи отперта и открыта игроком, через заданный интервал сама бы закрывалась и запиралась?

 

P.S. В MSFD сказано, что переменная OnActivate не работает на дверях. Проверил и обнаружил что нет, всё в порядке, работает.

Изменено пользователем z-Hunter
Ссылка на комментарий
Поделиться на другие сайты

Это не сложно.

Вот мой скрипт:

 

 

Begin DWRVscript

If ( OnActivate == 1 )

Activate

lock 100

endif

End

 

правда он для сундука и потому запирает его сразу, но ты можешь добавить таймер

и чтобы дверь именно закрывалась добавь rotate z -90 (любая дверь при открывании разворачивается на +90)

Ссылка на комментарий
Поделиться на другие сайты

Можно посмотреть скрипт на рычаге, открывающем двери Арктанда. Примерно вот что получилось (не тестил):

 

 

 

begin A_door

float timer

short 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

return

endif

 

if ( start == 0 )

return

endif

 

if ( timer > 14 )

;дверь закрывается через 14 секунд - можно поменять

if ( start == 1 )

Дверь->Rotate Z -90

lock 100

;тут не уверен. Может лучше так: Дверь->lock 100

endif

endif

 

if ( timer > 15 )

set start to 0

set timer to 0

endif

 

set timer to ( timer + GetSecondsPassed )

 

end A_door

 

Изменено пользователем Colt17
Ссылка на комментарий
Поделиться на другие сайты

Я бы еще добавил в скрипт двери Арктанда дистанцию. А то дверь закрывающиеся прямо перед носом как-то не кашерно. Переменную дистанции надеюсь знают все.
Ссылка на комментарий
Поделиться на другие сайты

Можно посмотреть скрипт на рычаге, открывающем двери Арктанда. Примерно вот что получилось (не тестил):

 

 

 

begin A_door

float timer

short 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

return

endif

 

if ( start == 0 )

return

endif

 

if ( timer > 14 )

;дверь закрывается через 14 секунд - можно поменять

if ( start == 1 )

Дверь->Rotate Z -90

lock 100

;тут не уверен. Может лучше так: Дверь->lock 100

endif

endif

 

if ( timer > 15 )

set start to 0

set timer to 0

endif

 

set timer to ( timer + GetSecondsPassed )

 

end A_door

 

set timer to ( timer + GetSecondsPassed ) нужно поставить после активации, а то он начнет вообще отсчитывать время

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

Ну, на длинных скриптах - действительно. А тут она просто обрубает (пока мы не активируем объект) ту часть, которая должна выполняться только после активациии.
Ссылка на комментарий
Поделиться на другие сайты

Вот какой скрипт у меня получился:

 

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, то один раз (самый первый) дверь всё же можно отпереть.

Изменено пользователем z-Hunter
Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...