enderalse/source/scripts/defaultonenter.psc

150 lines
4.3 KiB
Plaintext

Scriptname defaultOnEnter extends ObjectReference Conditional
{script to test if one or more actors are in a trigger}
import game
import debug
ActorBase property TriggerActor1 auto
{actor that trigger is looking for - all non-empty trigger actors need to be in trigger in order for IsTriggerReady to be true
Update OnInit when adding new trigger properties!}
ActorBase property TriggerActor2 auto
{ref that trigger is looking for - all non-empty trigger actors need to be in trigger in order for stage to be set
Update OnInit when adding new trigger properties!}
ActorBase property TriggerActor3 auto
{ref that trigger is looking for - all non-empty trigger actors need to be in trigger in order for stage to be set
Update OnInit when adding new trigger properties!}
ActorBase property TriggerActor4 auto
{ref that trigger is looking for - all non-empty trigger actors need to be in trigger in order for stage to be set
Update OnInit when adding new trigger properties!}
ReferenceAlias property TriggerAlias1 auto
{ref ALIAS that trigger is looking for - all non-empty triggerRefs need to be in trigger in order for stage to be set
Update OnInit when adding new trigger properties!}
; etc. - add more as needed
bool property disableWhenDone = false auto
{ disable myself after I've been triggered. Defaults to false }
;total targets currently in the trigger
int targetCountCurrent
;how many targets are we looking for? When targetCountCurrent reaches this, we trigger
int targetCountTotal
Event OnInit()
; count my non-empty trigger properties
if TriggerActor1
targetCountTotal = targetCountTotal + 1
endif
if TriggerActor2
targetCountTotal = targetCountTotal + 1
endif
if TriggerActor3
targetCountTotal = targetCountTotal + 1
endif
if TriggerActor4
targetCountTotal = targetCountTotal + 1
endif
if TriggerAlias1
targetCountTotal = targetCountTotal + 1
endif
endEvent
auto STATE waiting
EVENT onTriggerEnter(objectReference triggerRef)
if CheckTriggerRef(triggerRef)
; increase ref count
modTargetCount(1)
; if all target refs are in the trigger, done
if bAllTargetsInTrigger
TriggerMe()
endif
endif
endEVENT
EVENT OnTriggerLeave(objectReference triggerRef)
if CheckTriggerRef(triggerRef)
; decrease ref count
modTargetCount(-1)
endif
endEvent
endSTATE
STATE hasBeenTriggered
; this is an empty state.
endSTATE
function modTargetCount(int modValue)
targetCountCurrent = targetCountCurrent + modValue
; failsafe - don't go below 0
if targetCountCurrent < 0
targetCountCurrent = 0
endif
; update bAllTargetsInTrigger
if targetCountCurrent >= targetCountTotal
bAllTargetsInTrigger = true
else
bAllTargetsInTrigger = false
endif
endFunction
int function GetCurrentTargetCount()
return targetCountCurrent
endFunction
int function GetTotalTargetCount()
return targetCountTotal
endFunction
bool function IsTriggerReady()
return ( GetCurrentTargetCount() >= GetTotalTargetCount() )
endfunction
bool function CheckTriggerRef(objectReference triggerRef)
; debug.trace(self + "CheckTriggerRef for " + triggerRef)
bool bSuccess = false
if triggerRef
Actor triggerActor = triggerRef as Actor
if triggerActor
; we have an actor, check if it matches any of our trigger actors
ActorBase triggerActorBase = triggerActor.GetActorBase()
; debug.trace(self + "CheckTriggerRef for " + triggerRef + ": actorbase=" + triggerActorBase)
if triggerActorBase == TriggerActor1 || triggerActorBase == TriggerActor2 || triggerActorBase == TriggerActor3 || triggerActorBase == TriggerActor4
; debug.trace(self + "CheckTriggerRef for " + triggerRef + ": MATCHED")
bSuccess = true
else
; debug.trace(self + "CheckTriggerRef for " + triggerRef + ": failed to match " + TriggerActor1 + ", " + TriggerActor2 + ", " + TriggerActor3 + ", " + TriggerActor4)
endif
endif
; if we haven't already found something, check aliases
if !bSuccess
if (TriggerAlias1 && triggerRef == TriggerAlias1.GetRef())
bSuccess = true
endif
endif
endif
return bSuccess
endFunction
; what happens when all my targets are in the trigger?
; override on subclass to change behavior
function TriggerMe()
if disableWhenDone
gotoState("hasBeenTriggered")
Disable()
endif
endFunction
bool Property bAllTargetsInTrigger = false Auto conditional
{true when all targets are in trigger}