From fe952e429aa3e5748118b66178f53e868c8749c7 Mon Sep 17 00:00:00 2001 From: Ovalord <1Don7H4v3@m41L.com> Date: Mon, 26 Feb 2018 02:07:56 +0100 Subject: [PATCH] Core/Spells: fixed Mage's Hot Streak and Improved Hot Streak talents --- .../4.3.4/custom_2018_02_26_00_world.sql | 14 ++ src/server/scripts/Spells/spell_mage.cpp | 221 +++++++++++++++++- 2 files changed, 234 insertions(+), 1 deletion(-) create mode 100644 sql/updates/world/4.3.4/custom_2018_02_26_00_world.sql diff --git a/sql/updates/world/4.3.4/custom_2018_02_26_00_world.sql b/sql/updates/world/4.3.4/custom_2018_02_26_00_world.sql new file mode 100644 index 0000000000..5fe7ee9940 --- /dev/null +++ b/sql/updates/world/4.3.4/custom_2018_02_26_00_world.sql @@ -0,0 +1,14 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName` IN +('spell_mage_hot_streak', +'spell_mage_improved_hot_streak', +'spell_mage_pyroblast'); + +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(44445, 'spell_mage_hot_streak'), +(-44446, 'spell_mage_improved_hot_streak'), +(92315, 'spell_mage_pyroblast'); + +DELETE FROM `spell_proc` WHERE `SpellID` IN (44445, -44446); +INSERT INTO `spell_proc` (`SpellID`, `SpellFamilyName`, `SpellFamilyMask0`, `ProcFlags`, `SpellTypeMask`, `SpellPhaseMask`, `HitMask`, `AttributesMask`) VALUES +(44445, 3, 0, 0x00010000, 1, 2, 2, 0x0000020), +(-44446, 3, 0, 0x00010000, 1, 2, 0, 0x0000020); diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index 31ab0aac3c..6678fe3407 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -49,6 +49,8 @@ enum MageSpells SPELL_MAGE_EARLY_FROST_TRIGGERED_R1 = 83162, SPELL_MAGE_EARLY_FROST_TRIGGERED_R2 = 83239, SPELL_MAGE_EARLY_FROST_VISUAL = 94315, + SPELL_MAGE_FIREBALL = 133, + SPELL_MAGE_FIRE_BLAST = 2136, SPELL_MAGE_FOCUS_MAGIC_PROC = 54648, SPELL_MAGE_FROST_NOVA = 122, SPELL_MAGE_FROST_WARDING_R1 = 11189, @@ -60,7 +62,7 @@ enum MageSpells SPELL_MAGE_FLAME_ORB_BEAM_DUMMY = 86719, SPELL_MAGE_FLAME_ORB_DAMAGE = 82739, SPELL_MAGE_FLAME_ORB_SELF_SNARE = 82736, - + SPELL_MAGE_FROSTFIRE_BOLT = 44614, SPELL_MAGE_FROSTFIRE_ORB_DUMMY = 92283, SPELL_MAGE_FROSTFIRE_ORB_SUMMON = 84714, SPELL_MAGE_FROSTFIRE_ORB_AOE = 84718, @@ -71,6 +73,9 @@ enum MageSpells 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, + SPELL_MAGE_IMPROVED_HOT_STREAK_R2 = 44448, SPELL_MAGE_IMPROVED_POLYMORPH_RANK_1 = 11210, SPELL_MAGE_IMPROVED_POLYMORPH_STUN_RANK_1 = 83046, SPELL_MAGE_IMPROVED_POLYMORPH_MARKER = 87515, @@ -79,6 +84,8 @@ enum MageSpells SPELL_MAGE_IGNITE = 12654, SPELL_MAGE_MASTER_OF_ELEMENTS_ENERGIZE = 29077, SPELL_MAGE_PERMAFROST = 91394, + SPELL_MAGE_PYRO_BLAST = 11366, + SPELL_MAGE_SCORCH = 2948, SPELL_MAGE_SLOW = 31589, SPELL_MAGE_SQUIRREL_FORM = 32813, SPELL_MAGE_GIRAFFE_FORM = 32816, @@ -1850,6 +1857,215 @@ class spell_mage_flame_orb_aoe_dummy: public SpellScriptLoader } }; +// 44445 - 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 Load() override + { + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_MAGE_HOT_STREAK_TRIGGERED, + SPELL_MAGE_IMPROVED_HOT_STREAK_R1, + SPELL_MAGE_IMPROVED_HOT_STREAK_R2, + SPELL_MAGE_FIREBALL, + SPELL_MAGE_PYRO_BLAST, + SPELL_MAGE_FIRE_BLAST, + SPELL_MAGE_FROSTFIRE_BOLT + }); + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + if (Unit* caster = GetCaster()) + if (roll_chance_i(GetSpellInfo()->Effects[EFFECT_0].BasePoints) + && !caster->HasAura(SPELL_MAGE_IMPROVED_HOT_STREAK_R1) + && !caster->HasAura(SPELL_MAGE_IMPROVED_HOT_STREAK_R2)) + switch (eventInfo.GetSpellInfo()->Id) + { + case SPELL_MAGE_FIREBALL: + case SPELL_MAGE_PYRO_BLAST: + case SPELL_MAGE_FIRE_BLAST: + case SPELL_MAGE_FROSTFIRE_BOLT: + return true; + default: + return false; + } + + return false; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + GetCaster()->CastSpell(GetCaster(), SPELL_MAGE_HOT_STREAK_TRIGGERED, true, nullptr, aurEff); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_mage_hot_streak_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_mage_hot_streak_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_mage_hot_streak_AuraScript(); + } +}; + +// -44446 - Improved Hot Streak +class spell_mage_improved_hot_streak : public SpellScriptLoader +{ + public: + spell_mage_improved_hot_streak() : SpellScriptLoader("spell_mage_improved_hot_streak") { } + + class spell_mage_improved_hot_streak_AuraScript : public AuraScript + { + PrepareAuraScript(spell_mage_improved_hot_streak_AuraScript); + + uint8 criticalStrikesCounter; + + bool Load() override + { + criticalStrikesCounter = 0; + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_MAGE_HOT_STREAK_TRIGGERED, + SPELL_MAGE_FIREBALL, + SPELL_MAGE_PYRO_BLAST, + SPELL_MAGE_FIRE_BLAST, + SPELL_MAGE_FROSTFIRE_BOLT + }); + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + switch (eventInfo.GetSpellInfo()->Id) + { + case SPELL_MAGE_FIREBALL: + case SPELL_MAGE_PYRO_BLAST: + case SPELL_MAGE_FIRE_BLAST: + case SPELL_MAGE_FROSTFIRE_BOLT: + if (eventInfo.GetDamageInfo()->GetHitMask() & PROC_HIT_CRITICAL) + criticalStrikesCounter++; + else + criticalStrikesCounter = 0; + + if (criticalStrikesCounter == 2) + { + if (roll_chance_i(GetSpellInfo()->Effects[EFFECT_0].BasePoints)) + { + criticalStrikesCounter = 0; + return true; + } + else + { + criticalStrikesCounter = 0; + return false; + } + } + } + return false; + } + + void HandleProc(AuraEffect const* aurEff, ProcEventInfo& /*eventInfo*/) + { + PreventDefaultAction(); + GetCaster()->CastSpell(GetCaster(), SPELL_MAGE_HOT_STREAK_TRIGGERED, true, nullptr, aurEff); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_mage_improved_hot_streak_AuraScript::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_mage_improved_hot_streak_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_mage_improved_hot_streak_AuraScript(); + } +}; + +// 92315 - Pyroblast! +class spell_mage_pyroblast : public SpellScriptLoader +{ + public: + spell_mage_pyroblast() : SpellScriptLoader("spell_mage_pyroblast") { } + + class spell_mage_pyroblast_SpellScript : public SpellScript + { + PrepareSpellScript(spell_mage_pyroblast_SpellScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo( + { + SPELL_MAGE_HOT_STREAK_TRIGGERED, + SPELL_MAGE_PYRO_BLAST + }); + } + + void HandleHotStreak(SpellEffIndex /*effIndex*/) + { + GetCaster()->RemoveAurasDueToSpell(SPELL_MAGE_HOT_STREAK_TRIGGERED); + } + + void HandleDamage(SpellEffIndex /*effIndex*/) + { + // Copy the spellpower coefficient from the original pyroblast spell + if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(SPELL_MAGE_PYRO_BLAST)) + { + int32 damage = GetEffectValue(); + if (Unit* target = GetHitUnit()) + { + damage = GetCaster()->SpellDamageBonusDone(target, spell, uint32(damage), SPELL_DIRECT_DAMAGE, EFFECT_0); + damage = target->SpellDamageBonusTaken(GetCaster(), spell, uint32(damage), SPELL_DIRECT_DAMAGE); + } + SetHitDamage(damage); + } + } + + void ApplyDotBonus() + { + if (Unit* target = GetHitUnit()) + if (Unit* caster = GetCaster()) + if (SpellInfo const* spell = sSpellMgr->GetSpellInfo(SPELL_MAGE_PYRO_BLAST)) + if (Aura* aura = target->GetAura(GetSpellInfo()->Id)) + aura->GetEffect(EFFECT_1)->SetBonusAmount(caster->SpellDamageBonusDone(target, spell, 0, DOT, EFFECT_1)); + } + + void Register() override + { + OnEffectLaunch += SpellEffectFn(spell_mage_pyroblast_SpellScript::HandleHotStreak, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + OnEffectHitTarget += SpellEffectFn(spell_mage_pyroblast_SpellScript::HandleDamage, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE); + AfterHit += SpellHitFn(spell_mage_pyroblast_SpellScript::ApplyDotBonus); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_mage_pyroblast_SpellScript(); + } +}; + void AddSC_mage_spell_scripts() { new spell_mage_arcane_potency(); @@ -1866,8 +2082,10 @@ void AddSC_mage_spell_scripts() new spell_mage_flame_orb_aoe_dummy(); new spell_mage_focus_magic(); new spell_mage_frostbolt(); + new spell_mage_hot_streak(); new spell_mage_ice_barrier(); new spell_mage_ignite(); + new spell_mage_improved_hot_streak(); new spell_mage_glyph_of_ice_block(); new spell_mage_glyph_of_icy_veins(); new spell_mage_glyph_of_polymorph(); @@ -1879,6 +2097,7 @@ void AddSC_mage_spell_scripts() new spell_mage_permafrost(); new spell_mage_polymorph(); new spell_mage_polymorph_cast_visual(); + new spell_mage_pyroblast(); new spell_mage_replenish_mana(); new spell_mage_ring_of_frost(); new spell_mage_ring_of_frost_freeze();