Scripts/Spells: Implement mage talent Hot Streak (#31253)

Closes #19582
This commit is contained in:
Aqua Deus
2025-09-19 10:38:40 +02:00
committed by GitHub
parent 4c66c09e38
commit 2536890beb
2 changed files with 117 additions and 1 deletions

View File

@@ -0,0 +1,10 @@
DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_mage_hot_streak', 'spell_mage_hot_streak_ignite_marker');
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(44448, 'spell_mage_hot_streak'),
(11366, 'spell_mage_hot_streak_ignite_marker'),
(2120, 'spell_mage_hot_streak_ignite_marker');
DELETE FROM `spell_proc` WHERE `SpellId` IN (44448,48108);
INSERT INTO `spell_proc` (`SpellId`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`SpellFamilyMask3`,`ProcFlags`,`ProcFlags2`,`SpellTypeMask`,`SpellPhaseMask`,`HitMask`,`AttributesMask`,`DisableEffectsMask`,`ProcsPerMinute`,`Chance`,`Cooldown`,`Charges`) VALUES
(44448,0x04,3,0x00C00013,0x00100000,0x00000000,0x00000000,0x0,0x0,0x1,0x2,0x2,0x0,0x0,0,0,0,0), -- Pyroblast Clearcasting Driver
(48108,0x00,3,0x00000000,0x00000000,0x00000000,0x00000000,0x0,0x4,0x0,0x0,0x0,0x8,0x0,0,0,0,1); -- Hot Streak!

View File

@@ -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);