diff --git a/sql/updates/world/custom/custom_2018_09_03_01_world.sql b/sql/updates/world/custom/custom_2018_09_03_01_world.sql new file mode 100644 index 00000000000..2d281e60ccc --- /dev/null +++ b/sql/updates/world/custom/custom_2018_09_03_01_world.sql @@ -0,0 +1,12 @@ +DELETE FROM `spell_proc` WHERE `SpellId` IN (83074, 44544, 57761); +INSERT INTO `spell_proc` (`SpellId`, `SpellFamilyName`, `SpellFamilyMask0`, `SpellFamilyMask1`, `SpellFamilyMask2`, `ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`, `AttributesMask`, `Cooldown`, `Charges`, `Chance`) VALUES +(83074, 3, 1049120, 4096, 0, 0, 0, 2, 0, 2, 0, 0, 25), +(44544, 3, 0x00020000, 0x00100000, 0, 0x00010000, 1, 1, 0, 0, 0, 1, 100), +(57761, 3, 0x00000001, 0x00001000, 0, 0x00010000, 1, 1, 0, 0, 0, 1, 100); + +UPDATE `spell_proc` SET `SpellPhaseMask`= 2 WHERE `SpellId` IN (44543, 44545); + +-- Spells +DELETE FROM `spell_script_names` WHERE `ScriptName`= 'spell_mage_deep_freeze'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(44572, 'spell_mage_deep_freeze'); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index a3ea23832f8..e56fdc0bb74 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -6791,8 +6791,16 @@ float Unit::SpellDamagePctDone(Unit* victim, SpellInfo const* spellProto, Damage // Ice Lance if (spellProto->SpellIconID == 186) - if (victim->HasAuraState(AURA_STATE_FROZEN, spellProto, this)) + { + if (victim->HasAuraState(AURA_STATE_FROZEN, spellProto, this) + || GetAuraEffect(SPELL_AURA_ABILITY_IGNORE_AURASTATE, SPELLFAMILY_MAGE, 0, 0, 0x0000000A, GetGUID())) DoneTotalMod *= 2.0f; + } + + // Fingers of Frost + if (spellProto->SpellFamilyFlags[0] & 0x00020000) + if (GetAuraEffect(SPELL_AURA_ABILITY_IGNORE_AURASTATE, SPELLFAMILY_MAGE, 0, 0, 0x0000000A, GetGUID())) + AddPct(DoneTotalMod, 25.0f); // Torment the weak if (spellProto->GetSchoolMask() & SPELL_SCHOOL_MASK_ARCANE) @@ -7102,6 +7110,9 @@ float Unit::GetUnitSpellCriticalChance(Unit* victim, SpellInfo const* spellProto case 12982: if (victim->HasAuraState(AURA_STATE_FROZEN, spellProto, this)) crit_chance *= 2; + else if (spellProto->SpellFamilyFlags[0] & 0x00020000 || spellProto->SpellFamilyFlags[1] & 0x00100000) + if (GetAuraEffect(SPELL_AURA_ABILITY_IGNORE_AURASTATE, SPELLFAMILY_MAGE, 0, 0, 0x0000000A, GetGUID())) + crit_chance *= 2; break; case 7917: // Glyph of Shadowburn if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this)) diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 175c625b6b0..5a9b3904d6b 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3097,12 +3097,6 @@ void SpellMgr::LoadSpellInfoCorrections() spellInfo->Effects[EFFECT_0].TriggerSpell = 33760; }); - // Fingers of Frost - ApplySpellFix({ 44544 }, [](SpellInfo* spellInfo) - { - spellInfo->Effects[EFFECT_0].SpellClassMask = flag96(685904631, 1151048, 0); - }); - // Magic Suppression - DK ApplySpellFix({ 49224, 49610, 49611 }, [](SpellInfo* spellInfo) { diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index b9405a6dc75..c75a84ae0c5 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -36,15 +36,15 @@ enum MageSpells SPELL_MAGE_ARCANE_POTENCY_RANK_2 = 31572, SPELL_MAGE_ARCANE_POTENCY_TRIGGER_RANK_1 = 57529, SPELL_MAGE_ARCANE_POTENCY_TRIGGER_RANK_2 = 57531, - SPELL_MAGE_ARCANE_BLAST = 30451, SPELL_MAGE_ARCANE_MISSILES = 5143, SPELL_MAGE_ARCANE_MISSILES_DAMAGE = 7268, SPELL_MAGE_ARCANE_MISSILES_AURASTATE = 79808, - SPELL_MAGE_BLAZING_SPEED = 31643, + SPELL_MAGE_BRAIN_FREEZE_R1 = 44546, SPELL_MAGE_BURNOUT = 29077, SPELL_MAGE_COLD_SNAP = 11958, + SPELL_MAGE_DEEP_FREEZE_DAMAGE = 71757, SPELL_MAGE_EARLY_FROST_R1 = 83049, SPELL_MAGE_EARLY_FROST_R2 = 83050, SPELL_MAGE_EARLY_FROST_TRIGGERED_R1 = 83162, @@ -56,7 +56,6 @@ enum MageSpells SPELL_MAGE_FROST_NOVA = 122, SPELL_MAGE_FROST_WARDING_R1 = 11189, SPELL_MAGE_FROST_WARDING_TRIGGERED = 57776, - SPELL_MAGE_FLAME_ORB_DUMMY = 82731, SPELL_MAGE_FLAME_ORB_SUMMON = 84765, SPELL_MAGE_FLAME_ORB_AOE = 82734, @@ -67,12 +66,10 @@ enum MageSpells SPELL_MAGE_FROSTFIRE_ORB_DUMMY = 92283, SPELL_MAGE_FROSTFIRE_ORB_SUMMON = 84714, SPELL_MAGE_FROSTFIRE_ORB_AOE = 84718, - SPELL_MAGE_FROSTFIRE_ORB_DAMAGE_R1 = 95969, SPELL_MAGE_FROSTFIRE_ORB_DAMAGE_R2 = 84721, SPELL_MAGE_FROSTFIRE_ORB_RANK_R2 = 84727, SPELL_MAGE_FROSTFIRE_BOLT_CHILL_EFFECT = 44614, - SPELL_MAGE_HOT_STREAK = 44445, SPELL_MAGE_HOT_STREAK_TRIGGERED = 48108, SPELL_MAGE_IMPROVED_HOT_STREAK_R1 = 44446, @@ -1592,58 +1589,55 @@ public: }; // 79684 Offensive State (DND) -class spell_mage_offensive_state_dnd : public SpellScriptLoader +class spell_mage_offensive_state_dnd : public AuraScript { -public: - spell_mage_offensive_state_dnd() : SpellScriptLoader("spell_mage_offensive_state_dnd") { } + PrepareAuraScript(spell_mage_offensive_state_dnd); - class spell_mage_offensive_state_dnd_AuraScript : public AuraScript + bool Load() override { - PrepareAuraScript(spell_mage_offensive_state_dnd_AuraScript); + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } - bool Load() override - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo( - { - SPELL_MAGE_ARCANE_MISSILES, - SPELL_MAGE_ARCANE_MISSILES_DAMAGE, - SPELL_MAGE_ARCANE_BLAST, - SPELL_MAGE_HOT_STREAK - }); - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - // Hot Streak will no longer allow Arcane Missiles to proc - if (GetCaster()->HasAura(SPELL_MAGE_HOT_STREAK)) - return false; - - // Don't proc when caster does not know Arcane Missiles - if (Player* playerCaster = GetCaster()->ToPlayer()) - if (!playerCaster->HasSpell(SPELL_MAGE_ARCANE_MISSILES)) - return false; - - // Don't proc Arcane Missiles from triggered Missiles - if (eventInfo.GetProcSpell()->GetSpellInfo()->Id == SPELL_MAGE_ARCANE_MISSILES_DAMAGE) - return false; - - return roll_chance_i(40); - } - - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_mage_offensive_state_dnd_AuraScript::CheckProc); - } - }; - - AuraScript* GetAuraScript() const override + bool Validate(SpellInfo const* /*spellInfo*/) override { - return new spell_mage_offensive_state_dnd_AuraScript(); + return ValidateSpellInfo( + { + SPELL_MAGE_ARCANE_MISSILES, + SPELL_MAGE_ARCANE_MISSILES_DAMAGE, + SPELL_MAGE_ARCANE_BLAST, + SPELL_MAGE_HOT_STREAK, + SPELL_MAGE_BRAIN_FREEZE_R1 + }); + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + Player* player = GetTarget()->ToPlayer(); + if (!player) + return false; + + // Don't proc when caster does not know Arcane Missiles + if (!player->HasSpell(SPELL_MAGE_ARCANE_MISSILES)) + return false; + + // Hot Streak will no longer allow Arcane Missiles to proc + if (player->HasAura(SPELL_MAGE_HOT_STREAK)) + return false; + + // Brain Freeze will no longer allow Arcane Missiles to proc + if (player->GetAuraOfRankedSpell(SPELL_MAGE_BRAIN_FREEZE_R1)) + return false; + + // Don't proc Arcane Missiles from triggered Missiles + if (eventInfo.GetSpellInfo()->Id == SPELL_MAGE_ARCANE_MISSILES_DAMAGE) + return false; + + return roll_chance_i(40); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_mage_offensive_state_dnd::CheckProc); } }; @@ -2119,6 +2113,33 @@ class spell_mage_initialize_images : public SpellScript } }; +class spell_mage_deep_freeze : public SpellScript +{ + PrepareSpellScript(spell_mage_deep_freeze); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_MAGE_DEEP_FREEZE_DAMAGE }); + } + + void HandleDamage(SpellEffIndex effIndex) + { + Unit* caster = GetCaster(); + Unit* target = GetExplTargetUnit(); + if (!target) + return; + + if (target->GetTypeId() == TYPEID_UNIT) + if (target->IsImmunedToSpell(GetSpellInfo(), caster)) + caster->CastSpell(target, SPELL_MAGE_DEEP_FREEZE_DAMAGE, true); + } + + void Register() override + { + OnEffectLaunch += SpellEffectFn(spell_mage_deep_freeze::HandleDamage, EFFECT_0, SPELL_EFFECT_APPLY_AURA); + } +}; + void AddSC_mage_spell_scripts() { new spell_mage_arcane_potency(); @@ -2128,6 +2149,7 @@ void AddSC_mage_spell_scripts() new spell_mage_cold_snap(); new spell_mage_cone_of_cold(); new spell_mage_conjure_refreshment(); + RegisterSpellScript(spell_mage_deep_freeze); RegisterAuraScript(spell_mage_dragon_breath); new spell_mage_early_frost(); new spell_mage_fire_frost_ward(); @@ -2149,6 +2171,7 @@ void AddSC_mage_spell_scripts() new spell_mage_master_of_elements(); RegisterSpellAndAuraScriptPair(spell_mage_mirror_image, spell_mage_mirror_image_AurasScript); new spell_mage_nether_vortex(); + RegisterAuraScript(spell_mage_offensive_state_dnd); new spell_mage_permafrost(); new spell_mage_polymorph(); new spell_mage_polymorph_cast_visual(); @@ -2159,5 +2182,4 @@ void AddSC_mage_spell_scripts() new spell_mage_time_warp(); new spell_mage_water_elemental_freeze(); new spell_mage_arcane_missiles_trigger(); - new spell_mage_offensive_state_dnd(); }