mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Scripts/Spells: Implement mage talent Hot Streak (#31253)
Closes #19582
This commit is contained in:
10
sql/updates/world/master/2025_09_19_00_world.sql
Normal file
10
sql/updates/world/master/2025_09_19_00_world.sql
Normal 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!
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user