TrinityCore
Loading...
Searching...
No Matches
spell_dh.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18/*
19 * Scripts for spells with SPELLFAMILY_DEMONHUNTER and SPELLFAMILY_GENERIC spells used by demon hunter players.
20 * Ordered alphabetically using scriptname.
21 * Scriptnames of files in this file should be prefixed with "spell_dh_".
22 */
23
24#include "AreaTrigger.h"
25#include "AreaTriggerAI.h"
26#include "Containers.h"
27#include "DB2Stores.h"
28#include "PathGenerator.h"
29#include "Player.h"
30#include "ScriptMgr.h"
31#include "Spell.h"
32#include "SpellAuraEffects.h"
33#include "SpellAuras.h"
34#include "SpellHistory.h"
35#include "SpellMgr.h"
36#include "SpellScript.h"
37#include "TaskScheduler.h"
38#include <numeric>
39
41{
49 SPELL_DH_BLUR = 212800,
183 SPELL_DH_REAP = 1226019,
264};
265
271
272// Called by 232893 - Felblade
274{
275 bool Validate(SpellInfo const* /*spellInfo*/) override
276 {
278 }
279
280 bool Load() override
281 {
283 }
284
292
297};
298
299// Called by 203819 - Demon Spikes
326
327// 391171 - Calcified Spikes
329{
330 bool Validate(SpellInfo const* spellInfo) override
331 {
332 return ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
333 }
334
335 void HandlePeriodic(AuraEffect const* /*aurEff*/) const
336 {
337 if (AuraEffect* damagePctTaken = GetEffect(EFFECT_0))
338 damagePctTaken->ChangeAmount(damagePctTaken->GetAmount() + 1);
339 }
340
345};
346
347// 197125 - Chaos Strike
369
370// 344862 - Chaos Strike
391
392// Called by 188499 - Blade Dance and 210152 - Death Sweep
394{
395 bool Validate(SpellInfo const* /*spellInfo*/) override
396 {
399 return false;
400
401 SpellInfo const* chaosTheory = sSpellMgr->AssertSpellInfo(SPELL_DH_CHAOS_THEORY_TALENT, DIFFICULTY_NONE);
402 return chaosTheory->GetEffect(EFFECT_0).CalcValue() < chaosTheory->GetEffect(EFFECT_1).CalcValue();
403 }
404
405 bool Load() override
406 {
408 }
409
410 void ChaosTheory() const
411 {
412 Unit* caster = GetCaster();
413 Aura const* chaosTheory = caster->GetAura(SPELL_DH_CHAOS_THEORY_TALENT);
414 if (!chaosTheory)
415 return;
416
417 AuraEffect const* min = chaosTheory->GetEffect(EFFECT_0);
418 AuraEffect const* max = chaosTheory->GetEffect(EFFECT_1);
419 if (!min || !max)
420 return;
421
422 SpellEffectValue critChance = frand(min->GetAmount(), max->GetAmount());
425 .SpellValueOverrides = { { SPELLVALUE_BASE_POINT0, critChance } }
426 });
427 }
428
433};
434
435// 390195 - Chaos Theory
437{
438 void Prepare(ProcEventInfo const& /*eventInfo*/)
439 {
441 // delayed charge drop - this aura must be removed after Chaos Strike does damage and after it procs power refund
443 }
444
449};
450
451// Called by 191427 - Metamorphosis
453{
454 bool Validate(SpellInfo const* /*spellInfo*/) override
455 {
459 }
460
461 bool Load() override
462 {
464 }
465
466 void HandleCooldown() const
467 {
469 {
470 uint32 category = sSpellMgr->AssertSpellInfo(cooldown.SpellId, DIFFICULTY_NONE)->CategoryId;
471 return category == SPELL_CATEGORY_DH_EYE_BEAM || category == SPELL_CATEGORY_DH_BLADE_DANCE;
472 }, true);
473 }
474
479};
480
481// 213010 - Charred Warblades
483{
484 bool Validate(SpellInfo const* /*spellInfo*/) override
485 {
487 }
488
489 bool CheckProc(ProcEventInfo& eventInfo)
490 {
491 return eventInfo.GetDamageInfo() && eventInfo.GetDamageInfo()->GetSchoolMask() & SPELL_SCHOOL_MASK_FIRE;
492 }
493
495 {
496 _healAmount += CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), GetEffect(EFFECT_0)->GetAmount());
497 }
498
499 void HandleDummyTick(AuraEffect const* aurEff)
500 {
501 if (_healAmount == 0)
502 return;
503
506 .SetTriggeringAura(aurEff)
507 .AddSpellBP0(_healAmount));
508
509 _healAmount = 0;
510 }
511
518
519private:
521};
522
523// Called by 212084 - Fel Devastation and 198013 - Eye Beam
560
561// 391057 - Eye Beam
583
584// 473662 - Consume
586{
587 bool Validate(SpellInfo const* /*spellInfo*/) override
588 {
590 }
591
599
604};
605
606// 203794 - Consume Soul
608{
609 bool Validate(SpellInfo const* /*spellInfo*/) override
610 {
612 }
613
614 void CalcHealingFromDamageTaken(SpellEffectInfo const& /*effectInfo*/, Unit const* victim, int32& /*healing*/, int32& flatMod, float& /*pctMod*/) const
615 {
617 if (!damageTakenTracker)
618 return;
619
620 Aura const* shearPassive = GetCaster()->GetAura(SPELL_DH_SHEAR_PASSIVE);
621 if (!shearPassive || !shearPassive->HasEffect(EFFECT_1) || !shearPassive->HasEffect(EFFECT_2))
622 return;
623
624 flatMod += std::max<SpellEffectValue>(CalculatePct(damageTakenTracker->CalculateAmount(GetCaster()), shearPassive->GetEffect(EFFECT_1)->GetAmount()),
625 victim->CountPctFromMaxHealth(shearPassive->GetEffect(EFFECT_2)->GetAmount()));
626 }
627
632};
633
634// 320413 - Critical Chaos
636{
637 void CalcAmount(AuraEffect const* /*aurEff*/, SpellEffectValue& amount, bool const& /*canBeRecalculated*/) const
638 {
639 if (AuraEffect const* amountHolder = GetEffect(EFFECT_1))
640 {
641 float critChanceDone = GetUnitOwner()->GetUnitCriticalChanceDone(BASE_ATTACK);
642 amount = CalculatePct(critChanceDone, amountHolder->GetAmount());
643 }
644 }
645
646 void UpdatePeriodic(AuraEffect const* aurEff) const
647 {
648 if (AuraEffect* bonus = GetEffect(EFFECT_0))
649 bonus->RecalculateAmount(aurEff);
650 }
651
657};
658
659// 1226019 - Reap
661{
662 bool Validate(SpellInfo const* /*spellInfo*/) override
663 {
665 }
666
674
679};
680
681// 389718 - Cycle of Binding
683{
685
686 bool Validate(SpellInfo const* /*spellInfo*/) override
687 {
689 }
690
691 void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo const& /*eventInfo*/) const
692 {
693 SpellHistory* history = GetTarget()->GetSpellHistory();
694 SpellHistory::Duration amount = duration_cast<SpellHistory::Duration>(FloatSeconds(-aurEff->GetAmount()));
695
696 for (uint32 spellId : SigilSpellsIds)
697 history->ModifyCooldown(spellId, amount);
698 }
699
704};
705
706// Called by 198013 - Eye Beam
708{
713
714 bool Load() override
715 {
717 }
718
720 {
721 Unit* caster = GetCaster();
722
723 // First calculate cooldown then add another stack
725 AuraEffect const* cycleOfHatred = caster->GetAuraEffect(SPELL_DH_CYCLE_OF_HATRED_TALENT, EFFECT_0);
726 caster->GetSpellHistory()->ModifyCooldown(GetSpellInfo(), -Milliseconds(static_cast<int64>(cycleOfHatred->GetAmount() * cycleOfHatredStack)));
727
731
734 }
735
740};
741
742// 1214890 - Cycle of Hatred
744{
745 bool Validate(SpellInfo const* /*spellInfo*/) override
746 {
748 }
749
750 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
751 {
753 aura->SetStackAmount(1);
754 }
755
760};
761
762// 258887 - Cycle of Hatred
787
788// Called by 212084 - Fel Devastation
790{
791 bool Validate(SpellInfo const* /*spellInfo*/) override
792 {
795 return false;
796
797 SpellInfo const* darkglareBoon = sSpellMgr->GetSpellInfo(SPELL_DH_DARKGLARE_BOON, DIFFICULTY_NONE);
798 return darkglareBoon->GetEffect(EFFECT_0).CalcValue() < darkglareBoon->GetEffect(EFFECT_1).CalcValue()
799 && darkglareBoon->GetEffect(EFFECT_2).CalcValue() < darkglareBoon->GetEffect(EFFECT_3).CalcValue();
800 }
801
802 bool Load() override
803 {
805 }
806
807 void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
808 {
809 // Tooltip mentions "fully channelled" being a requirement but ingame it always reduces cooldown and energizes, even when manually cancelled
810 //if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
811 // return;
812
813 Unit* target = GetTarget();
814 Aura const* darkglareBoon = target->GetAura(SPELL_DH_DARKGLARE_BOON);
815
816 SpellHistory::Duration cooldown, categoryCooldown;
817 SpellHistory::GetCooldownDurations(GetSpellInfo(), 0, &cooldown, nullptr, &categoryCooldown);
818 SpellEffectValue reductionPct = frand(darkglareBoon->GetEffect(EFFECT_0)->GetAmount(), darkglareBoon->GetEffect(EFFECT_1)->GetAmount());
819 SpellHistory::Duration cooldownReduction(CalculatePct(std::max(cooldown, categoryCooldown).count(), reductionPct));
820
821 SpellEffectValue energizeValue = frand(darkglareBoon->GetEffect(EFFECT_2)->GetAmount(), darkglareBoon->GetEffect(EFFECT_3)->GetAmount());
822
823 target->GetSpellHistory()->ModifyCooldown(SPELL_DH_FEL_DEVASTATION, -cooldownReduction);
824
827 .SpellValueOverrides = { { SPELLVALUE_BASE_POINT0, energizeValue } }
828 });
829 }
830
835};
836
837// 209426 - Darkness
839{
840 bool Validate(SpellInfo const* spellInfo) override
841 {
842 return ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
843 }
844
845 void CalculateAmount(AuraEffect const* /*aurEff*/, SpellEffectValue& amount, bool& /*canBeRecalculated*/)
846 {
847 // Set absorbtion amount to unlimited
848 amount = -1;
849 }
850
851 void Absorb(AuraEffect const* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) const
852 {
853 if (AuraEffect const* chanceEffect = GetEffect(EFFECT_1))
854 if (roll_chance(chanceEffect->GetAmount()))
855 absorbAmount = dmgInfo.GetDamage();
856 }
857
863};
864
865// 196718 - Darkness
866// Id: 6615
868{
871
872 void OnUnitEnter(Unit* unit) override
873 {
874 Unit* caster = at->GetCaster();
875 if (!caster || !caster->IsValidAssistTarget(unit, _absorbAuraInfo))
876 return;
877
880 .SpellValueOverrides = { { SPELLVALUE_DURATION, at->GetDuration() } }
881 });
882 }
883
884 void OnUnitExit(Unit* unit, AreaTriggerExitReason /*reason*/) override
885 {
887 }
888
889private:
891};
892
893// 203819 - Demon Spikes
895{
896 bool Validate(SpellInfo const* spellInfo) override
897 {
899 && ValidateSpellEffect({ { spellInfo->Id, EFFECT_0 } })
901 }
902
903 void HandleParryChance(WorldObject*& target) const
904 {
906 target = nullptr;
907 }
908
913};
914
915// 388111 - Demon Muzzle
917{
918 bool Validate(SpellInfo const* /*spellInfo*/) override
919 {
921 }
922
923 static void HandleProc(AuraScript const&, AuraEffect const*, ProcEventInfo const& procEvent)
924 {
926 .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
927 .TriggeringSpell = procEvent.GetProcSpell()
928 });
929 }
930
935};
936
937// 213410 - Demonic (attached to 212084 - Fel Devastation and 198013 - Eye Beam)
939{
940 bool Validate(SpellInfo const* /*spellInfo*/) override
941 {
944 && sSpellMgr->AssertSpellInfo(SPELL_DH_DEMONIC, DIFFICULTY_NONE)->GetEffect(EFFECT_0).IsAura();
945 }
946
947 bool Load() override
948 {
950 }
951
953 {
954 Unit* caster = GetCaster();
955 AuraEffect const* demonic = caster->GetAuraEffect(SPELL_DH_DEMONIC, EFFECT_0);
956 if (!demonic)
957 return;
958
959 int32 duration = demonic->GetAmountAsInt() + GetSpell()->GetChannelDuration();
960
961 if (Aura* aura = caster->GetAura(_transformSpellId))
962 {
963 aura->SetMaxDuration(aura->GetDuration() + duration);
964 aura->SetDuration(aura->GetMaxDuration());
965 return;
966 }
967
968 SpellCastTargets targets;
969 targets.SetUnitTarget(caster);
970
971 Spell* spell = new Spell(caster, sSpellMgr->AssertSpellInfo(_transformSpellId, DIFFICULTY_NONE),
973 ObjectGuid::Empty, GetSpell()->m_castId);
975 spell->m_SpellVisual.ScriptVisualID = 0;
976 spell->SetSpellValue({ SPELLVALUE_DURATION, duration });
977 spell->prepare(targets);
978 }
979
984
986
987public:
988 explicit spell_dh_demonic(uint32 transformSpellId) : _transformSpellId(transformSpellId) { }
989};
990
991// 206478 - Demonic Appetite
993{
998
999 static void ShatterLesserSoulFragment(AuraScript const&, ProcEventInfo const& procEvent)
1000 {
1001 procEvent.GetActionTarget()->CastSpell(procEvent.GetActor(),
1002 Trinity::Containers::SelectRandomContainerElement(std::array{ SPELL_DH_SHATTERED_SOUL_LESSER_RIGHT, SPELL_DH_SHATTERED_SOUL_LESSER_LEFT }),
1004 }
1005
1010};
1011
1012// 178963 - Consume Soul
1013// 202644 - Consume Soul
1014// 228532 - Consume Soul
1015// 328953 - Consume Soul
1016// 1238743 - Consume Soul
1018{
1019 bool Validate(SpellInfo const* /*spellInfo*/) override
1020 {
1022 }
1023
1024 bool Load() override
1025 {
1027 }
1028
1029 void Register() override
1030 {
1031 for (SpellEffectInfo const& spellEffectInfo : sSpellMgr->AssertSpellInfo(m_scriptSpellId, DIFFICULTY_NONE)->GetEffects())
1032 if (spellEffectInfo.IsEffect(SPELL_EFFECT_TRIGGER_SPELL) && spellEffectInfo.TriggerSpell == SPELL_DH_DEMONIC_APPETITE_ENERGIZE)
1034 }
1035};
1036
1037// 203720 - Demon Spikes
1039{
1040 bool Validate(SpellInfo const* /*spellInfo*/) override
1041 {
1043 }
1044
1052
1057};
1058
1060{
1062 static constexpr std::array<DemonHunterSpells, 2> HavocSpells = { SPELL_DH_SHATTERED_SOUL_LESSER_RIGHT, SPELL_DH_SHATTERED_SOUL_LESSER_LEFT };
1064
1071
1072 static void CreateFragments(Unit* source, Unit* dh, int32 count)
1073 {
1074 std::span<DemonHunterSpells const> spells = HavocSpells;
1075 if (Player* player = dh->ToPlayer())
1076 {
1077 if (player->GetPrimarySpecialization() == ChrSpecialization::DemonHunterDevourer)
1078 spells = DevourerSpells;
1079 else if (player->GetPrimarySpecialization() == ChrSpecialization::DemonHunterVengeance)
1080 spells = VengeanceSpells;
1081 }
1082
1083 for (int32 i = 0; i < count; ++i)
1085 }
1086};
1087
1088// 452410 - Enduring Torment
1090{
1095
1096 void HandlePeriodic(AuraEffect const* aurEff) const
1097 {
1098 Unit* target = GetTarget();
1100
1102 {
1103 if (statBuff)
1104 target->RemoveOwnedAura(statBuff);
1105 }
1106 else if (!statBuff)
1107 {
1110 .TriggeringAura = aurEff
1111 });
1112 }
1113 }
1114
1119};
1120
1121// 453314 - Enduring Torment
1123{
1124 bool Load() override
1125 {
1126 return GetCaster()->IsPlayer();
1127 }
1128
1129 template <ChrSpecialization Spec>
1130 void PreventEffect(WorldObject*& target) const
1131 {
1132 if (GetCaster()->ToPlayer()->GetPrimarySpecialization() != Spec)
1133 target = nullptr;
1134 }
1135
1136 void Register() override
1137 {
1138 OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dh_enduring_torment_buff::PreventEffect<ChrSpecialization::DemonHunterHavoc>, EFFECT_0, TARGET_UNIT_CASTER);
1139 OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dh_enduring_torment_buff::PreventEffect<ChrSpecialization::DemonHunterHavoc>, EFFECT_1, TARGET_UNIT_CASTER);
1140 OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dh_enduring_torment_buff::PreventEffect<ChrSpecialization::DemonHunterDevourer>, EFFECT_2, TARGET_UNIT_CASTER);
1141 OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dh_enduring_torment_buff::PreventEffect<ChrSpecialization::DemonHunterDevourer>, EFFECT_3, TARGET_UNIT_CASTER);
1142 }
1143};
1144
1145// 307046 - Elysian Decree (Kyrian)
1146// 389860 - Sigil of Spite
1148{
1149public:
1150 spell_dh_elysian_decree(uint32 primarySpellId) : _primarySpellId(primarySpellId) { }
1151
1152 bool Validate(SpellInfo const* /*spellInfo*/) override
1153 {
1155 && sSpellMgr->AssertSpellInfo(_primarySpellId, DIFFICULTY_NONE)->GetEffect(EFFECT_2).IsEffect(SPELL_EFFECT_DUMMY)
1157 }
1158
1159 bool Load() override
1160 {
1161 _maxFragmentsToCreate = sSpellMgr->AssertSpellInfo(_primarySpellId, GetCastDifficulty())->GetEffect(EFFECT_2).CalcValueAsInt(GetCaster());
1163 return true;
1164 }
1165
1167 {
1168 // spawn more than 1 fragment per target if there are less than 3 total targets
1169 int32 fragments = 1 + std::max(int32(_maxFragmentsToCreate - GetUnitTargetCountForEffect(effIndex)), 0);
1170 fragments = std::min(fragments, _fragmentsToCreate);
1171
1173
1174 _fragmentsToCreate -= fragments;
1175 }
1176
1181
1182private:
1186};
1187
1188// 1225826 - Eradicate
1211
1212// 258860 - Essence Break
1214{
1215 bool Validate(SpellInfo const* /*spellInfo*/) override
1216 {
1218 }
1219
1220 void HandleDebuff(SpellEffIndex /*effIndex*/) const
1221 {
1222 Unit* caster = GetCaster();
1223
1224 // debuff application is slightly delayed on official servers (after animation fully finishes playing)
1225 caster->m_Events.AddEventAtOffset([caster, targets = CastSpellTargetArg(GetHitUnit())]() mutable
1226 {
1227 if (!targets.Targets)
1228 return;
1229
1230 targets.Targets->Update(caster);
1231
1233 }, 300ms);
1234 }
1235
1240};
1241
1242// 198013 - Eye Beam
1244{
1245 bool Validate(SpellInfo const* /*spellInfo*/) override
1246 {
1248 }
1249
1250 void HandleEffectPeriodic(AuraEffect const* aurEff) const
1251 {
1252 if (Unit* caster = GetCaster())
1253 caster->CastSpell(nullptr, SPELL_DH_EYE_BEAM_DAMAGE, CastSpellExtraArgsInit{
1255 .TriggeringAura = aurEff
1256 });
1257 }
1258
1263};
1264
1265// Called by 228477 - Soul Cleave
1267{
1268 bool Validate(SpellInfo const* /*spellInfo*/) override
1269 {
1271 }
1272
1273 bool Load() override
1274 {
1276 }
1277
1285
1290};
1291
1292// 212084 - Fel Devastation
1294{
1295 bool Validate(SpellInfo const* /*spellInfo*/) override
1296 {
1298 }
1299
1300 void HandlePeriodicEffect(AuraEffect const* aurEff) const
1301 {
1302 if (Unit* caster = GetCaster())
1303 caster->CastSpell(caster, SPELL_DH_FEL_DEVASTATION_HEAL, CastSpellExtraArgsInit{
1305 .TriggeringAura = aurEff
1306 });
1307 }
1308
1313};
1314
1315// Called by 258920 - Immolation Aura
1349
1350// 232893 - Felblade
1352{
1353 bool Validate(SpellInfo const* /*spellInfo*/) override
1354 {
1356 }
1357
1366
1371};
1372
1373// 213241 - Felblade Charge
1375{
1376 bool Validate(SpellInfo const* /*spellInfo*/) override
1377 {
1379 }
1380
1388
1393};
1394
1395// 203557 - Felblade (Vengeance cooldow reset proc aura)
1396// 236167 - Felblade (Havoc cooldow reset proc aura)
1398{
1399 bool Validate(SpellInfo const* /*spellInfo*/) override
1400 {
1402 }
1403
1404 void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& /*eventInfo*/) const
1405 {
1407 }
1408
1413};
1414
1415// 204021 - Fiery Brand
1437
1438// 206416 - First Blood
1440{
1441public:
1442 ObjectGuid const& GetFirstTarget() const { return _firstTargetGUID; }
1443 void SetFirstTarget(ObjectGuid const& targetGuid) { _firstTargetGUID = targetGuid; }
1444
1445private:
1446 void Register() override
1447 {
1448 }
1449
1450private:
1452};
1453
1454// Called by 198013 - Eye Beam
1456{
1457 bool Validate(SpellInfo const* /*spellInfo*/) override
1458 {
1460 }
1461
1462 bool Load() override
1463 {
1465 }
1466
1467 void HandleAfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) const
1468 {
1469 if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
1470 return;
1471
1472 Unit* target = GetTarget();
1475 .TriggeringAura = aurEff
1476 });
1477 }
1478
1483};
1484
1485// 342817 - Glaive Tempest
1486// ID - 21832
1488{
1490
1491 void OnCreate(Spell const* /*creatingSpell*/) override
1492 {
1493 _scheduler.Schedule(0ms, [this](TaskContext& task)
1494 {
1495 FloatMilliseconds period = 500ms; // 500ms, affected by haste
1496 if (Unit* caster = at->GetCaster())
1497 {
1498 period *= *caster->m_unitData->ModHaste;
1499 caster->CastSpell(at->GetPosition(), SPELL_DH_GLAIVE_TEMPEST, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
1500 caster->CastSpell(at->GetPosition(), SPELL_DH_GLAIVE_TEMPEST, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
1501 }
1502 task.Repeat(duration_cast<Milliseconds>(period));
1503 });
1504 }
1505
1506 void OnUpdate(uint32 diff) override
1507 {
1508 _scheduler.Update(diff);
1509 }
1510
1511private:
1513};
1514
1515// Called by 162264 - Metamorphosis
1517{
1518 bool Validate(SpellInfo const* /*spell*/) override
1519 {
1521 }
1522
1523 bool Load() override
1524 {
1525 return GetUnitOwner()->HasAura(SPELL_DH_INNER_DEMON_TALENT); // This spell has a proc, but is just a copypaste from spell 390145 (also don't have a 5s cooldown)
1526 }
1527
1528 void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
1529 {
1530 Unit* target = GetTarget();
1533 });
1534 }
1535
1540};
1541
1542// 390139 - Inner Demon
1543// ID - 26749
1545{
1547
1548 void OnInitialize() override
1549 {
1550 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(at->GetSpellId(), DIFFICULTY_NONE);
1551 if (!spellInfo)
1552 return;
1553
1554 Unit* caster = at->GetCaster();
1555 if (!caster)
1556 return;
1557
1559 PathGenerator path(at);
1560
1561 path.CalculatePath(destPos.GetPositionX(), destPos.GetPositionY(), destPos.GetPositionZ(), false);
1562
1563 at->InitSplines(path.GetPath());
1564 }
1565
1566 void OnRemove() override
1567 {
1568 if (Unit* caster = at->GetCaster())
1570 }
1571};
1572
1573// 388118 - Know Your Enemy
1575{
1576 void CalcAmount(AuraEffect const* /*aurEff*/, SpellEffectValue& amount, bool const& /*canBeRecalculated*/) const
1577 {
1578 if (AuraEffect const* amountHolder = GetEffect(EFFECT_1))
1579 {
1580 float critChanceDone = GetUnitOwner()->GetUnitCriticalChanceDone(BASE_ATTACK);
1581 amount = CalculatePct(critChanceDone, amountHolder->GetAmount());
1582 }
1583 }
1584
1585 void UpdatePeriodic(AuraEffect const* aurEff) const
1586 {
1587 if (AuraEffect* bonus = GetEffect(EFFECT_0))
1588 bonus->RecalculateAmount(aurEff);
1589 }
1590
1596};
1597
1598// 209258 - Last Resort
1600{
1601 bool Validate(SpellInfo const* spellInfo) override
1602 {
1604 && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
1605 }
1606
1607 void HandleAbsorb(AuraEffect const* /*aurEff*/, DamageInfo const& /*dmgInfo*/, uint32& absorbAmount)
1608 {
1609 Unit* target = GetTarget();
1610 if (target->HasAura(SPELL_DH_UNCONTAINED_FEL))
1611 {
1612 absorbAmount = 0;
1613 return;
1614 }
1615
1617
1619
1620 target->CastSpell(target, SPELL_DH_METAMORPHOSIS_VENGEANCE_TRANSFORM, castArgs);
1621 target->CastSpell(target, SPELL_DH_UNCONTAINED_FEL, castArgs);
1622
1623 target->SetHealth(target->CountPctFromMaxHealth(GetEffectInfo(EFFECT_1).CalcValue(target)));
1624 }
1625
1630};
1631
1632// 1238488 - Moment of Craving (attached to 473728 - Void Ray)
1634{
1639
1640 bool Load() override
1641 {
1643 }
1644
1645 void HandleAfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
1646 {
1647 if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
1648 return;
1649
1650 Unit* target = GetTarget();
1651 target->GetSpellHistory()->RestoreCharge(sSpellMgr->AssertSpellInfo(SPELL_DH_REAP, GetCastDifficulty())->ChargeCategoryId);
1653 }
1654
1659};
1660
1661// 452414 - Monster Rising
1663{
1668
1669 void HandlePeriodic(AuraEffect const* aurEff) const
1670 {
1671 Unit* target = GetTarget();
1673
1675 {
1676 if (statBuff)
1677 target->RemoveAura(statBuff);
1678 }
1679 else if (!statBuff)
1680 {
1683 .TriggeringAura = aurEff
1684 });
1685 }
1686 }
1687
1692};
1693
1694// 207387 - Painbringer
1696{
1697 bool Validate(SpellInfo const* /*spellInfo*/) override
1698 {
1700 }
1701
1702 void HandleProc(ProcEventInfo const& eventInfo) const
1703 {
1704 Unit* target = eventInfo.GetActor();
1707 .TriggeringSpell = eventInfo.GetProcSpell()
1708 });
1709 }
1710
1711 void Register() override
1712 {
1714 }
1715};
1716
1717// 212988 - Painbringer
1719{
1720 bool Validate(SpellInfo const* /*spell*/) override
1721 {
1723 }
1724
1725 void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes mode) const
1726 {
1727 Unit* target = GetTarget();
1728
1729 if (mode & AURA_EFFECT_HANDLE_REAL)
1732 .TriggeringAura = aurEff
1733 });
1734
1735 target->m_Events.AddEventAtOffset([self = GetAura()->GetWeakPtr()]
1736 {
1737 if (Trinity::unique_strong_ref_ptr<Aura> aura = self.lock())
1738 aura->ModStackAmount(-1, AURA_REMOVE_BY_EXPIRE, false);
1740 }
1741
1742 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
1743 {
1745 }
1746
1752};
1753
1754// 188499 - Blade Dance
1755// 210152 - Death Sweep
1757{
1758 bool Validate(SpellInfo const* /*spellInfo*/) override
1759 {
1761 }
1762
1763 void DecideFirstTarget(std::list<WorldObject*>& targetList)
1764 {
1765 if (targetList.empty())
1766 return;
1767
1769 if (!aura)
1770 return;
1771
1772 ObjectGuid firstTargetGUID = ObjectGuid::Empty;
1773 ObjectGuid selectedTarget = GetCaster()->GetTarget();
1774
1775 // Prefer the selected target if he is one of the enemies
1776 if (targetList.size() > 1 && !selectedTarget.IsEmpty())
1777 {
1778 auto it = std::find_if(targetList.begin(), targetList.end(), [selectedTarget](WorldObject* object)
1779 {
1780 return object->GetGUID() == selectedTarget;
1781 });
1782 if (it != targetList.end())
1783 firstTargetGUID = (*it)->GetGUID();
1784 }
1785
1786 if (firstTargetGUID.IsEmpty())
1787 firstTargetGUID = targetList.front()->GetGUID();
1788
1790 script->SetFirstTarget(firstTargetGUID);
1791 }
1792
1797};
1798
1799// 199552 - Blade Dance
1800// 200685 - Blade Dance
1801// 210153 - Death Sweep
1802// 210155 - Death Sweep
1804{
1805 bool Validate(SpellInfo const* /*spellInfo*/) override
1806 {
1808 }
1809
1811 {
1812 int32 damage = GetHitDamage();
1813
1814 if (AuraEffect* aurEff = GetCaster()->GetAuraEffect(SPELL_DH_FIRST_BLOOD, EFFECT_0))
1815 if (spell_dh_first_blood* script = aurEff->GetBase()->GetScript<spell_dh_first_blood>())
1816 if (GetHitUnit()->GetGUID() == script->GetFirstTarget())
1817 AddPct(damage, aurEff->GetAmount());
1818
1819 SetHitDamage(damage);
1820 }
1821
1826};
1827
1828// 131347 - Glide
1830{
1835
1837 {
1838 Unit* caster = GetCaster();
1839 if (caster->IsMounted() || caster->GetVehicleBase())
1841
1842 if (!caster->IsFalling())
1844
1845 return SPELL_CAST_OK;
1846 }
1847
1849 {
1850 Player* caster = GetCaster()->ToPlayer();
1851 if (!caster)
1852 return;
1853
1854 caster->CastSpell(caster, SPELL_DH_GLIDE_KNOCKBACK, true);
1855 caster->CastSpell(caster, SPELL_DH_GLIDE_DURATION, true);
1856
1857 caster->GetSpellHistory()->StartCooldown(sSpellMgr->AssertSpellInfo(SPELL_DH_VENGEFUL_RETREAT_TRIGGER, GetCastDifficulty()), 0, nullptr, false, 250ms);
1858 caster->GetSpellHistory()->StartCooldown(sSpellMgr->AssertSpellInfo(SPELL_DH_FEL_RUSH, GetCastDifficulty()), 0, nullptr, false, 250ms);
1859 }
1860
1866};
1867
1868// 131347 - Glide
1870{
1871 bool Validate(SpellInfo const* /*spellInfo*/) override
1872 {
1874 }
1875
1876 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1877 {
1879 }
1880
1885};
1886
1887// 197154 - Glide
1889{
1890 bool Validate(SpellInfo const* /*spellInfo*/) override
1891 {
1893 }
1894
1895 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1896 {
1898 }
1899
1904};
1905
1906// 1226019 - Reap
1908{
1909 bool Validate(SpellInfo const* /*spellInfo*/) override
1910 {
1912 }
1913
1921
1926};
1927
1928// 339895 - Repeat Decree (attached to 307046 - Elysian Decree and 389860 - Sigil of Spite)
1930{
1931 bool Validate(SpellInfo const* /*spellInfo*/) override
1932 {
1934 }
1935
1936 bool Load() override
1937 {
1939 }
1940
1945};
1946
1947// Called by 162264 - Metamorphosis
1949{
1950 bool Validate(SpellInfo const* /*spellInfo*/) override
1951 {
1953 && sSpellCategoryStore.HasRecord(sSpellMgr->AssertSpellInfo(SPELL_DH_FEL_RUSH, DIFFICULTY_NONE)->ChargeCategoryId);
1954 }
1955
1956 bool Load() override
1957 {
1959 }
1960
1961 void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) const
1962 {
1963 Unit* target = GetTarget();
1964
1967 .TriggeringAura = aurEff
1968 });
1969
1970 target->GetSpellHistory()->RestoreCharge(sSpellMgr->AssertSpellInfo(SPELL_DH_FEL_RUSH, GetCastDifficulty())->ChargeCategoryId);
1971 }
1972
1977};
1978
1979// 389729 - Retaliation (attached to 203819 - Demon Spikes)
2012
2013// 388116 - Shattered Destiny
2015{
2016 bool Validate(SpellInfo const* spellInfo) override
2017 {
2019 && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } })
2020 && spellInfo->GetEffect(EFFECT_0).IsAura()
2021 && spellInfo->GetEffect(EFFECT_1).IsAura();
2022 }
2023
2024 bool CheckFurySpent(ProcEventInfo const& eventInfo)
2025 {
2026 Spell const* procSpell = eventInfo.GetProcSpell();
2027 if (!procSpell)
2028 return false;
2029
2031 return false;
2032
2033 _furySpent += procSpell->GetPowerTypeCostAmount(POWER_FURY).value_or(0);
2035 }
2036
2037 void HandleProc(ProcEventInfo const& /*eventInfo*/)
2038 {
2040 if (!metamorphosis)
2041 return;
2042
2043 int32 requiredFuryAmount = GetEffect(EFFECT_1)->GetAmountAsInt();
2044 metamorphosis->SetDuration(metamorphosis->GetDuration() + _furySpent / requiredFuryAmount * GetEffect(EFFECT_0)->GetAmountAsInt());
2045 _furySpent %= requiredFuryAmount;
2046 }
2047
2053
2054private:
2056};
2057
2058// 389824 - Shattered Restoration (attached to 202644, 228532, 178963, 210042, 203794 - Consume Soul)
2060{
2061 bool Validate(SpellInfo const* /*spellInfo*/) override
2062 {
2064 }
2065
2066 void CalculateHealingBonus(SpellEffectInfo const& /*spellEffectInfo*/, Unit const* /*victim*/, int32 const& /*healing*/, int32 const& /*flatMod*/, float& pctMod) const
2067 {
2068 if (AuraEffect* const shatteredRestoration = GetCaster()->GetAuraEffect(SPELL_DH_SHATTERED_RESTORATION, EFFECT_0))
2069 AddPct(pctMod, shatteredRestoration->GetAmount());
2070 }
2071
2076};
2077
2078// 178940 - Shattered Souls
2079// 204254 - Shattered Souls
2081{
2082public:
2083 spell_dh_shattered_souls(uint32 triggeredSpellId) : _triggeredSpellId(triggeredSpellId) { }
2084
2085 bool Validate(SpellInfo const* /*spellInfo*/) override
2086 {
2088 }
2089
2090 void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo) const
2091 {
2092 Unit* caster = eventInfo.GetActor();
2093 Unit* target = eventInfo.GetActionTarget();
2094
2095 if (!caster || !target)
2096 return;
2097
2099 }
2100
2105
2106private:
2108};
2109
2110// 1227619 - Shattered Souls
2112{
2113 bool Validate(SpellInfo const* /*spellInfo*/) override
2114 {
2117 }
2118
2119 static bool CheckProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& /*eventInfo*/)
2120 {
2121 return roll_chance(aurEff->GetAmount());
2122 }
2123
2124 static bool CheckReapSoulGatheringProc(AuraScript const&, AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo)
2125 {
2126 // Eradicate, Reap and Cull
2127 return eventInfo.GetSpellInfo()->IsAffected(SPELLFAMILY_DEMON_HUNTER, { 0x0, 0x0, 0x0, 0x40 });
2128 }
2129
2130 static void HandleProc(AuraScript const&, AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo)
2131 {
2133 }
2134
2135 static void HandleSoulsGathering(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
2136 {
2137 Unit* caster = eventInfo.GetActor();
2138 float range = eventInfo.GetSpellInfo()->GetMaxRange();
2139
2140 std::vector<AreaTrigger*> soulFragments = caster->GetAreaTriggers(SPELL_DH_SOUL_FRAGMENT_DEVOURER);
2141 Trinity::Containers::EraseIf(soulFragments, [caster, range](AreaTrigger const* at) { return !at->IsWithinDist(caster, range); });
2142 if (soulFragments.empty())
2143 return;
2144
2145 uint32 maxTargets = aurEff->GetAmountAsInt();
2146 if (soulFragments.size() > maxTargets)
2147 soulFragments.resize(maxTargets);
2148
2149 for (AreaTrigger* soulFragment : soulFragments)
2150 {
2151 caster->CastSpell(soulFragment->GetPosition(), SPELL_DH_CONSUME_SOUL_DEVOURER, CastSpellExtraArgsInit{
2153 .TriggeringSpell = eventInfo.GetProcSpell()
2154 });
2155 soulFragment->Remove();
2156 }
2157 }
2158
2166};
2167
2168// 1223450 - Shattered Souls
2189
2190// 209651 - Shattered Souls
2191// 210038 - Shatter Soul
2192// 1223445 - Shattered Souls
2193// 1223448 - Shattered Souls
2195{
2196public:
2197 spell_dh_shattered_souls_trigger(uint32 triggeredSpellId, uint32 triggeredSpellIdDemon)
2198 : _triggeredSpellId(triggeredSpellId), _triggeredSpellIdDemon(triggeredSpellIdDemon) { }
2199
2200 bool Validate(SpellInfo const* /*spellInfo*/) override
2201 {
2204 }
2205
2206 void HandleSoulFragment(SpellEffIndex /*effIndex*/) const
2207 {
2208 if (Unit* target = GetExplTargetUnit())
2209 target->CastSpell(GetHitDest()->GetPosition(), _triggeredSpellIdDemon && GetCaster()->GetCreatureType() == CREATURE_TYPE_DEMON ? _triggeredSpellIdDemon : _triggeredSpellId, CastSpellExtraArgsInit{
2211 .TriggeringSpell = GetSpell()
2212 });
2213 }
2214
2219
2220private:
2223};
2224
2225// 209693 - Shattered Souls, 209788 - Shattered Souls and 1223412 - Soul Fragment
2226// Id - 3680, 6659 and 36671
2227template<uint32 SpellId>
2229{
2231
2232 void OnUnitEnter(Unit* unit) override
2233 {
2235 at->Remove();
2236 }
2237
2238 void OnInitialize() override
2239 {
2240 if (Unit* caster = at->GetCaster())
2241 {
2242 if (caster->HasAura(SPELL_DH_SHATTERED_SOULS_VENGEANCE))
2244 else if (caster->HasAura(SPELL_DH_SHATTERED_SOULS_DEVOURER))
2246 }
2247 }
2248
2249 void OnRemove() override
2250 {
2251 if (Unit* caster = at->GetCaster())
2252 {
2253 caster->RemoveAuraFromStack(SPELL_DH_SOUL_FRAGMENT_COUNTER);
2254 caster->RemoveAuraFromStack(SPELL_DH_SOUL_FRAGMENTS_DEVOURER_COUNTER);
2255 }
2256 }
2257};
2258
2266
2267// 1234796 - Shift
2269{
2270 bool Validate(SpellInfo const* /*spellInfo*/) override
2271 {
2273 }
2274
2275 void HandleEffectDummy(SpellEffIndex /*effIndex*/) const
2276 {
2277 Unit* caster = GetCaster();
2278 WorldLocation const& target = *GetHitDest();
2279
2280 CastSpellExtraArgs args;
2282 args.TriggeringSpell = GetSpell();
2283
2284 caster->CastSpell(target, SPELL_DH_SHIFT_VISUAL_DEST, args);
2285 caster->CastSpell(target, SPELL_DH_SHIFT_CHARGE, args);
2286 }
2287
2292};
2293
2294// 207407 - Soul Carver
2296{
2297 bool Validate(SpellInfo const* spellInfo) override
2298 {
2299 return ValidateSpellEffect({ { spellInfo->Id, EFFECT_2 } })
2301 }
2302
2307
2312};
2313
2315{
2316 bool Validate(SpellInfo const* /*spellInfo*/) override
2317 {
2319 }
2320
2321 void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) const
2322 {
2323 if (Unit* caster = GetCaster())
2325 }
2326
2331};
2332
2333// 210788 - Soul Fragments
2335{
2336 bool Validate(SpellInfo const* /*spellInfo*/) override
2337 {
2339 }
2340
2341 bool Load() override
2342 {
2344 if (!seconds)
2345 return false;
2346
2347 _damagePerSecond.resize(seconds->GetAmountAsInt());
2348 return !_damagePerSecond.empty();
2349 }
2350
2351 static bool CheckProc(AuraScript const&, ProcEventInfo const& eventInfo)
2352 {
2353 return eventInfo.GetDamageInfo() != nullptr;
2354 }
2355
2356 void Update(AuraEffect* /*aurEff*/)
2357 {
2358 // Move backwards all datas by one from [23][0][0][0][0] -> [0][23][0][0][0]
2359 std::move_backward(_damagePerSecond.begin(), std::next(_damagePerSecond.begin(), std::ssize(_damagePerSecond) - 1), _damagePerSecond.end());
2360 _damagePerSecond[0] = 0;
2361 }
2362
2363 void HandleCalcAmount(AuraEffect const* /*aurEff*/, SpellEffectValue& amount, bool& canBeRecalculated)
2364 {
2365 canBeRecalculated = true;
2366 amount = std::reduce(_damagePerSecond.begin(), _damagePerSecond.end(), 0u);
2367 }
2368
2369 void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo)
2370 {
2371 _damagePerSecond[0] += eventInfo.GetDamageInfo()->GetDamage();
2372 }
2373
2381
2382private:
2383 std::vector<uint32> _damagePerSecond;
2384};
2385
2386// 389711 - Soulmonger
2388{
2389 bool Validate(SpellInfo const* /*spellInfo*/) override
2390 {
2392 }
2393
2394 static bool CheckProc(AuraScript const&, ProcEventInfo const& eventInfo)
2395 {
2396 return eventInfo.GetActionTarget()->HealthAbovePctHealed(100, eventInfo.GetHealInfo()->GetHeal());
2397 }
2398
2399 static void HandleEffectProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
2400 {
2401 Unit* target = eventInfo.GetActionTarget();
2402 SpellEffectValue amount = eventInfo.GetHealInfo()->GetHeal();
2403 if (AuraEffect const* existingAbsorb = target->GetAuraEffect(SPELL_DH_SOULMONGER_ABSORB, EFFECT_0))
2404 amount += existingAbsorb->GetAmount();
2405
2406 amount = std::min(amount, SpellEffectValue(target->CountPctFromMaxHealth(aurEff->GetAmount())));
2407
2410 .TriggeringAura = aurEff,
2411 .SpellValueOverrides = { { SPELLVALUE_BASE_POINT0, amount } }
2412 });
2413 }
2414
2420};
2421
2422// 391166 - Soul Furnace
2424{
2425 bool Validate(SpellInfo const* /*spellInfo*/) override
2426 {
2428 }
2429
2430 void CalculateSpellMod(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
2431 {
2432 if (GetStackAmount() == GetAura()->CalcMaxStackAmount())
2433 {
2435 Remove();
2436 }
2437 }
2438
2443};
2444
2445// 339424 - Soul Furnace
2447{
2448 void CalculateSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod)
2449 {
2450 if (aurEff->GetAmountAsInt() == 10)
2451 {
2452 if (!spellMod)
2453 {
2455 static_cast<SpellPctModifierByClassMask*>(spellMod)->value = GetEffect(EFFECT_1)->GetAmount() + 1;
2456 }
2457 }
2458 }
2459
2464};
2465
2466// 395446 - Soul Sigils
2468{
2469 void HandleOnProc(AuraEffect const* aurEff, ProcEventInfo const& eventInfo) const
2470 {
2472 }
2473
2478};
2479
2480// 320313 - Swallowed Anger (attached to 278326 - Consume Magic)
2503
2504// 202138 - Sigil of Chains
2505// 204596 - Sigil of Flame
2506// 207684 - Sigil of Misery
2507// 202137 - Sigil of Silence
2508// 390163 - Sigil of Spite
2509template<uint32 TriggerSpellId, uint32 TriggerSpellId2 = 0>
2511{
2513
2514 void OnRemove() override
2515 {
2516 if (Unit* caster = at->GetCaster())
2517 {
2519 if constexpr (TriggerSpellId2 != 0)
2520 caster->CastSpell(at->GetPosition(), TriggerSpellId2, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
2521 }
2522 }
2523};
2524
2531
2532// 208673 - Sigil of Chains
2534{
2535 bool Validate(SpellInfo const* /*spellInfo*/) override
2536 {
2538 }
2539
2541 {
2542 if (WorldLocation const* loc = GetExplTargetDest())
2543 {
2545 GetHitUnit()->CastSpell(loc->GetPosition(), SPELL_DH_SIGIL_OF_CHAINS_GRIP, true);
2546 }
2547 }
2548
2553};
2554
2555// 204596 - Sigil of Flame
2557{
2558 bool Validate(SpellInfo const* /*spellInfo*/) override
2559 {
2561 }
2562
2563 void HandleEnergize(SpellEffIndex /*effIndex*/) const
2564 {
2565 Unit* caster = GetCaster();
2568 .TriggeringSpell = GetSpell()
2569 });
2570 }
2571
2576};
2577
2578// Called by 204598 - Sigil of Flame
2601
2602// Called by 198793 - Vengeful Retreat
2604{
2605 bool Validate(SpellInfo const* /*spellInfo*/) override
2606 {
2608 }
2609
2610 bool Load() override
2611 {
2613 }
2614
2622
2627};
2628
2629// 444931 - Unhindered Assault
2631{
2632 bool Validate(SpellInfo const* /*spellInfo*/) override
2633 {
2635 }
2636
2637 void HandleOnProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& /*eventInfo*/) const
2638 {
2640 }
2641
2646};
2647
2648// 198813 - Vengeful Retreat
2650{
2651 bool Validate(SpellInfo const* /*spellInfo*/) override
2652 {
2654 }
2655
2656 void HandleVengefulBonds(std::list<WorldObject*>& targets)
2657 {
2659 targets.clear();
2660 }
2661
2666};
2667
2668// 452409 - Violent Transformation
2670{
2675
2676 void HandleOnProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& /*eventInfo*/) const
2677 {
2678 Unit* target = GetTarget();
2679 target->GetSpellHistory()->RestoreCharge(sSpellMgr->AssertSpellInfo(SPELL_DH_SIGIL_OF_FLAME, GetCastDifficulty())->ChargeCategoryId);
2680
2683 else
2684 target->GetSpellHistory()->RestoreCharge(sSpellMgr->AssertSpellInfo(SPELL_DH_IMMOLATION_AURA, GetCastDifficulty())->ChargeCategoryId);
2685 }
2686
2691};
2692
2693// 1245412 - Voidblade
2715
2716// 1241285 - Voidblade Charge
2737
2738// 1240202 - Voidglare Boon (attached to 473728 - Void Ray)
2740{
2741 bool Validate(SpellInfo const* /*spellInfo*/) override
2742 {
2744 }
2745
2746 bool Load() override
2747 {
2749 }
2750
2751 void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
2752 {
2753 if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
2754 return;
2755
2756 Unit* target = GetTarget();
2758 }
2759
2764};
2765
2766// 473728 - Void Ray
2768{
2769 bool Validate(SpellInfo const* /*spellInfo*/) override
2770 {
2772 }
2773
2774 void HandleEffectPeriodic(AuraEffect const* aurEff) const
2775 {
2776 if (Unit* caster = GetCaster())
2777 caster->CastSpell(nullptr, SPELL_DH_VOID_RAY_DAMAGE, CastSpellExtraArgsInit{
2779 .TriggeringAura = aurEff
2780 });
2781 }
2782
2787};
2788
2789// 179057 - Chaos Nova
2791{
2792 bool Validate(SpellInfo const* /*spellInfo*/) override
2793 {
2795 }
2796
2797 bool Load() override
2798 {
2800 }
2801
2802 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
2803 {
2804 if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_DEATH)
2805 return;
2806
2807 if (Unit* caster = GetCaster())
2809 }
2810
2815};
2816
2818{
2878 RegisterSpellScriptWithArgs(spell_dh_shattered_souls, "spell_dh_shattered_souls_vengeance", SPELL_DH_SHATTER_SOUL);
2883 RegisterSpellScriptWithArgs(spell_dh_shattered_souls_trigger, "spell_dh_shattered_souls_vengeance_trigger_lesser", SPELL_DH_SHATTERED_SOUL, 0);
2912
2919
2920 // Havoc
2921
2922 /* Spells & Auras */
2923
2924 /* Auras */
2925
2927
2928 /* AreaTrigger */
2929
2930 /* Spells */
2931
2934
2935 // Vengeance
2937
2938 // Vengeance & Havoc
2939
2942
2943 // Soulbind conduits
2945}
AreaTriggerExitReason
Definition AreaTrigger.h:70
DB2Storage< SpellCategoryEntry > sSpellCategoryStore("SpellCategory.db2", &SpellCategoryLoadInfo::Instance)
@ DIFFICULTY_NONE
Definition DBCEnums.h:936
int64_t int64
Definition Define.h:149
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:24
std::chrono::duration< double, Seconds::period > FloatSeconds
Definition Duration.h:29
std::chrono::duration< double, Milliseconds::period > FloatMilliseconds
Definition Duration.h:25
float frand(float min, float max)
Definition Random.cpp:56
bool roll_chance(float chance, PseudoRandomDistributionState &state)
Definition Random.cpp:131
#define RegisterSpellAndAuraScriptPair(script_1, script_2)
Definition ScriptMgr.h:1381
#define RegisterAreaTriggerAI(ai_name)
Definition ScriptMgr.h:1428
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1383
#define RegisterSpellScriptWithArgs(spell_script, script_name,...)
Definition ScriptMgr.h:1382
SpellEffIndex
@ EFFECT_3
@ EFFECT_1
@ EFFECT_0
@ EFFECT_2
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_TRIGGER_SPELL
@ SPELL_EFFECT_DISPEL
@ SPELL_EFFECT_CHARGE
@ SPELL_EFFECT_SCHOOL_DAMAGE
@ TARGET_UNIT_SRC_AREA_ENEMY
@ TARGET_UNIT_CASTER
@ SPELL_SCHOOL_MASK_FIRE
@ CREATURE_TYPE_DEMON
@ BASE_ATTACK
@ POWER_FURY
SpellCastResult
@ SPELL_FAILED_NOT_ON_GROUND
@ SPELL_FAILED_DONT_REPORT
@ SPELL_CAST_OK
#define EFFECT_ALL
@ SPELLFAMILY_DEMON_HUNTER
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK
@ AURA_EFFECT_HANDLE_REAL
@ AURA_REMOVE_BY_DEATH
@ AURA_REMOVE_BY_EXPIRE
@ SPELL_AURA_PERIODIC_DAMAGE
@ SPELL_AURA_MOD_PARRY_PERCENT
@ SPELL_AURA_FEATHER_FALL
@ SPELL_AURA_PROC_TRIGGER_SPELL
@ SPELL_AURA_MOD_ARMOR_PCT_FROM_STAT
@ SPELL_AURA_ADD_FLAT_MODIFIER
@ SPELL_AURA_DUMMY
@ SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
@ SPELL_AURA_TRANSFORM
@ SPELL_AURA_SCHOOL_ABSORB
@ SPELL_AURA_PERIODIC_DUMMY
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
@ SPELL_AURA_MOD_STUN
@ SPELLVALUE_DURATION
double SpellEffectValue
This is a double instead of float to be able to store full range of int32.
@ TRIGGERED_IGNORE_SPELL_AND_CATEGORY_CD
Will ignore Spell and Category cooldowns.
@ TRIGGERED_IGNORE_CAST_IN_PROGRESS
Will not check if a current cast is in progress.
@ TRIGGERED_IGNORE_POWER_COST
Will ignore power and reagent cost.
@ TRIGGERED_IGNORE_GCD
Will ignore GCD.
@ TRIGGERED_DONT_REPORT_CAST_ERROR
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
@ SPELLVALUE_BASE_POINT0
#define sSpellMgr
Definition SpellMgr.h:812
#define AuraProcFn(F)
#define SpellObjectTargetSelectFn(F, I, N)
#define SpellCheckCastFn(F)
#define AuraEffectProcFn(F, I, N)
#define SpellEffectFn(F, I, N)
#define AuraEffectCalcAmountFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define AuraCheckEffectProcFn(F, I, N)
#define AuraEffectUpdatePeriodicFn(F, I, N)
#define SpellCastFn(F)
#define AuraEffectAbsorbFn(F, I)
#define AuraEffectApplyFn(F, I, N, M)
#define AuraEffectAbsorbOverkillFn(F, I)
#define AuraCheckProcFn(F)
#define SpellHitFn(F)
#define AuraEffectCalcSpellModFn(F, I, N)
#define SpellCalcHealingFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
T AddPct(T &base, U pct)
Definition Util.h:85
T CalculatePct(T base, U pct)
Definition Util.h:72
AreaTrigger *const at
AreaTriggerAI(AreaTrigger *a, uint32 scriptId={}) noexcept
ObjectGuid const & GetCasterGuid() const
float GetMaxSearchRadius() const
void InitSplines(std::vector< G3D::Vector3 > const &splinePoints, Optional< float > overrideSpeed={}, Optional< bool > speedIsTimeInSeconds={})
uint32 GetSpellId() const
int32 GetDuration() const
Unit * GetCaster() const
int32 GetAmountAsInt() const
Aura * GetBase() const
SpellEffectValue CalculateAmount(Unit *caster)
SpellEffectValue GetAmount() const
void PreventDefaultAction()
AuraApplication const * GetTargetApplication() const
HookList< EffectApplyHandler > AfterEffectRemove
HookList< CheckEffectProcHandler > DoCheckEffectProc
HookList< EffectPeriodicHandler > OnEffectPeriodic
SpellInfo const * GetSpellInfo() const
HookList< EffectApplyHandler > AfterEffectApply
int32 GetMaxDuration() const
HookList< EffectCalcAmountHandler > DoEffectCalcAmount
Unit * GetCaster() const
HookList< EffectUpdatePeriodicHandler > OnEffectUpdatePeriodic
HookList< EffectCalcSpellModHandler > DoEffectCalcSpellMod
SpellEffectInfo const & GetEffectInfo(SpellEffIndex effIndex) const
AuraEffect * GetEffect(uint8 effIndex) const
HookList< EffectAbsorbHandler > OnEffectAbsorb
Aura * GetAura() const
Unit * GetTarget() const
HookList< AuraProcHandler > AfterProc
Difficulty GetCastDifficulty() const
HookList< CheckProcHandler > DoCheckProc
HookList< EffectApplyHandler > OnEffectRemove
HookList< EffectProcHandler > OnEffectProc
Unit * GetUnitOwner() const
HookList< AuraProcHandler > DoPrepareProc
HookList< AuraProcHandler > OnProc
uint8 GetStackAmount() const
uint32 GetId() const
void DropChargeDelayed(uint32 delay, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
bool HasEffect(uint8 effIndex) const
Definition SpellAuras.h:277
int32 GetDuration() const
Definition SpellAuras.h:222
AuraEffect * GetEffect(uint32 index) const
void SetDuration(int32 duration, bool withMods=false)
Script * GetScript() const
Definition SpellAuras.h:355
bool IsPlayer() const
Definition BaseEntity.h:173
SpellSchoolMask GetSchoolMask() const
Definition Unit.h:463
uint32 GetDamage() const
Definition Unit.h:466
void AddEventAtOffset(BasicEvent *event, Milliseconds offset)
uint32 GetHeal() const
Definition Unit.h:496
static ObjectGuid const Empty
Definition ObjectGuid.h:314
bool IsEmpty() const
Definition ObjectGuid.h:362
Player * ToPlayer()
Definition Object.h:126
Movement::PointsArray const & GetPath() const
bool CalculatePath(float srcX, float srcY, float srcZ, float destX, float destY, float destZ, bool forceDest=false)
HealInfo * GetHealInfo() const
Definition Unit.h:525
Unit * GetActionTarget() const
Definition Unit.h:514
Spell const * GetProcSpell() const
Definition Unit.h:527
SpellInfo const * GetSpellInfo() const
Definition Unit.cpp:281
DamageInfo * GetDamageInfo() const
Definition Unit.h:524
Unit * GetActor() const
Definition Unit.h:513
void SetUnitTarget(Unit *target)
Definition Spell.cpp:194
SpellEffectValue CalcValue(WorldObject const *caster=nullptr, SpellEffectValue const *basePoints=nullptr, Unit const *target=nullptr, float *variance=nullptr, uint32 castItemId=0, int32 itemLevel=-1) const
bool IsAura() const
void ResetCooldown(uint32 spellId, bool update=false)
void RestoreCharge(uint32 chargeCategoryId)
static void GetCooldownDurations(SpellInfo const *spellInfo, uint32 itemId, Duration *cooldown, uint32 *categoryId, Duration *categoryCooldown)
void ModifyCooldown(uint32 spellId, Duration cooldownMod, bool withoutCategoryCooldown=false)
Milliseconds Duration
void ResetCooldowns(Predicate &&predicate, bool update=false)
void StartCooldown(SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool onHold=false, Optional< Duration > forcedCooldown={})
bool IsAffected(uint32 familyName, flag128 const &familyFlags) const
float GetMaxRange(bool positive=false, WorldObject const *caster=nullptr, Spell *spell=nullptr) const
uint32 const Id
Definition SpellInfo.h:328
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition SpellInfo.h:590
uint32 m_scriptSpellId
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
static bool ValidateSpellEffect(std::initializer_list< std::pair< uint32, SpellEffIndex > > effects)
HookList< CastHandler > AfterCast
WorldLocation * GetHitDest() const
HookList< CheckCastHandler > OnCheckCast
int32 GetHitDamage() const
Unit * GetCaster() const
HookList< HitHandler > OnHit
HookList< EffectHandler > OnEffectHit
void PreventHitDefaultEffect(SpellEffIndex effIndex)
int64 GetUnitTargetCountForEffect(SpellEffIndex effect) const
Unit * GetHitUnit() const
SpellEffectInfo const & GetEffectInfo() const
HookList< EffectHandler > OnEffectHitTarget
HookList< ObjectTargetSelectHandler > OnObjectTargetSelect
HookList< CastHandler > BeforeCast
Spell * GetSpell() const
HookList< EffectHandler > OnEffectLaunchTarget
Difficulty GetCastDifficulty() const
void SetHitDamage(int32 damage)
HookList< EffectHandler > OnEffectSuccessfulDispel
WorldLocation const * GetExplTargetDest() const
HookList< EffectHandler > OnEffectLaunch
HookList< DamageAndHealingCalcHandler > CalcHealing
Unit * GetExplTargetUnit() const
SpellInfo const * GetSpellInfo() const
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
Definition Spell.h:277
int32 GetChannelDuration() const
Definition Spell.h:661
void SetSpellValue(CastSpellExtraArgsInit::SpellValueOverride const &value)
Definition Spell.cpp:8729
Optional< int32 > GetPowerTypeCostAmount(Powers power) const
Definition Spell.cpp:8093
SpellCastResult prepare(SpellCastTargets const &targets, AuraEffect const *triggeredByAura=nullptr)
Definition Spell.cpp:3432
SpellCastVisual m_SpellVisual
Definition Spell.h:650
TaskContext & Repeat(TaskScheduler::duration_t duration)
TaskScheduler & Schedule(duration_t time, task_handler_t task)
TaskScheduler & Update()
Update the scheduler to the current time.
Result of unique_weak_ptr::lock() function, this class holds a temporary strong reference to held obj...
Definition Unit.h:647
bool IsWithinMeleeRange(Unit const *obj) const
Definition Unit.h:722
void RemoveOwnedAura(AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3769
void SetHealth(uint64 val)
Definition Unit.cpp:10041
uint64 CountPctFromMaxHealth(float pct) const
Definition Unit.h:809
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3846
bool HealthAbovePctHealed(float pct, uint32 heal) const
Definition Unit.h:807
Aura * GetOwnedAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, Aura *except=nullptr) const
Definition Unit.cpp:3830
Unit * GetVehicleBase() const
Definition Unit.cpp:12206
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition Unit.cpp:4622
uint32 GetAuraCount(uint32 spellId) const
Definition Unit.cpp:4806
bool HasAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid caster=ObjectGuid::Empty) const
Definition Unit.cpp:4792
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4718
float GetUnitCriticalChanceDone(WeaponAttackType attackType) const
Definition Unit.cpp:2863
bool IsMounted() const
Definition Unit.h:927
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4822
SpellHistory * GetSpellHistory()
Definition Unit.h:1521
std::vector< AreaTrigger * > GetAreaTriggers(uint32 spellId) const
Definition Unit.cpp:5494
AuraApplication * GetAuraApplication(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraApplication *except=nullptr) const
Definition Unit.cpp:4664
bool IsFalling() const
Definition Unit.cpp:13035
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3992
ObjectGuid GetTarget() const
Definition Unit.h:1847
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2222
bool IsValidAssistTarget(WorldObject const *target, SpellInfo const *bySpell=nullptr) const
Definition Object.cpp:2487
EventProcessor m_Events
Definition Object.h:561
Position GetFirstCollisionPosition(float dist, float angle)
Definition Object.cpp:2767
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:494
void Register() override
Definition spell_dh.cpp:293
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:275
bool Validate(SpellInfo const *) override
void Register() override
bool Validate(SpellInfo const *) override
void DecideFirstTarget(std::list< WorldObject * > &targetList)
void HandlePeriodic(AuraEffect const *) const
Definition spell_dh.cpp:335
bool Validate(SpellInfo const *spellInfo) override
Definition spell_dh.cpp:330
void Register() override
Definition spell_dh.cpp:321
void HandleAfterRemove(AuraEffect const *aurEff, AuraEffectHandleModes) const
Definition spell_dh.cpp:312
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:302
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:373
void HandleHit(SpellEffIndex) const
Definition spell_dh.cpp:378
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:350
void Register() override
Definition spell_dh.cpp:364
void HandleEffectProc(AuraEffect const *, ProcEventInfo const &eventInfo)
Definition spell_dh.cpp:355
void Prepare(ProcEventInfo const &)
Definition spell_dh.cpp:438
bool Load() override
Definition spell_dh.cpp:405
void ChaosTheory() const
Definition spell_dh.cpp:410
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:395
void Register() override
Definition spell_dh.cpp:429
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:454
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:484
void Register() override
Definition spell_dh.cpp:512
void HandleAfterProc(ProcEventInfo &eventInfo)
Definition spell_dh.cpp:494
void HandleDummyTick(AuraEffect const *aurEff)
Definition spell_dh.cpp:499
bool CheckProc(ProcEventInfo &eventInfo)
Definition spell_dh.cpp:489
void HandleEffectPeriodic(AuraEffect const *aurEff) const
Definition spell_dh.cpp:569
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:564
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:526
void HandleFelDevastation() const
Definition spell_dh.cpp:544
void Register() override
Definition spell_dh.cpp:600
void HandleAfterCast() const
Definition spell_dh.cpp:592
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:587
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:609
void CalcHealingFromDamageTaken(SpellEffectInfo const &, Unit const *victim, int32 &, int32 &flatMod, float &) const
Definition spell_dh.cpp:614
void Register() override
Definition spell_dh.cpp:652
void UpdatePeriodic(AuraEffect const *aurEff) const
Definition spell_dh.cpp:646
void CalcAmount(AuraEffect const *, SpellEffectValue &amount, bool const &) const
Definition spell_dh.cpp:637
void Register() override
Definition spell_dh.cpp:675
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:662
void HandleDamage(SpellEffIndex) const
Definition spell_dh.cpp:667
static constexpr std::array< uint32, 5 > SigilSpellsIds
Definition spell_dh.cpp:684
void HandleEffectProc(AuraEffect const *aurEff, ProcEventInfo const &) const
Definition spell_dh.cpp:691
void Register() override
Definition spell_dh.cpp:700
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:686
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:745
void OnRemove(AuraEffect const *, AuraEffectHandleModes) const
Definition spell_dh.cpp:750
void OnRemove(AuraEffect const *, AuraEffectHandleModes) const
Definition spell_dh.cpp:776
void OnApply(AuraEffect const *, AuraEffectHandleModes) const
Definition spell_dh.cpp:770
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:765
bool Load() override
Definition spell_dh.cpp:714
void Register() override
Definition spell_dh.cpp:736
void HandleCycleOfHatred() const
Definition spell_dh.cpp:719
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:709
bool Load() override
Definition spell_dh.cpp:802
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:791
void Register() override
Definition spell_dh.cpp:831
void HandleEffectRemove(AuraEffect const *, AuraEffectHandleModes) const
Definition spell_dh.cpp:807
bool Validate(SpellInfo const *spellInfo) override
Definition spell_dh.cpp:840
void Absorb(AuraEffect const *, DamageInfo &dmgInfo, uint32 &absorbAmount) const
Definition spell_dh.cpp:851
void CalculateAmount(AuraEffect const *, SpellEffectValue &amount, bool &)
Definition spell_dh.cpp:845
void Register() override
Definition spell_dh.cpp:858
void HandleParryChance(WorldObject *&target) const
Definition spell_dh.cpp:903
bool Validate(SpellInfo const *spellInfo) override
Definition spell_dh.cpp:896
void Register() override
Definition spell_dh.cpp:909
void Register() override
Definition spell_dh.cpp:931
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:918
static void HandleProc(AuraScript const &, AuraEffect const *, ProcEventInfo const &procEvent)
Definition spell_dh.cpp:923
void HandleArmor(SpellEffIndex)
void Register() override
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void Register() override
static void ShatterLesserSoulFragment(AuraScript const &, ProcEventInfo const &procEvent)
Definition spell_dh.cpp:999
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:994
uint32 _transformSpellId
Definition spell_dh.cpp:985
void TriggerMetamorphosis() const
Definition spell_dh.cpp:952
spell_dh_demonic(uint32 transformSpellId)
Definition spell_dh.cpp:988
void Register() override
Definition spell_dh.cpp:980
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:940
bool Load() override
Definition spell_dh.cpp:947
void Register() override
spell_dh_elysian_decree(uint32 primarySpellId)
bool Validate(SpellInfo const *) override
void CreateLesserSoulFragments(SpellEffIndex effIndex)
bool Load() override
void PreventEffect(WorldObject *&target) const
bool Validate(SpellInfo const *) override
void Register() override
void HandlePeriodic(AuraEffect const *aurEff) const
void Register() override
bool Validate(SpellInfo const *) override
void HandleDamage(SpellEffIndex) const
void Register() override
void HandleDebuff(SpellEffIndex) const
bool Validate(SpellInfo const *) override
void Register() override
bool Validate(SpellInfo const *) override
void HandleEffectPeriodic(AuraEffect const *aurEff) const
bool Load() override
void Register() override
bool Validate(SpellInfo const *) override
void Register() override
bool Validate(SpellInfo const *) override
void HandlePeriodicEffect(AuraEffect const *aurEff) const
bool Validate(SpellInfo const *) override
void OnApply(AuraEffect const *aurEff, AuraEffectHandleModes) const
void OnRemove(AuraEffect const *, AuraEffectHandleModes) const
void Register() override
void HandleDamage(SpellEffIndex) const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect const *, ProcEventInfo const &) const
void Register() override
bool Validate(SpellInfo const *) override
void HandleCharge(SpellEffIndex) const
bool Validate(SpellInfo const *) override
void HandleDamage(SpellEffIndex) const
void Register() override
ObjectGuid const & GetFirstTarget() const
ObjectGuid _firstTargetGUID
void SetFirstTarget(ObjectGuid const &targetGuid)
void Register() override
bool Validate(SpellInfo const *) override
void HandleAfterRemove(AuraEffect const *aurEff, AuraEffectHandleModes) const
void Register() override
bool Load() override
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
void Register() override
bool Validate(SpellInfo const *) override
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
void Register() override
void Register() override
SpellCastResult CheckCast()
bool Validate(SpellInfo const *) override
void Register() override
void OnApply(AuraEffect const *, AuraEffectHandleModes) const
bool Validate(SpellInfo const *) override
bool Load() override
void UpdatePeriodic(AuraEffect const *aurEff) const
void CalcAmount(AuraEffect const *, SpellEffectValue &amount, bool const &) const
void Register() override
void HandleAbsorb(AuraEffect const *, DamageInfo const &, uint32 &absorbAmount)
void Register() override
bool Validate(SpellInfo const *spellInfo) override
bool Validate(SpellInfo const *) override
void HandleAfterRemove(AuraEffect const *, AuraEffectHandleModes) const
bool Validate(SpellInfo const *) override
void Register() override
void HandlePeriodic(AuraEffect const *aurEff) const
bool Validate(SpellInfo const *) override
void OnApply(AuraEffect const *aurEff, AuraEffectHandleModes mode) const
void OnRemove(AuraEffect const *, AuraEffectHandleModes) const
void Register() override
void HandleProc(ProcEventInfo const &eventInfo) const
bool Validate(SpellInfo const *) override
void Register() override
void HandleDamage(SpellEffIndex) const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void Register() override
void OnRemove(AuraEffect const *aurEff, AuraEffectHandleModes) const
bool Validate(SpellInfo const *) override
void Register() override
bool Load() override
void HandleAfterRemove(AuraEffect const *, AuraEffectHandleModes) const
void HandleAfterApply(AuraEffect const *aurEff, AuraEffectHandleModes) const
bool Validate(SpellInfo const *) override
bool CheckFurySpent(ProcEventInfo const &eventInfo)
bool Validate(SpellInfo const *spellInfo) override
void HandleProc(ProcEventInfo const &)
void CalculateHealingBonus(SpellEffectInfo const &, Unit const *, int32 const &, int32 const &, float &pctMod) const
bool Validate(SpellInfo const *) override
void HandleSoulFragment(SpellEffIndex) const
bool Validate(SpellInfo const *) override
static void HandleSoulsGathering(AuraScript const &, AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
static bool CheckProc(AuraScript const &, AuraEffect const *aurEff, ProcEventInfo const &)
bool Validate(SpellInfo const *) override
static void HandleProc(AuraScript const &, AuraEffect const *, ProcEventInfo const &eventInfo)
static bool CheckReapSoulGatheringProc(AuraScript const &, AuraEffect const *, ProcEventInfo const &eventInfo)
spell_dh_shattered_souls_trigger(uint32 triggeredSpellId, uint32 triggeredSpellIdDemon)
void HandleSoulFragment(SpellEffIndex) const
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect const *, ProcEventInfo const &eventInfo) const
void Register() override
spell_dh_shattered_souls(uint32 triggeredSpellId)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleEffectDummy(SpellEffIndex) const
void Register() override
void Register() override
bool Validate(SpellInfo const *) override
void HandleEffectHitTarget(SpellEffIndex)
void HandleEnergize(SpellEffIndex) const
bool Validate(SpellInfo const *) override
void Register() override
bool Validate(SpellInfo const *) override
void HandleEffectPeriodic(AuraEffect const *) const
void Register() override
bool Validate(SpellInfo const *spellInfo) override
void Register() override
void HandleSoulFragments(SpellEffIndex) const
void HandleCalcAmount(AuraEffect const *, SpellEffectValue &amount, bool &canBeRecalculated)
static bool CheckProc(AuraScript const &, ProcEventInfo const &eventInfo)
void HandleProc(AuraEffect const *, ProcEventInfo const &eventInfo)
bool Validate(SpellInfo const *) override
void CalculateSpellMod(AuraEffect const *aurEff, SpellModifier *&spellMod)
void Register() override
bool Validate(SpellInfo const *) override
void CalculateSpellMod(AuraEffect const *, AuraEffectHandleModes)
void HandleOnProc(AuraEffect const *aurEff, ProcEventInfo const &eventInfo) const
void Register() override
void Register() override
static void HandleEffectProc(AuraScript const &, AuraEffect const *aurEff, ProcEventInfo const &eventInfo)
bool Validate(SpellInfo const *) override
static bool CheckProc(AuraScript const &, ProcEventInfo const &eventInfo)
bool Validate(SpellInfo const *) override
void HandleStudentOfSuffering() const
void OnSuccessfulDispel(SpellEffIndex) const
bool Validate(SpellInfo const *) override
void Register() override
bool Validate(SpellInfo const *) override
void Register() override
void HandleOnProc(AuraEffect const *, ProcEventInfo const &) const
bool Validate(SpellInfo const *) override
void HandleVengefulBonds(std::list< WorldObject * > &targets)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleOnProc(AuraEffect const *, ProcEventInfo const &) const
void Register() override
bool Validate(SpellInfo const *) override
void HandleEffectPeriodic(AuraEffect const *aurEff) const
void Register() override
bool Validate(SpellInfo const *) override
void HandleDamage(SpellEffIndex) const
bool Validate(SpellInfo const *) override
void HandleCharge(SpellEffIndex) const
void Register() override
bool Load() override
bool Validate(SpellInfo const *) override
void HandleEffectRemove(AuraEffect const *, AuraEffectHandleModes) const
void Register() override
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
constexpr void EraseIf(Container &c, Predicate p)
Definition Containers.h:283
auto SelectRandomContainerElement(C const &container) -> std::add_const_t< decltype(*std::ranges::begin(container))> &
Definition Containers.h:110
DemonHunterSpellCategories
Definition spell_dh.cpp:267
@ SPELL_CATEGORY_DH_EYE_BEAM
Definition spell_dh.cpp:268
@ SPELL_CATEGORY_DH_BLADE_DANCE
Definition spell_dh.cpp:269
void AddSC_demon_hunter_spell_scripts()
DemonHunterSpells
Definition spell_dh.cpp:41
@ SPELL_DH_DEFLECTING_SPIKES
Definition spell_dh.cpp:84
@ SPELL_DH_RESTLESS_HUNTER_TALENT
Definition spell_dh.cpp:186
@ SPELL_DH_SWALLOWED_ANGER
Definition spell_dh.cpp:247
@ SPELL_DH_METAMORPHOSIS_DUMMY
Definition spell_dh.cpp:158
@ SPELL_DH_SHATTERED_SOUL_LESSER_LEFT
Definition spell_dh.cpp:201
@ SPELL_DH_FEL_RUSH_GROUND
Definition spell_dh.cpp:119
@ SPELL_DH_NEMESIS_ELEMENTALS
Definition spell_dh.cpp:172
@ SPELL_DH_VOID_METAMORPHOSIS_BUFF
Definition spell_dh.cpp:260
@ SPELL_DH_JAGGED_SPIKES
Definition spell_dh.cpp:152
@ SPELL_DH_CYCLE_OF_HATRED_TALENT
Definition spell_dh.cpp:78
@ SPELL_DH_INNER_DEMON_DAMAGE
Definition spell_dh.cpp:147
@ SPELL_DH_NEMESIS_DEMONS
Definition spell_dh.cpp:170
@ SPELL_DH_VOIDBLADE_DAMAGE
Definition spell_dh.cpp:257
@ SPELL_DH_REPEAT_DECREE_CONDUIT
Definition spell_dh.cpp:185
@ SPELL_DH_SIGIL_OF_SPITE
Definition spell_dh.cpp:230
@ SPELL_DH_SHATTERED_SOUL_LESSER_RIGHT
Definition spell_dh.cpp:200
@ SPELL_DH_FEL_FLAME_FORTIFICATION_MOD_DAMAGE
Definition spell_dh.cpp:116
@ SPELL_DH_SIGIL_OF_CHAINS_SNARE
Definition spell_dh.cpp:218
@ SPELL_DH_NEMESIS_ABERRATIONS
Definition spell_dh.cpp:167
@ SPELL_DH_DEMONIC_ORIGINS
Definition spell_dh.cpp:92
@ SPELL_DH_SHIFT_VISUAL_DEST
Definition spell_dh.cpp:212
@ SPELL_DH_ENDURING_TORMENT_BUFF
Definition spell_dh.cpp:99
@ SPELL_DH_BLADE_WARD
Definition spell_dh.cpp:48
@ SPELL_DH_CONSUME_SOUL_HAVOC_DEMON
Definition spell_dh.cpp:71
@ SPELL_DH_EYE_OF_LEOTHERAS_DMG
Definition spell_dh.cpp:105
@ SPELL_DH_DEMONIC_APPETITE_ENERGIZE
Definition spell_dh.cpp:91
@ SPELL_DH_MOMENT_OF_CRAVING_BUFF
Definition spell_dh.cpp:165
@ SPELL_DH_CONSUME_MAGIC
Definition spell_dh.cpp:69
@ SPELL_DH_SHATTERED_SOUL
Definition spell_dh.cpp:195
@ SPELL_DH_METAMORPHOSIS_IMPACT_DAMAGE
Definition spell_dh.cpp:159
@ SPELL_DH_JAGGED_SPIKES_DMG
Definition spell_dh.cpp:153
@ SPELL_DH_CONSUME_SOUL_VENGEANCE_LESSER
Definition spell_dh.cpp:75
@ SPELL_DH_SHIFT_CHARGE
Definition spell_dh.cpp:213
@ SPELL_DH_INFERNAL_STRIKE_JUMP
Definition spell_dh.cpp:151
@ SPELL_DH_DEMON_SPIKES
Definition spell_dh.cpp:87
@ SPELL_DH_SIGIL_OF_CHAINS_GRIP
Definition spell_dh.cpp:215
@ SPELL_DH_FIERY_BRAND_RANK_2
Definition spell_dh.cpp:128
@ SPELL_DH_ELYSIAN_DECREE
Definition spell_dh.cpp:97
@ SPELL_DH_INNER_DEMON_TALENT
Definition spell_dh.cpp:148
@ SPELL_DH_SHATTERED_SOULS_HAVOC
Definition spell_dh.cpp:204
@ SPELL_DH_ANNIHILATION_MH
Definition spell_dh.cpp:44
@ SPELL_DH_TACTICAL_RETREAT_TALENT
Definition spell_dh.cpp:249
@ SPELL_DH_SOUL_CLEAVE
Definition spell_dh.cpp:234
@ SPELL_DH_METAMORPHOSIS
Definition spell_dh.cpp:156
@ SPELL_DH_DARKGLARE_BOON
Definition spell_dh.cpp:81
@ SPELL_DH_SIGIL_OF_CHAINS_VISUAL
Definition spell_dh.cpp:220
@ SPELL_DH_SIGIL_OF_FLAME_ENERGIZE
Definition spell_dh.cpp:223
@ SPELL_DH_SIGIL_OF_FLAME_AOE
Definition spell_dh.cpp:222
@ SPELL_DH_CONSUME_SOUL_VENGEANCE_SHATTERED
Definition spell_dh.cpp:76
@ SPELL_DH_COLLECTIVE_ANGUISH_EYE_BEAM
Definition spell_dh.cpp:65
@ SPELL_DH_NEMESIS_MECHANICALS
Definition spell_dh.cpp:175
@ SPELL_DH_REAP_DAMAGE
Definition spell_dh.cpp:184
@ SPELL_DH_SHATTERED_SOULS_HAVOC_LESSER_TRIGGER
Definition spell_dh.cpp:206
@ SPELL_DH_COLLECTIVE_ANGUISH
Definition spell_dh.cpp:64
@ SPELL_DH_GLIDE_KNOCKBACK
Definition spell_dh.cpp:140
@ SPELL_DH_SPIRIT_BOMB_VISUAL
Definition spell_dh.cpp:244
@ SPELL_DH_FEL_BARRAGE
Definition spell_dh.cpp:109
@ SPELL_DH_COLLECTIVE_ANGUISH_EYE_BEAM_DAMAGE
Definition spell_dh.cpp:66
@ SPELL_DH_SHATTERED_SOULS_V_SHATTERED_TRIGGER
Definition spell_dh.cpp:197
@ SPELL_DH_RAIN_OF_CHAOS_IMPACT
Definition spell_dh.cpp:181
@ SPELL_DH_CHAOS_NOVA
Definition spell_dh.cpp:55
@ SPELL_DH_FEL_BARRAGE_DMG
Definition spell_dh.cpp:110
@ SPELL_DH_RAIN_OF_CHAOS
Definition spell_dh.cpp:180
@ SPELL_DH_CHAOS_STRIKE_OH
Definition spell_dh.cpp:59
@ SPELL_DH_GLIDE_DURATION
Definition spell_dh.cpp:139
@ SPELL_DH_FELBLADE_COOLDOWN_RESET_PROC_VENGEANCE
Definition spell_dh.cpp:124
@ SPELL_DH_FELBLADE_COOLDOWN_RESET_PROC_VISUAL
Definition spell_dh.cpp:125
@ SPELL_DH_SIGIL_OF_SILENCE_AOE
Definition spell_dh.cpp:229
@ SPELL_DH_CHAOS_STRIKE_MH
Definition spell_dh.cpp:58
@ SPELL_DH_MOMENTUM
Definition spell_dh.cpp:163
@ SPELL_DH_BLUR_TRIGGER
Definition spell_dh.cpp:50
@ SPELL_DH_SHATTERED_RESTORATION
Definition spell_dh.cpp:191
@ SPELL_DH_FEL_RUSH
Definition spell_dh.cpp:117
@ SPELL_DH_VOID_RAY_DAMAGE
Definition spell_dh.cpp:261
@ SPELL_DH_SIGIL_OF_SPITE_AOE
Definition spell_dh.cpp:231
@ SPELL_DH_CHAOTIC_TRANSFORMATION
Definition spell_dh.cpp:62
@ SPELL_DH_METAMORPHOSIS_RESET
Definition spell_dh.cpp:160
@ SPELL_DH_SIGIL_OF_FLAME
Definition spell_dh.cpp:221
@ SPELL_DH_SPIRIT_BOMB_DAMAGE
Definition spell_dh.cpp:242
@ SPELL_DH_SHATTERED_SOUL_DEVOURER_LESSER_LEFT
Definition spell_dh.cpp:199
@ SPELL_DH_VENGEFUL_RETREAT
Definition spell_dh.cpp:254
@ SPELL_DH_SHATTERED_SOULS_DEVOURER_DUMMY
Definition spell_dh.cpp:203
@ SPELL_DH_SHEAR
Definition spell_dh.cpp:210
@ SPELL_DH_EYE_BEAM_DAMAGE
Definition spell_dh.cpp:104
@ SPELL_DH_SOUL_FURNACE_DAMAGE_BUFF
Definition spell_dh.cpp:240
@ SPELL_DH_FLAME_CRASH
Definition spell_dh.cpp:132
@ SPELL_DH_ILLIDANS_GRASP_JUMP_DEST
Definition spell_dh.cpp:144
@ SPELL_DH_STUDENT_OF_SUFFERING_TALENT
Definition spell_dh.cpp:245
@ SPELL_DH_CONSUME_ENERGIZE
Definition spell_dh.cpp:68
@ SPELL_DH_WAVE_OF_DEBILITATION_SLOW
Definition spell_dh.cpp:263
@ SPELL_DH_ANNIHILATION_OH
Definition spell_dh.cpp:45
@ SPELL_DH_PAINBRINGER_STACK
Definition spell_dh.cpp:178
@ SPELL_DH_SHATTERED_SOUL_DEVOURER_LESSER_RIGHT
Definition spell_dh.cpp:198
@ SPELL_DH_CHAOS_THEORY_CRIT
Definition spell_dh.cpp:61
@ SPELL_DH_VOIDGLARE_BOON_ENERGIZE
Definition spell_dh.cpp:258
@ SPELL_DH_FIERY_BRAND_DEBUFF_RANK_2
Definition spell_dh.cpp:130
@ SPELL_DH_SHATTER_SOUL_VENGEANCE_FRONT_RIGHT
Definition spell_dh.cpp:193
@ SPELL_DH_FURIOUS_THROWS
Definition spell_dh.cpp:136
@ SPELL_DH_SOUL_RENDING
Definition spell_dh.cpp:241
@ SPELL_DH_VOIDGLARE_BOON_TALENT
Definition spell_dh.cpp:259
@ SPELL_DH_FEL_DEVASTATION_DMG
Definition spell_dh.cpp:113
@ SPELL_DH_RAZOR_SPIKES
Definition spell_dh.cpp:182
@ SPELL_DH_SHATTER_SOUL_VENGEANCE_BACK_RIGHT
Definition spell_dh.cpp:194
@ SPELL_DH_SIGIL_OF_MISERY_AOE
Definition spell_dh.cpp:227
@ SPELL_DH_CULL_DAMAGE
Definition spell_dh.cpp:77
@ SPELL_DH_ERADICATE_DAMAGE_METAMORPHOSIS
Definition spell_dh.cpp:101
@ SPELL_DH_INNER_DEMON_BUFF
Definition spell_dh.cpp:146
@ SPELL_DH_ANNIHILATION
Definition spell_dh.cpp:43
@ SPELL_DH_ILLIDANS_GRASP_DAMAGE
Definition spell_dh.cpp:143
@ SPELL_DH_AWAKEN_THE_DEMON_WITHIN_CD
Definition spell_dh.cpp:47
@ SPELL_DH_VENGEANCE_DEMON_HUNTER
Definition spell_dh.cpp:252
@ SPELL_DH_METAMORPHOSIS_DEVOURER_TRANSFORM
Definition spell_dh.cpp:157
@ SPELL_DH_FEL_RUSH_WATER_AIR
Definition spell_dh.cpp:120
@ SPELL_DH_NEMESIS_UNDEAD
Definition spell_dh.cpp:176
@ SPELL_DH_SHATTERED_SOULS_HAVOC_SHATTERED_TRIGGER
Definition spell_dh.cpp:207
@ SPELL_DH_FELBLADE_CHARGE
Definition spell_dh.cpp:122
@ SPELL_DH_SOUL_FRAGMENTS_DAMAGE_TAKEN_TRACKER
Definition spell_dh.cpp:239
@ SPELL_DH_DEMONS_BITE
Definition spell_dh.cpp:96
@ SPELL_DH_EYE_BEAM
Definition spell_dh.cpp:103
@ SPELL_DH_DARKNESS_ABSORB
Definition spell_dh.cpp:83
@ SPELL_DH_JAGGED_SPIKES_PROC
Definition spell_dh.cpp:154
@ SPELL_DH_RETALIATION_TALENT
Definition spell_dh.cpp:188
@ SPELL_DH_ABYSSAL_STRIKE
Definition spell_dh.cpp:42
@ SPELL_DH_MOMENT_OF_CRAVING_TALENT
Definition spell_dh.cpp:164
@ SPELL_DH_SOUL_FRAGMENT_COUNTER
Definition spell_dh.cpp:236
@ SPELL_DH_IMMOLATION_AURA
Definition spell_dh.cpp:145
@ SPELL_DH_METAMORPHOSIS_VENGEANCE_TRANSFORM
Definition spell_dh.cpp:162
@ SPELL_DH_FURIOUS_GAZE_BUFF
Definition spell_dh.cpp:135
@ SPELL_DH_SIGIL_OF_CHAINS
Definition spell_dh.cpp:214
@ SPELL_DH_CALCIFIED_SPIKES_MOD_DAMAGE
Definition spell_dh.cpp:54
@ SPELL_DH_DEMONIC_APPETITE
Definition spell_dh.cpp:90
@ SPELL_DH_PAINBRINGER_DUMMY
Definition spell_dh.cpp:177
@ SPELL_DH_SIGIL_OF_FLAME_VISUAL
Definition spell_dh.cpp:225
@ SPELL_DH_FELBLADE
Definition spell_dh.cpp:121
@ SPELL_DH_FIRST_BLOOD
Definition spell_dh.cpp:131
@ SPELL_DH_FELBLADE_DAMAGE
Definition spell_dh.cpp:126
@ SPELL_DH_CONSUME_SOUL_DEVOURER
Definition spell_dh.cpp:70
@ SPELL_DH_FEL_BARRAGE_PROC
Definition spell_dh.cpp:111
@ SPELL_DH_BLUR
Definition spell_dh.cpp:49
@ SPELL_DH_FEL_RUSH_DMG
Definition spell_dh.cpp:118
@ SPELL_DH_INFERNAL_STRIKE_IMPACT_DAMAGE
Definition spell_dh.cpp:150
@ SPELL_DH_VENGEFUL_BONDS
Definition spell_dh.cpp:253
@ SPELL_DH_ELYSIAN_DECREE_AOE
Definition spell_dh.cpp:98
@ SPELL_DH_DEMONIC_ORIGINS_BUFF
Definition spell_dh.cpp:93
@ SPELL_DH_MONSTER_RISING_AGILITY
Definition spell_dh.cpp:166
@ SPELL_DH_SHATTERED_SOULS_HAVOC_DEMON_TRIGGER
Definition spell_dh.cpp:205
@ SPELL_DH_NEMESIS_BEASTS
Definition spell_dh.cpp:168
@ SPELL_DH_FEED_THE_DEMON
Definition spell_dh.cpp:108
@ SPELL_DH_SHATTERED_SOULS_V_DEMON_TRIGGER
Definition spell_dh.cpp:196
@ SPELL_DH_SOUL_CLEAVE_DMG
Definition spell_dh.cpp:235
@ SPELL_DH_DARKGLARE_BOON_ENERGIZE
Definition spell_dh.cpp:82
@ SPELL_DH_RAIN_FROM_ABOVE
Definition spell_dh.cpp:179
@ SPELL_DH_SOUL_BARRIER
Definition spell_dh.cpp:233
@ SPELL_DH_METAMORPHOSIS_TRANSFORM
Definition spell_dh.cpp:161
@ SPELL_DH_ERADICATE_DAMAGE
Definition spell_dh.cpp:100
@ SPELL_DH_SOULMONGER_ABSORB
Definition spell_dh.cpp:232
@ SPELL_DH_FEL_FLAME_FORTIFICATION_TALENT
Definition spell_dh.cpp:115
@ SPELL_DH_HAVOC_MASTERY
Definition spell_dh.cpp:141
@ SPELL_DH_SHATTER_SOUL
Definition spell_dh.cpp:192
@ SPELL_DH_VOIDBLADE_CHARGE
Definition spell_dh.cpp:256
@ SPELL_DH_CHAOS_THEORY_TALENT
Definition spell_dh.cpp:60
@ SPELL_DH_STUDENT_OF_SUFFERING_AURA
Definition spell_dh.cpp:246
@ SPELL_DH_CALCIFIED_SPIKES_TALENT
Definition spell_dh.cpp:53
@ SPELL_DH_DEMONIC
Definition spell_dh.cpp:89
@ SPELL_DH_SPIRIT_BOMB_HEAL
Definition spell_dh.cpp:243
@ SPELL_DH_NEMESIS_HUMANOIDS
Definition spell_dh.cpp:174
@ SPELL_DH_ESSENCE_BREAK_DEBUFF
Definition spell_dh.cpp:102
@ SPELL_DH_DEMONIC_TRAMPLE_STUN
Definition spell_dh.cpp:95
@ SPELL_DH_DEMON_SPIKES_TRIGGER
Definition spell_dh.cpp:88
@ SPELL_DH_REAP
Definition spell_dh.cpp:183
@ SPELL_DH_SIGIL_OF_CHAINS_SLOW
Definition spell_dh.cpp:217
@ SPELL_DH_NEMESIS_CRITTERS
Definition spell_dh.cpp:169
@ SPELL_DH_SIGIL_OF_FLAME_FLAME_CRASH
Definition spell_dh.cpp:224
@ SPELL_DH_FEAST_OF_SOULS
Definition spell_dh.cpp:106
@ SPELL_DH_CYCLE_OF_HATRED_COOLDOWN_REDUCTION
Definition spell_dh.cpp:79
@ SPELL_DH_SHEAR_PASSIVE
Definition spell_dh.cpp:211
@ SPELL_DH_FEL_DEVASTATION_HEAL
Definition spell_dh.cpp:114
@ SPELL_DH_WAVE_OF_DEBILITATION_TALENT
Definition spell_dh.cpp:262
@ SPELL_DH_SIGIL_OF_SILENCE
Definition spell_dh.cpp:228
@ SPELL_DH_GLAIVE_TEMPEST
Definition spell_dh.cpp:137
@ SPELL_DH_INFERNAL_STRIKE_CAST
Definition spell_dh.cpp:149
@ SPELL_DH_VENGEFUL_RETREAT_TRIGGER
Definition spell_dh.cpp:255
@ SPELL_DH_BURNING_ALIVE_TARGET_SELECTOR
Definition spell_dh.cpp:52
@ SPELL_DH_CHAOS_STRIKE_ENERGIZE
Definition spell_dh.cpp:57
@ SPELL_DH_NEMESIS_GIANTS
Definition spell_dh.cpp:173
@ SPELL_DH_DEMON_BLADES_DMG
Definition spell_dh.cpp:85
@ SPELL_DH_ILLIDANS_GRASP
Definition spell_dh.cpp:142
@ SPELL_DH_BURNING_ALIVE
Definition spell_dh.cpp:51
@ SPELL_DH_FRAILTY
Definition spell_dh.cpp:133
@ SPELL_DH_CONSUME_SOUL_VENGEANCE_DEMON
Definition spell_dh.cpp:74
@ SPELL_DH_SIGIL_OF_CHAINS_JUMP
Definition spell_dh.cpp:216
@ SPELL_DH_CONSUME_SOUL_HAVOC_LESSER
Definition spell_dh.cpp:72
@ SPELL_DH_SOUL_FRAGMENTS_DEVOURER_COUNTER
Definition spell_dh.cpp:238
@ SPELL_DH_SOUL_FRAGMENT_DEVOURER
Definition spell_dh.cpp:237
@ SPELL_DH_SHATTERED_SOULS_VENGEANCE
Definition spell_dh.cpp:209
@ SPELL_DH_GLIDE
Definition spell_dh.cpp:138
@ SPELL_DH_CHARRED_WARBLADES_HEAL
Definition spell_dh.cpp:63
@ SPELL_DH_SIGIL_OF_MISERY
Definition spell_dh.cpp:226
@ SPELL_DH_FURIOUS_GAZE
Definition spell_dh.cpp:134
@ SPELL_DH_FELBLADE_COOLDOWN_RESET_PROC_HAVOC
Definition spell_dh.cpp:123
@ SPELL_DH_ARMY_UNTO_ONESELF
Definition spell_dh.cpp:46
@ SPELL_DH_SHATTERED_SOULS_MARKER
Definition spell_dh.cpp:208
@ SPELL_DH_FIERY_BRAND
Definition spell_dh.cpp:127
@ SPELL_DH_DEMON_MUZZLE_PROC
Definition spell_dh.cpp:86
@ SPELL_DH_COLLECTIVE_ANGUISH_FEL_DEVASTATION
Definition spell_dh.cpp:67
@ SPELL_DH_FEAST_OF_SOULS_PERIODIC_HEAL
Definition spell_dh.cpp:107
@ SPELL_DH_MANA_RIFT_DMG_POWER_BURN
Definition spell_dh.cpp:155
@ SPELL_DH_THROW_GLAIVE
Definition spell_dh.cpp:250
@ SPELL_DH_RESTLESS_HUNTER_BUFF
Definition spell_dh.cpp:187
@ SPELL_DH_NEMESIS_DRAGONKIN
Definition spell_dh.cpp:171
@ SPELL_DH_RETALIATION_PROC
Definition spell_dh.cpp:189
@ SPELL_DH_SIGIL_OF_CHAINS_TARGET_SELECT
Definition spell_dh.cpp:219
@ SPELL_DH_FIERY_BRAND_DEBUFF_RANK_1
Definition spell_dh.cpp:129
@ SPELL_DH_CYCLE_OF_HATRED_REMOVE_STACKS
Definition spell_dh.cpp:80
@ SPELL_DH_CONSUME_SOUL_HAVOC_SHATTERED
Definition spell_dh.cpp:73
@ SPELL_DH_TACTICAL_RETREAT_ENERGIZE
Definition spell_dh.cpp:248
@ SPELL_DH_SHATTERED_SOULS_DEVOURER
Definition spell_dh.cpp:202
@ SPELL_DH_DEMONIC_TRAMPLE_DMG
Definition spell_dh.cpp:94
@ SPELL_DH_CHAOS_STRIKE
Definition spell_dh.cpp:56
@ SPELL_DH_FEL_DEVASTATION
Definition spell_dh.cpp:112
@ SPELL_DH_UNCONTAINED_FEL
Definition spell_dh.cpp:251
@ SPELL_DH_SEVER
Definition spell_dh.cpp:190
TriggerCastFlags TriggerFlags
Spell const * TriggeringSpell
CastSpellExtraArgs & SetTriggeringSpell(Spell const *triggeringSpell)
Definition Spell.cpp:9646
CastSpellExtraArgs & SetTriggerFlags(TriggerCastFlags flag)
constexpr float GetPositionX() const
Definition Position.h:87
constexpr float GetPositionY() const
Definition Position.h:88
float GetRelativeAngle(float x, float y) const
Definition Position.h:147
constexpr void GetPosition(float &x, float &y) const
Definition Position.h:92
constexpr float GetPositionZ() const
Definition Position.h:89
uint32 SpellXSpellVisualID
areatrigger_dh_darkness(AreaTrigger *areaTrigger)
Definition spell_dh.cpp:869
void OnUnitEnter(Unit *unit) override
Definition spell_dh.cpp:872
void OnUnitExit(Unit *unit, AreaTriggerExitReason) override
Definition spell_dh.cpp:884
SpellInfo const * _absorbAuraInfo
Definition spell_dh.cpp:890
TaskScheduler _scheduler
void OnUpdate(uint32 diff) override
void OnCreate(Spell const *) override
void OnInitialize() override
void OnRemove() override
void OnRemove() override
void OnInitialize() override
void OnUnitEnter(Unit *unit) override
static void CreateFragments(Unit *source, Unit *dh, int32 count)
static constexpr std::array< DemonHunterSpells, 2 > DevourerSpells
static constexpr std::array< DemonHunterSpells, 2 > VengeanceSpells
static constexpr std::array< DemonHunterSpells, 2 > HavocSpells