2021-10-05 22:15:58 +00:00
|
|
|
Scriptname _00E_FortAdBalorLeverScript extends ObjectReference
|
|
|
|
|
|
|
|
Actor Property BossMage Auto
|
|
|
|
Actor Property PlayerRef Auto
|
|
|
|
NorPortcullisSCRIPT Property Door01 Auto
|
|
|
|
NorPortcullisSCRIPT Property Door02 Auto
|
|
|
|
ObjectReference Property EnterTrigger Auto
|
|
|
|
ObjectReference Property LeaveTrigger Auto
|
|
|
|
Bool bDoorsUpdateLocked = False
|
|
|
|
|
|
|
|
Event OnLoad()
|
|
|
|
SetDefaultState()
|
|
|
|
EndEvent
|
|
|
|
|
|
|
|
Event OnReset()
|
|
|
|
SetDefaultState()
|
|
|
|
EndEvent
|
|
|
|
|
|
|
|
;This has to be handled as a function, since OnLoad and OnReset can fire in either order, and we can't handle competing animation calls.
|
|
|
|
Function SetDefaultState()
|
|
|
|
bDoorsUpdateLocked = False
|
|
|
|
PlayAnimation("FullPull")
|
|
|
|
EndFunction
|
|
|
|
|
|
|
|
Function LockDoorsUpdate()
|
|
|
|
While bDoorsUpdateLocked
|
2021-10-05 22:59:59 +00:00
|
|
|
Utility.Wait(0.1)
|
2021-10-05 22:15:58 +00:00
|
|
|
EndWhile
|
|
|
|
bDoorsUpdateLocked = True
|
|
|
|
EndFunction
|
|
|
|
|
|
|
|
Function UnlockDoorsUpdate()
|
|
|
|
bDoorsUpdateLocked = False
|
|
|
|
EndFunction
|
|
|
|
|
|
|
|
Function OpenCloseDoors(Bool bOpen)
|
|
|
|
|
|
|
|
If bOpen != Door01.isAlreadyOpen
|
|
|
|
If bOpen
|
|
|
|
PlayAnimationAndWait("FullPush", "FullPushedUp")
|
|
|
|
Else
|
|
|
|
PlayAnimationAndWait("FullPull", "FullPulledDown")
|
|
|
|
EndIf
|
|
|
|
Door01.Activate(self)
|
|
|
|
Door02.Activate(self)
|
|
|
|
; Give some time for the busy state to kick in. The doors' animations take 3-4 secs anyway.
|
|
|
|
Utility.Wait(2.0)
|
|
|
|
While Door02.GetState() == "busy" || Door01.GetState() == "busy"
|
2021-10-05 22:59:59 +00:00
|
|
|
Utility.Wait(0.1)
|
2021-10-05 22:15:58 +00:00
|
|
|
EndWhile
|
|
|
|
EndIf
|
|
|
|
|
|
|
|
EndFunction
|
|
|
|
|
|
|
|
Event OnActivate(ObjectReference triggerRef)
|
|
|
|
If triggerRef == PlayerRef
|
|
|
|
; If the boss is dead (and nothing else is trying to open/close the doors ATM),
|
|
|
|
; the player can open/close the doors by interacting with the lever at the throne
|
|
|
|
If bDoorsUpdateLocked == False
|
|
|
|
LockDoorsUpdate()
|
|
|
|
If BossMage.IsDead()
|
|
|
|
OpenCloseDoors((Door01.isAlreadyOpen == False)) ; Invert the current open state of the doors
|
|
|
|
EndIf
|
|
|
|
UnlockDoorsUpdate()
|
|
|
|
EndIf
|
|
|
|
|
|
|
|
ElseIf triggerRef == BossMage || triggerRef == EnterTrigger
|
|
|
|
; Spring the trap, if the boss is alive
|
|
|
|
; Close the doors when the boss enters combat or the player enters the "enter" trigger
|
|
|
|
LockDoorsUpdate()
|
|
|
|
If BossMage.IsDead() == False
|
|
|
|
OpenCloseDoors(False)
|
|
|
|
EndIf
|
|
|
|
UnlockDoorsUpdate()
|
|
|
|
|
|
|
|
ElseIf triggerRef == LeaveTrigger
|
|
|
|
; Failsafe - open the doors if the player leaves or enters the "leave" trigger encasing the whole boss chamber
|
|
|
|
LockDoorsUpdate()
|
|
|
|
OpenCloseDoors(True)
|
|
|
|
UnlockDoorsUpdate()
|
|
|
|
|
|
|
|
EndIf
|
|
|
|
EndEvent
|