diff options
| author | Shauren <shauren.trinity@gmail.com> | 2017-08-26 23:04:57 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2017-08-26 23:04:57 +0200 |
| commit | ee0e9c8578486879a27059b82f30618ef2ebb4fd (patch) | |
| tree | 3982e0852c0593656c6d08972365e7bbd5881a01 | |
| parent | 6cae8a52a0234d7e7067547a58976ebb61f88292 (diff) | |
Core/Spells: Updated mage spell scripts
| -rw-r--r-- | sql/updates/world/master/2017_08_26_01_world.sql | 28 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_generic.cpp | 2 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_mage.cpp | 1356 |
3 files changed, 464 insertions, 922 deletions
diff --git a/sql/updates/world/master/2017_08_26_01_world.sql b/sql/updates/world/master/2017_08_26_01_world.sql new file mode 100644 index 00000000000..70ad20c9ae4 --- /dev/null +++ b/sql/updates/world/master/2017_08_26_01_world.sql @@ -0,0 +1,28 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ( +'spell_mage_nether_vortex', +'spell_mage_master_of_elements', +'spell_mage_permafrost', +'spell_mage_ignite', +'spell_mage_arcane_brilliance', +'spell_mage_cold_snap', +'spell_mage_focus_magic', +'spell_mage_glyph_of_icy_veins', +'spell_mage_glyph_of_polymorph', +'spell_mage_dalaran_brilliance', +'spell_mage_ring_of_frost', +'spell_mage_living_bomb_explosion', +'spell_mage_living_bomb_periodic', +'spell_mage_nether_vortex', +'spell_mage_master_of_elements', +'spell_mage_focus_magic', +'spell_mage_glyph_of_icy_veins', +'spell_mage_glyph_of_polymorph', +'spell_mage_hot_streak', +'spell_mage_permafrost', +'spell_mage_polymorph'); +INSERT INTO `spell_script_names` (`spell_id`,`ScriptName`) VALUES +(235219,'spell_mage_cold_snap'), +(12846,'spell_mage_ignite'), +(44461,'spell_mage_living_bomb_explosion'), +(217694,'spell_mage_living_bomb_periodic'), +(136511,'spell_mage_ring_of_frost'); diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 9e1f4d2dd87..8e9035e5a40 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -4583,8 +4583,6 @@ void AddSC_generic_spell_scripts() new spell_gen_increase_stats_buff("spell_dru_mark_of_the_wild"); new spell_gen_increase_stats_buff("spell_pri_power_word_fortitude"); new spell_gen_increase_stats_buff("spell_pri_shadow_protection"); - new spell_gen_increase_stats_buff("spell_mage_arcane_brilliance"); - new spell_gen_increase_stats_buff("spell_mage_dalaran_brilliance"); new spell_gen_interrupt(); new spell_gen_lifebloom("spell_hexlord_lifebloom", SPELL_HEXLORD_MALACRASS_LIFEBLOOM_FINAL_HEAL); new spell_gen_lifebloom("spell_tur_ragepaw_lifebloom", SPELL_TUR_RAGEPAW_LIFEBLOOM_FINAL_HEAL); diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index f4efe94d241..a870223bc74 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -34,738 +34,352 @@ enum MageSpells { SPELL_MAGE_BLAZING_BARRIER_TRIGGER = 235314, - SPELL_MAGE_COLD_SNAP = 11958, + SPELL_MAGE_CONE_OF_COLD = 120, + SPELL_MAGE_CONE_OF_COLD_SLOW = 212792, SPELL_MAGE_CONJURE_REFRESHMENT = 116136, SPELL_MAGE_CONJURE_REFRESHMENT_TABLE = 167145, + SPELL_MAGE_DRAGONHAWK_FORM = 32818, SPELL_MAGE_FINGERS_OF_FROST = 44544, - SPELL_MAGE_FOCUS_MAGIC_PROC = 54648, SPELL_MAGE_FROST_NOVA = 122, - SPELL_MAGE_IMPROVED_POLYMORPH_RANK_1 = 11210, - SPELL_MAGE_IMPROVED_POLYMORPH_STUN_RANK_1 = 83046, - SPELL_MAGE_IMPROVED_POLYMORPH_MARKER = 87515, + SPELL_MAGE_GIRAFFE_FORM = 32816, + SPELL_MAGE_ICE_BARRIER = 11426, + SPELL_MAGE_ICE_BLOCK = 45438, SPELL_MAGE_IGNITE = 12654, + SPELL_MAGE_LIVING_BOMB_EXPLOSION = 44461, + SPELL_MAGE_LIVING_BOMB_PERIODIC = 217694, SPELL_MAGE_MANA_SURGE = 37445, - SPELL_MAGE_MASTER_OF_ELEMENTS_ENERGIZE = 29077, - SPELL_MAGE_PERMAFROST = 91394, - SPELL_MAGE_SLOW = 31589, - SPELL_MAGE_SQUIRREL_FORM = 32813, - SPELL_MAGE_GIRAFFE_FORM = 32816, + SPELL_MAGE_RING_OF_FROST_DUMMY = 91264, + SPELL_MAGE_RING_OF_FROST_FREEZE = 82691, + SPELL_MAGE_RING_OF_FROST_SUMMON = 113724, SPELL_MAGE_SERPENT_FORM = 32817, - SPELL_MAGE_DRAGONHAWK_FORM = 32818, - SPELL_MAGE_WORGEN_FORM = 32819, SPELL_MAGE_SHEEP_FORM = 32820, - SPELL_MAGE_CONE_OF_COLD_AURA_R1 = 11190, - SPELL_MAGE_CONE_OF_COLD_AURA_R2 = 12489, - SPELL_MAGE_CONE_OF_COLD_TRIGGER_R1 = 83301, - SPELL_MAGE_CONE_OF_COLD_TRIGGER_R2 = 83302, - SPELL_MAGE_RING_OF_FROST_SUMMON = 82676, - SPELL_MAGE_RING_OF_FROST_FREEZE = 82691, - SPELL_MAGE_RING_OF_FROST_DUMMY = 91264, + SPELL_MAGE_SQUIRREL_FORM = 32813, SPELL_MAGE_TEMPORAL_DISPLACEMENT = 80354, + SPELL_MAGE_WORGEN_FORM = 32819, SPELL_PET_NETHERWINDS_FATIGUED = 160455, }; enum MiscSpells { SPELL_HUNTER_INSANITY = 95809, - SPELL_PRIEST_SHADOW_WORD_DEATH = 32409, SPELL_SHAMAN_EXHAUSTION = 57723, SPELL_SHAMAN_SATED = 57724, SPELL_MAGE_CHILLED = 205708 }; // 235313 - Blazing Barrier -class spell_mage_blazing_barrier : public SpellScriptLoader +class spell_mage_blazing_barrier : public AuraScript { - public: - spell_mage_blazing_barrier() : SpellScriptLoader("spell_mage_blazing_barrier") { } + PrepareAuraScript(spell_mage_blazing_barrier); - class spell_mage_blazing_barrier_AuraScript : public AuraScript - { - PrepareAuraScript(spell_mage_blazing_barrier_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo - ({ - SPELL_MAGE_BLAZING_BARRIER_TRIGGER - }); - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) - { - canBeRecalculated = false; - if (Unit* caster = GetCaster()) - amount = int32(caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()) * 7.0f); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_MAGE_BLAZING_BARRIER_TRIGGER }); + } - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - Unit* caster = eventInfo.GetDamageInfo()->GetVictim(); - Unit* target = eventInfo.GetDamageInfo()->GetAttacker(); + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) + { + canBeRecalculated = false; + if (Unit* caster = GetCaster()) + amount = int32(caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()) * 7.0f); + } - if (caster && target) - caster->CastSpell(target, SPELL_MAGE_BLAZING_BARRIER_TRIGGER, true); - } + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* caster = eventInfo.GetDamageInfo()->GetVictim(); + Unit* target = eventInfo.GetDamageInfo()->GetAttacker(); - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_blazing_barrier_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - OnEffectProc += AuraEffectProcFn(spell_mage_blazing_barrier_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_PROC_TRIGGER_SPELL); - } - }; + if (caster && target) + caster->CastSpell(target, SPELL_MAGE_BLAZING_BARRIER_TRIGGER, true); + } - AuraScript* GetAuraScript() const override - { - return new spell_mage_blazing_barrier_AuraScript(); - } + void Register() override + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_blazing_barrier::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + OnEffectProc += AuraEffectProcFn(spell_mage_blazing_barrier::HandleProc, EFFECT_1, SPELL_AURA_PROC_TRIGGER_SPELL); + } }; // 198063 - Burning Determination -class spell_mage_burning_determination : public SpellScriptLoader +class spell_mage_burning_determination : public AuraScript { - public: - spell_mage_burning_determination() : SpellScriptLoader("spell_mage_burning_determination") { } - - class spell_mage_burning_determination_AuraScript : public AuraScript - { - PrepareAuraScript(spell_mage_burning_determination_AuraScript); - - bool CheckProc(ProcEventInfo& eventInfo) - { - if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo()) - if (spellInfo->GetAllEffectsMechanicMask() & ((1 << MECHANIC_INTERRUPT) | (1 << MECHANIC_SILENCE))) - return true; + PrepareAuraScript(spell_mage_burning_determination); - return false; - } + bool CheckProc(ProcEventInfo& eventInfo) + { + if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo()) + if (spellInfo->GetAllEffectsMechanicMask() & ((1 << MECHANIC_INTERRUPT) | (1 << MECHANIC_SILENCE))) + return true; - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_mage_burning_determination_AuraScript::CheckProc); - } - }; + return false; + } - AuraScript* GetAuraScript() const override - { - return new spell_mage_burning_determination_AuraScript(); - } + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_mage_burning_determination::CheckProc); + } }; -// 11958 - Cold Snap -class spell_mage_cold_snap : public SpellScriptLoader +// 235219 - Cold Snap +class spell_mage_cold_snap : public SpellScript { - public: - spell_mage_cold_snap() : SpellScriptLoader("spell_mage_cold_snap") { } - - class spell_mage_cold_snap_SpellScript : public SpellScript - { - PrepareSpellScript(spell_mage_cold_snap_SpellScript); - - bool Load() override - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } + PrepareSpellScript(spell_mage_cold_snap); - void HandleDummy(SpellEffIndex /*effIndex*/) - { - GetCaster()->GetSpellHistory()->ResetCooldowns([](SpellHistory::CooldownStorageType::iterator itr) - { - SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(itr->first); - return spellInfo->SpellFamilyName == SPELLFAMILY_MAGE && (spellInfo->GetSchoolMask() & SPELL_SCHOOL_MASK_FROST) && - spellInfo->Id != SPELL_MAGE_COLD_SNAP && spellInfo->GetRecoveryTime() > 0; - }, true); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo + ({ + SPELL_MAGE_CONE_OF_COLD, + SPELL_MAGE_FROST_NOVA, + SPELL_MAGE_ICE_BARRIER, + SPELL_MAGE_ICE_BLOCK + }); + } - void Register() override + void HandleDummy(SpellEffIndex /*effIndex*/) + { + GetCaster()->GetSpellHistory()->ResetCooldowns([](SpellHistory::CooldownStorageType::iterator itr) + { + switch (itr->first) { - OnEffectHit += SpellEffectFn(spell_mage_cold_snap_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + case SPELL_MAGE_CONE_OF_COLD: + case SPELL_MAGE_FROST_NOVA: + case SPELL_MAGE_ICE_BARRIER: + case SPELL_MAGE_ICE_BLOCK: + return true; + default: + break; } - }; + return false; + }, true); + } - SpellScript* GetSpellScript() const override - { - return new spell_mage_cold_snap_SpellScript(); - } + void Register() override + { + OnEffectHit += SpellEffectFn(spell_mage_cold_snap::HandleDummy, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } }; // 120 - Cone of Cold -/// Updated 4.3.4 -class spell_mage_cone_of_cold : public SpellScriptLoader +class spell_mage_cone_of_cold : public SpellScript { - public: - spell_mage_cone_of_cold() : SpellScriptLoader("spell_mage_cone_of_cold") { } - - class spell_mage_cone_of_cold_SpellScript : public SpellScript - { - PrepareSpellScript(spell_mage_cone_of_cold_SpellScript); + PrepareSpellScript(spell_mage_cone_of_cold); - void HandleConeOfColdScript(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Unit* unitTarget = GetHitUnit()) - { - if (caster->HasAura(SPELL_MAGE_CONE_OF_COLD_AURA_R1)) // Improved Cone of Cold Rank 1 - unitTarget->CastSpell(unitTarget, SPELL_MAGE_CONE_OF_COLD_TRIGGER_R1, true); - else if (caster->HasAura(SPELL_MAGE_CONE_OF_COLD_AURA_R2)) // Improved Cone of Cold Rank 2 - unitTarget->CastSpell(unitTarget, SPELL_MAGE_CONE_OF_COLD_TRIGGER_R2, true); - } - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_MAGE_CONE_OF_COLD_SLOW }); + } - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_mage_cone_of_cold_SpellScript::HandleConeOfColdScript, EFFECT_0, SPELL_EFFECT_APPLY_AURA); - } - }; + void HandleSlow(SpellEffIndex /*effIndex*/) + { + GetCaster()->CastSpell(GetHitUnit(), SPELL_MAGE_CONE_OF_COLD_SLOW, true); + } - SpellScript* GetSpellScript() const override - { - return new spell_mage_cone_of_cold_SpellScript(); - } + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_mage_cone_of_cold::HandleSlow, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + } }; // 190336 - Conjure Refreshment -class spell_mage_conjure_refreshment : public SpellScriptLoader +class spell_mage_conjure_refreshment : public SpellScript { -public: - spell_mage_conjure_refreshment() : SpellScriptLoader("spell_mage_conjure_refreshment") { } + PrepareSpellScript(spell_mage_conjure_refreshment); - class spell_mage_conjure_refreshment_SpellScript : public SpellScript + bool Validate(SpellInfo const* /*spellInfo*/) override { - PrepareSpellScript(spell_mage_conjure_refreshment_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo - ({ - SPELL_MAGE_CONJURE_REFRESHMENT, - SPELL_MAGE_CONJURE_REFRESHMENT_TABLE - }); - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Player* caster = GetCaster()->ToPlayer()) - { - Group* group = caster->GetGroup(); - if (group) - caster->CastSpell(caster, SPELL_MAGE_CONJURE_REFRESHMENT_TABLE, true); - else - caster->CastSpell(caster, SPELL_MAGE_CONJURE_REFRESHMENT, true); - } - } + return ValidateSpellInfo + ({ + SPELL_MAGE_CONJURE_REFRESHMENT, + SPELL_MAGE_CONJURE_REFRESHMENT_TABLE + }); + } - void Register() override + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (Player* caster = GetCaster()->ToPlayer()) { - OnEffectHitTarget += SpellEffectFn(spell_mage_conjure_refreshment_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + Group* group = caster->GetGroup(); + if (group) + caster->CastSpell(caster, SPELL_MAGE_CONJURE_REFRESHMENT_TABLE, true); + else + caster->CastSpell(caster, SPELL_MAGE_CONJURE_REFRESHMENT, true); } - }; + } - SpellScript* GetSpellScript() const override + void Register() override { - return new spell_mage_conjure_refreshment_SpellScript(); + OnEffectHitTarget += SpellEffectFn(spell_mage_conjure_refreshment::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; -// 54646 - Focus Magic -class spell_mage_focus_magic : public SpellScriptLoader -{ - public: - spell_mage_focus_magic() : SpellScriptLoader("spell_mage_focus_magic") { } - - class spell_mage_focus_magic_AuraScript : public AuraScript - { - PrepareAuraScript(spell_mage_focus_magic_AuraScript); - - public: - spell_mage_focus_magic_AuraScript() - { - _procTarget = nullptr; - } - - private: - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_MAGE_FOCUS_MAGIC_PROC }); - } - - bool CheckProc(ProcEventInfo& /*eventInfo*/) - { - _procTarget = GetCaster(); - return _procTarget && _procTarget->IsAlive(); - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - GetTarget()->CastSpell(_procTarget, SPELL_MAGE_FOCUS_MAGIC_PROC, true, NULL, aurEff); - } - - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_mage_focus_magic_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_mage_focus_magic_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_MOD_SPELL_CRIT_CHANCE); - } - - private: - Unit* _procTarget; - }; - - AuraScript* GetAuraScript() const override - { - return new spell_mage_focus_magic_AuraScript(); - } -}; - -// 195283 - Hot Streak -class spell_mage_hot_streak : public SpellScriptLoader -{ - public: - spell_mage_hot_streak() : SpellScriptLoader("spell_mage_hot_streak") { } - - class spell_mage_hot_streak_AuraScript : public AuraScript - { - PrepareAuraScript(spell_mage_hot_streak_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return true; - } - - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) - { - } - - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_mage_hot_streak_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_mage_hot_streak_AuraScript(); - } -}; - -// 56374 - Glyph of Icy Veins -class spell_mage_glyph_of_icy_veins : public SpellScriptLoader +// 11426 - Ice Barrier +class spell_mage_ice_barrier : public AuraScript { - public: - spell_mage_glyph_of_icy_veins() : SpellScriptLoader("spell_mage_glyph_of_icy_veins") { } + PrepareAuraScript(spell_mage_ice_barrier); - class spell_mage_glyph_of_icy_veins_AuraScript : public AuraScript - { - PrepareAuraScript(spell_mage_glyph_of_icy_veins_AuraScript); + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo + ({ + SPELL_MAGE_CHILLED + }); + } - void HandleEffectProc(AuraEffect const* /*aurEff*/, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) + { + canBeRecalculated = false; + if (Unit* caster = GetCaster()) + amount += int32(caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()) * 10.0f); + } - GetTarget()->RemoveAurasByType(SPELL_AURA_HASTE_SPELLS, ObjectGuid::Empty, 0, true, false); - GetTarget()->RemoveAurasByType(SPELL_AURA_MOD_DECREASE_SPEED); - } + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + Unit* caster = eventInfo.GetDamageInfo()->GetVictim(); + Unit* target = eventInfo.GetDamageInfo()->GetAttacker(); - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_mage_glyph_of_icy_veins_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; + if (caster && target) + caster->CastSpell(target, SPELL_MAGE_CHILLED, true); + } - AuraScript* GetAuraScript() const override - { - return new spell_mage_glyph_of_icy_veins_AuraScript(); - } + void Register() override + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_ice_barrier::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + OnEffectProc += AuraEffectProcFn(spell_mage_ice_barrier::HandleProc, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + } }; -// 56375 - Glyph of Polymorph -class spell_mage_glyph_of_polymorph : public SpellScriptLoader +// 12846 - Ignite +class spell_mage_ignite : public AuraScript { - public: - spell_mage_glyph_of_polymorph() : SpellScriptLoader("spell_mage_glyph_of_polymorph") { } + PrepareAuraScript(spell_mage_ignite); - class spell_mage_glyph_of_polymorph_AuraScript : public AuraScript - { - PrepareAuraScript(spell_mage_glyph_of_polymorph_AuraScript); + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_MAGE_IGNITE }); + } - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_PRIEST_SHADOW_WORD_DEATH }); - } + bool CheckProc(ProcEventInfo& eventInfo) + { + return eventInfo.GetProcTarget() != nullptr; + } - void HandleEffectProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - Unit* target = eventInfo.GetProcTarget(); + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); - target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE, ObjectGuid::Empty, target->GetAura(SPELL_PRIEST_SHADOW_WORD_DEATH)); // SW:D shall not be removed. - target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT); - target->RemoveAurasByType(SPELL_AURA_PERIODIC_LEECH); - } + SpellInfo const* igniteDot = sSpellMgr->AssertSpellInfo(SPELL_MAGE_IGNITE); + int32 pct = aurEff->GetAmount(); - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_mage_glyph_of_polymorph_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; + int32 amount = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), pct) / igniteDot->GetMaxTicks(DIFFICULTY_NONE)); + amount += eventInfo.GetProcTarget()->GetRemainingPeriodicAmount(eventInfo.GetActor()->GetGUID(), SPELL_MAGE_IGNITE, SPELL_AURA_PERIODIC_DAMAGE); + GetTarget()->CastCustomSpell(SPELL_MAGE_IGNITE, SPELLVALUE_BASE_POINT0, amount, eventInfo.GetProcTarget(), true, nullptr, aurEff); + } - AuraScript* GetAuraScript() const override - { - return new spell_mage_glyph_of_polymorph_AuraScript(); - } + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_mage_ignite::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_mage_ignite::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } }; // 37447 - Improved Mana Gems // 61062 - Improved Mana Gems -class spell_mage_imp_mana_gems : public SpellScriptLoader +class spell_mage_imp_mana_gems : public AuraScript { - public: - spell_mage_imp_mana_gems() : SpellScriptLoader("spell_mage_imp_mana_gems") { } + PrepareAuraScript(spell_mage_imp_mana_gems); - class spell_mage_imp_mana_gems_AuraScript : public AuraScript - { - PrepareAuraScript(spell_mage_imp_mana_gems_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_MAGE_MANA_SURGE }); - } - - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - eventInfo.GetActor()->CastSpell((Unit*)nullptr, SPELL_MAGE_MANA_SURGE, true); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_MAGE_MANA_SURGE }); + } - void Register() override - { - OnEffectProc += AuraEffectProcFn(spell_mage_imp_mana_gems_AuraScript::HandleProc, EFFECT_1, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS); - } - }; + void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + eventInfo.GetActor()->CastSpell((Unit*)nullptr, SPELL_MAGE_MANA_SURGE, true); + } - AuraScript* GetAuraScript() const override - { - return new spell_mage_imp_mana_gems_AuraScript(); - } + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_mage_imp_mana_gems::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); + } }; // 44457 - Living Bomb -class spell_mage_living_bomb : public SpellScriptLoader +class spell_mage_living_bomb : public SpellScript { - public: - spell_mage_living_bomb() : SpellScriptLoader("spell_mage_living_bomb") { } - - class spell_mage_living_bomb_AuraScript : public AuraScript - { - PrepareAuraScript(spell_mage_living_bomb_AuraScript); - - bool Validate(SpellInfo const* spellInfo) override - { - if (!spellInfo->GetEffect(EFFECT_1)) - return false; - return ValidateSpellInfo({ uint32(spellInfo->GetEffect(EFFECT_1)->CalcValue()) }); - } + PrepareSpellScript(spell_mage_living_bomb); - void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) - { - AuraRemoveMode removeMode = GetTargetApplication()->GetRemoveMode(); - if (removeMode != AURA_REMOVE_BY_ENEMY_SPELL && removeMode != AURA_REMOVE_BY_EXPIRE) - return; - - if (Unit* caster = GetCaster()) - caster->CastSpell(GetTarget(), uint32(aurEff->GetAmount()), true, NULL, aurEff); - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_mage_living_bomb_AuraScript::AfterRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_mage_living_bomb_AuraScript(); - } -}; - -// 11426 - Ice Barrier -class spell_mage_ice_barrier : public SpellScriptLoader -{ - public: - spell_mage_ice_barrier() : SpellScriptLoader("spell_mage_ice_barrier") { } - - class spell_mage_ice_barrier_AuraScript : public AuraScript - { - PrepareAuraScript(spell_mage_ice_barrier_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo - ({ - SPELL_MAGE_CHILLED - }); - } - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) - { - canBeRecalculated = false; - if (Unit* caster = GetCaster()) - amount += int32(caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()) * 10.0f); - } - - void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) - { - Unit* caster = eventInfo.GetDamageInfo()->GetVictim(); - Unit* target = eventInfo.GetDamageInfo()->GetAttacker(); - - if (caster && target) - caster->CastSpell(target, SPELL_MAGE_CHILLED, true); - } - - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_ice_barrier_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - OnEffectProc += AuraEffectProcFn(spell_mage_ice_barrier_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_mage_ice_barrier_AuraScript(); - } -}; - -// -11119 - Ignite -class spell_mage_ignite : public SpellScriptLoader -{ - public: - spell_mage_ignite() : SpellScriptLoader("spell_mage_ignite") { } - - class spell_mage_ignite_AuraScript : public AuraScript - { - PrepareAuraScript(spell_mage_ignite_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_MAGE_IGNITE }); - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetProcTarget() != nullptr; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - SpellInfo const* igniteDot = sSpellMgr->AssertSpellInfo(SPELL_MAGE_IGNITE); - int32 pct = 8 * GetSpellInfo()->GetRank(); - - int32 amount = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), pct) / igniteDot->GetMaxTicks(DIFFICULTY_NONE)); - amount += eventInfo.GetProcTarget()->GetRemainingPeriodicAmount(eventInfo.GetActor()->GetGUID(), SPELL_MAGE_IGNITE, SPELL_AURA_PERIODIC_DAMAGE); - GetTarget()->CastCustomSpell(SPELL_MAGE_IGNITE, SPELLVALUE_BASE_POINT0, amount, eventInfo.GetProcTarget(), true, NULL, aurEff); - } - - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_mage_ignite_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_mage_ignite_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_mage_ignite_AuraScript(); - } -}; - -// -29074 - Master of Elements -class spell_mage_master_of_elements : public SpellScriptLoader -{ - public: - spell_mage_master_of_elements() : SpellScriptLoader("spell_mage_master_of_elements") { } - - class spell_mage_master_of_elements_AuraScript : public AuraScript - { - PrepareAuraScript(spell_mage_master_of_elements_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_MAGE_MASTER_OF_ELEMENTS_ENERGIZE }); - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - return eventInfo.GetProcSpell() != nullptr; - } - - void HandleProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - - std::vector<SpellPowerCost> const& costs = eventInfo.GetProcSpell()->GetPowerCost(); - auto m = std::find_if(costs.begin(), costs.end(), [](SpellPowerCost const& cost) { return cost.Power == POWER_MANA; }); - if (m != costs.end()) - { - int32 mana = CalculatePct(m->Amount, aurEff->GetAmount()); - if (mana > 0) - GetTarget()->CastCustomSpell(SPELL_MAGE_MASTER_OF_ELEMENTS_ENERGIZE, SPELLVALUE_BASE_POINT0, mana, GetTarget(), true, NULL, aurEff); - } - } - - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_mage_master_of_elements_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_mage_master_of_elements_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_mage_master_of_elements_AuraScript(); - } -}; - -// 86181 - Nether Vortex -class spell_mage_nether_vortex : public SpellScriptLoader -{ - public: - spell_mage_nether_vortex() : SpellScriptLoader("spell_mage_nether_vortex") { } - - class spell_mage_nether_vortex_AuraScript : public AuraScript - { - PrepareAuraScript(spell_mage_nether_vortex_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_MAGE_SLOW }); - } - - bool DoCheck(ProcEventInfo& eventInfo) - { - if (Aura* aura = eventInfo.GetProcTarget()->GetAura(SPELL_MAGE_SLOW)) - if (aura->GetCasterGUID() != GetTarget()->GetGUID()) - return false; - - return true; - } - - void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - GetTarget()->CastSpell(eventInfo.GetProcTarget(), SPELL_MAGE_SLOW, true, NULL, aurEff); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_MAGE_LIVING_BOMB_PERIODIC }); + } - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_mage_nether_vortex_AuraScript::DoCheck); - OnEffectProc += AuraEffectProcFn(spell_mage_nether_vortex_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; + void HandleDummy(SpellEffIndex effIndex) + { + PreventHitDefaultEffect(effIndex); + GetCaster()->CastCustomSpell(SPELL_MAGE_LIVING_BOMB_PERIODIC, SPELLVALUE_BASE_POINT2, 1, GetHitUnit(), TRIGGERED_FULL_MASK); + } - AuraScript* GetAuraScript() const override - { - return new spell_mage_nether_vortex_AuraScript(); - } + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_mage_living_bomb::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } }; -// -11175 - Permafrost -class spell_mage_permafrost : public SpellScriptLoader +// 44461 - Living Bomb +class spell_mage_living_bomb_explosion : public SpellScript { - public: - spell_mage_permafrost() : SpellScriptLoader("spell_mage_permafrost") { } - - class spell_mage_permafrost_AuraScript : public AuraScript - { - PrepareAuraScript(spell_mage_permafrost_AuraScript); + PrepareSpellScript(spell_mage_living_bomb_explosion); - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_MAGE_PERMAFROST }); - } - - bool DoCheck(ProcEventInfo& eventInfo) - { - return GetTarget()->GetGuardianPet() && eventInfo.GetDamageInfo()->GetDamage(); - } - - void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); + bool Validate(SpellInfo const* spellInfo) override + { + return spellInfo->NeedsExplicitUnitTarget() && ValidateSpellInfo({ SPELL_MAGE_LIVING_BOMB_PERIODIC }); + } - int32 heal = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), aurEff->GetAmount())); - GetTarget()->CastCustomSpell(SPELL_MAGE_PERMAFROST, SPELLVALUE_BASE_POINT0, heal, (Unit*)NULL, true, NULL, aurEff); - } + void FilterTargets(std::list<WorldObject*>& targets) + { + targets.remove(GetExplTargetWorldObject()); + } - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_mage_permafrost_AuraScript::DoCheck); - OnEffectProc += AuraEffectProcFn(spell_mage_permafrost_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; + void HandleSpread(SpellEffIndex /*effIndex*/) + { + if (GetSpellValue()->EffectBasePoints[EFFECT_0] > 0) + GetCaster()->CastCustomSpell(SPELL_MAGE_LIVING_BOMB_PERIODIC, SPELLVALUE_BASE_POINT2, 0, GetHitUnit(), TRIGGERED_FULL_MASK); + } - AuraScript* GetAuraScript() const override - { - return new spell_mage_permafrost_AuraScript(); - } + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mage_living_bomb_explosion::FilterTargets, EFFECT_1, TARGET_UNIT_DEST_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_mage_living_bomb_explosion::HandleSpread, EFFECT_1, SPELL_EFFECT_SCHOOL_DAMAGE); + } }; -// 118 - Polymorph -class spell_mage_polymorph : public SpellScriptLoader +// 217694 - Living Bomb +class spell_mage_living_bomb_periodic : public AuraScript { - public: - spell_mage_polymorph() : SpellScriptLoader("spell_mage_polymorph") { } - - class spell_mage_polymorph_AuraScript : public AuraScript - { - PrepareAuraScript(spell_mage_polymorph_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( - { - SPELL_MAGE_IMPROVED_POLYMORPH_RANK_1, - SPELL_MAGE_IMPROVED_POLYMORPH_STUN_RANK_1, - SPELL_MAGE_IMPROVED_POLYMORPH_MARKER - }); - } - - bool DoCheck(ProcEventInfo& eventInfo) - { - _caster = GetCaster(); - return _caster && eventInfo.GetDamageInfo(); - } + PrepareAuraScript(spell_mage_living_bomb_periodic); - void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) - { - PreventDefaultAction(); - // Improved Polymorph - if (AuraEffect const* improvedPolymorph = _caster->GetAuraEffectOfRankedSpell(SPELL_MAGE_IMPROVED_POLYMORPH_RANK_1, EFFECT_0)) - { - if (_caster->HasAura(SPELL_MAGE_IMPROVED_POLYMORPH_MARKER)) - return; - - GetTarget()->CastSpell(GetTarget(), sSpellMgr->GetSpellWithRank(SPELL_MAGE_IMPROVED_POLYMORPH_STUN_RANK_1, improvedPolymorph->GetSpellInfo()->GetRank()), true, NULL, aurEff); - _caster->CastSpell(_caster, SPELL_MAGE_IMPROVED_POLYMORPH_MARKER, true, NULL, aurEff); - } - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_MAGE_LIVING_BOMB_EXPLOSION }); + } - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_mage_polymorph_AuraScript::DoCheck); - OnEffectProc += AuraEffectProcFn(spell_mage_polymorph_AuraScript::HandleEffectProc, EFFECT_0, SPELL_AURA_MOD_CONFUSE); - } + void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) + return; - private: - Unit* _caster = nullptr; - }; + if (Unit* caster = GetCaster()) + caster->CastCustomSpell(SPELL_MAGE_LIVING_BOMB_EXPLOSION, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetTarget(), TRIGGERED_FULL_MASK); + } - AuraScript* GetAuraScript() const override - { - return new spell_mage_polymorph_AuraScript(); - } + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_mage_living_bomb_periodic::AfterRemove, EFFECT_2, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } }; enum SilvermoonPolymorph @@ -775,43 +389,32 @@ enum SilvermoonPolymorph /// @todo move out of here and rename - not a mage spell // 32826 - Polymorph (Visual) -class spell_mage_polymorph_cast_visual : public SpellScriptLoader +class spell_mage_polymorph_visual : public SpellScript { - public: - spell_mage_polymorph_cast_visual() : SpellScriptLoader("spell_mage_polymorph_visual") { } - - class spell_mage_polymorph_cast_visual_SpellScript : public SpellScript - { - PrepareSpellScript(spell_mage_polymorph_cast_visual_SpellScript); + PrepareSpellScript(spell_mage_polymorph_visual); - static const uint32 PolymorhForms[6]; + static const uint32 PolymorhForms[6]; - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo(PolymorhForms); - } - - void HandleDummy(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetCaster()->FindNearestCreature(NPC_AUROSALIA, 30.0f)) - if (target->GetTypeId() == TYPEID_UNIT) - target->CastSpell(target, PolymorhForms[urand(0, 5)], true); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo(PolymorhForms); + } - void Register() override - { - // add dummy effect spell handler to Polymorph visual - OnEffectHitTarget += SpellEffectFn(spell_mage_polymorph_cast_visual_SpellScript::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; + void HandleDummy(SpellEffIndex /*effIndex*/) + { + if (Unit* target = GetCaster()->FindNearestCreature(NPC_AUROSALIA, 30.0f)) + if (target->GetTypeId() == TYPEID_UNIT) + target->CastSpell(target, PolymorhForms[urand(0, 5)], true); + } - SpellScript* GetSpellScript() const override - { - return new spell_mage_polymorph_cast_visual_SpellScript(); - } + void Register() override + { + // add dummy effect spell handler to Polymorph visual + OnEffectHitTarget += SpellEffectFn(spell_mage_polymorph_visual::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); + } }; -uint32 const spell_mage_polymorph_cast_visual::spell_mage_polymorph_cast_visual_SpellScript::PolymorhForms[6] = +uint32 const spell_mage_polymorph_visual::PolymorhForms[6] = { SPELL_MAGE_SQUIRREL_FORM, SPELL_MAGE_GIRAFFE_FORM, @@ -822,324 +425,237 @@ uint32 const spell_mage_polymorph_cast_visual::spell_mage_polymorph_cast_visual_ }; // 235450 - Prismatic Barrier -class spell_mage_prismatic_barrier : public SpellScriptLoader +class spell_mage_prismatic_barrier : public AuraScript { - public: - spell_mage_prismatic_barrier() : SpellScriptLoader("spell_mage_prismatic_barrier") { } - - class spell_mage_prismatic_barrier_AuraScript : public AuraScript - { - PrepareAuraScript(spell_mage_prismatic_barrier_AuraScript); - - void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) - { - canBeRecalculated = false; - if (Unit* caster = GetCaster()) - amount += int32(caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()) * 7.0f); - } + PrepareAuraScript(spell_mage_prismatic_barrier); - void Register() override - { - DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_prismatic_barrier_AuraScript::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); - } - }; + void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) + { + canBeRecalculated = false; + if (Unit* caster = GetCaster()) + amount += int32(caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()) * 7.0f); + } - AuraScript* GetAuraScript() const override - { - return new spell_mage_prismatic_barrier_AuraScript(); - } + void Register() override + { + DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_prismatic_barrier::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); + } }; -// 82676 - Ring of Frost -/// Updated 4.3.4 -class spell_mage_ring_of_frost : public SpellScriptLoader +// 136511 - Ring of Frost +class spell_mage_ring_of_frost : public AuraScript { - public: - spell_mage_ring_of_frost() : SpellScriptLoader("spell_mage_ring_of_frost") { } + PrepareAuraScript(spell_mage_ring_of_frost); - class spell_mage_ring_of_frost_AuraScript : public AuraScript - { - PrepareAuraScript(spell_mage_ring_of_frost_AuraScript); + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_MAGE_RING_OF_FROST_SUMMON, SPELL_MAGE_RING_OF_FROST_FREEZE }); + } - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( - { - SPELL_MAGE_RING_OF_FROST_SUMMON, - SPELL_MAGE_RING_OF_FROST_FREEZE, - SPELL_MAGE_RING_OF_FROST_DUMMY - }); - } + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) + { + if (TempSummon* ringOfFrost = GetRingOfFrostMinion()) + GetTarget()->CastSpell(ringOfFrost->GetPositionX(), ringOfFrost->GetPositionY(), ringOfFrost->GetPositionZ(), SPELL_MAGE_RING_OF_FROST_FREEZE, true); + } - void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) - { - if (TempSummon* ringOfFrost = GetRingOfFrostMinion()) - if (GetMaxDuration() - int32(ringOfFrost->GetTimer()) >= sSpellMgr->AssertSpellInfo(SPELL_MAGE_RING_OF_FROST_DUMMY)->GetDuration()) - GetTarget()->CastSpell(ringOfFrost->GetPositionX(), ringOfFrost->GetPositionY(), ringOfFrost->GetPositionZ(), SPELL_MAGE_RING_OF_FROST_FREEZE, true); - } + void Apply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + std::list<TempSummon*> minions; + GetTarget()->GetAllMinionsByEntry(minions, sSpellMgr->AssertSpellInfo(SPELL_MAGE_RING_OF_FROST_SUMMON)->GetEffect(EFFECT_0)->MiscValue); - void Apply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + // Get the last summoned RoF, save it and despawn older ones + for (TempSummon* summon : minions) + { + if (TempSummon* ringOfFrost = GetRingOfFrostMinion()) { - std::list<TempSummon*> MinionList; - GetTarget()->GetAllMinionsByEntry(MinionList, GetSpellInfo()->GetEffect(EFFECT_0)->MiscValue); - - // Get the last summoned RoF, save it and despawn older ones - for (std::list<TempSummon*>::iterator itr = MinionList.begin(); itr != MinionList.end(); ++itr) + if (summon->GetTimer() > ringOfFrost->GetTimer()) { - TempSummon* summon = (*itr); - - if (TempSummon* ringOfFrost = GetRingOfFrostMinion()) - { - if (summon->GetTimer() > ringOfFrost->GetTimer()) - { - ringOfFrost->DespawnOrUnsummon(); - _ringOfFrostGUID = summon->GetGUID(); - } - else - summon->DespawnOrUnsummon(); - } - else - _ringOfFrostGUID = summon->GetGUID(); + ringOfFrost->DespawnOrUnsummon(); + _ringOfFrostGUID = summon->GetGUID(); } + else + summon->DespawnOrUnsummon(); } + else + _ringOfFrostGUID = summon->GetGUID(); + } + } - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_mage_ring_of_frost_AuraScript::HandleEffectPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - OnEffectApply += AuraEffectApplyFn(spell_mage_ring_of_frost_AuraScript::Apply, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); - } - - private: - TempSummon* GetRingOfFrostMinion() const - { - if (Creature* creature = ObjectAccessor::GetCreature(*GetOwner(), _ringOfFrostGUID)) - return creature->ToTempSummon(); - return nullptr; - } + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_mage_ring_of_frost::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + OnEffectApply += AuraEffectApplyFn(spell_mage_ring_of_frost::Apply, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + } - ObjectGuid _ringOfFrostGUID; - }; +private: + TempSummon* GetRingOfFrostMinion() const + { + if (Creature* creature = ObjectAccessor::GetCreature(*GetOwner(), _ringOfFrostGUID)) + return creature->ToTempSummon(); + return nullptr; + } - AuraScript* GetAuraScript() const override - { - return new spell_mage_ring_of_frost_AuraScript(); - } + ObjectGuid _ringOfFrostGUID; }; // 82691 - Ring of Frost (freeze efect) -/// Updated 4.3.4 -class spell_mage_ring_of_frost_freeze : public SpellScriptLoader +class spell_mage_ring_of_frost_freeze : public SpellScript { - public: - spell_mage_ring_of_frost_freeze() : SpellScriptLoader("spell_mage_ring_of_frost_freeze") { } - - class spell_mage_ring_of_frost_freeze_SpellScript : public SpellScript - { - PrepareSpellScript(spell_mage_ring_of_frost_freeze_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_MAGE_RING_OF_FROST_SUMMON, SPELL_MAGE_RING_OF_FROST_FREEZE }); - } - - void FilterTargets(std::list<WorldObject*>& targets) - { - WorldLocation const* dest = GetExplTargetDest(); - float outRadius = sSpellMgr->AssertSpellInfo(SPELL_MAGE_RING_OF_FROST_SUMMON)->GetEffect(EFFECT_0)->CalcRadius(); - float inRadius = 4.7f; + PrepareSpellScript(spell_mage_ring_of_frost_freeze); - targets.remove_if([dest, outRadius, inRadius](WorldObject* target) - { - Unit* unit = target->ToUnit(); - if (!unit) - return true; - return unit->HasAura(SPELL_MAGE_RING_OF_FROST_DUMMY) || unit->HasAura(SPELL_MAGE_RING_OF_FROST_FREEZE) || unit->GetExactDist(dest) > outRadius || unit->GetExactDist(dest) < inRadius; - }); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_MAGE_RING_OF_FROST_SUMMON, SPELL_MAGE_RING_OF_FROST_FREEZE }); + } - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mage_ring_of_frost_freeze_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); - } - }; + void FilterTargets(std::list<WorldObject*>& targets) + { + WorldLocation const* dest = GetExplTargetDest(); + float outRadius = sSpellMgr->AssertSpellInfo(SPELL_MAGE_RING_OF_FROST_SUMMON)->GetEffect(EFFECT_0)->CalcRadius(); + float inRadius = 6.5f; - SpellScript* GetSpellScript() const override + targets.remove_if([dest, outRadius, inRadius](WorldObject* target) { - return new spell_mage_ring_of_frost_freeze_SpellScript(); - } + Unit* unit = target->ToUnit(); + if (!unit) + return true; + return unit->HasAura(SPELL_MAGE_RING_OF_FROST_DUMMY) || unit->HasAura(SPELL_MAGE_RING_OF_FROST_FREEZE) || unit->GetExactDist(dest) > outRadius || unit->GetExactDist(dest) < inRadius; + }); + } - class spell_mage_ring_of_frost_freeze_AuraScript : public AuraScript - { - PrepareAuraScript(spell_mage_ring_of_frost_freeze_AuraScript); + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mage_ring_of_frost_freeze::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); + } +}; - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_MAGE_RING_OF_FROST_DUMMY }); - } +class spell_mage_ring_of_frost_freeze_AuraScript : public AuraScript +{ + PrepareAuraScript(spell_mage_ring_of_frost_freeze_AuraScript); - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) - if (GetCaster()) - GetCaster()->CastSpell(GetTarget(), SPELL_MAGE_RING_OF_FROST_DUMMY, true); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_MAGE_RING_OF_FROST_DUMMY }); + } - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_mage_ring_of_frost_freeze_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); - } - }; + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) + if (GetCaster()) + GetCaster()->CastSpell(GetTarget(), SPELL_MAGE_RING_OF_FROST_DUMMY, true); + } - AuraScript* GetAuraScript() const override - { - return new spell_mage_ring_of_frost_freeze_AuraScript(); - } + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_mage_ring_of_frost_freeze_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_MOD_STUN, AURA_EFFECT_HANDLE_REAL); + } }; // 80353 - Time Warp -class spell_mage_time_warp : public SpellScriptLoader +class spell_mage_time_warp : public SpellScript { - public: - spell_mage_time_warp() : SpellScriptLoader("spell_mage_time_warp") { } + PrepareSpellScript(spell_mage_time_warp); - class spell_mage_time_warp_SpellScript : public SpellScript - { - PrepareSpellScript(spell_mage_time_warp_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( - { - SPELL_MAGE_TEMPORAL_DISPLACEMENT, - SPELL_HUNTER_INSANITY, - SPELL_SHAMAN_EXHAUSTION, - SPELL_SHAMAN_SATED, - SPELL_PET_NETHERWINDS_FATIGUED - }); - } - - void RemoveInvalidTargets(std::list<WorldObject*>& targets) - { - targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_MAGE_TEMPORAL_DISPLACEMENT)); - targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_HUNTER_INSANITY)); - targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_SHAMAN_EXHAUSTION)); - targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_SHAMAN_SATED)); - } + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_MAGE_TEMPORAL_DISPLACEMENT, + SPELL_HUNTER_INSANITY, + SPELL_SHAMAN_EXHAUSTION, + SPELL_SHAMAN_SATED, + SPELL_PET_NETHERWINDS_FATIGUED + }); + } - void ApplyDebuff() - { - if (Unit* target = GetHitUnit()) - target->CastSpell(target, SPELL_MAGE_TEMPORAL_DISPLACEMENT, true); - } + void RemoveInvalidTargets(std::list<WorldObject*>& targets) + { + targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_MAGE_TEMPORAL_DISPLACEMENT)); + targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_HUNTER_INSANITY)); + targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_SHAMAN_EXHAUSTION)); + targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_SHAMAN_SATED)); + } - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mage_time_warp_SpellScript::RemoveInvalidTargets, EFFECT_ALL, TARGET_UNIT_CASTER_AREA_RAID); - AfterHit += SpellHitFn(spell_mage_time_warp_SpellScript::ApplyDebuff); - } - }; + void ApplyDebuff() + { + if (Unit* target = GetHitUnit()) + target->CastSpell(target, SPELL_MAGE_TEMPORAL_DISPLACEMENT, true); + } - SpellScript* GetSpellScript() const override - { - return new spell_mage_time_warp_SpellScript(); - } + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mage_time_warp::RemoveInvalidTargets, EFFECT_ALL, TARGET_UNIT_CASTER_AREA_RAID); + AfterHit += SpellHitFn(spell_mage_time_warp::ApplyDebuff); + } }; /* 228597 - Frostbolt 84721 - Frozen Orb 190357 - Blizzard */ -class spell_mage_trigger_chilled : public SpellScriptLoader +class spell_mage_trigger_chilled : public SpellScript { - public: - spell_mage_trigger_chilled() : SpellScriptLoader("spell_mage_trigger_chilled") { } - - class spell_mage_trigger_chilled_SpellScript : public SpellScript - { - PrepareSpellScript(spell_mage_trigger_chilled_SpellScript); + PrepareSpellScript(spell_mage_trigger_chilled); - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_MAGE_CHILLED }); - } - - void HandleChilled() - { - if (Unit* target = GetHitUnit()) - GetCaster()->CastSpell(target, SPELL_MAGE_CHILLED, true); - } + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_MAGE_CHILLED }); + } - void Register() override - { - OnHit += SpellHitFn(spell_mage_trigger_chilled_SpellScript::HandleChilled); - } - }; + void HandleChilled() + { + if (Unit* target = GetHitUnit()) + GetCaster()->CastSpell(target, SPELL_MAGE_CHILLED, true); + } - SpellScript* GetSpellScript() const override - { - return new spell_mage_trigger_chilled_SpellScript(); - } + void Register() override + { + OnHit += SpellHitFn(spell_mage_trigger_chilled::HandleChilled); + } }; // 33395 Water Elemental's Freeze -class spell_mage_water_elemental_freeze : public SpellScriptLoader +class spell_mage_water_elemental_freeze : public SpellScript { - public: - spell_mage_water_elemental_freeze() : SpellScriptLoader("spell_mage_water_elemental_freeze") { } - - class spell_mage_water_elemental_freeze_SpellScript : public SpellScript - { - PrepareSpellScript(spell_mage_water_elemental_freeze_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_MAGE_FINGERS_OF_FROST }); - } - - void HandleImprovedFreeze() - { - Unit* owner = GetCaster()->GetOwner(); - if (!owner) - return; - - owner->CastSpell(owner, SPELL_MAGE_FINGERS_OF_FROST, true); - } - - void Register() override - { - AfterHit += SpellHitFn(spell_mage_water_elemental_freeze_SpellScript::HandleImprovedFreeze); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_mage_water_elemental_freeze_SpellScript(); - } + PrepareSpellScript(spell_mage_water_elemental_freeze); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_MAGE_FINGERS_OF_FROST }); + } + + void HandleImprovedFreeze() + { + Unit* owner = GetCaster()->GetOwner(); + if (!owner) + return; + + owner->CastSpell(owner, SPELL_MAGE_FINGERS_OF_FROST, true); + } + + void Register() override + { + AfterHit += SpellHitFn(spell_mage_water_elemental_freeze::HandleImprovedFreeze); + } }; void AddSC_mage_spell_scripts() { - new spell_mage_blazing_barrier(); - new spell_mage_burning_determination(); - new spell_mage_cold_snap(); - new spell_mage_cone_of_cold(); - new spell_mage_conjure_refreshment(); - new spell_mage_focus_magic(); - new spell_mage_hot_streak(); - new spell_mage_ice_barrier(); - new spell_mage_ignite(); - new spell_mage_glyph_of_icy_veins(); - new spell_mage_glyph_of_polymorph(); - new spell_mage_imp_mana_gems(); - new spell_mage_living_bomb(); - new spell_mage_master_of_elements(); - new spell_mage_nether_vortex(); - new spell_mage_permafrost(); - new spell_mage_polymorph(); - new spell_mage_polymorph_cast_visual(); - new spell_mage_prismatic_barrier(); - new spell_mage_ring_of_frost(); - new spell_mage_ring_of_frost_freeze(); - new spell_mage_time_warp(); - new spell_mage_trigger_chilled(); - new spell_mage_water_elemental_freeze(); + RegisterAuraScript(spell_mage_blazing_barrier); + RegisterAuraScript(spell_mage_burning_determination); + RegisterSpellScript(spell_mage_cold_snap); + RegisterSpellScript(spell_mage_cone_of_cold); + RegisterSpellScript(spell_mage_conjure_refreshment); + RegisterAuraScript(spell_mage_ice_barrier); + RegisterAuraScript(spell_mage_ignite); + RegisterAuraScript(spell_mage_imp_mana_gems); + RegisterSpellScript(spell_mage_living_bomb); + RegisterSpellScript(spell_mage_living_bomb_explosion); + RegisterAuraScript(spell_mage_living_bomb_periodic); + RegisterSpellScript(spell_mage_polymorph_visual); + RegisterAuraScript(spell_mage_prismatic_barrier); + RegisterAuraScript(spell_mage_ring_of_frost); + RegisterSpellAndAuraScriptPair(spell_mage_ring_of_frost_freeze, spell_mage_ring_of_frost_freeze_AuraScript); + RegisterSpellScript(spell_mage_time_warp); + RegisterSpellScript(spell_mage_trigger_chilled); + RegisterSpellScript(spell_mage_water_elemental_freeze); } |
