diff options
| -rw-r--r-- | sql/updates/world/master/2025_11_14_02_world.sql | 12 | ||||
| -rw-r--r-- | sql/updates/world/master/2025_11_15_00_world.sql | 30 | ||||
| -rw-r--r-- | src/server/scripts/Spells/spell_dh.cpp | 247 |
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); |
