/* * Copyright (C) 2008-2017 TrinityCore * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ /* * Scripts for spells with SPELLFAMILY_MAGE and SPELLFAMILY_GENERIC spells used by mage players. * Ordered alphabetically using scriptname. * Scriptnames of files in this file should be prefixed with "spell_mage_". */ #include "ScriptMgr.h" #include "GridNotifiers.h" #include "ObjectAccessor.h" #include "Pet.h" #include "Player.h" #include "SpellAuraEffects.h" #include "SpellHistory.h" #include "SpellMgr.h" #include "SpellScript.h" enum MageSpells { SPELL_MAGE_BLAZING_BARRIER_TRIGGER = 235314, SPELL_MAGE_CAUTERIZE_DOT = 87023, SPELL_MAGE_CAUTERIZED = 87024, 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_FROST_NOVA = 122, 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_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_SHEEP_FORM = 32820, 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_SHAMAN_EXHAUSTION = 57723, SPELL_SHAMAN_SATED = 57724, SPELL_MAGE_CHILLED = 205708 }; // 235313 - Blazing Barrier class spell_mage_blazing_barrier : public AuraScript { PrepareAuraScript(spell_mage_blazing_barrier); 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); } void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo& eventInfo) { PreventDefaultAction(); Unit* caster = eventInfo.GetDamageInfo()->GetVictim(); Unit* target = eventInfo.GetDamageInfo()->GetAttacker(); if (caster && target) caster->CastSpell(target, SPELL_MAGE_BLAZING_BARRIER_TRIGGER, true); } 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 AuraScript { PrepareAuraScript(spell_mage_burning_determination); bool CheckProc(ProcEventInfo& eventInfo) { if (SpellInfo const* spellInfo = eventInfo.GetSpellInfo()) if (spellInfo->GetAllEffectsMechanicMask() & ((1 << MECHANIC_INTERRUPT) | (1 << MECHANIC_SILENCE))) return true; return false; } void Register() override { DoCheckProc += AuraCheckProcFn(spell_mage_burning_determination::CheckProc); } }; // 86949 - Cauterize class spell_mage_cauterize : public SpellScript { PrepareSpellScript(spell_mage_cauterize); void SuppressSpeedBuff(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); } void Register() override { OnEffectLaunch += SpellEffectFn(spell_mage_cauterize::SuppressSpeedBuff, EFFECT_2, SPELL_EFFECT_TRIGGER_SPELL); } }; class spell_mage_cauterize_AuraScript : public AuraScript { PrepareAuraScript(spell_mage_cauterize_AuraScript); bool Validate(SpellInfo const* spellInfo) override { return spellInfo->GetEffect(EFFECT_2) && ValidateSpellInfo ({ SPELL_MAGE_CAUTERIZE_DOT, SPELL_MAGE_CAUTERIZED, spellInfo->GetEffect(EFFECT_2)->TriggerSpell }); } void HandleAbsorb(AuraEffect* /*aurEff*/, DamageInfo& dmgInfo, uint32& /*absorbAmount*/) { AuraEffect const* effect1 = GetEffect(EFFECT_1); if (!effect1 || !GetTargetApplication()->HasEffect(EFFECT_1) || dmgInfo.GetDamage() < GetTarget()->GetHealth() || dmgInfo.GetDamage() > GetTarget()->GetMaxHealth() * 2 || GetTarget()->HasAura(SPELL_MAGE_CAUTERIZED)) { PreventDefaultAction(); return; } GetTarget()->SetHealth(GetTarget()->CountPctFromMaxHealth(effect1->GetAmount())); GetTarget()->CastSpell(GetTarget(), GetAura()->GetSpellEffectInfo(EFFECT_2)->TriggerSpell, TRIGGERED_FULL_MASK); GetTarget()->CastSpell(GetTarget(), SPELL_MAGE_CAUTERIZE_DOT, TRIGGERED_FULL_MASK); GetTarget()->CastSpell(GetTarget(), SPELL_MAGE_CAUTERIZED, TRIGGERED_FULL_MASK); } void Register() override { OnEffectAbsorb += AuraEffectAbsorbFn(spell_mage_cauterize_AuraScript::HandleAbsorb, EFFECT_0); } }; // 235219 - Cold Snap class spell_mage_cold_snap : public SpellScript { PrepareSpellScript(spell_mage_cold_snap); 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 HandleDummy(SpellEffIndex /*effIndex*/) { GetCaster()->GetSpellHistory()->ResetCooldowns([](SpellHistory::CooldownStorageType::iterator itr) { switch (itr->first) { 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); } void Register() override { OnEffectHit += SpellEffectFn(spell_mage_cold_snap::HandleDummy, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); } }; // 120 - Cone of Cold class spell_mage_cone_of_cold : public SpellScript { PrepareSpellScript(spell_mage_cone_of_cold); bool Validate(SpellInfo const* /*spellInfo*/) override { return ValidateSpellInfo({ SPELL_MAGE_CONE_OF_COLD_SLOW }); } void HandleSlow(SpellEffIndex /*effIndex*/) { GetCaster()->CastSpell(GetHitUnit(), SPELL_MAGE_CONE_OF_COLD_SLOW, true); } 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 SpellScript { PrepareSpellScript(spell_mage_conjure_refreshment); 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); } } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_mage_conjure_refreshment::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; // 11426 - Ice Barrier class spell_mage_ice_barrier : public AuraScript { PrepareAuraScript(spell_mage_ice_barrier); 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::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); OnEffectProc += AuraEffectProcFn(spell_mage_ice_barrier::HandleProc, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); } }; // 12846 - Ignite class spell_mage_ignite : public AuraScript { PrepareAuraScript(spell_mage_ignite); 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 = aurEff->GetAmount(); 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); } 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 AuraScript { PrepareAuraScript(spell_mage_imp_mana_gems); 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); } 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 SpellScript { PrepareSpellScript(spell_mage_living_bomb); bool Validate(SpellInfo const* /*spellInfo*/) override { return ValidateSpellInfo({ SPELL_MAGE_LIVING_BOMB_PERIODIC }); } void HandleDummy(SpellEffIndex effIndex) { PreventHitDefaultEffect(effIndex); GetCaster()->CastCustomSpell(SPELL_MAGE_LIVING_BOMB_PERIODIC, SPELLVALUE_BASE_POINT2, 1, GetHitUnit(), TRIGGERED_FULL_MASK); } void Register() override { OnEffectHitTarget += SpellEffectFn(spell_mage_living_bomb::HandleDummy, EFFECT_0, SPELL_EFFECT_DUMMY); } }; // 44461 - Living Bomb class spell_mage_living_bomb_explosion : public SpellScript { PrepareSpellScript(spell_mage_living_bomb_explosion); bool Validate(SpellInfo const* spellInfo) override { return spellInfo->NeedsExplicitUnitTarget() && ValidateSpellInfo({ SPELL_MAGE_LIVING_BOMB_PERIODIC }); } void FilterTargets(std::list& targets) { targets.remove(GetExplTargetWorldObject()); } 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); } 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); } }; // 217694 - Living Bomb class spell_mage_living_bomb_periodic : public AuraScript { PrepareAuraScript(spell_mage_living_bomb_periodic); bool Validate(SpellInfo const* /*spellInfo*/) override { return ValidateSpellInfo({ SPELL_MAGE_LIVING_BOMB_EXPLOSION }); } void AfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) { if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) return; if (Unit* caster = GetCaster()) caster->CastCustomSpell(SPELL_MAGE_LIVING_BOMB_EXPLOSION, SPELLVALUE_BASE_POINT0, aurEff->GetAmount(), GetTarget(), TRIGGERED_FULL_MASK); } void Register() override { AfterEffectRemove += AuraEffectRemoveFn(spell_mage_living_bomb_periodic::AfterRemove, EFFECT_2, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); } }; enum SilvermoonPolymorph { NPC_AUROSALIA = 18744 }; /// @todo move out of here and rename - not a mage spell // 32826 - Polymorph (Visual) class spell_mage_polymorph_visual : public SpellScript { PrepareSpellScript(spell_mage_polymorph_visual); 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); } 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_visual::PolymorhForms[6] = { SPELL_MAGE_SQUIRREL_FORM, SPELL_MAGE_GIRAFFE_FORM, SPELL_MAGE_SERPENT_FORM, SPELL_MAGE_DRAGONHAWK_FORM, SPELL_MAGE_WORGEN_FORM, SPELL_MAGE_SHEEP_FORM }; // 235450 - Prismatic Barrier class spell_mage_prismatic_barrier : public AuraScript { PrepareAuraScript(spell_mage_prismatic_barrier); void CalculateAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated) { canBeRecalculated = false; if (Unit* caster = GetCaster()) amount += int32(caster->SpellBaseHealingBonusDone(GetSpellInfo()->GetSchoolMask()) * 7.0f); } void Register() override { DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_mage_prismatic_barrier::CalculateAmount, EFFECT_0, SPELL_AURA_SCHOOL_ABSORB); } }; // 136511 - Ring of Frost class spell_mage_ring_of_frost : public AuraScript { PrepareAuraScript(spell_mage_ring_of_frost); bool Validate(SpellInfo const* /*spellInfo*/) override { return ValidateSpellInfo({ SPELL_MAGE_RING_OF_FROST_SUMMON, SPELL_MAGE_RING_OF_FROST_FREEZE }); } 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 Apply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { std::list minions; GetTarget()->GetAllMinionsByEntry(minions, sSpellMgr->AssertSpellInfo(SPELL_MAGE_RING_OF_FROST_SUMMON)->GetEffect(EFFECT_0)->MiscValue); // Get the last summoned RoF, save it and despawn older ones for (TempSummon* summon : minions) { if (TempSummon* ringOfFrost = GetRingOfFrostMinion()) { if (summon->GetTimer() > ringOfFrost->GetTimer()) { ringOfFrost->DespawnOrUnsummon(); _ringOfFrostGUID = summon->GetGUID(); } else summon->DespawnOrUnsummon(); } else _ringOfFrostGUID = summon->GetGUID(); } } 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); } private: TempSummon* GetRingOfFrostMinion() const { if (Creature* creature = ObjectAccessor::GetCreature(*GetOwner(), _ringOfFrostGUID)) return creature->ToTempSummon(); return nullptr; } ObjectGuid _ringOfFrostGUID; }; // 82691 - Ring of Frost (freeze efect) class spell_mage_ring_of_frost_freeze : public SpellScript { PrepareSpellScript(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 }); } void FilterTargets(std::list& targets) { WorldLocation const* dest = GetExplTargetDest(); float outRadius = sSpellMgr->AssertSpellInfo(SPELL_MAGE_RING_OF_FROST_SUMMON)->GetEffect(EFFECT_0)->CalcRadius(); float inRadius = 6.5f; 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; }); } void Register() override { OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mage_ring_of_frost_freeze::FilterTargets, EFFECT_0, TARGET_UNIT_DEST_AREA_ENEMY); } }; class spell_mage_ring_of_frost_freeze_AuraScript : public AuraScript { PrepareAuraScript(spell_mage_ring_of_frost_freeze_AuraScript); bool Validate(SpellInfo const* /*spellInfo*/) override { return ValidateSpellInfo({ SPELL_MAGE_RING_OF_FROST_DUMMY }); } 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); } 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 SpellScript { PrepareSpellScript(spell_mage_time_warp); 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& 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 ApplyDebuff() { if (Unit* target = GetHitUnit()) target->CastSpell(target, SPELL_MAGE_TEMPORAL_DISPLACEMENT, true); } 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 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); } void Register() override { OnHit += SpellHitFn(spell_mage_trigger_chilled::HandleChilled); } }; // 33395 Water Elemental's Freeze class spell_mage_water_elemental_freeze : public 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() { RegisterAuraScript(spell_mage_blazing_barrier); RegisterAuraScript(spell_mage_burning_determination); RegisterSpellAndAuraScriptPair(spell_mage_cauterize, spell_mage_cauterize_AuraScript); 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); }