diff options
author | Aqua Deus <95978183+aquadeus@users.noreply.github.com> | 2025-09-19 10:38:40 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-09-19 10:38:40 +0200 |
commit | 2536890beb2b25c257c5120852818d788ee9e73f (patch) | |
tree | e1f3c69d25363116cea45e5ef053fbaf8a58cb8c /src/server/scripts | |
parent | 4c66c09e38ab327019f63f3c7beadb72f4647123 (diff) |
Scripts/Spells: Implement mage talent Hot Streak (#31253)
Closes #19582
Diffstat (limited to 'src/server/scripts')
-rw-r--r-- | src/server/scripts/Spells/spell_mage.cpp | 108 |
1 files changed, 107 insertions, 1 deletions
diff --git a/src/server/scripts/Spells/spell_mage.cpp b/src/server/scripts/Spells/spell_mage.cpp index 2dbd651e1e9..72255517390 100644 --- a/src/server/scripts/Spells/spell_mage.cpp +++ b/src/server/scripts/Spells/spell_mage.cpp @@ -37,6 +37,7 @@ enum MageSpells { + SPELL_MAGE_ALEXSTRASZAS_FURY = 235870, SPELL_MAGE_ALTER_TIME_AURA = 110909, SPELL_MAGE_ALTER_TIME_VISUAL = 347402, SPELL_MAGE_ARCANE_ALTER_TIME_AURA = 342246, @@ -57,6 +58,7 @@ enum MageSpells SPELL_MAGE_CONE_OF_COLD_SLOW = 212792, SPELL_MAGE_CONJURE_REFRESHMENT = 116136, SPELL_MAGE_CONJURE_REFRESHMENT_TABLE = 167145, + SPELL_MAGE_DRAGONS_BREATH = 31661, SPELL_MAGE_DRAGONHAWK_FORM = 32818, SPELL_MAGE_ETHEREAL_BLINK = 410939, SPELL_MAGE_EVERWARM_SOCKS = 320913, @@ -65,6 +67,7 @@ enum MageSpells SPELL_MAGE_FINGERS_OF_FROST = 44544, SPELL_MAGE_FIRE_BLAST = 108853, SPELL_MAGE_FIRESTARTER = 205026, + SPELL_MAGE_FLAMESTRIKE = 2120, SPELL_MAGE_FLAME_PATCH_AREATRIGGER = 205470, SPELL_MAGE_FLAME_PATCH_DAMAGE = 205472, SPELL_MAGE_FLAME_PATCH_TALENT = 205037, @@ -72,6 +75,8 @@ enum MageSpells SPELL_MAGE_FRENETIC_SPEED = 236060, SPELL_MAGE_FROST_NOVA = 122, SPELL_MAGE_GIRAFFE_FORM = 32816, + SPELL_MAGE_HEATING_UP = 48107, + SPELL_MAGE_HOT_STREAK = 48108, SPELL_MAGE_ICE_BARRIER = 11426, SPELL_MAGE_ICE_BLOCK = 45438, SPELL_MAGE_IGNITE = 12654, @@ -87,6 +92,8 @@ enum MageSpells SPELL_MAGE_METEOR_MISSILE = 153564, SPELL_MAGE_MOLTEN_FURY = 458910, SPELL_MAGE_PHOENIX_FLAMES = 257541, + SPELL_MAGE_PHOENIX_FLAMES_DAMAGE = 257542, + SPELL_MAGE_PYROBLAST = 11366, SPELL_MAGE_RADIANT_SPARK_PROC_BLOCKER = 376105, SPELL_MAGE_RAY_OF_FROST_BONUS = 208141, SPELL_MAGE_RAY_OF_FROST_FINGERS_OF_FROST = 269748, @@ -963,6 +970,100 @@ class spell_mage_frostbolt : public SpellScript } }; +// 44448 - Pyroblast Clearcasting Driver +class spell_mage_hot_streak : public AuraScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo + ({ + SPELL_MAGE_DRAGONS_BREATH, + SPELL_MAGE_ALEXSTRASZAS_FURY, + SPELL_MAGE_HOT_STREAK, + SPELL_MAGE_HEATING_UP, + SPELL_MAGE_PHOENIX_FLAMES_DAMAGE + }); + } + + bool CheckProc(ProcEventInfo const& procEvent) const + { + Unit const* caster = GetTarget(); + switch (procEvent.GetSpellInfo()->Id) + { + case SPELL_MAGE_DRAGONS_BREATH: + // talent requirement + if (!caster->HasAura(SPELL_MAGE_ALEXSTRASZAS_FURY)) + return false; + break; + case SPELL_MAGE_PHOENIX_FLAMES_DAMAGE: + // primary target only + if (procEvent.GetActionTarget()->GetGUID() != procEvent.GetProcSpell()->m_targets.GetObjectTargetGUID()) + return false; + break; + default: + break; + } + + return true; + } + + void HandleProc(ProcEventInfo const& eventInfo) const + { + Unit* caster = GetTarget(); + + if (eventInfo.GetHitMask() & PROC_HIT_CRITICAL) + { + CastSpellExtraArgs args; + args.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR; + + if (!caster->HasAura(SPELL_MAGE_HEATING_UP)) + caster->CastSpell(caster, SPELL_MAGE_HEATING_UP, args); + else + { + caster->RemoveAura(SPELL_MAGE_HEATING_UP); + caster->CastSpell(caster, SPELL_MAGE_HOT_STREAK, args); + } + } + else + caster->RemoveAura(SPELL_MAGE_HEATING_UP); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_mage_hot_streak::CheckProc); + OnProc += AuraProcFn(spell_mage_hot_streak::HandleProc); + } +}; + +// 48108 - Hot Streak! (attached to 11366 - Pyroblast and 2120 - Flamestrike) +class spell_mage_hot_streak_ignite_marker : public SpellScript +{ + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_MAGE_HOT_STREAK }); + } + + int32 CalcCastTime(int32 castTime) override + { + _affectedByHotStreak = GetSpell()->m_appliedMods.contains(GetCaster()->GetAura(SPELL_MAGE_HOT_STREAK)); + return castTime; + } + + void Register() override + { + } + + bool _affectedByHotStreak = false; + +public: + static bool IsActive(Spell const* spell) + { + if (spell_mage_hot_streak_ignite_marker const* script = spell->GetScript<spell_mage_hot_streak_ignite_marker>()) + return script->_affectedByHotStreak; + return false; + } +}; + // 386737 - Hyper Impact class spell_mage_hyper_impact : public AuraScript { @@ -1129,7 +1230,7 @@ class spell_mage_ignite : public AuraScript { bool Validate(SpellInfo const* /*spellInfo*/) override { - return ValidateSpellInfo({ SPELL_MAGE_IGNITE }); + return ValidateSpellInfo({ SPELL_MAGE_IGNITE, SPELL_MAGE_HOT_STREAK, SPELL_MAGE_PYROBLAST, SPELL_MAGE_FLAMESTRIKE }); } bool CheckProc(ProcEventInfo& eventInfo) @@ -1145,6 +1246,9 @@ class spell_mage_ignite : public AuraScript int32 pct = aurEff->GetAmount(); ASSERT(igniteDot->GetMaxTicks() > 0); + if (spell_mage_hot_streak_ignite_marker::IsActive(eventInfo.GetProcSpell())) + pct *= 2; + int32 amount = int32(CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), pct) / igniteDot->GetMaxTicks()); CastSpellExtraArgs args(aurEff); @@ -1929,6 +2033,8 @@ void AddSC_mage_spell_scripts() RegisterSpellScript(spell_mage_flurry); RegisterSpellScript(spell_mage_flurry_damage); RegisterSpellScript(spell_mage_frostbolt); + RegisterSpellScript(spell_mage_hot_streak); + RegisterSpellScript(spell_mage_hot_streak_ignite_marker); RegisterSpellScript(spell_mage_hyper_impact); RegisterSpellScript(spell_mage_ice_barrier); RegisterSpellScript(spell_mage_ice_block); |