From ac08915142c80b20b53a65cd153ea328f244600d Mon Sep 17 00:00:00 2001 From: Aqua Deus <95978183+aquadeus@users.noreply.github.com> Date: Sat, 31 Jan 2026 23:08:08 +0100 Subject: [PATCH] Scripts/Spells: Implement dh talent "Soul Carver" (#31503) --- .../world/master/2026_01_31_15_world.sql | 3 ++ src/server/scripts/Spells/spell_dh.cpp | 40 +++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 sql/updates/world/master/2026_01_31_15_world.sql diff --git a/sql/updates/world/master/2026_01_31_15_world.sql b/sql/updates/world/master/2026_01_31_15_world.sql new file mode 100644 index 0000000000..e59f034040 --- /dev/null +++ b/sql/updates/world/master/2026_01_31_15_world.sql @@ -0,0 +1,3 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_dh_soul_carver'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(207407, 'spell_dh_soul_carver'); diff --git a/src/server/scripts/Spells/spell_dh.cpp b/src/server/scripts/Spells/spell_dh.cpp index 6c6d78ceb7..4950097cf4 100644 --- a/src/server/scripts/Spells/spell_dh.cpp +++ b/src/server/scripts/Spells/spell_dh.cpp @@ -1928,6 +1928,45 @@ using at_dh_shattered_souls_vengeance_demon = at_dh_shattered_souls; using at_dh_shattered_souls_vengeance_shattered = at_dh_shattered_souls; +// 207407 - Soul Carver +class spell_dh_soul_carver : public SpellScript +{ + bool Validate(SpellInfo const* spellInfo) override + { + return ValidateSpellEffect({ { spellInfo->Id, EFFECT_2 } }) + && spell_dh_shattered_souls_base_lesser::Validate(); + } + + void HandleSoulFragments(SpellEffIndex /*effIndex*/) const + { + spell_dh_shattered_souls_base_lesser::CreateFragments(GetHitUnit(), GetCaster(), GetEffectInfo(EFFECT_2).CalcValue(GetCaster())); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_dh_soul_carver::HandleSoulFragments, EFFECT_1, SPELL_EFFECT_SCHOOL_DAMAGE); + } +}; + +class spell_dh_soul_carver_aura : public AuraScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return spell_dh_shattered_souls_base_lesser::Validate(); + } + + void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) const + { + if (Unit* caster = GetCaster()) + spell_dh_shattered_souls_base_lesser::CreateFragments(GetTarget(), caster, GetEffectInfo(EFFECT_3).CalcValue(caster)); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_dh_soul_carver_aura::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } +}; + // 210788 - Soul Fragments class spell_dh_soul_fragments_damage_taken_tracker : public AuraScript { @@ -2322,6 +2361,7 @@ void AddSC_demon_hunter_spell_scripts() RegisterSpellScript(spell_dh_sigil_of_flame); RegisterSpellScriptWithArgs(spell_dh_elysian_decree, "spell_dh_sigil_of_spite", SPELL_DH_SIGIL_OF_SPITE); RegisterSpellScript(spell_dh_soulmonger); + RegisterSpellAndAuraScriptPair(spell_dh_soul_carver, spell_dh_soul_carver_aura); RegisterSpellScript(spell_dh_soul_fragments_damage_taken_tracker); RegisterSpellScript(spell_dh_student_of_suffering); RegisterSpellScript(spell_dh_tactical_retreat);