enderalse/scripts/source/_00e_fortadbalorleverscript.psc
2021-10-06 00:59:59 +02:00

84 lines
2.3 KiB
Plaintext

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
Utility.Wait(0.1)
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"
Utility.Wait(0.1)
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