2023-12-06 15:31:10 +00:00
|
|
|
Scriptname FXDragonBloodDamageScript extends ActiveMagicEffect
|
2023-12-04 15:02:58 +00:00
|
|
|
{This script applies blood damage geometry to the dragon and turns it on when they are hit based on the direction they are hit from}
|
|
|
|
|
|
|
|
;===============================================
|
|
|
|
; MARK'S ORIGINAL VARS & PROPERTIES
|
|
|
|
int frontBloodStepper
|
|
|
|
int backBloodStepper
|
|
|
|
int leftBloodStepper
|
|
|
|
int rightBloodStepper
|
|
|
|
int dragonHealth
|
|
|
|
string hitDirection ;0=front 1=right 2=back 3=left
|
|
|
|
float hitAngle
|
|
|
|
Armor Property DragonBloodHeadFXArmor Auto
|
|
|
|
Armor Property DragonBloodTailFXArmor Auto
|
|
|
|
Armor Property DragonBloodWingLFXArmor Auto
|
|
|
|
Armor Property DragonBloodWingRFXArmor Auto
|
|
|
|
Actor selfRef
|
|
|
|
|
|
|
|
; JOEL'S VARS & PROPERTIES
|
|
|
|
; user can override HP percentages
|
|
|
|
float property HPpctT1 = 0.98 auto
|
|
|
|
{relative total HP at which first blood should appear DEFAULT: 0.??}
|
|
|
|
float property HPpctT2 = 0.95 auto
|
|
|
|
{relative total HP at which second blood should appear DEFAULT: 0.??}
|
2023-12-06 15:31:10 +00:00
|
|
|
float property HPpctT3 = 0.90 auto
|
2023-12-04 15:02:58 +00:00
|
|
|
{relative total HP at which third blood should appear DEFAULT: 0.??}
|
|
|
|
float property HPpctT4 = 0.80 auto
|
|
|
|
{relative total HP at which final blood should appear DEFAULT: "+HPpctT4}
|
|
|
|
|
|
|
|
float previousHP
|
|
|
|
float diffHP
|
|
|
|
|
|
|
|
; tracking values for the amount of damage each "side" has taken.
|
|
|
|
float HPFront
|
|
|
|
float HPBack
|
|
|
|
float HPLeft
|
|
|
|
float HPRight
|
|
|
|
|
|
|
|
; tracking vars for damage to each side
|
|
|
|
; 0 = no blood, 1 = tier 1 blood, etc.
|
|
|
|
int stateFront = 0
|
|
|
|
int stateBack = 0
|
|
|
|
int stateLeft = 0
|
|
|
|
int stateRight = 0
|
|
|
|
|
|
|
|
; HP tiers. These are the threshold values below which each blood will play
|
|
|
|
float HPt1
|
|
|
|
float HPt2
|
|
|
|
float HPt3
|
|
|
|
float HPt4
|
|
|
|
|
|
|
|
bool bDebug = FALSE
|
|
|
|
|
2023-12-06 15:31:10 +00:00
|
|
|
;2017-01-05 by Taka2nd ========================
|
|
|
|
;
|
|
|
|
;Nexus ver1.2
|
|
|
|
;・変数をデフォルトのものに戻す
|
|
|
|
;・不要な変数をコメントアウト
|
|
|
|
;Nexus ver1.2a
|
|
|
|
;・不要な変数をコメントアウトを外す
|
|
|
|
;Nexus ver1.2b
|
|
|
|
;・機能していない不要なイベント処理を削除
|
|
|
|
;
|
|
|
|
;
|
|
|
|
;・PlaySubAnimation()の頻繁なエラーおよびエラースタック
|
|
|
|
;↓
|
|
|
|
;PlaySubAnimation()へのコマンドが逆行および多重化を起こしていた
|
|
|
|
;→排他制御を行っていなかったのとグローバル変数で計算していたのが原因
|
|
|
|
;↓
|
|
|
|
;State文によるの排他の追加および変数の見直しにより解決、それにより多少の負荷軽減効果もあり
|
|
|
|
;
|
|
|
|
;・死亡チェックを追加
|
|
|
|
;・HP計算の不具合→GetActorValuePercentage()に変更
|
|
|
|
;
|
|
|
|
;・PlaySubAnimation()の定期的なエラー、Bleed**を順番通りに実行することで解決
|
|
|
|
;
|
|
|
|
;
|
|
|
|
;Entire script rewritten for USLEEP 3.0.10. Used with permission from Taka2nd.
|
|
|
|
|
|
|
|
Event OnEffectStart(Actor Target, Actor Caster)
|
|
|
|
selfRef = Caster
|
|
|
|
stateFront = 0
|
|
|
|
stateBack = 0
|
|
|
|
stateLeft = 0
|
|
|
|
stateRight = 0
|
|
|
|
PreviousHP = 1.0
|
|
|
|
HPfront = 1.0
|
|
|
|
HPback = 1.0
|
|
|
|
HPleft = 1.0
|
|
|
|
HPright = 1.0
|
|
|
|
|
|
|
|
;USSEP 4.1.5 for Bug #13547: added this line:
|
|
|
|
USSEP_RegisterForAnimationEvents (selfRef)
|
|
|
|
endEvent
|
|
|
|
|
|
|
|
State __Busy__
|
|
|
|
Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked)
|
|
|
|
endEvent
|
|
|
|
endState
|
2023-12-04 15:02:58 +00:00
|
|
|
|
2023-12-06 15:31:10 +00:00
|
|
|
Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked)
|
2023-12-04 15:02:58 +00:00
|
|
|
|
2023-12-06 15:31:10 +00:00
|
|
|
GotoState("__Busy__")
|
2023-12-04 15:02:58 +00:00
|
|
|
|
2023-12-06 15:31:10 +00:00
|
|
|
if !selfRef
|
|
|
|
return ;OnHit Event Finish
|
2023-12-04 15:02:58 +00:00
|
|
|
endif
|
|
|
|
|
2023-12-06 15:31:10 +00:00
|
|
|
if akAggressor
|
2023-12-04 15:02:58 +00:00
|
|
|
|
2023-12-06 15:31:10 +00:00
|
|
|
float fCurrentHP = selfRef.GetActorValuePercentage("health")
|
|
|
|
if fCurrentHP <= 0
|
|
|
|
return ;OnHit Event Finish
|
|
|
|
endif
|
2023-12-04 15:02:58 +00:00
|
|
|
|
2023-12-06 15:31:10 +00:00
|
|
|
float fDiffHP = PreviousHP - fCurrentHP
|
|
|
|
if fDiffHP > 0
|
|
|
|
|
|
|
|
PreviousHP = fCurrentHP
|
|
|
|
float fHitAngle = selfRef.GetHeadingAngle(akAggressor)
|
|
|
|
|
|
|
|
;FRONT
|
|
|
|
if fHitAngle >= -45 && fHitAngle <= 45
|
|
|
|
HPfront -= fDiffHP
|
|
|
|
if GetBleedState(HPfront) > stateFront
|
|
|
|
stateFront += 1
|
|
|
|
selfRef.PlaySubGraphAnimation("HeadBleed0" + stateFront)
|
|
|
|
endif
|
|
|
|
;BACK
|
|
|
|
elseif fHitAngle >= 135 || fHitAngle <= -135
|
|
|
|
HPback -= fDiffHP
|
|
|
|
if GetBleedState(HPback) > stateBack
|
|
|
|
stateBack += 1
|
|
|
|
selfRef.PlaySubGraphAnimation("TailBleed0" + stateBack)
|
|
|
|
endif
|
|
|
|
;LEFT
|
|
|
|
elseif fHitAngle < 0
|
|
|
|
HPleft -= fDiffHP
|
|
|
|
if GetBleedState(HPleft) > stateLeft
|
|
|
|
stateLeft += 1
|
|
|
|
selfRef.PlaySubGraphAnimation("WingLBleed0" + stateLeft)
|
|
|
|
endif
|
|
|
|
;RIGHT
|
|
|
|
else
|
|
|
|
HPright -= fDiffHP
|
|
|
|
if GetBleedState(HPright) > stateRight
|
|
|
|
stateRight += 1
|
|
|
|
selfRef.PlaySubGraphAnimation("WingRBleed0" + stateRight)
|
|
|
|
endif
|
|
|
|
endif
|
2023-12-04 15:02:58 +00:00
|
|
|
|
2023-12-06 15:31:10 +00:00
|
|
|
endif
|
2023-12-04 15:02:58 +00:00
|
|
|
|
2023-12-06 15:31:10 +00:00
|
|
|
endif
|
2023-12-04 15:02:58 +00:00
|
|
|
|
2023-12-06 15:31:10 +00:00
|
|
|
;Debug.Trace("OnHit : akAggressor=" + akAggressor + " : akSource=" + akSource + " (" + akSource.GetType() + ") : akProjectile=" + akProjectile)
|
|
|
|
GotoState("")
|
2023-12-04 15:02:58 +00:00
|
|
|
|
2023-12-06 15:31:10 +00:00
|
|
|
endEVENT
|
2023-12-04 15:02:58 +00:00
|
|
|
|
2023-12-06 15:31:10 +00:00
|
|
|
int FUNCTION GetBleedState(float fHP)
|
|
|
|
if fHP > HPpctT1
|
|
|
|
return 0
|
|
|
|
elseif fHP > HPpctT2
|
|
|
|
return 1
|
|
|
|
elseif fHP > HPpctT3
|
|
|
|
return 2
|
|
|
|
elseif fHP > HPpctT4
|
|
|
|
return 3
|
|
|
|
endif
|
|
|
|
return 4
|
|
|
|
endFUNCTION
|
2023-12-04 15:02:58 +00:00
|
|
|
|
2023-12-06 15:31:10 +00:00
|
|
|
;-----------------------------------------------------------------
|
|
|
|
; Added by USSEP 4.1.5 for Bug #13547:
|
|
|
|
;-----------------------------------------------------------------
|
|
|
|
|
|
|
|
Event OnAnimationEvent (ObjectReference akSource, string asEventName)
|
|
|
|
;do nothing
|
|
|
|
EndEvent
|
|
|
|
|
|
|
|
function USSEP_RegisterForAnimationEvents (actor dragonRef)
|
|
|
|
if dragonRef
|
|
|
|
RegisterForAnimationEvent (dragonRef, "HeadBleed01")
|
|
|
|
RegisterForAnimationEvent (dragonRef, "HeadBleed02")
|
|
|
|
RegisterForAnimationEvent (dragonRef, "HeadBleed03")
|
|
|
|
RegisterForAnimationEvent (dragonRef, "HeadBleed04")
|
|
|
|
RegisterForAnimationEvent (dragonRef, "TailBleed01")
|
|
|
|
RegisterForAnimationEvent (dragonRef, "TailBleed02")
|
|
|
|
RegisterForAnimationEvent (dragonRef, "TailBleed03")
|
|
|
|
RegisterForAnimationEvent (dragonRef, "TailBleed04")
|
|
|
|
RegisterForAnimationEvent (dragonRef, "WingLBleed01")
|
|
|
|
RegisterForAnimationEvent (dragonRef, "WingLBleed02")
|
|
|
|
RegisterForAnimationEvent (dragonRef, "WingLBleed03")
|
|
|
|
RegisterForAnimationEvent (dragonRef, "WingLBleed04")
|
|
|
|
RegisterForAnimationEvent (dragonRef, "WingRBleed01")
|
|
|
|
RegisterForAnimationEvent (dragonRef, "WingRBleed02")
|
|
|
|
RegisterForAnimationEvent (dragonRef, "WingRBleed03")
|
|
|
|
RegisterForAnimationEvent (dragonRef, "WingRBleed04")
|
|
|
|
endif
|
|
|
|
endFunction
|