enderalse/source/scripts/physicstraphit.psc

83 lines
2.9 KiB
Plaintext

scriptName PhysicsTrapHit extends TrapHitBase
;
;
;
;=========================================
import utility
float property damageVelocityThreshold = 6.0 auto
{This sets the velocity needed to apply damage
It is non-squareroot of the delta velocity as recieved from the TrapHit
Default = 6.0
This should NOT be changed on the Ref except in rare cases}
Auto state CanHit
Event OnTrapHitStart(ObjectReference akTarget, float afXVel, float afYVel, float afZVel, float afXPos, float afYPos, float afZPos, int aeMaterial, bool abInitialHit, int aeMotionType)
;goToState("CannotHit")
if acceptableVelocityDelta(damageVelocityThreshold, afXVel, afYVel, afZVel)
; debug.Trace(self + " is dealing damage!!!")
;damage = 40 ;THIS IS FOR A TEST ONLY
if !(akTarget as actor).hasSpell(ghostAbility) && !(akTarget as actor).IsInFaction(noHitFaction)
if hitOnlyOnce
goToState("CannotHit")
endif
if akTarget == game.GetPlayer()
if rumble
game.ShakeController(rumbleAmount, rumbleAmount, rumbleDuration)
EndIf
if cameraShake
game.ShakeCamera(afStrength = cameraShakeAmount)
endif
endif
akTarget.ProcessTrapHit(self, damage, trapPushBack, afXVel, afYVel, afZVel, afXPos, afYPos, afZPos, aeMaterial, staggerAmount)
if TrapHitSound
TrapHitSound.play( self as ObjectReference) ;play hit sound
endif
;hitFX.fire(self, hitFxAmmo)
CreateDetectionEvent(akTarget as actor, soundLevel) ; creates a detection event
endif
endif
endEvent
endState
state CannotHit
Event OnTrapHit(ObjectReference akTarget, float afXVel, float afYVel, float afZVel, float afXPos, float afYPos, float afZPos, int aeMaterial, bool abInitialHit, int aeMotionType)
endEvent
endState
bool function acceptableVelocityDelta(float targetVelocity, float afXVel, float afYVel, float afZVel)
float actualDeltaVelocity
float xyDelta
;xyDelta = math.sqrt(math.pow(afXVel, 2) + math.pow(afYVel, 2))
;actualDeltaVelocity = math.sqrt(math.pow(xyDelta, 2) + math.pow(afZVel, 2))
;actualDeltaVelocity = (math.abs(afxVel) + math.abs(afYVel) + math.abs(afZVel))
actualDeltaVelocity = ((afxVel * afxVel) + (afyVel * afyVel) + (afZVel * afZVel))
if actualDeltaVelocity >= targetVelocity
; debug.trace(self + " actualVelocity >= targetVelocity")
; debug.trace(self + " deltaX = " + afXVel)
; debug.trace(self + " deltaY = " + afYVel)
; debug.trace(self + " deltaZ = " + afZVel)
; debug.trace(self + " targetVelocity = " + targetVelocity)
; debug.trace(self + " totalDelta = " + actualDeltaVelocity)
return True
Else
; debug.trace(self + " actualVelocity < targetVelocity")
; debug.trace(self + " deltaX = " + afXVel)
; debug.trace(self + " deltaY = " + afYVel)
; debug.trace(self + " deltaZ = " + afZVel)
; debug.trace(self + " targetVelocity = " + targetVelocity)
; debug.trace(self + " totalDelta = " + actualDeltaVelocity)
return False
endif
endFunction