135 lines
4.2 KiB
Plaintext
135 lines
4.2 KiB
Plaintext
|
scriptName TrapHitBase 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
|
||
|
bool property trapCausesStagger = false Auto
|
||
|
{does this trap stagger actors
|
||
|
default = false}
|
||
|
bool property rumble = false Auto
|
||
|
float property rumbleAmount = 0.7 Auto
|
||
|
float property rumbleDuration = 0.5 auto
|
||
|
bool property cameraShake = false Auto
|
||
|
float property cameraShakeAmount = 0.7 auto
|
||
|
float property staggerAmount = 0.0 auto
|
||
|
bool property soundCanPlay = TRUE auto hidden
|
||
|
float property soundDelay = 1.0 auto
|
||
|
bool property throttleSound = TRUE auto
|
||
|
spell property ghostAbility auto
|
||
|
bool property hitOnlyOnce = false auto
|
||
|
{This variable to act as a safety mechanism,
|
||
|
if this is true, after one trap hit this will put itself
|
||
|
into the cannotHit State, Mainly for bearTrap
|
||
|
Default == FALSE}
|
||
|
|
||
|
|
||
|
explosion property pushbackExplosion auto
|
||
|
objectReference placedExplosion
|
||
|
|
||
|
bool property canDisease auto
|
||
|
{this property says whether this can apply diseases on hit
|
||
|
diseaseChance determines the odds if this is true
|
||
|
default = false}
|
||
|
|
||
|
float property diseaseChance = 2.5 auto
|
||
|
{if canDisease is true, this determines the chance of a disease being applied
|
||
|
default = 2.5%}
|
||
|
|
||
|
spell property TrapDiseaseAtaxia auto
|
||
|
spell property TrapDiseaseBoneBreakFever auto
|
||
|
spell property TrapDiseaseBrainRot auto
|
||
|
spell property TrapDiseaseRattles auto
|
||
|
spell property TrapDiseaseRockjoint auto
|
||
|
spell property TrapDiseaseWitbane auto
|
||
|
|
||
|
faction property noHitFaction auto
|
||
|
{This faction will not be affected by hits from this trap}
|
||
|
|
||
|
;This only processes the hits, another script should tell this one when to be in the CanHit state
|
||
|
state CanHit
|
||
|
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 + " has hit " + akTarget)
|
||
|
if !(akTarget as actor).hasSpell(ghostAbility) && !(akTarget as actor).IsInFaction(noHitFaction)
|
||
|
if hitOnlyOnce
|
||
|
goToState("CannotHit")
|
||
|
endif
|
||
|
akTarget.ProcessTrapHit(self, damage, trapPushBack, afXVel, afYVel, afZVel, afXPos, afYPos, afZPos, aeMaterial, staggerAmount)
|
||
|
if throttleSound
|
||
|
if soundCanPlay
|
||
|
soundCanPlay = False
|
||
|
if TrapHitSound
|
||
|
TrapHitSound.play( self as ObjectReference) ;play hit sound
|
||
|
endif
|
||
|
registerForSingleUpdate(soundDelay)
|
||
|
endif
|
||
|
Else
|
||
|
TrapHitSound.play( self as ObjectReference) ;play hit sound
|
||
|
endif
|
||
|
|
||
|
bool isPlayer = false
|
||
|
if akTarget == game.getPlayer()
|
||
|
isPlayer = True
|
||
|
endif
|
||
|
|
||
|
actor myTarget
|
||
|
myTarget = akTarget as Actor
|
||
|
|
||
|
if canDisease && isPlayer
|
||
|
if randomFloat(0.0, 100.0) <= diseaseChance
|
||
|
int diseasePick
|
||
|
diseasePick = randomInt(1,6)
|
||
|
if diseasePick == 1
|
||
|
myTarget.addSpell(TrapDiseaseAtaxia)
|
||
|
elseif diseasePick == 2
|
||
|
myTarget.addSpell(TrapDiseaseBoneBreakFever)
|
||
|
elseif diseasePick == 3
|
||
|
myTarget.addSpell(TrapDiseaseBrainRot)
|
||
|
elseif diseasePick == 4
|
||
|
myTarget.addSpell(TrapDiseaseRattles)
|
||
|
elseif diseasePick == 5
|
||
|
myTarget.addSpell(TrapDiseaseRockjoint)
|
||
|
elseif diseasePick == 6
|
||
|
myTarget.addSpell(TrapDiseaseWitbane)
|
||
|
endif
|
||
|
endif
|
||
|
endif
|
||
|
|
||
|
if hitFX
|
||
|
hitFX.fire(self, hitFxAmmo)
|
||
|
endif
|
||
|
CreateDetectionEvent(myTarget, soundLevel) ; creates a detection event
|
||
|
;/if trapCausesStagger
|
||
|
placedExplosion = self.placeatme(pushbackExplosion)
|
||
|
placedExplosion.moveto(self, afXoffset = afXpos, afYoffset = afYpos, afZoffset = afZpos)
|
||
|
endif/;
|
||
|
if rumble && isPlayer
|
||
|
game.ShakeController(rumbleAmount, rumbleAmount, rumbleDuration)
|
||
|
EndIf
|
||
|
if cameraShake && isPlayer
|
||
|
game.ShakeCamera(game.getPlayer(),cameraShakeAmount, rumbleDuration)
|
||
|
endif
|
||
|
endif
|
||
|
;Trace("Damage =")
|
||
|
;Trace(damage)
|
||
|
|
||
|
endEvent
|
||
|
endState
|
||
|
|
||
|
auto 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
|
||
|
|
||
|
event onUpdate()
|
||
|
soundCanPlay = TRUE
|
||
|
EndEvent
|
||
|
|