From 1ff3bac7266571f8183bdd87275e2833bcf1a1ef Mon Sep 17 00:00:00 2001 From: Cristian Vintila <127750549+cristianvnt@users.noreply.github.com> Date: Sat, 10 Jan 2026 22:54:25 +0200 Subject: [PATCH] Scripts/Spells: Implement priest talent Power Surge (#31475) --- .../world/master/2026_01_10_02_world.sql | 9 ++ src/server/scripts/Spells/spell_priest.cpp | 82 +++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 sql/updates/world/master/2026_01_10_02_world.sql diff --git a/sql/updates/world/master/2026_01_10_02_world.sql b/sql/updates/world/master/2026_01_10_02_world.sql new file mode 100644 index 00000000000..9909d56732d --- /dev/null +++ b/sql/updates/world/master/2026_01_10_02_world.sql @@ -0,0 +1,9 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_pri_power_surge','spell_pri_power_surge_periodic_holy','spell_pri_power_surge_periodic_shadow'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(453109,'spell_pri_power_surge'), +(453112,'spell_pri_power_surge_periodic_holy'), +(453113,'spell_pri_power_surge_periodic_shadow'); + +DELETE FROM `spell_proc` WHERE `SpellId` IN (453109); +INSERT INTO `spell_proc` (`SpellId`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`SpellFamilyMask3`,`ProcFlags`,`ProcFlags2`,`SpellTypeMask`,`SpellPhaseMask`,`HitMask`,`AttributesMask`,`DisableEffectsMask`,`ProcsPerMinute`,`Chance`,`Cooldown`,`Charges`) VALUES +(453109,0x00,6,0x00000000,0x00000000,0x00000000,0x00000040,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0,0,0,0); -- Power Surge diff --git a/src/server/scripts/Spells/spell_priest.cpp b/src/server/scripts/Spells/spell_priest.cpp index b59c45cc28b..96d975c9c6c 100644 --- a/src/server/scripts/Spells/spell_priest.cpp +++ b/src/server/scripts/Spells/spell_priest.cpp @@ -177,6 +177,11 @@ enum PriestSpells SPELL_PRIEST_POWER_LEECH_SHADOWFIEND_INSANITY = 262485, SPELL_PRIEST_POWER_OF_THE_DARK_SIDE = 198069, SPELL_PRIEST_POWER_OF_THE_DARK_SIDE_TINT = 225795, + SPELL_PRIEST_POWER_SURGE = 453109, + SPELL_PRIEST_POWER_SURGE_HALO_VISUAL = 454342, + SPELL_PRIEST_POWER_SURGE_HALO_VISUAL_RETURN = 467824, // TODO: cast when triggering first return halo from Divine Halo (from halo on expire script) + SPELL_PRIEST_POWER_SURGE_PERIODIC_HOLY = 453112, + SPELL_PRIEST_POWER_SURGE_PERIODIC_SHADOW = 453113, SPELL_PRIEST_POWER_WORD_LIFE = 373481, SPELL_PRIEST_POWER_WORD_RADIANCE = 194509, SPELL_PRIEST_POWER_WORD_SHIELD = 17, @@ -2898,6 +2903,80 @@ class spell_pri_power_of_the_dark_side_healing_bonus : public SpellScript } }; +// 453109 - Power Surge +// Triggered by 120517 - Halo (Holy) and 120644 - Halo (Shadow) +class spell_pri_power_surge : public AuraScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo + ({ + SPELL_PRIEST_HALO_HOLY, + SPELL_PRIEST_HALO_SHADOW, + SPELL_PRIEST_POWER_SURGE_PERIODIC_HOLY, + SPELL_PRIEST_POWER_SURGE_PERIODIC_SHADOW, + SPELL_PRIEST_POWER_SURGE_HALO_VISUAL + }); + } + + static void HandleProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& eventInfo) + { + Unit* caster = eventInfo.GetActor(); + + uint32 spellId = 0; + switch (eventInfo.GetSpellInfo()->Id) + { + case SPELL_PRIEST_HALO_HOLY: + spellId = SPELL_PRIEST_POWER_SURGE_PERIODIC_HOLY; + break; + case SPELL_PRIEST_HALO_SHADOW: + spellId = SPELL_PRIEST_POWER_SURGE_PERIODIC_SHADOW; + break; + default: + return; + } + + CastSpellExtraArgs args = CastSpellExtraArgsInit{ + .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR, + .TriggeringSpell = eventInfo.GetProcSpell(), + .TriggeringAura = aurEff + }; + + caster->CastSpell(caster, SPELL_PRIEST_POWER_SURGE_HALO_VISUAL, args); + caster->CastSpell(caster, spellId, args); + } + + void Register() override + { + OnEffectProc += AuraEffectProcFn(spell_pri_power_surge::HandleProc, EFFECT_1, SPELL_AURA_DUMMY); + } +}; + +// 453112 - Power Surge (Holy - Periodic) +// 453113 - Power Surge (Shadow - Periodic) +class spell_pri_power_surge_periodic : public AuraScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ _spellId }); + } + + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) const + { + GetTarget()->CastSpell(GetTarget(), _spellId, TRIGGERED_IGNORE_GCD | TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD | TRIGGERED_IGNORE_POWER_COST | TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_IGNORE_CAST_TIME | TRIGGERED_DONT_REPORT_CAST_ERROR); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_pri_power_surge_periodic::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } + + uint32 _spellId; + +public: + explicit spell_pri_power_surge_periodic(uint32 haloSpellId) : _spellId(haloSpellId) {} +}; + // 194509 - Power Word: Radiance class spell_pri_power_word_radiance : public SpellScript { @@ -4787,6 +4866,9 @@ void AddSC_priest_spell_scripts() RegisterSpellScript(spell_pri_power_of_the_dark_side); RegisterSpellScript(spell_pri_power_of_the_dark_side_damage_bonus); RegisterSpellScript(spell_pri_power_of_the_dark_side_healing_bonus); + RegisterSpellScript(spell_pri_power_surge); + RegisterSpellScriptWithArgs(spell_pri_power_surge_periodic, "spell_pri_power_surge_periodic_holy", SPELL_PRIEST_HALO_HOLY); + RegisterSpellScriptWithArgs(spell_pri_power_surge_periodic, "spell_pri_power_surge_periodic_shadow", SPELL_PRIEST_HALO_SHADOW); RegisterSpellScript(spell_pri_power_word_radiance); RegisterSpellScript(spell_pri_power_word_shield); RegisterSpellScript(spell_pri_power_word_solace);