diff --git a/sql/updates/world/master/2026_02_05_08_world.sql b/sql/updates/world/master/2026_02_05_08_world.sql new file mode 100644 index 0000000000..871b5c6bd1 --- /dev/null +++ b/sql/updates/world/master/2026_02_05_08_world.sql @@ -0,0 +1,4 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_dh_enduring_torment','spell_dh_enduring_torment_buff'); +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(452410, 'spell_dh_enduring_torment'), +(453314, 'spell_dh_enduring_torment_buff'); diff --git a/src/server/scripts/Spells/spell_dh.cpp b/src/server/scripts/Spells/spell_dh.cpp index 635837ed71..fe8bb8da02 100644 --- a/src/server/scripts/Spells/spell_dh.cpp +++ b/src/server/scripts/Spells/spell_dh.cpp @@ -92,6 +92,7 @@ enum DemonHunterSpells SPELL_DH_DEMONS_BITE = 162243, SPELL_DH_ELYSIAN_DECREE = 306830, SPELL_DH_ELYSIAN_DECREE_AOE = 307046, + SPELL_DH_ENDURING_TORMENT_BUFF = 453314, SPELL_DH_ESSENCE_BREAK_DEBUFF = 320338, SPELL_DH_EYE_BEAM = 198013, SPELL_DH_EYE_BEAM_DAMAGE = 198030, @@ -147,6 +148,7 @@ enum DemonHunterSpells SPELL_DH_JAGGED_SPIKES_PROC = 208796, SPELL_DH_MANA_RIFT_DMG_POWER_BURN = 235904, SPELL_DH_METAMORPHOSIS = 191428, + SPELL_DH_METAMORPHOSIS_DEVOURER_TRANSFORM = 1217607, SPELL_DH_METAMORPHOSIS_DUMMY = 191427, SPELL_DH_METAMORPHOSIS_IMPACT_DAMAGE = 200166, SPELL_DH_METAMORPHOSIS_RESET = 320645, @@ -1008,6 +1010,63 @@ struct spell_dh_shattered_souls_base_lesser } }; +// 452410 - Enduring Torment +class spell_dh_enduring_torment : public AuraScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DH_ENDURING_TORMENT_BUFF, SPELL_DH_METAMORPHOSIS_TRANSFORM, SPELL_DH_METAMORPHOSIS_DEVOURER_TRANSFORM }); + } + + void HandlePeriodic(AuraEffect const* aurEff) const + { + Unit* target = GetTarget(); + Aura* statBuff = target->GetOwnedAura(SPELL_DH_ENDURING_TORMENT_BUFF); + + if (target->HasAura(SPELL_DH_METAMORPHOSIS_TRANSFORM) || target->HasAura(SPELL_DH_METAMORPHOSIS_DEVOURER_TRANSFORM)) + { + if (statBuff) + target->RemoveOwnedAura(statBuff); + } + else if (!statBuff) + { + target->CastSpell(target, SPELL_DH_ENDURING_TORMENT_BUFF, CastSpellExtraArgsInit{ + .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR, + .TriggeringAura = aurEff + }); + } + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_dh_enduring_torment::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } +}; + +// 453314 - Enduring Torment +class spell_dh_enduring_torment_buff : public SpellScript +{ + bool Load() override + { + return GetCaster()->IsPlayer(); + } + + template + void PreventEffect(WorldObject*& target) const + { + if (GetCaster()->ToPlayer()->GetPrimarySpecialization() != Spec) + target = nullptr; + } + + void Register() override + { + OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dh_enduring_torment_buff::PreventEffect, EFFECT_0, TARGET_UNIT_CASTER); + OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dh_enduring_torment_buff::PreventEffect, EFFECT_1, TARGET_UNIT_CASTER); + OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dh_enduring_torment_buff::PreventEffect, EFFECT_2, TARGET_UNIT_CASTER); + OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dh_enduring_torment_buff::PreventEffect, EFFECT_3, TARGET_UNIT_CASTER); + } +}; + // 307046 - Elysian Decree (Kyrian) // 389860 - Sigil of Spite class spell_dh_elysian_decree : public SpellScript @@ -2404,6 +2463,8 @@ void AddSC_demon_hunter_spell_scripts() RegisterSpellScript(spell_dh_demon_spikes); RegisterSpellScriptWithArgs(spell_dh_elysian_decree, "spell_dh_elysian_decree", SPELL_DH_ELYSIAN_DECREE); RegisterAreaTriggerAI(at_dh_elysian_decree); + RegisterSpellScript(spell_dh_enduring_torment); + RegisterSpellScript(spell_dh_enduring_torment_buff); RegisterSpellScript(spell_dh_essence_break); RegisterSpellScript(spell_dh_eye_beam); RegisterSpellScript(spell_dh_feast_of_souls);