From b384c2bc8b477a4b0d22b2fbef024293d506e020 Mon Sep 17 00:00:00 2001 From: Aqua Deus <95978183+aquadeus@users.noreply.github.com> Date: Sat, 17 Jan 2026 16:20:13 +0100 Subject: [PATCH] Scripts/Spells: Implement dh talent "Painbringer" (#31501) --- .../world/master/2026_01_17_01_world.sql | 8 +++ src/server/scripts/Spells/spell_dh.cpp | 64 +++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 sql/updates/world/master/2026_01_17_01_world.sql diff --git a/sql/updates/world/master/2026_01_17_01_world.sql b/sql/updates/world/master/2026_01_17_01_world.sql new file mode 100644 index 00000000000..1a39de82ae5 --- /dev/null +++ b/sql/updates/world/master/2026_01_17_01_world.sql @@ -0,0 +1,8 @@ +DELETE FROM `spell_proc` WHERE `SpellId` IN (207387); +INSERT INTO `spell_proc` (`SpellId`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`SpellFamilyMask3`,`ProcFlags`,`ProcFlags2`,`SpellTypeMask`,`SpellPhaseMask`,`HitMask`,`AttributesMask`,`DisableEffectsMask`,`ProcsPerMinute`,`Chance`,`Cooldown`,`Charges`) VALUES +(207387,0x00,107,0x00100000,0x00000000,0x00000000,0x00000000,0x4000,0x0,0x2,0x2,0x0,0x2,0x0,0,100,0,0); -- Painbringer + +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_dh_painbringer', 'spell_dh_painbringer_reduce_damage'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(207387, 'spell_dh_painbringer'), +(212988, 'spell_dh_painbringer_reduce_damage'); diff --git a/src/server/scripts/Spells/spell_dh.cpp b/src/server/scripts/Spells/spell_dh.cpp index e2ac61de012..6c6d78ceb76 100644 --- a/src/server/scripts/Spells/spell_dh.cpp +++ b/src/server/scripts/Spells/spell_dh.cpp @@ -164,6 +164,8 @@ enum DemonHunterSpells SPELL_DH_NEMESIS_HUMANOIDS = 208605, SPELL_DH_NEMESIS_MECHANICALS = 208613, SPELL_DH_NEMESIS_UNDEAD = 208614, + SPELL_DH_PAINBRINGER_DUMMY = 225413, + SPELL_DH_PAINBRINGER_STACK = 212988, SPELL_DH_RAIN_FROM_ABOVE = 206803, SPELL_DH_RAIN_OF_CHAOS = 205628, SPELL_DH_RAIN_OF_CHAOS_IMPACT = 232538, @@ -1498,6 +1500,66 @@ class spell_dh_monster_rising : public AuraScript } }; +// 207387 - Painbringer +class spell_dh_painbringer : public AuraScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DH_PAINBRINGER_STACK }); + } + + void HandleProc(ProcEventInfo const& eventInfo) const + { + Unit* target = eventInfo.GetActor(); + target->CastSpell(target, SPELL_DH_PAINBRINGER_STACK, CastSpellExtraArgsInit{ + .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR, + .TriggeringSpell = eventInfo.GetProcSpell() + }); + } + + void Register() override + { + OnProc += AuraProcFn(spell_dh_painbringer::HandleProc); + } +}; + +// 212988 - Painbringer +class spell_dh_painbringer_reduce_damage : public AuraScript +{ + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_DH_PAINBRINGER_DUMMY }); + } + + void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes mode) const + { + Unit* target = GetTarget(); + + if (mode & AURA_EFFECT_HANDLE_REAL) + target->CastSpell(target, SPELL_DH_PAINBRINGER_DUMMY, CastSpellExtraArgsInit{ + .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR, + .TriggeringAura = aurEff + }); + + target->m_Events.AddEventAtOffset([self = GetAura()->GetWeakPtr()] + { + if (Trinity::unique_strong_ref_ptr aura = self.lock()) + aura->ModStackAmount(-1, AURA_REMOVE_BY_EXPIRE, false); + }, Milliseconds(GetMaxDuration())); + } + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const + { + GetTarget()->RemoveAurasDueToSpell(SPELL_DH_PAINBRINGER_DUMMY); + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_dh_painbringer_reduce_damage::OnApply, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK); + AfterEffectRemove += AuraEffectRemoveFn(spell_dh_painbringer_reduce_damage::OnRemove, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } +}; + // 188499 - Blade Dance // 210152 - Death Sweep class spell_dh_blade_dance : public SpellScript @@ -2238,6 +2300,8 @@ void AddSC_demon_hunter_spell_scripts() RegisterSpellScript(spell_dh_know_your_enemy); RegisterSpellScript(spell_dh_last_resort); RegisterSpellScript(spell_dh_monster_rising); + RegisterSpellScript(spell_dh_painbringer); + RegisterSpellScript(spell_dh_painbringer_reduce_damage); RegisterSpellScript(spell_dh_repeat_decree_conduit); RegisterSpellScript(spell_dh_restless_hunter); RegisterSpellScript(spell_dh_retaliation);