aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2025_11_14_00_world.sql19
-rw-r--r--src/server/game/Spells/SpellMgr.cpp12
-rw-r--r--src/server/scripts/Spells/spell_dh.cpp97
3 files changed, 120 insertions, 8 deletions
diff --git a/sql/updates/world/master/2025_11_14_00_world.sql b/sql/updates/world/master/2025_11_14_00_world.sql
new file mode 100644
index 00000000000..5fa6e522046
--- /dev/null
+++ b/sql/updates/world/master/2025_11_14_00_world.sql
@@ -0,0 +1,19 @@
+DELETE FROM `areatrigger_create_properties` WHERE `Id` IN (18264,26752,26753) AND `IsCustom`=0;
+INSERT INTO `areatrigger_create_properties` (`Id`, `IsCustom`, `AreaTriggerId`, `IsAreatriggerCustom`, `Flags`, `MoveCurveId`, `ScaleCurveId`, `MorphCurveId`, `FacingCurveId`, `AnimId`, `AnimKitId`, `DecalPropertiesId`, `SpellForVisuals`, `TimeToTargetScale`, `Speed`, `Shape`, `ShapeData0`, `ShapeData1`, `ShapeData2`, `ShapeData3`, `ShapeData4`, `ShapeData5`, `ShapeData6`, `ShapeData7`, `ScriptName`, `VerifiedBuild`) VALUES
+(18264, 0, 22375, 0, 0, 0, 0, 0, 0, -1, 0, 0, NULL, 1000, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 'at_dh_elysian_decree', 63834), -- Spell: 306830 (Elysian Decree)
+(26752, 0, 30889, 0, 0, 0, 0, 0, 0, -1, 0, 0, NULL, 1000, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 'areatrigger_dh_sigil_of_spite', 63834), -- Spell: 390163 (Sigil of Spite)
+(26753, 0, 30889, 0, 0, 0, 0, 0, 0, -1, 0, 0, NULL, 1000, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 'areatrigger_dh_sigil_of_spite', 63834); -- Spell: 389858 (Sigil of Spite)
+
+DELETE FROM `areatrigger_template` WHERE `Id` IN (22375,30889) AND `IsCustom`=0;
+INSERT INTO `areatrigger_template` (`Id`, `IsCustom`, `VerifiedBuild`) VALUES
+(22375, 0, 63834),
+(30889, 0, 63834);
+
+DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_dh_repeat_decree_conduit';
+DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_dh_elysian_decree';
+DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_dh_sigil_of_spite';
+INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
+(307046, 'spell_dh_repeat_decree_conduit'),
+(389860, 'spell_dh_repeat_decree_conduit'),
+(307046, 'spell_dh_elysian_decree'),
+(389860, 'spell_dh_sigil_of_spite');
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 0dc27c80927..93e7a0a4c82 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -5458,6 +5458,18 @@ void SpellMgr::LoadSpellInfoTargetCaps()
spellInfo->_LoadSqrtTargetLimit(5, 0, 190411, EFFECT_2, {}, {});
});
+ // Elysian Decree (Kyrian)
+ ApplySpellFix({ 307046 }, [](SpellInfo* spellInfo)
+ {
+ spellInfo->_LoadSqrtTargetLimit(5, 0, 306830, EFFECT_0, {}, {});
+ });
+
+ // Sigil of Spite
+ ApplySpellFix({ 389860 }, [](SpellInfo* spellInfo)
+ {
+ spellInfo->_LoadSqrtTargetLimit(5, 0, 390163, EFFECT_0, {}, {});
+ });
+
TC_LOG_INFO("server.loading", ">> Loaded SpellInfo target caps in {} ms", GetMSTimeDiffToNow(oldMSTime));
}
diff --git a/src/server/scripts/Spells/spell_dh.cpp b/src/server/scripts/Spells/spell_dh.cpp
index b806137bdb5..956892463a2 100644
--- a/src/server/scripts/Spells/spell_dh.cpp
+++ b/src/server/scripts/Spells/spell_dh.cpp
@@ -23,6 +23,7 @@
#include "AreaTrigger.h"
#include "AreaTriggerAI.h"
+#include "Containers.h"
#include "DB2Stores.h"
#include "PathGenerator.h"
#include "Player.h"
@@ -94,6 +95,8 @@ enum DemonHunterSpells
SPELL_DH_DEMONIC_TRAMPLE_DMG = 208645,
SPELL_DH_DEMONIC_TRAMPLE_STUN = 213491,
SPELL_DH_DEMONS_BITE = 162243,
+ SPELL_DH_ELYSIAN_DECREE = 306830,
+ SPELL_DH_ELYSIAN_DECREE_AOE = 307046,
SPELL_DH_ESSENCE_BREAK_DEBUFF = 320338,
SPELL_DH_EYE_BEAM = 198013,
SPELL_DH_EYE_BEAM_DAMAGE = 198030,
@@ -170,6 +173,7 @@ enum DemonHunterSpells
SPELL_DH_RAIN_OF_CHAOS = 205628,
SPELL_DH_RAIN_OF_CHAOS_IMPACT = 232538,
SPELL_DH_RAZOR_SPIKES = 210003,
+ SPELL_DH_REPEAT_DECREE_CONDUIT = 339895,
SPELL_DH_RESTLESS_HUNTER_TALENT = 390142,
SPELL_DH_RESTLESS_HUNTER_BUFF = 390212,
SPELL_DH_SEVER = 235964,
@@ -177,8 +181,8 @@ enum DemonHunterSpells
SPELL_DH_SHATTER_SOUL_1 = 209981,
SPELL_DH_SHATTER_SOUL_2 = 210038,
SPELL_DH_SHATTERED_SOUL = 226258,
- SPELL_DH_SHATTERED_SOUL_LESSER_SOUL_FRAGMENT_1 = 228533,
- SPELL_DH_SHATTERED_SOUL_LESSER_SOUL_FRAGMENT_2 = 237867,
+ SPELL_DH_SHATTERED_SOUL_LESSER_RIGHT = 228533,
+ SPELL_DH_SHATTERED_SOUL_LESSER_LEFT = 237867,
SPELL_DH_SHEAR = 203782,
SPELL_DH_SIGIL_OF_CHAINS_AREA_SELECTOR = 204834,
SPELL_DH_SIGIL_OF_CHAINS_GRIP = 208674,
@@ -195,6 +199,8 @@ enum DemonHunterSpells
SPELL_DH_SIGIL_OF_MISERY_AOE = 207685,
SPELL_DH_SIGIL_OF_SILENCE = 204490,
SPELL_DH_SIGIL_OF_SILENCE_AOE = 204490,
+ SPELL_DH_SIGIL_OF_SPITE = 390163,
+ SPELL_DH_SIGIL_OF_SPITE_AOE = 389860,
SPELL_DH_SOUL_BARRIER = 227225,
SPELL_DH_SOUL_CLEAVE = 228477,
SPELL_DH_SOUL_CLEAVE_DMG = 228478,
@@ -844,6 +850,49 @@ class spell_dh_demon_spikes : public SpellScript
}
};
+// 307046 - Elysian Decree (Kyrian)
+// 389860 - Sigil of Spite
+class spell_dh_elysian_decree : public SpellScript
+{
+public:
+ spell_dh_elysian_decree(uint32 primarySpellId) : _primarySpellId(primarySpellId) { }
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellEffect({ { _primarySpellId, EFFECT_2 } })
+ && sSpellMgr->AssertSpellInfo(_primarySpellId, DIFFICULTY_NONE)->GetEffect(EFFECT_2).IsEffect(SPELL_EFFECT_DUMMY);
+ }
+
+ bool Load() override
+ {
+ _maxFragmentsToCreate = sSpellMgr->AssertSpellInfo(_primarySpellId, GetCastDifficulty())->GetEffect(EFFECT_2).CalcValue(GetCaster());
+ _fragmentsToCreate = _maxFragmentsToCreate;
+ return true;
+ }
+
+ void CreateLesserSoulFragments(SpellEffIndex effIndex)
+ {
+ // spawn more than 1 fragment per target if there are less than 3 total targets
+ int32 fragments = 1 + std::max(int32(_maxFragmentsToCreate - GetUnitTargetCountForEffect(effIndex)), 0);
+ fragments = std::min(fragments, _fragmentsToCreate);
+
+ for (int32 i = 0; i < fragments; ++i)
+ GetHitUnit()->CastSpell(GetCaster(), Trinity::Containers::SelectRandomContainerElement(std::array{ SPELL_DH_SHATTERED_SOUL_LESSER_RIGHT, SPELL_DH_SHATTERED_SOUL_LESSER_LEFT }), TRIGGERED_DONT_REPORT_CAST_ERROR);
+
+ _fragmentsToCreate -= fragments;
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_dh_elysian_decree::CreateLesserSoulFragments, EFFECT_0, SPELL_EFFECT_SCHOOL_DAMAGE);
+ }
+
+private:
+ uint32 _primarySpellId;
+ int32 _maxFragmentsToCreate = 0;
+ int32 _fragmentsToCreate = 0;
+};
+
// 258860 - Essence Break
class spell_dh_essence_break : public SpellScript
{
@@ -1449,6 +1498,25 @@ class spell_dh_glide_timer : public AuraScript
}
};
+// 339895 - Repeat Decree (attached to 307046 - Elysian Decree and 389860 - Sigil of Spite)
+class spell_dh_repeat_decree_conduit : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_DH_REPEAT_DECREE_CONDUIT });
+ }
+
+ bool Load() override
+ {
+ return !GetCaster()->HasAura(SPELL_DH_REPEAT_DECREE_CONDUIT);
+ }
+
+ void Register() override
+ {
+ OnEffectLaunch += SpellEffectFn(spell_dh_repeat_decree_conduit::PreventHitDefaultEffect, EFFECT_1, SPELL_EFFECT_TRIGGER_SPELL);
+ }
+};
+
// Called by 162264 - Metamorphosis
class spell_dh_restless_hunter : public AuraScript
{
@@ -1578,6 +1646,7 @@ class spell_dh_soul_furnace_conduit : public AuraScript
// 204596 - Sigil of Flame
// 207684 - Sigil of Misery
// 202137 - Sigil of Silence
+// 390163 - Sigil of Spite
template<uint32 TriggerSpellId, uint32 TriggerSpellId2 = 0>
struct areatrigger_dh_generic_sigil : AreaTriggerAI
{
@@ -1587,13 +1656,20 @@ struct areatrigger_dh_generic_sigil : AreaTriggerAI
{
if (Unit* caster = at->GetCaster())
{
- caster->CastSpell(at->GetPosition(), TriggerSpellId);
+ caster->CastSpell(at->GetPosition(), TriggerSpellId, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
if constexpr (TriggerSpellId2 != 0)
- caster->CastSpell(at->GetPosition(), TriggerSpellId2);
+ caster->CastSpell(at->GetPosition(), TriggerSpellId2, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
}
}
};
+using at_dh_elysian_decree = areatrigger_dh_generic_sigil<SPELL_DH_ELYSIAN_DECREE_AOE>;
+using areatrigger_dh_sigil_of_chains = areatrigger_dh_generic_sigil<SPELL_DH_SIGIL_OF_CHAINS_TARGET_SELECT, SPELL_DH_SIGIL_OF_CHAINS_VISUAL>;
+using areatrigger_dh_sigil_of_flame = areatrigger_dh_generic_sigil<SPELL_DH_SIGIL_OF_FLAME_AOE, SPELL_DH_SIGIL_OF_FLAME_VISUAL>;
+using areatrigger_dh_sigil_of_silence = areatrigger_dh_generic_sigil<SPELL_DH_SIGIL_OF_SILENCE_AOE>;
+using areatrigger_dh_sigil_of_misery = areatrigger_dh_generic_sigil<SPELL_DH_SIGIL_OF_MISERY_AOE>;
+using areatrigger_dh_sigil_of_spite = areatrigger_dh_generic_sigil<SPELL_DH_SIGIL_OF_SPITE_AOE>;
+
// 208673 - Sigil of Chains
class spell_dh_sigil_of_chains : public SpellScript
{
@@ -1755,6 +1831,8 @@ void AddSC_demon_hunter_spell_scripts()
RegisterSpellScriptWithArgs(spell_dh_demonic, "spell_dh_demonic_havoc", SPELL_DH_METAMORPHOSIS_TRANSFORM);
RegisterSpellScriptWithArgs(spell_dh_demonic, "spell_dh_demonic_vengeance", SPELL_DH_METAMORPHOSIS_VENGEANCE_TRANSFORM);
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_essence_break);
RegisterSpellScript(spell_dh_eye_beam);
RegisterSpellScript(spell_dh_feast_of_souls);
@@ -1771,9 +1849,11 @@ 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_repeat_decree_conduit);
RegisterSpellScript(spell_dh_restless_hunter);
RegisterSpellScript(spell_dh_shattered_destiny);
RegisterSpellScript(spell_dh_sigil_of_chains);
+ RegisterSpellScriptWithArgs(spell_dh_elysian_decree, "spell_dh_sigil_of_spite", SPELL_DH_SIGIL_OF_SPITE);
RegisterSpellScript(spell_dh_student_of_suffering);
RegisterSpellScript(spell_dh_tactical_retreat);
RegisterSpellScript(spell_dh_unhindered_assault);
@@ -1781,10 +1861,11 @@ void AddSC_demon_hunter_spell_scripts()
RegisterSpellScript(spell_dh_violent_transformation);
RegisterAreaTriggerAI(areatrigger_dh_darkness);
- new GenericAreaTriggerEntityScript<areatrigger_dh_generic_sigil<SPELL_DH_SIGIL_OF_CHAINS_TARGET_SELECT, SPELL_DH_SIGIL_OF_CHAINS_VISUAL>>("areatrigger_dh_sigil_of_chains");
- new GenericAreaTriggerEntityScript<areatrigger_dh_generic_sigil<SPELL_DH_SIGIL_OF_FLAME_AOE, SPELL_DH_SIGIL_OF_FLAME_VISUAL>>("areatrigger_dh_sigil_of_flame");
- new GenericAreaTriggerEntityScript<areatrigger_dh_generic_sigil<SPELL_DH_SIGIL_OF_SILENCE_AOE>>("areatrigger_dh_sigil_of_silence");
- new GenericAreaTriggerEntityScript<areatrigger_dh_generic_sigil<SPELL_DH_SIGIL_OF_MISERY_AOE>>("areatrigger_dh_sigil_of_misery");
+ RegisterAreaTriggerAI(areatrigger_dh_sigil_of_chains);
+ RegisterAreaTriggerAI(areatrigger_dh_sigil_of_flame);
+ RegisterAreaTriggerAI(areatrigger_dh_sigil_of_silence);
+ RegisterAreaTriggerAI(areatrigger_dh_sigil_of_misery);
+ RegisterAreaTriggerAI(areatrigger_dh_sigil_of_spite);
// Havoc