452 lines
11 KiB
Plaintext
452 lines
11 KiB
Plaintext
scriptName TrapFlamethrower Extends TrapBase
|
|
;
|
|
;
|
|
;
|
|
;=========================================
|
|
|
|
spell property magicWeapon auto hidden
|
|
;ammo property magicWeaponAmmo auto
|
|
float property initialDelay = 0.5 auto hidden
|
|
float property firingRate = 7.0 auto hidden
|
|
float property firingRateOverride = 0.0 auto
|
|
{Overrides the spedified firing rate if > 0.0
|
|
only used for a few special uses}
|
|
float property firingSpinup = 0.5 auto hidden
|
|
int property castingAim = 0 auto
|
|
{use to determin how the aiming type of the magic cast
|
|
0 = straight fire (default)
|
|
1 = fire at linked Ref
|
|
2 = fire at the object that activated my trigger}
|
|
objectReference property targetRef auto hidden
|
|
bool property forwardFiring = false auto
|
|
int property aaSpellToCast = 2 Auto
|
|
{The type of spell to cast, the leveled version is resolved internally
|
|
0 = firebolt
|
|
1 = fireball
|
|
2 = flames
|
|
3 = lightning bolt
|
|
4 = chain lightning
|
|
5 = sparks
|
|
6 = ice spike
|
|
7 = frostbite
|
|
8 = ice storm
|
|
}
|
|
|
|
import utility
|
|
import game
|
|
import math
|
|
|
|
bool finishedFiring = false
|
|
bool weaponResolved = false
|
|
bool concentrationCastLoop = false
|
|
|
|
bool property isFiring auto hidden
|
|
bool property isLoaded auto hidden
|
|
|
|
|
|
|
|
event onLoad()
|
|
if !weaponResolved
|
|
ResolveLeveledWeapon ()
|
|
weaponResolved = True
|
|
endif
|
|
isLoaded = TRUE
|
|
if isFiring == True
|
|
fireTrap()
|
|
endif
|
|
EndEvent
|
|
|
|
event onUnload()
|
|
; debug.Trace(self + " has recieved onUnload event")
|
|
isLoaded = FALSE
|
|
endEvent
|
|
|
|
Function fireTrap()
|
|
isFiring = True
|
|
if !weaponResolved
|
|
ResolveLeveledWeapon()
|
|
weaponResolved = True
|
|
endif
|
|
if trapDisarmed == false
|
|
;playAnimation("alarm")
|
|
;WindupSound.play( self as ObjectReference) ;play windup sound
|
|
;wait( initialDelay ) ;wait for windup
|
|
wait(firingSpinup)
|
|
while(finishedFiring == False) && isLoaded == TRUE
|
|
;3D Loaded check added by USKP 1.3.3 - Otherwise this thing will unload and then sit in your Papyrus stack. FOREVER.
|
|
if( Is3DLoaded() )
|
|
;playAnimation("fire")
|
|
;if statement to handle concentration casting loop
|
|
if aaSpellToCast == 2 || aaSpellToCast == 5 || aaSpellToCast == 7
|
|
if concentrationCastLoop == false
|
|
fireByCastingType() ;does the actual casting
|
|
concentrationCastLoop = True
|
|
endif
|
|
Else
|
|
fireByCastingType() ;does the actual casting
|
|
endif
|
|
finishedFiring = True
|
|
|
|
;playAnimation("alarm")
|
|
wait(firingRate)
|
|
|
|
if (loop == TRUE) ;Reset Limiter
|
|
resetLimiter()
|
|
endif
|
|
Else
|
|
isLoaded = False
|
|
EndIf
|
|
endWhile
|
|
concentrationCastLoop = false
|
|
if aaSpellToCast == 2 || aaSpellToCast == 5 || aaSpellToCast == 7
|
|
interruptCast()
|
|
endif
|
|
|
|
if isLoaded
|
|
isFiring = false
|
|
;playAnimation("idle")
|
|
goToState("Reset")
|
|
endif
|
|
endif
|
|
|
|
endFunction
|
|
|
|
State Reset
|
|
|
|
Event OnBeginState()
|
|
;TRACE("State Reset")
|
|
GoToState ( "Idle" )
|
|
;TrapHitBase hitBase = (self as objectReference) as TrapHitBase
|
|
;hitBase.goToState("CanHit")
|
|
endEvent
|
|
|
|
Event OnActivate( objectReference activateRef )
|
|
EndEvent
|
|
|
|
endState
|
|
|
|
function resetLimiter()
|
|
finishedFiring = false
|
|
endFunction
|
|
|
|
function fireByCastingType()
|
|
if castingAim == 0
|
|
magicWeapon.cast(self)
|
|
elseIf castingAim == 1
|
|
if forwardFiring
|
|
if refIsValidForwardTarget(getLinkedRef())
|
|
magicWeapon.cast(self, getLinkedRef())
|
|
Else
|
|
magicWeapon.cast(self)
|
|
endif
|
|
Else
|
|
magicWeapon.cast(self, getLinkedRef())
|
|
endif
|
|
ElseIf castingAim == 2
|
|
targetRef = (lastActivateRef as traptriggerbase).lastTriggerRef
|
|
if forwardFiring
|
|
if refIsValidForwardTarget(targetRef)
|
|
magicWeapon.cast(self, targetRef)
|
|
Else
|
|
magicWeapon.cast(self)
|
|
endif
|
|
Else
|
|
magicWeapon.cast(self, targetRef)
|
|
endif
|
|
Else
|
|
; debug.Trace(self + " error: castingAim = " + castingAim)
|
|
endif
|
|
endFunction
|
|
|
|
float property horizontalSweepHalf = 90.0 auto
|
|
float property verticalSweepHalf = 90.0 auto
|
|
|
|
bool function refIsValidForwardTarget(objectReference testRef)
|
|
; debug.Trace(self + " is checking if refIsValidForwardTarget on " + testRef)
|
|
float deltaX = testRef.X - self.X
|
|
float deltaY = testRef.Y - self.Y
|
|
float deltaZ = testRef.Z - self.Z
|
|
|
|
float fAngleToRef = atan(deltaX/deltaY)
|
|
if (deltaX < 0.0) && (deltaY < 0.0)
|
|
fAngleToRef = fAngleToRef + 180
|
|
endIf
|
|
float deltaAngle = self.getAngleZ()-fAngletoRef
|
|
if (deltaAngle < -180.0)
|
|
deltaAngle = deltaAngle + 360.0
|
|
endIf
|
|
if (deltaAngle > 180.0)
|
|
deltaAngle = deltaAngle - 360.0
|
|
endIf
|
|
|
|
if Abs(deltaAngle) < horizontalSweepHalf
|
|
; debug.Trace(self + " is firing at a valid angle at " + testRef)
|
|
return true
|
|
Else
|
|
; debug.Trace(self + " could not fire at a valid angle at " + testRef)
|
|
return False
|
|
endif
|
|
endFunction
|
|
|
|
;-----------------------------------------------
|
|
|
|
int property TESTLvlEncValue auto
|
|
int property LvlThreshold1 auto
|
|
spell property LvlWeapon1 auto hidden
|
|
int property LvlThreshold2 auto
|
|
spell property LvlWeapon2 auto hidden
|
|
int property LvlThreshold3 auto
|
|
spell property LvlWeapon3 auto hidden
|
|
int property LvlThreshold4 auto
|
|
spell property LvlWeapon4 auto hidden
|
|
int property LvlThreshold5 auto
|
|
spell property LvlWeapon5 auto hidden
|
|
spell property LvlWeapon6 auto hidden
|
|
|
|
bool spellAndCastingTypeResolved = false
|
|
Function ResolveLeveledWeapon ()
|
|
; debug.Trace(self + " trying to ResolveLeveledWeapon")
|
|
if spellAndCastingTypeResolved == false
|
|
ResolveSpellType()
|
|
ResolveCastingDelay()
|
|
spellAndCastingTypeResolved = True
|
|
endif
|
|
int damageLevel
|
|
damageLevel = CalculateEncounterLevel(TrapLevel)
|
|
|
|
spell lvlWeapon = LvlWeapon1
|
|
|
|
if (damageLevel > LvlThreshold1 && damageLevel <= LvlThreshold2)
|
|
lvlWeapon = LvlWeapon2
|
|
;Trace("damage threshold =")
|
|
;Trace("2")
|
|
elseif (damageLevel > LvlThreshold2 && damageLevel <= LvlThreshold3)
|
|
lvlWeapon = LvlWeapon3
|
|
;Trace("damage threshold =")
|
|
;Trace("3")
|
|
elseif (damageLevel > LvlThreshold3 && damageLevel <= LvlThreshold4)
|
|
lvlWeapon = LvlWeapon4
|
|
;Trace("damage threshold =")
|
|
;Trace("4")
|
|
elseif (damageLevel > LvlThreshold4 && damageLevel <= LvlThreshold5)
|
|
lvlWeapon = LvlWeapon5
|
|
;Trace("damage threshold =")
|
|
;Trace("5")
|
|
elseif (damageLevel > LvlThreshold5)
|
|
lvlWeapon = LvlWeapon6
|
|
;Trace("damage threshold =")
|
|
;Trace("6")
|
|
endif
|
|
|
|
magicWeapon = lvlWeapon
|
|
EndFunction
|
|
|
|
function ResolveCastingDelay()
|
|
; debug.Trace(self + " trying to ResolveCastingDelay")
|
|
if castingAim == 0
|
|
initialDelay = 0.5
|
|
if aaSpellToCast == 2 || aaSpellToCast == 5 || aaSpellToCast == 7
|
|
firingRate = 7.0
|
|
else
|
|
firingRate = 2.0
|
|
endif
|
|
|
|
elseif castingAim == 1
|
|
initialDelay = 0.5
|
|
if aaSpellToCast == 2 || aaSpellToCast == 5 || aaSpellToCast == 7
|
|
firingRate = 7.0
|
|
else
|
|
firingRate = 2.0
|
|
endif
|
|
elseif castingAim == 2
|
|
initialDelay = 0.5
|
|
if aaSpellToCast == 2 || aaSpellToCast == 5 || aaSpellToCast == 7
|
|
firingRate = 7.0
|
|
else
|
|
firingRate = 2.0
|
|
endif
|
|
Else
|
|
; debug.Trace(self + " cannot resolveCastingDelay: unknown castingAim")
|
|
endIf
|
|
|
|
if firingRateOverride > 0.0
|
|
firingRate = firingRateOverride
|
|
endif
|
|
endFunction
|
|
|
|
function ResolveSpellType()
|
|
; debug.Trace(self + " trying to ResolveSpellType")
|
|
if aaSpellToCast == 0
|
|
LvlWeapon1 = sLvlfirebolt1
|
|
LvlWeapon2 = sLvlfirebolt2
|
|
LvlWeapon3 = sLvlfirebolt3
|
|
LvlWeapon4 = sLvlfirebolt4
|
|
LvlWeapon5 = sLvlfirebolt5
|
|
LvlWeapon6 = sLvlfirebolt6
|
|
elseif aaSpellToCast == 1
|
|
LvlWeapon1 = sLvlfireball1
|
|
LvlWeapon2 = sLvlfireball2
|
|
LvlWeapon3 = sLvlfireball3
|
|
LvlWeapon4 = sLvlfireball4
|
|
LvlWeapon5 = sLvlfireball5
|
|
LvlWeapon6 = sLvlfireball6
|
|
elseif aaSpellToCast == 2
|
|
LvlWeapon1 = sLvlFlames1
|
|
LvlWeapon2 = sLvlFlames2
|
|
LvlWeapon3 = sLvlFlames3
|
|
LvlWeapon4 = sLvlFlames4
|
|
LvlWeapon5 = sLvlFlames5
|
|
LvlWeapon6 = sLvlFlames6
|
|
elseif aaSpellToCast == 3
|
|
LvlWeapon1 = sLvlLightningBolt1
|
|
LvlWeapon2 = sLvlLightningBolt2
|
|
LvlWeapon3 = sLvlLightningBolt3
|
|
LvlWeapon4 = sLvlLightningBolt4
|
|
LvlWeapon5 = sLvlLightningBolt5
|
|
LvlWeapon6 = sLvlLightningBolt6
|
|
elseif aaSpellToCast == 4
|
|
LvlWeapon1 = sLvlChainLightning1
|
|
LvlWeapon2 = sLvlChainLightning2
|
|
LvlWeapon3 = sLvlChainLightning3
|
|
LvlWeapon4 = sLvlChainLightning4
|
|
LvlWeapon5 = sLvlChainLightning5
|
|
LvlWeapon6 = sLvlChainLightning6
|
|
elseif aaSpellToCast == 5
|
|
LvlWeapon1 = sLvlSparks1
|
|
LvlWeapon2 = sLvlSparks2
|
|
LvlWeapon3 = sLvlSparks3
|
|
LvlWeapon4 = sLvlSparks4
|
|
LvlWeapon5 = sLvlSparks5
|
|
LvlWeapon6 = sLvlSparks6
|
|
elseif aaSpellToCast == 6
|
|
LvlWeapon1 = sLvlIceSpike1
|
|
LvlWeapon2 = sLvlIceSpike2
|
|
LvlWeapon3 = sLvlIceSpike3
|
|
LvlWeapon4 = sLvlIceSpike4
|
|
LvlWeapon5 = sLvlIceSpike5
|
|
LvlWeapon6 = sLvlIceSpike6
|
|
elseif aaSpellToCast == 7
|
|
LvlWeapon1 = sLvlFrostBite1
|
|
LvlWeapon2 = sLvlFrostBite2
|
|
LvlWeapon3 = sLvlFrostBite3
|
|
LvlWeapon4 = sLvlFrostBite4
|
|
LvlWeapon5 = sLvlFrostBite5
|
|
LvlWeapon6 = sLvlFrostBite6
|
|
elseif aaSpellToCast == 8
|
|
LvlWeapon1 = sLvlIceStorm1
|
|
LvlWeapon2 = sLvlIceStorm2
|
|
LvlWeapon3 = sLvlIceStorm3
|
|
LvlWeapon4 = sLvlIceStorm4
|
|
LvlWeapon5 = sLvlIceStorm5
|
|
LvlWeapon6 = sLvlIceStorm6
|
|
else
|
|
; debug.Trace(self + " has been set to an invalid spell type")
|
|
endif
|
|
endFunction
|
|
|
|
spell property sLvlfirebolt1 auto
|
|
spell property sLvlfirebolt2 auto
|
|
spell property sLvlfirebolt3 auto
|
|
spell property sLvlfirebolt4 auto
|
|
spell property sLvlfirebolt5 auto
|
|
spell property sLvlfirebolt6 auto
|
|
|
|
spell property sLvlfireball1 auto
|
|
spell property sLvlfireball2 auto
|
|
spell property sLvlfireball3 auto
|
|
spell property sLvlfireball4 auto
|
|
spell property sLvlfireball5 auto
|
|
spell property sLvlfireball6 auto
|
|
|
|
spell property sLvlFlames1 auto
|
|
spell property sLvlFlames2 auto
|
|
spell property sLvlFlames3 auto
|
|
spell property sLvlFlames4 auto
|
|
spell property sLvlFlames5 auto
|
|
spell property sLvlFlames6 auto
|
|
|
|
spell property sLvlLightningBolt1 auto
|
|
spell property sLvlLightningBolt2 auto
|
|
spell property sLvlLightningBolt3 auto
|
|
spell property sLvlLightningBolt4 auto
|
|
spell property sLvlLightningBolt5 auto
|
|
spell property sLvlLightningBolt6 auto
|
|
|
|
spell property sLvlChainlightning1 auto
|
|
spell property sLvlChainlightning2 auto
|
|
spell property sLvlChainlightning3 auto
|
|
spell property sLvlChainlightning4 auto
|
|
spell property sLvlChainlightning5 auto
|
|
spell property sLvlChainlightning6 auto
|
|
|
|
spell property sLvlSparks1 auto
|
|
spell property sLvlSparks2 auto
|
|
spell property sLvlSparks3 auto
|
|
spell property sLvlSparks4 auto
|
|
spell property sLvlSparks5 auto
|
|
spell property sLvlSparks6 auto
|
|
|
|
spell property sLvlIceSpike1 auto
|
|
spell property sLvlIceSpike2 auto
|
|
spell property sLvlIceSpike3 auto
|
|
spell property sLvlIceSpike4 auto
|
|
spell property sLvlIceSpike5 auto
|
|
spell property sLvlIceSpike6 auto
|
|
|
|
spell property sLvlFrostbite1 auto
|
|
spell property sLvlFrostbite2 auto
|
|
spell property sLvlFrostbite3 auto
|
|
spell property sLvlFrostbite4 auto
|
|
spell property sLvlFrostbite5 auto
|
|
spell property sLvlFrostbite6 auto
|
|
|
|
spell property sLvlIceStorm1 auto
|
|
spell property sLvlIceStorm2 auto
|
|
spell property sLvlIceStorm3 auto
|
|
spell property sLvlIceStorm4 auto
|
|
spell property sLvlIceStorm5 auto
|
|
spell property sLvlIceStorm6 auto
|
|
|
|
;Event OnTrapHit(ObjectReference akTarget, float afXVel, float afYVel, float afZVel, float afXPos, float afYPos, float afZPos, int aeMaterial, bool abInitialHit, int aeMotionType)
|
|
; if (hitOnce == FALSE)
|
|
; hitOnce = TRUE
|
|
; endif
|
|
;endEvent
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|