aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2025_11_14_02_world.sql12
-rw-r--r--sql/updates/world/master/2025_11_15_00_world.sql30
-rw-r--r--src/server/scripts/Spells/spell_dh.cpp247
3 files changed, 258 insertions, 31 deletions
diff --git a/sql/updates/world/master/2025_11_14_02_world.sql b/sql/updates/world/master/2025_11_14_02_world.sql
new file mode 100644
index 00000000000..952204a9636
--- /dev/null
+++ b/sql/updates/world/master/2025_11_14_02_world.sql
@@ -0,0 +1,12 @@
+DELETE FROM `spell_proc` WHERE `SpellId` IN (206478);
+INSERT INTO `spell_proc` (`SpellId`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`SpellFamilyMask3`,`ProcFlags`,`ProcFlags2`,`SpellTypeMask`,`SpellPhaseMask`,`HitMask`,`AttributesMask`,`DisableEffectsMask`,`ProcsPerMinute`,`Chance`,`Cooldown`,`Charges`) VALUES
+(206478,0x00,107,0x00000040,0x00000000,0x00000000,0x80000000,0x0,0x0,0x0,0x2,0x0,0x0,0x0,0,0,0,0); -- Demonic Appetite
+
+DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_dh_demonic_appetite_energize','spell_dh_demonic_appetite_energize');
+INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
+(206478,'spell_dh_demonic_appetite'),
+(178963,'spell_dh_demonic_appetite_energize'),
+(202644,'spell_dh_demonic_appetite_energize'),
+(228532,'spell_dh_demonic_appetite_energize'),
+(328953,'spell_dh_demonic_appetite_energize'),
+(1238743,'spell_dh_demonic_appetite_energize');
diff --git a/sql/updates/world/master/2025_11_15_00_world.sql b/sql/updates/world/master/2025_11_15_00_world.sql
new file mode 100644
index 00000000000..2e017c0d974
--- /dev/null
+++ b/sql/updates/world/master/2025_11_15_00_world.sql
@@ -0,0 +1,30 @@
+DELETE FROM `spell_script_names` WHERE `ScriptName` IN ('spell_dh_shattered_souls_havoc_trigger_lesser','spell_dh_shattered_souls_vengeance','spell_dh_shattered_souls_vengeance_trigger','spell_dh_shattered_souls_vengeance_trigger_lesser','spell_dh_consume_soul_vengeance_lesser','spell_dh_soul_fragments_damage_taken_tracker');
+INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
+(228533, 'spell_dh_shattered_souls_havoc_trigger_lesser'),
+(237867, 'spell_dh_shattered_souls_havoc_trigger_lesser'),
+(204254, 'spell_dh_shattered_souls_vengeance'),
+(210038, 'spell_dh_shattered_souls_vengeance_trigger'),
+(209980, 'spell_dh_shattered_souls_vengeance_trigger_lesser'),
+(209981, 'spell_dh_shattered_souls_vengeance_trigger_lesser'),
+(203794, 'spell_dh_consume_soul_vengeance_lesser'),
+(210788, 'spell_dh_soul_fragments_damage_taken_tracker');
+
+DELETE FROM `areatrigger_create_properties` WHERE (`IsCustom`=0 AND `Id` IN (8867,5977,6710,6711));
+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
+(8867, 0, 12929, 0, 0, 0, 0, 0, 0, -1, 0, 0, NULL, 30000, 0, 0, 8, 8, 0, 0, 0, 0, 0, 0, 'at_dh_shattered_souls_havoc_lesser', 64270), -- Spell: 228537 (Shattered Souls)
+(5977, 0, 10665, 0, 0, 0, 0, 0, 0, -1, 0, 0, NULL, 20000, 0, 0, 4, 4, 0, 0, 0, 0, 0, 0, 'at_dh_shattered_souls_vengeance_lesser', 64270), -- Spell: 204255 (Soul Fragment)
+(6710, 0, 11266, 0, 0, 0, 0, 0, 0, -1, 0, 0, NULL, 20000, 0, 0, 4, 6, 0, 0, 0, 0, 0, 0, 'at_dh_shattered_souls_vengeance_shattered', 64270), -- Spell: 203795 (Soul Fragment)
+(6711, 0, 10693, 0, 0, 0, 0, 0, 0, -1, 0, 0, NULL, 20000, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 'at_dh_shattered_souls_vengeance_demon', 64270); -- Spell: 209788 (Shattered Souls)
+
+UPDATE `areatrigger_template` SET `ActionSetFlags`=1,`VerifiedBuild`=64270 WHERE `Id` IN (12929,10665,11266,10693) AND `IsCustom`=0;
+
+DELETE FROM `conditions` WHERE `SourceTypeOrReferenceId`=28 AND `SourceGroup` IN (12929,10665,11266,10693) AND `SourceEntry`=0;
+INSERT INTO `conditions` (`SourceTypeOrReferenceId`, `SourceGroup`, `SourceEntry`, `SourceId`, `ElseGroup`, `ConditionTypeOrReference`, `ConditionTarget`, `ConditionValue1`, `ConditionValue2`, `ConditionValue3`, `ConditionStringValue1`, `NegativeCondition`, `ErrorType`, `ErrorTextId`, `ScriptName`, `Comment`) VALUES
+(28, 12929, 0, 0, 0, 1, 0, 221461, 0, 0, '', 1, 0, 0, '', 'Only trigger Consume Soul without aura 221461'),
+(28, 10665, 0, 0, 0, 1, 0, 221461, 0, 0, '', 1, 0, 0, '', 'Only trigger Consume Soul without aura 221461'),
+(28, 11266, 0, 0, 0, 1, 0, 221461, 0, 0, '', 1, 0, 0, '', 'Only trigger Consume Soul without aura 221461'),
+(28, 10693, 0, 0, 0, 1, 0, 221461, 0, 0, '', 1, 0, 0, '', 'Only trigger Consume Soul without aura 221461');
+
+DELETE FROM `spell_proc` WHERE `SpellId` IN (210788);
+INSERT INTO `spell_proc` (`SpellId`,`SchoolMask`,`SpellFamilyName`,`SpellFamilyMask0`,`SpellFamilyMask1`,`SpellFamilyMask2`,`SpellFamilyMask3`,`ProcFlags`,`ProcFlags2`,`SpellTypeMask`,`SpellPhaseMask`,`HitMask`,`AttributesMask`,`DisableEffectsMask`,`ProcsPerMinute`,`Chance`,`Cooldown`,`Charges`) VALUES
+(210788,0x00,0,0x00000000,0x00000000,0x00000000,0x00000000,0x100000,0x0,0x0,0x2,0x0,0x0,0x0,0,100,0,0); -- Soul Fragments
diff --git a/src/server/scripts/Spells/spell_dh.cpp b/src/server/scripts/Spells/spell_dh.cpp
index 9772d0637cc..fcaf05b4963 100644
--- a/src/server/scripts/Spells/spell_dh.cpp
+++ b/src/server/scripts/Spells/spell_dh.cpp
@@ -35,17 +35,10 @@
#include "SpellMgr.h"
#include "SpellScript.h"
#include "TaskScheduler.h"
-#include "Unit.h"
+#include <numeric>
enum DemonHunterSpells
{
- AREATRIGGER_DH_SHATTERED_SOULS_HAVOC = 8352,
- AREATRIGGER_DH_SHATTERED_SOULS_HAVOC_DEMON = 11231,
- AREATRIGGER_DH_SHATTERED_SOULS_VENGEANCE = 11266,
- AREATRIGGER_DH_SHATTERED_SOULS_VENGEANCE_DEMON = 10693,
- AREATRIGGER_DH_SOUL_FRAGMENT_HAVOC = 12929,
- AREATRIGGER_DH_SOUL_FRAGMENT_VENGEANCE = 10665,
-
SPELL_DH_ABYSSAL_STRIKE = 207550,
SPELL_DH_ANNIHILATION = 201427,
SPELL_DH_ANNIHILATION_MH = 227518,
@@ -72,12 +65,11 @@ enum DemonHunterSpells
SPELL_DH_COLLECTIVE_ANGUISH_EYE_BEAM = 391057,
SPELL_DH_COLLECTIVE_ANGUISH_EYE_BEAM_DAMAGE = 391058,
SPELL_DH_COLLECTIVE_ANGUISH_FEL_DEVASTATION = 393831,
- SPELL_DH_CONSUME_SOUL_HAVOC = 228542,
SPELL_DH_CONSUME_SOUL_HAVOC_DEMON = 228556,
+ SPELL_DH_CONSUME_SOUL_HAVOC_LESSER = 228542,
SPELL_DH_CONSUME_SOUL_HAVOC_SHATTERED = 228540,
- SPELL_DH_CONSUME_SOUL_HEAL = 203794,
- SPELL_DH_CONSUME_SOUL_VENGEANCE = 208014,
SPELL_DH_CONSUME_SOUL_VENGEANCE_DEMON = 210050,
+ SPELL_DH_CONSUME_SOUL_VENGEANCE_LESSER = 208014,
SPELL_DH_CONSUME_SOUL_VENGEANCE_SHATTERED = 210047,
SPELL_DH_CYCLE_OF_HATRED_TALENT = 258887,
SPELL_DH_CYCLE_OF_HATRED_COOLDOWN_REDUCTION = 1214887,
@@ -90,6 +82,8 @@ enum DemonHunterSpells
SPELL_DH_DEMON_SPIKES = 203819,
SPELL_DH_DEMON_SPIKES_TRIGGER = 203720,
SPELL_DH_DEMONIC = 213410,
+ SPELL_DH_DEMONIC_APPETITE = 206478,
+ SPELL_DH_DEMONIC_APPETITE_ENERGIZE = 210041,
SPELL_DH_DEMONIC_ORIGINS = 235893,
SPELL_DH_DEMONIC_ORIGINS_BUFF = 235894,
SPELL_DH_DEMONIC_TRAMPLE_DMG = 208645,
@@ -177,17 +171,21 @@ enum DemonHunterSpells
SPELL_DH_RESTLESS_HUNTER_TALENT = 390142,
SPELL_DH_RESTLESS_HUNTER_BUFF = 390212,
SPELL_DH_SEVER = 235964,
- SPELL_DH_SHATTER_SOUL = 209980,
- SPELL_DH_SHATTER_SOUL_1 = 209981,
- SPELL_DH_SHATTER_SOUL_2 = 210038,
+ SPELL_DH_SHATTER_SOUL = 210038,
+ SPELL_DH_SHATTER_SOUL_VENGEANCE_FRONT_RIGHT = 209980,
+ SPELL_DH_SHATTER_SOUL_VENGEANCE_BACK_RIGHT = 209981,
SPELL_DH_SHATTERED_SOUL = 226258,
+ SPELL_DH_SHATTERED_SOULS_V_DEMON_TRIGGER = 226264,
+ SPELL_DH_SHATTERED_SOULS_V_SHATTERED_TRIGGER = 226263,
SPELL_DH_SHATTERED_SOUL_LESSER_RIGHT = 228533,
SPELL_DH_SHATTERED_SOUL_LESSER_LEFT = 237867,
SPELL_DH_SHATTERED_SOULS_HAVOC = 209651,
SPELL_DH_SHATTERED_SOULS_HAVOC_DEMON_TRIGGER = 226370,
+ SPELL_DH_SHATTERED_SOULS_HAVOC_LESSER_TRIGGER = 228536,
SPELL_DH_SHATTERED_SOULS_HAVOC_SHATTERED_TRIGGER = 209687,
SPELL_DH_SHATTERED_SOULS_MARKER = 221461,
SPELL_DH_SHEAR = 203782,
+ SPELL_DH_SHEAR_PASSIVE = 203783,
SPELL_DH_SIGIL_OF_CHAINS_AREA_SELECTOR = 204834,
SPELL_DH_SIGIL_OF_CHAINS_GRIP = 208674,
SPELL_DH_SIGIL_OF_CHAINS_JUMP = 208674,
@@ -209,6 +207,7 @@ enum DemonHunterSpells
SPELL_DH_SOUL_CLEAVE = 228477,
SPELL_DH_SOUL_CLEAVE_DMG = 228478,
SPELL_DH_SOUL_FRAGMENT_COUNTER = 203981,
+ SPELL_DH_SOUL_FRAGMENTS_DAMAGE_TAKEN_TRACKER = 210788,
SPELL_DH_SOUL_FURNACE_DAMAGE_BUFF = 391172,
SPELL_DH_SOUL_RENDING = 204909,
SPELL_DH_SPIRIT_BOMB_DAMAGE = 218677,
@@ -544,6 +543,34 @@ class spell_dh_collective_anguish_eye_beam : public AuraScript
}
};
+// 203794 - Consume Soul
+class spell_dh_consume_soul_vengeance_lesser : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellEffect({ { SPELL_DH_SOUL_FRAGMENTS_DAMAGE_TAKEN_TRACKER, EFFECT_0 }, { SPELL_DH_SHEAR_PASSIVE, EFFECT_2 } });
+ }
+
+ void CalcHealingFromDamageTaken(SpellEffectInfo const& /*effectInfo*/, Unit const* victim, int32& /*healing*/, int32& flatMod, float& /*pctMod*/) const
+ {
+ AuraEffect* damageTakenTracker = GetCaster()->GetAuraEffect(SPELL_DH_SOUL_FRAGMENTS_DAMAGE_TAKEN_TRACKER, EFFECT_0);
+ if (!damageTakenTracker)
+ return;
+
+ Aura const* shearPassive = GetCaster()->GetAura(SPELL_DH_SHEAR_PASSIVE);
+ if (!shearPassive || !shearPassive->HasEffect(EFFECT_1) || !shearPassive->HasEffect(EFFECT_2))
+ return;
+
+ flatMod += std::max(CalculatePct(uint64(damageTakenTracker->CalculateAmount(GetCaster())), shearPassive->GetEffect(EFFECT_1)->GetAmount()),
+ victim->CountPctFromMaxHealth(shearPassive->GetEffect(EFFECT_2)->GetAmount()));
+ }
+
+ void Register() override
+ {
+ CalcHealing += SpellCalcHealingFn(spell_dh_consume_soul_vengeance_lesser::CalcHealingFromDamageTaken);
+ }
+};
+
// 320413 - Critical Chaos
class spell_dh_critical_chaos : public AuraScript
{
@@ -832,6 +859,52 @@ public:
explicit spell_dh_demonic(uint32 transformSpellId) : _transformSpellId(transformSpellId) { }
};
+// 206478 - Demonic Appetite
+class spell_dh_demonic_appetite : public AuraScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_DH_SHATTERED_SOUL_LESSER_RIGHT, SPELL_DH_SHATTERED_SOUL_LESSER_LEFT });
+ }
+
+ static void ShatterLesserSoulFragment(AuraScript const&, ProcEventInfo const& procEvent)
+ {
+ procEvent.GetActionTarget()->CastSpell(procEvent.GetActor(),
+ Trinity::Containers::SelectRandomContainerElement(std::array{ SPELL_DH_SHATTERED_SOUL_LESSER_RIGHT, SPELL_DH_SHATTERED_SOUL_LESSER_LEFT }),
+ TRIGGERED_DONT_REPORT_CAST_ERROR);
+ }
+
+ void Register() override
+ {
+ OnProc += AuraProcFn(spell_dh_demonic_appetite::ShatterLesserSoulFragment);
+ }
+};
+
+// 178963 - Consume Soul
+// 202644 - Consume Soul
+// 228532 - Consume Soul
+// 328953 - Consume Soul
+// 1238743 - Consume Soul
+class spell_dh_demonic_appetite_energize : public SpellScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo({ SPELL_DH_DEMONIC_APPETITE_ENERGIZE });
+ }
+
+ bool Load() override
+ {
+ return !GetCaster()->HasAura(SPELL_DH_DEMONIC_APPETITE);
+ }
+
+ void Register() override
+ {
+ for (SpellEffectInfo const& spellEffectInfo : sSpellMgr->AssertSpellInfo(m_scriptSpellId, DIFFICULTY_NONE)->GetEffects())
+ if (spellEffectInfo.IsEffect(SPELL_EFFECT_TRIGGER_SPELL) && spellEffectInfo.TriggerSpell == SPELL_DH_DEMONIC_APPETITE_ENERGIZE)
+ OnEffectLaunchTarget += SpellEffectFn(spell_dh_demonic_appetite_energize::PreventHitDefaultEffect, spellEffectInfo.EffectIndex, SPELL_EFFECT_TRIGGER_SPELL);
+ }
+};
+
// 203720 - Demon Spikes
class spell_dh_demon_spikes : public SpellScript
{
@@ -854,6 +927,29 @@ class spell_dh_demon_spikes : public SpellScript
}
};
+struct spell_dh_shattered_souls_base_lesser
+{
+ static bool Validate()
+ {
+ return SpellScriptBase::ValidateSpellInfo({
+ SPELL_DH_SHATTERED_SOUL_LESSER_RIGHT,
+ SPELL_DH_SHATTERED_SOUL_LESSER_LEFT,
+ SPELL_DH_SHATTER_SOUL_VENGEANCE_FRONT_RIGHT,
+ SPELL_DH_SHATTER_SOUL_VENGEANCE_BACK_RIGHT
+ });
+ }
+
+ static void CreateFragments(Unit* source, Unit* dh, int32 count)
+ {
+ std::array<DemonHunterSpells, 2> spells = dh->IsPlayer() && dh->ToPlayer()->GetPrimarySpecialization() == ChrSpecialization::DemonHunterHavoc
+ ? std::array{ SPELL_DH_SHATTERED_SOUL_LESSER_RIGHT, SPELL_DH_SHATTERED_SOUL_LESSER_LEFT }
+ : std::array{ SPELL_DH_SHATTER_SOUL_VENGEANCE_FRONT_RIGHT, SPELL_DH_SHATTER_SOUL_VENGEANCE_BACK_RIGHT };
+
+ for (int32 i = 0; i < count; ++i)
+ source->CastSpell(dh, Trinity::Containers::SelectRandomContainerElement(spells), TRIGGERED_DONT_REPORT_CAST_ERROR);
+ }
+};
+
// 307046 - Elysian Decree (Kyrian)
// 389860 - Sigil of Spite
class spell_dh_elysian_decree : public SpellScript
@@ -864,7 +960,8 @@ public:
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellEffect({ { _primarySpellId, EFFECT_2 } })
- && sSpellMgr->AssertSpellInfo(_primarySpellId, DIFFICULTY_NONE)->GetEffect(EFFECT_2).IsEffect(SPELL_EFFECT_DUMMY);
+ && sSpellMgr->AssertSpellInfo(_primarySpellId, DIFFICULTY_NONE)->GetEffect(EFFECT_2).IsEffect(SPELL_EFFECT_DUMMY)
+ && spell_dh_shattered_souls_base_lesser::Validate();
}
bool Load() override
@@ -880,8 +977,7 @@ public:
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);
+ spell_dh_shattered_souls_base_lesser::CreateFragments(GetHitUnit(), GetCaster(), fragments);
_fragmentsToCreate -= fragments;
}
@@ -1599,14 +1695,18 @@ private:
};
// 178940 - Shattered Souls
-class spell_dh_shattered_souls_havoc : public AuraScript
+// 204254 - Shattered Souls
+class spell_dh_shattered_souls : public AuraScript
{
+public:
+ spell_dh_shattered_souls(uint32 triggeredSpellId) : _triggeredSpellId(triggeredSpellId) { }
+
bool Validate(SpellInfo const* /*spellInfo*/) override
{
- return ValidateSpellInfo({ SPELL_DH_SHATTERED_SOULS_HAVOC });
+ return ValidateSpellInfo({ _triggeredSpellId });
}
- static void HandleProc(AuraScript const&, AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo)
+ void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo) const
{
Unit* caster = eventInfo.GetActor();
Unit* target = eventInfo.GetProcTarget();
@@ -1614,27 +1714,36 @@ class spell_dh_shattered_souls_havoc : public AuraScript
if (!caster || !target)
return;
- target->CastSpell(caster, SPELL_DH_SHATTERED_SOULS_HAVOC, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
+ target->CastSpell(caster, _triggeredSpellId, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
}
void Register() override
{
- OnEffectProc += AuraEffectProcFn(spell_dh_shattered_souls_havoc::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
+ OnEffectProc += AuraEffectProcFn(spell_dh_shattered_souls::HandleProc, EFFECT_0, SPELL_AURA_DUMMY);
}
+
+private:
+ uint32 _triggeredSpellId;
};
// 209651 - Shattered Souls
-class spell_dh_shattered_souls_havoc_trigger : public SpellScript
+// 210038 - Shatter Soul
+class spell_dh_shattered_souls_trigger : public SpellScript
{
+public:
+ spell_dh_shattered_souls_trigger(uint32 triggeredSpellId, uint32 triggeredSpellIdDemon)
+ : _triggeredSpellId(triggeredSpellId), _triggeredSpellIdDemon(triggeredSpellIdDemon) { }
+
bool Validate(SpellInfo const* /*spellInfo*/) override
{
- return ValidateSpellInfo({ SPELL_DH_SHATTERED_SOULS_HAVOC_DEMON_TRIGGER, SPELL_DH_SHATTERED_SOULS_HAVOC_SHATTERED_TRIGGER });
+ return ValidateSpellInfo({ _triggeredSpellId })
+ && (!_triggeredSpellIdDemon || ValidateSpellInfo({ _triggeredSpellIdDemon }));
}
void HandleSoulFragment(SpellEffIndex /*effIndex*/) const
{
if (Unit* target = GetExplTargetUnit())
- target->CastSpell(GetHitDest()->GetPosition(), GetCaster()->GetCreatureType() == CREATURE_TYPE_DEMON ? SPELL_DH_SHATTERED_SOULS_HAVOC_DEMON_TRIGGER : SPELL_DH_SHATTERED_SOULS_HAVOC_SHATTERED_TRIGGER, CastSpellExtraArgsInit{
+ target->CastSpell(GetHitDest()->GetPosition(), _triggeredSpellIdDemon && GetCaster()->GetCreatureType() == CREATURE_TYPE_DEMON ? _triggeredSpellIdDemon : _triggeredSpellId, CastSpellExtraArgsInit{
.TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
.TriggeringSpell = GetSpell()
});
@@ -1642,8 +1751,12 @@ class spell_dh_shattered_souls_havoc_trigger : public SpellScript
void Register() override
{
- OnEffectLaunch += SpellEffectFn(spell_dh_shattered_souls_havoc_trigger::HandleSoulFragment, EFFECT_1, SPELL_EFFECT_DUMMY);
+ OnEffectLaunch += SpellEffectFn(spell_dh_shattered_souls_trigger::HandleSoulFragment, EFFECT_1, SPELL_EFFECT_DUMMY);
}
+
+private:
+ uint32 _triggeredSpellId;
+ uint32 _triggeredSpellIdDemon;
};
// 209693 - Shattered Souls and 209788 - Shattered Souls
@@ -1660,6 +1773,66 @@ struct at_dh_shattered_souls : public AreaTriggerAI
}
};
+using at_dh_shattered_souls_havoc_demon = at_dh_shattered_souls<SPELL_DH_CONSUME_SOUL_HAVOC_DEMON>;
+using at_dh_shattered_souls_havoc_lesser = at_dh_shattered_souls<SPELL_DH_CONSUME_SOUL_HAVOC_LESSER>;
+using at_dh_shattered_souls_havoc_shattered = at_dh_shattered_souls<SPELL_DH_CONSUME_SOUL_HAVOC_SHATTERED>;
+using at_dh_shattered_souls_vengeance_demon = at_dh_shattered_souls<SPELL_DH_CONSUME_SOUL_VENGEANCE_DEMON>;
+using at_dh_shattered_souls_vengeance_lesser = at_dh_shattered_souls<SPELL_DH_CONSUME_SOUL_VENGEANCE_LESSER>;
+using at_dh_shattered_souls_vengeance_shattered = at_dh_shattered_souls<SPELL_DH_CONSUME_SOUL_VENGEANCE_SHATTERED>;
+
+// 210788 - Soul Fragments
+class spell_dh_soul_fragments_damage_taken_tracker : public AuraScript
+{
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellEffect({ { SPELL_DH_SHEAR_PASSIVE, EFFECT_3 } });
+ }
+
+ bool Load() override
+ {
+ AuraEffect const* seconds = GetUnitOwner()->GetAuraEffect(SPELL_DH_SHEAR_PASSIVE, EFFECT_3);
+ if (!seconds)
+ return false;
+
+ _damagePerSecond.resize(seconds->GetAmount());
+ return !_damagePerSecond.empty();
+ }
+
+ static bool CheckProc(AuraScript const&, ProcEventInfo const& eventInfo)
+ {
+ return eventInfo.GetDamageInfo() != nullptr;
+ }
+
+ void Update(AuraEffect* /*aurEff*/)
+ {
+ // Move backwards all datas by one from [23][0][0][0][0] -> [0][23][0][0][0]
+ std::move_backward(_damagePerSecond.begin(), std::next(_damagePerSecond.begin(), std::ssize(_damagePerSecond) - 1), _damagePerSecond.end());
+ _damagePerSecond[0] = 0;
+ }
+
+ void HandleCalcAmount(AuraEffect const* /*aurEff*/, int32& amount, bool& canBeRecalculated)
+ {
+ canBeRecalculated = true;
+ amount = int32(std::reduce(_damagePerSecond.begin(), _damagePerSecond.end(), 0u));
+ }
+
+ void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo)
+ {
+ _damagePerSecond[0] += eventInfo.GetDamageInfo()->GetDamage();
+ }
+
+ void Register() override
+ {
+ DoCheckProc += AuraCheckProcFn(spell_dh_soul_fragments_damage_taken_tracker::CheckProc);
+ OnEffectProc += AuraEffectProcFn(spell_dh_soul_fragments_damage_taken_tracker::HandleProc, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_dh_soul_fragments_damage_taken_tracker::HandleCalcAmount, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_dh_soul_fragments_damage_taken_tracker::Update, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ }
+
+private:
+ std::vector<uint32> _damagePerSecond;
+};
+
// 391166 - Soul Furnace
class spell_dh_soul_furnace : public AuraScript
{
@@ -1885,9 +2058,10 @@ void AddSC_demon_hunter_spell_scripts()
RegisterSpellScript(spell_dh_chaos_theory_drop_charge);
RegisterSpellScript(spell_dh_chaotic_transformation);
RegisterSpellScript(spell_dh_charred_warblades);
- RegisterSpellScript(spell_dh_critical_chaos);
RegisterSpellScript(spell_dh_collective_anguish);
RegisterSpellScript(spell_dh_collective_anguish_eye_beam);
+ RegisterSpellScript(spell_dh_consume_soul_vengeance_lesser);
+ RegisterSpellScript(spell_dh_critical_chaos);
RegisterSpellScript(spell_dh_cycle_of_hatred);
RegisterSpellScript(spell_dh_cycle_of_hatred_remove_stacks);
RegisterSpellScript(spell_dh_cycle_of_hatred_talent);
@@ -1896,6 +2070,8 @@ void AddSC_demon_hunter_spell_scripts()
RegisterSpellScript(spell_dh_deflecting_spikes);
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_demonic_appetite);
+ RegisterSpellScript(spell_dh_demonic_appetite_energize);
RegisterSpellScript(spell_dh_demon_spikes);
RegisterSpellScriptWithArgs(spell_dh_elysian_decree, "spell_dh_elysian_decree", SPELL_DH_ELYSIAN_DECREE);
RegisterAreaTriggerAI(at_dh_elysian_decree);
@@ -1918,12 +2094,21 @@ void AddSC_demon_hunter_spell_scripts()
RegisterSpellScript(spell_dh_repeat_decree_conduit);
RegisterSpellScript(spell_dh_restless_hunter);
RegisterSpellScript(spell_dh_shattered_destiny);
- RegisterSpellScript(spell_dh_shattered_souls_havoc);
- RegisterSpellScript(spell_dh_shattered_souls_havoc_trigger);
- new GenericAreaTriggerEntityScript<at_dh_shattered_souls<SPELL_DH_CONSUME_SOUL_HAVOC_SHATTERED>>("at_dh_shattered_souls_havoc_shattered");
- new GenericAreaTriggerEntityScript<at_dh_shattered_souls<SPELL_DH_CONSUME_SOUL_HAVOC_DEMON>>("at_dh_shattered_souls_havoc_demon");
+ RegisterSpellScriptWithArgs(spell_dh_shattered_souls, "spell_dh_shattered_souls_havoc", SPELL_DH_SHATTERED_SOULS_HAVOC);
+ RegisterSpellScriptWithArgs(spell_dh_shattered_souls, "spell_dh_shattered_souls_vengeance", SPELL_DH_SHATTER_SOUL);
+ RegisterSpellScriptWithArgs(spell_dh_shattered_souls_trigger, "spell_dh_shattered_souls_havoc_trigger", SPELL_DH_SHATTERED_SOULS_HAVOC_SHATTERED_TRIGGER, SPELL_DH_SHATTERED_SOULS_HAVOC_DEMON_TRIGGER);
+ RegisterSpellScriptWithArgs(spell_dh_shattered_souls_trigger, "spell_dh_shattered_souls_havoc_trigger_lesser", SPELL_DH_SHATTERED_SOULS_HAVOC_LESSER_TRIGGER, 0);
+ RegisterSpellScriptWithArgs(spell_dh_shattered_souls_trigger, "spell_dh_shattered_souls_vengeance_trigger", SPELL_DH_SHATTERED_SOULS_V_SHATTERED_TRIGGER, SPELL_DH_SHATTERED_SOULS_V_DEMON_TRIGGER);
+ RegisterSpellScriptWithArgs(spell_dh_shattered_souls_trigger, "spell_dh_shattered_souls_vengeance_trigger_lesser", SPELL_DH_SHATTERED_SOUL, 0);
+ RegisterAreaTriggerAI(at_dh_shattered_souls_havoc_demon);
+ RegisterAreaTriggerAI(at_dh_shattered_souls_havoc_lesser);
+ RegisterAreaTriggerAI(at_dh_shattered_souls_havoc_shattered);
+ RegisterAreaTriggerAI(at_dh_shattered_souls_vengeance_demon);
+ RegisterAreaTriggerAI(at_dh_shattered_souls_vengeance_lesser);
+ RegisterAreaTriggerAI(at_dh_shattered_souls_vengeance_shattered);
RegisterSpellScript(spell_dh_sigil_of_chains);
RegisterSpellScriptWithArgs(spell_dh_elysian_decree, "spell_dh_sigil_of_spite", SPELL_DH_SIGIL_OF_SPITE);
+ RegisterSpellScript(spell_dh_soul_fragments_damage_taken_tracker);
RegisterSpellScript(spell_dh_student_of_suffering);
RegisterSpellScript(spell_dh_tactical_retreat);
RegisterSpellScript(spell_dh_unhindered_assault);