enderalse/source/scripts/hazardbase.psc

164 lines
4.6 KiB
Plaintext

scriptName HazardBase extends objectReference
;
;
;============================================
import utility
int property damage auto hidden
int property soundLevel = 10 auto
int property trapPushBack auto
sound property TrapHitSound auto
weapon property hitFX auto
ammo property hitFXAmmo auto
int property trapLevel = 1 auto
bool isWaitingToEvaluate = False
float property staggerAmount = 0.0 auto
bool property CheckAngle = false auto
{if true this will check the angle of the actors velocity to the "up" vector of the trap
default == False}
auto State CanHit
Event OnTrapHit(ObjectReference akTarget, float afXVel, float afYVel, float afZVel, float afXPos, float afYPos, float afZPos, int aeMaterial, bool abInitialHit, int aeMotionType)
; debug.Trace(self + ": TrapHit")
; debug.Trace(self + ": XYZ = (" + afXPos + "," + afYPos + "," +afZPos + ")")
if !CheckAngle
doLocalHit(akTarget, afXVel, afYVel, afZVel, afXPos, afYPos, afZPos, aeMaterial, abInitialHit, aeMotionType)
else
if isAngleAcceptable(afXVel, afYVel, afZVel)
doLocalHit(akTarget, afXVel, afYVel, afZVel, afXPos, afYPos, afZPos, aeMaterial, abInitialHit, aeMotionType)
endif
endif
endEvent
Event OnTrapHitStart(ObjectReference akTarget, float afXVel, float afYVel, float afZVel, float afXPos, float afYPos, float afZPos, int aeMaterial, bool abInitialHit, int aeMotionType)
; debug.Trace(self + ": TrapHitStart")
; debug.Trace(self + ": XYZ = (" + afXPos + "," + afYPos + "," +afZPos + ")")
if !CheckAngle
doLocalHit(akTarget, afXVel, afYVel, afZVel, afXPos, afYPos, afZPos, aeMaterial, abInitialHit, aeMotionType)
else
if isAngleAcceptable(afXVel, afYVel, afZVel)
doLocalHit(akTarget, afXVel, afYVel, afZVel, afXPos, afYPos, afZPos, aeMaterial, abInitialHit, aeMotionType)
endif
endif
endEvent
EndState
State CannotHit
endState
event onLoad()
ResolveLeveledDamage() ;set damage appropriate to player level
endEvent
event onUpdate()
unRegisterForUpdate()
;EvaluateStoredRefs()
isWaitingToEvaluate = FALSE
endEvent
function doLocalHit(ObjectReference akTarget, float afXVel, float afYVel, float afZVel, float afXPos, float afYPos, float afZPos, int aeMaterial, bool abInitialHit, int aeMotionType)
akTarget.ProcessTrapHit(self, damage, trapPushBack, afXVel, afYVel, afZVel, afXPos, afYPos, afZPos, aeMaterial, staggerAmount)
; debug.Trace(self + " has hit " + akTarget)
TrapHitSound.play( self as ObjectReference) ;play hit sound
hitFX.fire(self, hitFxAmmo)
CreateDetectionEvent(akTarget as actor, soundLevel) ; creates a detection event
endFunction
bool function isAngleAcceptable(float afXVel, float afYVel, float afZVel)
float maxZVelocity = 1.0
float minZVelocity = 0.3
; float selfX
; float selfY
; float selfZ
; float selfNodeX
; float selfNodeY
; float selfNodeZ
; float dotProduct
; dotProduct = sqrt()
; if acos(MAXANGLE) < dotProduct
; debug.trace (self + ": X velocity = " + afXVel)
; debug.trace (self + ": Y velocity = " + afYVel)
; debug.trace (self + ": Z velocity = " + afZVel)
float absoluteZ = (math.abs(afZVel))
float absoluteY = math.abs(afYVel)
float absoluteX = math.abs(afXVel)
if absoluteZ >= maxZVelocity
return true
elseif absoluteZ >= minZVelocity
if (absoluteZ * (0.6)) >= absoluteY
return True
elseif (absoluteZ * (0.6)) >= absoluteX
Return True
else
return False
endif
else
return false
endif
endFunction
;======================================================
int property LvlThreshold1 auto
int property LvlDamage1 auto
int property LvlThreshold2 auto
int property LvlDamage2 auto
int property LvlThreshold3 auto
int property LvlDamage3 auto
int property LvlThreshold4 auto
int property LvlDamage4 auto
int property LvlThreshold5 auto
int property LvlDamage5 auto
int property LvlDamage6 auto
;int Function ResolveLeveledDamage (int damage)
Function ResolveLeveledDamage()
int damageLevel
damageLevel = CalculateEncounterLevel(TrapLevel)
damage = LvlDamage1
if (damageLevel > LvlThreshold1 && damageLevel <= LvlThreshold2)
damage = LvlDamage2
;Trace("damage threshold =")
;Trace("2")
endif
if (damageLevel > LvlThreshold2 && damageLevel <= LvlThreshold3)
damage = LvlDamage3
;Trace("damage threshold =")
;Trace("3")
endif
if (damageLevel > LvlThreshold3 && damageLevel <= LvlThreshold4)
damage = LvlDamage4
;Trace("damage threshold =")
;Trace("4")
endif
if (damageLevel > LvlThreshold4 && damageLevel <= LvlThreshold5)
damage = LvlDamage5
;Trace("damage threshold =")
;Trace("5")
endif
if (damageLevel > LvlThreshold5)
damage = LvlDamage6
;Trace("damage threshold =")
;Trace("6")
endif
;Trace("damage =")
;Trace(damage)
;return damage
EndFunction