316 lines
9.2 KiB
Plaintext
316 lines
9.2 KiB
Plaintext
Scriptname _00E_A2_RiftSC extends activemagiceffect
|
|
|
|
Import _00E_TalentLibrary
|
|
import Utility
|
|
Import Debug
|
|
|
|
;=====================================================================================
|
|
; EVENTS
|
|
;=====================================================================================
|
|
|
|
Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked)
|
|
|
|
bRegisteredForSynergy
|
|
|
|
If akSource == _00E_A2_SkyfallBoltSP && !bRegisteredForSynergy
|
|
bRegisteredForSynergy = True
|
|
bSynergyImplosionEffect = True
|
|
;We can't use Dispel() here, it will result in the target being stuck in dimensional rift forever, fixing https://sureai.net/tracker/view.php?id=107 partially
|
|
;Self.Dispel()
|
|
EndIf
|
|
|
|
EndEvent
|
|
|
|
Event OnDying(Actor akKiller)
|
|
|
|
Self.Dispel()
|
|
|
|
EndEvent
|
|
|
|
Event OnEffectStart(Actor akTarget, Actor akCaster)
|
|
|
|
Target = akTarget
|
|
|
|
If !(IsTargetValid(Target))
|
|
(PlayerREF as _00E_Game_TalentControlSC).SetTalentRecoveryTime(_00E_A1_Rift, 0)
|
|
Return
|
|
Elseif IsTargetValid(Target)
|
|
TargetWasValid = True
|
|
Target.SetActorCause(PlayerREF)
|
|
PlayFXAndAnimation()
|
|
DrainLoop()
|
|
EndIf
|
|
|
|
EndEvent
|
|
|
|
Event OnEffectFinish(Actor akTarget, Actor akCaster)
|
|
|
|
If TargetWasValid
|
|
Finished = True
|
|
StopFXAndCastFinalExplosion()
|
|
Wait(3)
|
|
Target.SetActorCause(None)
|
|
CleanUp()
|
|
TargetWasValid = False
|
|
EndIf
|
|
|
|
EndEvent
|
|
|
|
Event OnUpdate()
|
|
|
|
If (fEnemyPositionAtStartX != Target.GetPositionX()) || (fEnemyPositionAtStartY != Target.GetPositionY())
|
|
_00E_Ability_StaggerSelfSpell.RemoteCast(Target, PlayerREF, Target)
|
|
Wait(1)
|
|
Target.EnableAI(False)
|
|
EndIf
|
|
|
|
EndEvent
|
|
|
|
Event OnCellDetach()
|
|
; Prevent an infinite loop in DrainLoop()
|
|
Finished = true
|
|
endEvent
|
|
|
|
;=====================================================================================
|
|
; FUNCTIONS
|
|
;=====================================================================================
|
|
|
|
bool Function IsTargetValid(Actor iTarget)
|
|
|
|
Float iAllowedLevelDifference = _00E_A1_RiftSP.GetNthEffectMagnitude(3)
|
|
|
|
If (Target.GetLevel()) >= (PlayerLevel.GetValueInt() + iAllowedLevelDifference as Int)
|
|
_00E_Levelsystem_sAbilityEnemyLevelTooHigh.Show()
|
|
return False
|
|
ElseIf Target.IsDead()
|
|
_00E_Levelsystem_sAbilityEnemyHasToBeAlive.Show()
|
|
return False
|
|
ElseIf Target.HasKeyword(MagicNoRift)
|
|
_00E_Levelsystem_sAbilityTargetImmune.Show()
|
|
return False
|
|
Else
|
|
Return True
|
|
EndIf
|
|
|
|
EndFunction
|
|
|
|
|
|
Function PlayFXAndAnimation()
|
|
|
|
Target.PlaceAtMe(ThrowVoiceExplosion)
|
|
_00E_A1_RiftIntroSound.Play(PlayerREF)
|
|
GhostEtherealFXShader.Play(PlayerREF)
|
|
PlaceMarker = Target.PlaceAtMe(XMarker)
|
|
Target.SetGhost(True)
|
|
|
|
ActorBase TargetBase = Target.GetBaseObject() as ActorBase
|
|
|
|
if TargetBase.HasKeyword(TypeHumanoid) && !(TargetBase.GetRace() == DraugrRace)
|
|
|
|
if (TargetBase.GetSex() == 0)
|
|
_00E_Ability_StaggerSelfSpell.RemoteCast(Target, PlayerREF, Target)
|
|
Wait(1)
|
|
|
|
If !Target.PlayIdle(IdleT02AscendMale)
|
|
_00E_Ability_StaggerSelfSpell.RemoteCast(Target, PlayerREF, Target)
|
|
Wait(1)
|
|
Target.EnableAI(False)
|
|
EndIf
|
|
|
|
ElseIf (TargetBase.GetSex() == 1)
|
|
_00E_Ability_StaggerSelfSpell.RemoteCast(Target, PlayerREF, Target)
|
|
Wait(1)
|
|
|
|
If !Target.PlayIdle(IdleT02AscendFemale)
|
|
_00E_Ability_StaggerSelfSpell.RemoteCast(Target, PlayerREF, Target)
|
|
Wait(1)
|
|
Target.EnableAI(False)
|
|
EndIf
|
|
|
|
EndIf
|
|
|
|
Else
|
|
_00E_Ability_StaggerSelfSpell.RemoteCast(Target, PlayerREF, Target)
|
|
Wait(1)
|
|
Target.EnableAI(False)
|
|
EndIf
|
|
|
|
GhostEtherealFXShader.Play(Target)
|
|
Target.SetAlpha (0.6, true)
|
|
|
|
iRiftDurationSound = _00E_A1_RiftDurSound.Play(Target)
|
|
|
|
Wait(2)
|
|
RiftLight = Target.PlaceAtMe(_00E_A1_RiftLight)
|
|
|
|
|
|
EndFunction
|
|
|
|
Function DrainLoop()
|
|
|
|
float iWait = ((_00E_A1_RiftSP.GetNthEffectDuration(0) - 3)/3)
|
|
iIndex = _00E_TalentLibrary.GetPlayerTalentLevel(_00E_Class_Thaumaturge_P04_Talent_DimensionalRift_01, _00E_Class_Thaumaturge_P04_Talent_DimensionalRift_02, _00E_Class_Thaumaturge_P04_Talent_DimensionalRift_03) - 1
|
|
float fDrainAmountMagicka = ((Target.GetActorValue("Magicka"))*((_00E_A1_RiftSP.GetNthEffectMagnitude(iIndex)/100)/(_00E_A1_RiftSP.GetNthEffectDuration(0)/3)))
|
|
float fDrainAmountStamina = ((Target.GetActorValue("Stamina"))*((_00E_A1_RiftSP.GetNthEffectMagnitude(iIndex)/100)/(_00E_A1_RiftSP.GetNthEffectDuration(0)/3)))
|
|
|
|
While !Finished && Target.HasMagicEffect(GetBaseObject())
|
|
DrainManaAndStamina(fDrainAmountMagicka, fDrainAmountStamina)
|
|
Wait(iWait)
|
|
EndWhile
|
|
|
|
EndFunction
|
|
|
|
Function DrainManaAndStamina(float fDrainAmountMagicka, float fDrainAmountStamina)
|
|
|
|
GhostEtherealFXShaderIntro.Play(Target)
|
|
_00E_A1_RiftDrainSound.Play(PlayerREF)
|
|
Target.DamageActorValue("Magicka", fDrainAmountMagicka)
|
|
PlayerREF.RestoreActorValue("Magicka", fDrainAmountMagicka)
|
|
Target.DamageActorValue("Stamina", fDrainAmountStamina)
|
|
PlayerREF.RestoreActorValue("Stamina", fDrainAmountStamina)
|
|
iFinalImpact = iFinalImpact + (fDrainAmountMagicka + fDrainAmountStamina)
|
|
_00E_A2_RiftDrainImod.Apply()
|
|
|
|
EndFunction
|
|
|
|
Function StopFXAndCastFinalExplosion()
|
|
|
|
Target.SetGhost(False)
|
|
|
|
if bSynergyImplosionEffect
|
|
;shifted the code around and introduced a Kill() to properly get rid of the target after the explosion
|
|
;together with the removed Dispel() from line 20 this will fix problems with the synergy https://sureai.net/tracker/view.php?id=107
|
|
;but changing the synergy in a way that the enemy won't explode right away
|
|
bSynergyImplosionEffect = False
|
|
bRegisteredForSynergy = False
|
|
|
|
Game.ShakeCamera(afStrength = 0.25)
|
|
Target.RemovePerk(_00E_A2_RiftEtheralPerk)
|
|
GhostEtherealFXShader.Stop(PlayerREF)
|
|
GhostEtherealFXShader.Stop(Target)
|
|
;Target.SetAlpha(1, true)
|
|
;Target.EnableAI(true)
|
|
_00E_A2_SynergyRiftImplosionDMGEnch.SetNthEffectMagnitude(0, iFinalImpact)
|
|
Target.KnockAreaEffect(1, 512)
|
|
Target.PlaceAtMe(_00E_A2_SynergyRiftImplosion, 1)
|
|
MAGShockExpMassImod.Apply()
|
|
|
|
If ((Target.GetActorValue("Health") - iFinalImpact*2) <= 0)
|
|
|
|
AtronachUnsummonDeathFXS.Play(Target)
|
|
Target.Kill(PlayerREF)
|
|
Target.SetAlpha (0.0,True)
|
|
Target.SetCriticalStage(Target.CritStage_DisintegrateStart)
|
|
Target.AttachAshPile(_00E_NPCOorbayaAshPile)
|
|
Wait(0.5)
|
|
Target.SetCriticalStage(Target.CritStage_DisintegrateEnd)
|
|
EndIf
|
|
|
|
If _00E_Synergy_RiftSkyfall.GetValueInt() == 0
|
|
_00E_Synergy_RiftSkyfall.SetValueInt(1)
|
|
_00E_PlayerFunctions.GetSkillControl().ShowSynergyMessage()
|
|
EndIf
|
|
|
|
Self.Dispel()
|
|
|
|
Else
|
|
|
|
MAGMysticismSoulTrapCapture.Play(Target)
|
|
_00E_A1_RiftExplosionSound.Play(Target)
|
|
Target.PlaceAtMe(ThrowVoiceExplosion)
|
|
_00E_A2_RiftExplosionImod.Apply()
|
|
Target.DamageActorValue("Health", iFinalImpact/2)
|
|
PlayerREF.PushActorAway(Target, 1)
|
|
Target.RemovePerk(_00E_A2_RiftEtheralPerk)
|
|
Target.EnableAI(true)
|
|
Game.ShakeCamera(afStrength = 0.5)
|
|
GhostEtherealFXShader.Stop(PlayerREF)
|
|
GhostEtherealFXShader.Stop(Target)
|
|
Target.SetAlpha(1, true)
|
|
|
|
EndIf
|
|
|
|
Sound.StopInstance(iRiftDurationSound)
|
|
|
|
EndFunction
|
|
|
|
Function CleanUp()
|
|
|
|
PlaceMarker.Delete()
|
|
RiftLight.Delete()
|
|
|
|
EndFunction
|
|
|
|
;=====================================================================================
|
|
; PROPERTIES
|
|
;=====================================================================================
|
|
|
|
float fEnemyPositionAtStartX
|
|
float fEnemyPositionAtStartY
|
|
|
|
bool TargetWasValid
|
|
bool Finished
|
|
bool bSynergyImplosionEffect
|
|
bool bRegisteredForSynergy
|
|
float iFinalImpact
|
|
int iindex
|
|
int iRiftDurationSound
|
|
|
|
Message Property _00E_Levelsystem_sAbilityEnemyLevelTooHigh Auto
|
|
Message Property _00E_Levelsystem_sAbilityEnemyHasToBeAlive Auto
|
|
Message Property _00E_Levelsystem_sAbilityTargetImmune Auto
|
|
|
|
Actor Target
|
|
ObjectReference PlaceMarker
|
|
ObjectReference RiftLight
|
|
|
|
Activator Property _00E_NPCOorbayaAshPile Auto
|
|
|
|
Static Property XMarker Auto
|
|
|
|
Enchantment Property _00E_A2_SynergyRiftImplosionDMGEnch Auto
|
|
|
|
ImageSpaceModifier Property MAGShockExpMassImod Auto
|
|
|
|
EffectShader Property GhostEtherealFXShaderIntro Auto
|
|
EffectShader Property GhostEtherealFXShader Auto
|
|
EffectShader Property AtronachUnsummonDeathFXS Auto
|
|
|
|
Explosion Property _00E_A2_SynergyRiftImplosion Auto
|
|
Explosion Property ThrowVoiceExplosion Auto
|
|
|
|
Perk Property _00E_Class_Thaumaturge_P04_Talent_DimensionalRift_01 Auto
|
|
Perk Property _00E_Class_Thaumaturge_P04_Talent_DimensionalRift_02 Auto
|
|
Perk Property _00E_Class_Thaumaturge_P04_Talent_DimensionalRift_03 Auto
|
|
|
|
Idle Property IdleT02AscendMale Auto
|
|
Idle Property IdleT02AscendFemale Auto
|
|
|
|
Light Property _00E_A1_RiftLight Auto
|
|
|
|
Race Property DraugrRace Auto
|
|
|
|
Perk Property _00E_A2_RiftEtheralPerk Auto
|
|
|
|
Sound Property _00E_A1_RiftIntroSound Auto
|
|
Sound Property _00E_A1_RiftDurSound Auto
|
|
Sound Property MAGMysticismSoulTrapCapture Auto
|
|
Sound Property _00E_A1_RiftExplosionSound Auto
|
|
Sound Property _00E_A1_RiftDrainSound Auto
|
|
|
|
Spell Property _00E_Ability_StaggerSelfSpell Auto
|
|
Spell Property _00E_A1_RiftSP Auto
|
|
Spell Property _00E_A2_SkyfallBoltSP Auto
|
|
|
|
Actor Property PlayerREF Auto
|
|
|
|
GlobalVariable Property PlayerLevel Auto
|
|
GlobalVariable Property _00E_Synergy_RiftSkyfall Auto
|
|
|
|
ImagespaceModifier Property _00E_A2_RiftDrainImod Auto
|
|
ImagespaceModifier Property _00E_A2_RiftExplosionImod Auto
|
|
|
|
KeyWord Property TypeHumanoid Auto
|
|
KeyWord Property MagicNoRift Auto
|
|
|
|
Shout Property _00E_A1_Rift Auto |