diff options
author | Shauren <shauren.trinity@gmail.com> | 2025-04-15 15:38:04 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2025-04-15 15:38:04 +0200 |
commit | 120d9bd4fe39c26b8613392a3978c86ac23d9d52 (patch) | |
tree | db9bfd81603b7bdb629a55a9803330b88f807a07 /src | |
parent | c6150b4d5d47454460623253627aede783bc8a6a (diff) |
Scripts/Spells: Implemented Primordial Wave
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Spells/spell_shaman.cpp | 60 |
1 files changed, 56 insertions, 4 deletions
diff --git a/src/server/scripts/Spells/spell_shaman.cpp b/src/server/scripts/Spells/spell_shaman.cpp index 15dd8a81d57..21a59d58aff 100644 --- a/src/server/scripts/Spells/spell_shaman.cpp +++ b/src/server/scripts/Spells/spell_shaman.cpp @@ -125,6 +125,7 @@ enum ShamanSpells SPELL_SHAMAN_PATH_OF_FLAMES_SPREAD = 210621, SPELL_SHAMAN_PATH_OF_FLAMES_TALENT = 201909, SPELL_SHAMAN_POWER_SURGE = 40466, + SPELL_SHAMAN_PRIMORDIAL_WAVE_DAMAGE = 375984, SPELL_SHAMAN_RESTORATIVE_MISTS = 114083, SPELL_SHAMAN_RESTORATIVE_MISTS_INITIAL = 294020, SPELL_SHAMAN_RIPTIDE = 61295, @@ -1059,8 +1060,7 @@ class spell_sha_elemental_weapons : public AuraScript struct FireNovaTargetCheck { - static constexpr float MaxSearchRange = 40.0f; - + float MaxSearchRange = 40.0f; Unit const* Shaman; bool operator()(Unit const* candidate) const @@ -1083,7 +1083,7 @@ class spell_sha_fire_nova : public SpellScript std::vector<Unit*> targets; FireNovaTargetCheck check{ .Shaman = shaman }; Trinity::UnitListSearcher searcher(shaman, targets, check); - Cell::VisitAllObjects(shaman, searcher, FireNovaTargetCheck::MaxSearchRange); + Cell::VisitAllObjects(shaman, searcher, check.MaxSearchRange); CastSpellExtraArgs args; args.SetTriggerFlags(TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR); @@ -1113,7 +1113,7 @@ class spell_sha_flame_shock_fire_nova_enabler : public AuraScript Unit* target = nullptr; FireNovaTargetCheck check{ .Shaman = shaman }; Trinity::UnitSearcher searcher(shaman, target, check); - Cell::VisitAllObjects(shaman, searcher, FireNovaTargetCheck::MaxSearchRange); + Cell::VisitAllObjects(shaman, searcher, check.MaxSearchRange); if (target) shaman->CastSpell(shaman, SPELL_SHAMAN_FIRE_NOVA_ENABLER, CastSpellExtraArgsInit{ .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR, @@ -2237,6 +2237,57 @@ class spell_sha_path_of_flames_spread : public SpellScript } }; +// 375982 - Primordial Wave +class spell_sha_primordial_wave : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_SHAMAN_FLAME_SHOCK, SPELL_SHAMAN_PRIMORDIAL_WAVE_DAMAGE }); + } + + void TriggerDamage(SpellEffIndex /*effIndex*/) const + { + Unit* shaman = GetCaster(); + std::vector<Unit*> targets; + FireNovaTargetCheck check{ .MaxSearchRange = GetSpell()->GetMinMaxRange(false).second, .Shaman = shaman }; + Trinity::UnitListSearcher searcher(shaman, targets, check); + Cell::VisitAllObjects(shaman, searcher, check.MaxSearchRange); + + CastSpellExtraArgs args; + args.SetTriggerFlags(TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR); + args.SetTriggeringSpell(GetSpell()); + + for (Unit* target : targets) + shaman->CastSpell(target, SPELL_SHAMAN_PRIMORDIAL_WAVE_DAMAGE, args); + } + + void PreventLavaSurge(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + } + + void EnergizeMaelstrom(SpellEffIndex /*effIndex*/) const + { + spell_sha_maelstrom_weapon_base::GenerateMaelstromWeapon(GetCaster(), GetEffectValue()); + } + + void Register() override + { + ChrSpecialization specialization = ChrSpecialization::None; + if (Spell const* spell = GetSpell()) // spell doesn't exist at startup validation + if (Player const* caster = Object::ToPlayer(spell->GetCaster())) + specialization = caster->GetPrimarySpecialization(); + + OnEffectHitTarget += SpellEffectFn(spell_sha_primordial_wave::TriggerDamage, EFFECT_0, SPELL_EFFECT_DUMMY); + + if (specialization != ChrSpecialization::ShamanElemental) + OnEffectLaunch += SpellEffectFn(spell_sha_primordial_wave::PreventLavaSurge, EFFECT_5, SPELL_EFFECT_TRIGGER_SPELL); + + if (specialization == ChrSpecialization::None || specialization == ChrSpecialization::ShamanEnhancement) + OnEffectHitTarget += SpellEffectFn(spell_sha_primordial_wave::EnergizeMaelstrom, EFFECT_4, SPELL_EFFECT_DUMMY); + } +}; + // 114083 - Restorative Mists // 294020 - Restorative Mists class spell_sha_restorative_mists : public SpellScript @@ -3283,6 +3334,7 @@ void AddSC_shaman_spell_scripts() RegisterSpellScript(spell_sha_molten_thunder_sundering); RegisterSpellScript(spell_sha_natures_guardian); RegisterSpellScript(spell_sha_path_of_flames_spread); + RegisterSpellScript(spell_sha_primordial_wave); RegisterSpellScript(spell_sha_restorative_mists); RegisterSpellScript(spell_sha_spirit_wolf); RegisterSpellScript(spell_sha_stormblast); |