140 lines
4.5 KiB
Plaintext
140 lines
4.5 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
|
|
|
|
;USSEP 4.2.5 Bug #29500 - Traps weren't accounting for players' disease resistance.
|
|
Float diseaseResistMult = (Game.GetForm(0x14) as Actor).GetActorValue("DiseaseResist")
|
|
|
|
if canDisease && isPlayer && diseaseResistMult < 100.0
|
|
Float chance = diseaseChance * (100.0 - diseaseResistMult)
|
|
Float result = utility.RandomFloat(1.0, 10000.0)
|
|
if result <= chance
|
|
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
|
|
|