83 lines
2.9 KiB
Plaintext
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
|
|
|