150 lines
4.3 KiB
Plaintext
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} |