diff options
-rw-r--r-- | sql/updates/world/master/2022_07_16_06_world_mage_ray_of_frost.sql | 3 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 6 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_mage.cpp | 56 |
3 files changed, 65 insertions, 0 deletions
diff --git a/sql/updates/world/master/2022_07_16_06_world_mage_ray_of_frost.sql b/sql/updates/world/master/2022_07_16_06_world_mage_ray_of_frost.sql new file mode 100644 index 00000000000..4686eaf17dd --- /dev/null +++ b/sql/updates/world/master/2022_07_16_06_world_mage_ray_of_frost.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName` = 'spell_mage_ray_of_frost'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(205021, 'spell_mage_ray_of_frost'); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 32776cc27ea..87603c9a888 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -4649,6 +4649,12 @@ void SpellMgr::LoadSpellInfoCorrections() }); }); + // Ray of Frost (Fingers of Frost charges) + ApplySpellFix({ 269748 }, [](SpellInfo* spellInfo) + { + spellInfo->AttributesEx &= ~SPELL_ATTR1_IS_CHANNELLED; + }); + for (SpellInfo const& s : mSpellInfoMap) { SpellInfo* spellInfo = &const_cast<SpellInfo&>(s); diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index ecd0f5a086f..a67e313675b 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -71,6 +71,8 @@ enum MageSpells SPELL_MAGE_LIVING_BOMB_PERIODIC = 217694, SPELL_MAGE_MANA_SURGE = 37445, SPELL_MAGE_MASTER_OF_TIME = 342249, + SPELL_MAGE_RAY_OF_FROST_BONUS = 208141, + SPELL_MAGE_RAY_OF_FROST_FINGERS_OF_FROST = 269748, SPELL_MAGE_REVERBERATE = 281482, SPELL_MAGE_RING_OF_FROST_DUMMY = 91264, SPELL_MAGE_RING_OF_FROST_FREEZE = 82691, @@ -1110,6 +1112,59 @@ class spell_mage_prismatic_barrier : public AuraScript } }; +// 205021 - Ray of Frost +class spell_mage_ray_of_frost : public SpellScript +{ + PrepareSpellScript(spell_mage_ray_of_frost); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo ({ SPELL_MAGE_RAY_OF_FROST_FINGERS_OF_FROST }); + } + + void HandleOnHit() + { + if (Unit* caster = GetCaster()) + caster->CastSpell(caster, SPELL_MAGE_RAY_OF_FROST_FINGERS_OF_FROST, TRIGGERED_IGNORE_CAST_IN_PROGRESS); + } + + void Register() override + { + OnHit += SpellHitFn(spell_mage_ray_of_frost::HandleOnHit); + } +}; + +class spell_mage_ray_of_frost_aura : public AuraScript +{ + PrepareAuraScript(spell_mage_ray_of_frost_aura); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo ({ SPELL_MAGE_RAY_OF_FROST_BONUS, SPELL_MAGE_RAY_OF_FROST_FINGERS_OF_FROST }); + } + + void HandleEffectPeriodic(AuraEffect const* aurEff) + { + if (Unit* caster = GetCaster()) + { + if (aurEff->GetTickNumber() > 1) // First tick should deal base damage + caster->CastSpell(caster, SPELL_MAGE_RAY_OF_FROST_BONUS, true); + } + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) + caster->RemoveAurasDueToSpell(SPELL_MAGE_RAY_OF_FROST_FINGERS_OF_FROST); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_mage_ray_of_frost_aura::HandleEffectPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE); + AfterEffectRemove += AuraEffectRemoveFn(spell_mage_ray_of_frost_aura::OnRemove, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE, AURA_EFFECT_HANDLE_REAL); + } +}; + // 136511 - Ring of Frost class spell_mage_ring_of_frost : public AuraScript { @@ -1380,6 +1435,7 @@ void AddSC_mage_spell_scripts() RegisterSpellScript(spell_mage_living_bomb_periodic); RegisterSpellScript(spell_mage_polymorph_visual); RegisterSpellScript(spell_mage_prismatic_barrier); + RegisterSpellAndAuraScriptPair(spell_mage_ray_of_frost, spell_mage_ray_of_frost_aura); RegisterSpellScript(spell_mage_ring_of_frost); RegisterSpellAndAuraScriptPair(spell_mage_ring_of_frost_freeze, spell_mage_ring_of_frost_freeze_AuraScript); RegisterSpellScript(spell_mage_supernova); |