aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorAqua Deus <95978183+aquadeus@users.noreply.github.com>2025-09-19 10:38:40 +0200
committerGitHub <noreply@github.com>2025-09-19 10:38:40 +0200
commit2536890beb2b25c257c5120852818d788ee9e73f (patch)
treee1f3c69d25363116cea45e5ef053fbaf8a58cb8c /src/server
parent4c66c09e38ab327019f63f3c7beadb72f4647123 (diff)
Scripts/Spells: Implement mage talent Hot Streak (#31253)
Closes #19582
Diffstat (limited to 'src/server')
-rw-r--r--src/server/scripts/Spells/spell_mage.cpp108
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);