enderalse/source/scripts/traptriggerbase.psc

396 lines
12 KiB
Plaintext

scriptName TrapTriggerBASE extends objectReference hidden
;
;
;This is the base trap trigger script and handles what the trigger tells the trap
;Any trigger should be useable with any trap
;Activation params are on the trigger, toggle, number of times it can be triggered, etc.
;Trap params are on the trap (damage, timing, etc)
;Some triggers will be extended from this base to handle animation, etc.
;================================================================
import debug
int Count ;if Finite = 1, Determines how many times this trigger can be used
int property CountUsed auto hidden ;Used to compare times triggered to max triggers allowed
int property Type auto hidden ;This is to determine trigger to send to the trap
;The trap will handle its behavior based on this signal
;0 = Single - fire the trap once do one time
;1 = Hold - on entry turn on, on exit turn off
;2 = Toggle - on entry or use toggle trap state
;3 = Turn On - on entry or use turn on trap
;4 = Turn Off - on entry or use turn off trap
sound property TriggerSound auto
objectReference property lastTriggerRef auto hidden
int property soundLevel = 10 auto
int objInTriggerVar
int property objectsInTrigger hidden
function set(int value)
objInTriggerVar = value
;TraceStack("Setting objectsInTrigger to " + value)
endFunction
int function get()
return objInTriggerVar
endFunction
endProperty
faction property owningFaction Auto
actorBase property owningActorBase Auto
bool property doOnceBase = False auto hidden
bool property playerOnlyTrigger = false auto
bool property checkForLightFootPerk = false Auto
{Setting this will give a chance that the trap trigger will not Fire
this does not work on triggers with the HOLD trigger type
Set on by default on all pressure plates
you should only mess with this locally for triggerboxes}
bool property checkForLightHandsPerk = false Auto
{Setting this will give a chance that the trap trigger will not Fire when lockpicked
this is used specifically for hinge triggers or other things like that
set to on by default on the hinge trigger}
perk property lightFootPerk Auto
globalVariable property LightFootGlobalVar auto
perk property lightHandsPerk Auto
globalVariable property LightHandsGlobalVar auto
bool property blockActivate = false Auto
{block activation of this by the player, only used for trapLinker
default = False}
bool property FiniteUse auto
{If true this has a finite number of uses as defined by the TriggerCount, and then will not fire}
bool property isTriggerVolume = False auto
{This property is used to tell the trap trigger if it is a trigger volume
if true, on cell attach it will try to check if there are object in the trigger and go to state inactive if not
This should be turned to TRUE for pressure plates & triggerboxes
default = false}
int property TriggerCount
{the number of times this Trigger can fire, only used if FiniteUse is True}
int Function Get()
return Count
endFunction
Function Set (int value)
if (value >= 1 && value <= 100)
Count = Value
else
Count = 1
endif
endFunction
endProperty
int property TriggerType
{This property determines how the trigger will tell the trap to fire
0 = Single Fire
1 = Hold
2 = Toggle
3 = Turn On
4 = Turn Off}
int Function Get()
return Type
endFunction
Function Set (int value)
if (value >= 0 && value <= 4)
Type = value
StoredTriggerType = Value
else
Type = 0
StoredTriggerType = 0
endif
endFunction
endProperty
int property StoredTriggerType auto Hidden
{this stores what the triggerType was set to on the Ref
used for trapLinker in case of activation by non trapTriggerBase ref}
event onCellAttach()
if self.GetFactionOwner()
owningFaction = self.GetFactionOwner()
ElseIf self.GetActorOwner()
owningActorBase = (self.GetActorOwner() as actorBase)
endif
if blockActivate
self.blockActivation(true)
endif
;/
if !doOnceBase
StoredTriggerType = TriggerType
doOnceBase = True
endif
/;
endEvent
Event onCellLoad()
objectsInTrigger = self.GetTriggerObjectCount()
if isTriggerVolume && objectsInTrigger == 0
goToState ("Inactive")
endif
endEvent
;USSEP 4.2.2 Bug #28300
Event OnCellDetach()
lastTriggerRef = None
endEvent
;THIS SECTION IS USED FOR TRAP LINKERS
event onActivate(objectReference akActivator)
; debug.Trace(self + " has been activated by + " + akActivator)
; debug.Trace(self + ": Type = " + Type + ", StoredTriggerType = " + StoredTriggerType)
if blockActivate && akActivator != (self as objectReference)
if (akActivator as trapTriggerBase)
; debug.Trace(akActivator + " was able to be cast as trapTriggerBase")
; debug.Trace(self + " triggerType was " + triggerType)
TriggerType = (akActivator as trapTriggerBase).TriggerType
; debug.Trace(self + " triggerType is now " + triggerType)
else
; debug.Trace(akActivator + " was NOT able to be cast as trapTriggerBase")
triggerType = StoredTriggerType
endif
if blockActivate
self.blockActivation(false)
utility.wait(0.0)
localActivateFunction()
self.Activate(self)
self.blockActivation(true)
endif
endif
endEvent
;================================================================
auto State Inactive
event onBeginState()
; debug.Trace(self + ": is calling onBeginState Inactive")
; debug.Trace(self + ": StoredTriggerType = " + StoredTriggerType + ", objectsInTrigger = " + objectsInTrigger)
if (StoredTriggerType == 1 && objectsInTrigger == 0) ;type 1 = hold, so deprecate here if necessary
if (FiniteUse == TRUE && CountUsed < Count);if finite use and count > count used
CountUsed += 1 ;increase count for hold type triggers
endif
Type = 4
utility.wait(0.1)
activate(self as objectReference)
utility.wait(0.1)
;Type = 1
else
; debug.Trace(self + "StoredTriggerType = " + StoredTriggerType + ", ObjectsInTrigger = " + objectsInTrigger)
endif
endEvent
event OnTriggerEnter (objectReference triggerRef)
if acceptableTrigger(triggerRef)
; debug.Trace(self + " has been entered by " + triggerRef)
lastTriggerRef = triggerRef
objectsInTrigger = self.GetTriggerObjectCount()
if (FiniteUse == TRUE && CountUsed < Count) ;if finite use and count > count used
;TRACE("Finite Use")
if (Type != 1) ;type 1 = hold so only increase on leave
CountUsed += 1 ;increase count used
;TRACE("Increasing Count on enter")
endif
goToState( "Active" )
endif
if (FiniteUse == FALSE)
;TRACE("Infinite Use")
goToState( "Active" )
endif
endif
endevent
event OnTriggerLeave (objectReference triggerRef)
if acceptableTrigger(triggerRef)
; debug.Trace(self + " has been exited by " + triggerRef)
lastTriggerRef = triggerRef
objectsInTrigger = self.GetTriggerObjectCount()
; debug.Trace(self + ": StoredTriggerType = " + StoredTriggerType + ", objectsInTrigger = " + objectsInTrigger)
if (StoredTriggerType == 1 && objectsInTrigger == 0) ;type 1 = hold, so deprecate here if necessary
if (FiniteUse == TRUE && CountUsed < Count);if finite use and count > count used
CountUsed += 1 ;increase count for hold type triggers
endif
Type = 4
utility.wait(0.1)
activate(self as objectReference)
utility.wait(0.1)
;Type = 1
endif
endif
endevent
endstate
State Active
Event onBeginState()
; debug.Trace(self + ": is calling onBeginState Active")
; debug.Trace(self + ": StoredTriggerType = " + StoredTriggerType + ", objectsInTrigger = " + objectsInTrigger)
if (StoredTriggerType == 1)
Type = 3
utility.wait(0.1)
activate(self as objectReference)
utility.wait(0.1)
;Type = 1
else
activate(self as objectReference)
endif
if objectsInTrigger == 0
goToState( "Inactive" )
endif
endEvent
event OnTriggerEnter( objectReference triggerRef )
if acceptableTrigger(triggerRef)
; debug.Trace(self + " has been entered by " + triggerRef)
objectsInTrigger = self.GetTriggerObjectCount()
endif
endEvent
event OnTriggerLeave( objectReference triggerRef )
if acceptableTrigger(triggerRef)
; debug.Trace(self + " has been exited by " + triggerRef)
objectsInTrigger = self.GetTriggerObjectCount()
if objectsInTrigger == 0
goToState ("Inactive")
endif
endif
endEvent
event OnMagicEffectApply(objectReference akCaster, MagicEffect akEffect)
;Trace("MagicEffectHit")
activate(self as objectReference)
goToState( "Inactive" )
endEvent
endState
;The following function is used to filter for acceptable objects to trigger this
;if it is player only, then ONLY the player will trigger it and nothing else, including projectiles
;if there is an owning faction and it is not player only then everything BUT actors
;that are part of that owning faction will trigger it
bool function acceptableTrigger(objectReference triggerRef)
; debug.Trace(self + " is checking if " + triggerRef + " is an acceptable trigger")
if playerOnlyTrigger
if triggerRef == game.getPlayer()
; debug.Trace(self + " has found that " + triggerRef + " is an acceptable trigger")
if checkPerks(triggerRef)
Return True
Else
Return False
endif
Else
; debug.Trace(self + " has found that " + triggerRef + " is not an acceptable trigger")
return False
endif
Else
if !(triggerRef as actor) ;if this is not a player only trigger and this is not an actor
return True
elseif owningFaction
if (triggerRef as actor).IsInFaction(owningFaction)
; debug.Trace(self + " has found that " + triggerRef + " is not an acceptable trigger")
return False
else
; debug.Trace(self + " has found that " + triggerRef + " is an acceptable trigger")
if checkPerks(triggerRef)
Return True
Else
Return False
endif
endif
else
if owningActorBase
if (triggerRef as actor).getActorBase() == owningActorBase
; debug.Trace(self + " has found that " + triggerRef + " is not an acceptable trigger")
return False
Else
; debug.Trace(self + " has found that " + triggerRef + " is an acceptable trigger")
if checkPerks(triggerRef)
Return True
Else
Return False
endif
endif
else
; debug.Trace(self + " has found that " + triggerRef + " is an acceptable trigger")
if checkPerks(triggerRef)
Return True
Else
Return False
endif
endif
endif
endif
endFunction
Bool function checkPerks(objectReference triggerRef)
if checkForLightFootPerk
; debug.Trace(self + " is checking if " + triggerRef + " has LightFoot Perk")
if (triggerRef as actor).hasPerk(lightFootPerk)
; debug.Trace(self + " has found that " + triggerRef + " has LightFoot Perk")
if utility.randomFloat(0.0,100.00) <= LightFootGlobalVar.getValue()
; debug.Trace(self + " is returning false due to failed lightfoot roll")
return False
else
; debug.Trace(self + " is returning true due to successful lightfoot roll")
return True
endif
Else
; debug.Trace(self + " has found that " + triggerRef + " doesn't have the LightFoot Perk")
Return True
EndIf
elseif checkForLightHandsPerk
; debug.Trace(self + " is checking if " + triggerRef + " has LightHands Perk")
if (triggerRef as actor).hasPerk(lightHandsPerk)
; debug.Trace(self + " has found that " + triggerRef + " has LightFoot Perk")
if utility.randomFloat(0.0,100.00) <= LightHandsGlobalVar.getValue()
; debug.Trace(self + " is returning false due to failed lightHands roll")
return False
else
; debug.Trace(self + " is returning true due to successful lightHands roll")
return True
endif
Else
; debug.Trace(self + " has found that " + triggerRef + " doesn't have the LightFoot Perk")
Return True
EndIf
Else
; debug.Trace(self + " has found that " + triggerRef + " doesn't have applicable perks")
return True
EndIf
endFunction
function localActivateFunction() ;placeholder function for anything that may need to be on the child activate event
endFunction