aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts/Spells
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/scripts/Spells')
-rw-r--r--src/server/scripts/Spells/spell_evoker.cpp99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/server/scripts/Spells/spell_evoker.cpp b/src/server/scripts/Spells/spell_evoker.cpp
index 8004f4115e7..adb1794a7bc 100644
--- a/src/server/scripts/Spells/spell_evoker.cpp
+++ b/src/server/scripts/Spells/spell_evoker.cpp
@@ -32,7 +32,9 @@
enum EvokerSpells
{
+ SPELL_EVOKER_BLAST_FURNACE = 375510,
SPELL_EVOKER_ENERGIZING_FLAME = 400006,
+ SPELL_EVOKER_FIRE_BREATH_DAMAGE = 357209,
SPELL_EVOKER_GLIDE_KNOCKBACK = 358736,
SPELL_EVOKER_HOVER = 358267,
SPELL_EVOKER_LIVING_FLAME = 361469,
@@ -40,6 +42,7 @@ enum EvokerSpells
SPELL_EVOKER_LIVING_FLAME_HEAL = 361509,
SPELL_EVOKER_PERMEATING_CHILL_TALENT = 370897,
SPELL_EVOKER_PYRE_DAMAGE = 357212,
+ SPELL_EVOKER_SCOURING_FLAME = 378438,
SPELL_EVOKER_SOAR_RACIAL = 369536
};
@@ -78,6 +81,72 @@ class spell_evo_charged_blast : public AuraScript
}
};
+// 357208 Fire Breath (Red)
+// 382266 Fire Breath (Red)
+class spell_evo_fire_breath : public SpellScript
+{
+public:
+ struct data
+ {
+ int32 EmpowerLevel;
+ };
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_EVOKER_FIRE_BREATH_DAMAGE, SPELL_EVOKER_BLAST_FURNACE });
+ }
+
+ void OnComplete(int32 completedStageCount) const
+ {
+ int32 dotTicks = 10 - (completedStageCount - 1) * 3;
+ if (AuraEffect const* blastFurnace = GetCaster()->GetAuraEffect(SPELL_EVOKER_BLAST_FURNACE, EFFECT_0))
+ dotTicks += blastFurnace->GetAmount() / 2;
+
+ GetCaster()->CastSpell(GetCaster(), SPELL_EVOKER_FIRE_BREATH_DAMAGE, CastSpellExtraArgs()
+ .SetTriggeringSpell(GetSpell())
+ .SetTriggerFlags(TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR)
+ .AddSpellMod(SPELLVALUE_DURATION_PCT, 100 * dotTicks)
+ .SetCustomArg(data{ .EmpowerLevel = completedStageCount }));
+ }
+
+ void Register() override
+ {
+ OnEmpowerCompleted += SpellOnEmpowerStageCompletedFn(spell_evo_fire_breath::OnComplete);
+ }
+};
+
+// 357209 Fire Breath (Red)
+class spell_evo_fire_breath_damage : public SpellScript
+{
+ bool Validate(SpellInfo const* spellInfo) override
+ {
+ return ValidateSpellEffect({ { spellInfo->Id, EFFECT_2 } })
+ && spellInfo->GetEffect(EFFECT_2).IsAura(SPELL_AURA_MOD_SILENCE); // validate we are removing the correct effect
+ }
+
+ void AddBonusUpfrontDamage(Unit const* victim, int32& /*damage*/, int32& flatMod, float& /*pctMod*/) const
+ {
+ spell_evo_fire_breath::data const* params = std::any_cast<spell_evo_fire_breath::data>(&GetSpell()->m_customArg);
+ if (!params)
+ return;
+
+ // damage is done after aura is applied, grab periodic amount
+ if (AuraEffect const* fireBreath = victim->GetAuraEffect(GetSpellInfo()->Id, EFFECT_1, GetCaster()->GetGUID()))
+ flatMod += fireBreath->GetEstimatedAmount().value_or(fireBreath->GetAmount()) * (params->EmpowerLevel - 1) * 3;
+ }
+
+ void RemoveUnusedEffect(std::list<WorldObject*>& targets) const
+ {
+ targets.clear();
+ }
+
+ void Register() override
+ {
+ CalcDamage += SpellCalcDamageFn(spell_evo_fire_breath_damage::AddBonusUpfrontDamage);
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_evo_fire_breath_damage::RemoveUnusedEffect, EFFECT_2, TARGET_UNIT_CONE_CASTER_TO_DEST_ENEMY);
+ }
+};
+
// 358733 - Glide (Racial)
class spell_evo_glide : public SpellScript
{
@@ -203,12 +272,42 @@ class spell_evo_pyre : public SpellScript
}
};
+// 357209 Fire Breath (Red)
+class spell_evo_scouring_flame : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_EVOKER_SCOURING_FLAME });
+ }
+
+ void HandleScouringFlame(std::list<WorldObject*>& targets) const
+ {
+ if (!GetCaster()->HasAura(SPELL_EVOKER_SCOURING_FLAME))
+ targets.clear();
+ }
+
+ void CalcDispelCount(SpellEffIndex /*effIndex*/)
+ {
+ if (spell_evo_fire_breath::data const* params = std::any_cast<spell_evo_fire_breath::data>(&GetSpell()->m_customArg))
+ SetEffectValue(params->EmpowerLevel);
+ }
+
+ void Register() override
+ {
+ OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_evo_scouring_flame::HandleScouringFlame, EFFECT_3, TARGET_UNIT_CONE_CASTER_TO_DEST_ENEMY);
+ OnEffectHitTarget += SpellEffectFn(spell_evo_scouring_flame::CalcDispelCount, EFFECT_3, SPELL_EFFECT_DISPEL);
+ }
+};
+
void AddSC_evoker_spell_scripts()
{
RegisterSpellScript(spell_evo_azure_strike);
RegisterSpellScript(spell_evo_charged_blast);
+ RegisterSpellScript(spell_evo_fire_breath);
+ RegisterSpellScript(spell_evo_fire_breath_damage);
RegisterSpellScript(spell_evo_glide);
RegisterSpellScript(spell_evo_living_flame);
RegisterSpellScript(spell_evo_permeating_chill);
RegisterSpellScript(spell_evo_pyre);
+ RegisterSpellScript(spell_evo_scouring_flame);
}