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,
182 SPELL_DH_REAP = 1226019,
262};
263
269
270// Called by 232893 - Felblade
272{
273 bool Validate(SpellInfo const* /*spellInfo*/) override
274 {
276 }
277
278 bool Load() override
279 {
281 }
282
290
295};
296
297// Called by 203819 - Demon Spikes
324
325// 391171 - Calcified Spikes
327{
328 bool Validate(SpellInfo const* spellInfo) override
329 {
330 return ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
331 }
332
333 void HandlePeriodic(AuraEffect const* /*aurEff*/) const
334 {
335 if (AuraEffect* damagePctTaken = GetEffect(EFFECT_0))
336 damagePctTaken->ChangeAmount(damagePctTaken->GetAmount() + 1);
337 }
338
343};
344
345// 197125 - Chaos Strike
367
368// 344862 - Chaos Strike
389
390// Called by 188499 - Blade Dance and 210152 - Death Sweep
392{
393 bool Validate(SpellInfo const* /*spellInfo*/) override
394 {
397 return false;
398
399 SpellInfo const* chaosTheory = sSpellMgr->AssertSpellInfo(SPELL_DH_CHAOS_THEORY_TALENT, DIFFICULTY_NONE);
400 return chaosTheory->GetEffect(EFFECT_0).CalcValue() < chaosTheory->GetEffect(EFFECT_1).CalcValue();
401 }
402
403 bool Load() override
404 {
406 }
407
408 void ChaosTheory() const
409 {
410 Unit* caster = GetCaster();
411 Aura const* chaosTheory = caster->GetAura(SPELL_DH_CHAOS_THEORY_TALENT);
412 if (!chaosTheory)
413 return;
414
415 AuraEffect const* min = chaosTheory->GetEffect(EFFECT_0);
416 AuraEffect const* max = chaosTheory->GetEffect(EFFECT_1);
417 if (!min || !max)
418 return;
419
420 SpellEffectValue critChance = frand(min->GetAmount(), max->GetAmount());
423 .SpellValueOverrides = { { SPELLVALUE_BASE_POINT0, critChance } }
424 });
425 }
426
431};
432
433// 390195 - Chaos Theory
435{
436 void Prepare(ProcEventInfo const& /*eventInfo*/)
437 {
439 // delayed charge drop - this aura must be removed after Chaos Strike does damage and after it procs power refund
441 }
442
447};
448
449// Called by 191427 - Metamorphosis
451{
452 bool Validate(SpellInfo const* /*spellInfo*/) override
453 {
457 }
458
459 bool Load() override
460 {
462 }
463
464 void HandleCooldown() const
465 {
467 {
468 uint32 category = sSpellMgr->AssertSpellInfo(cooldown.SpellId, DIFFICULTY_NONE)->CategoryId;
469 return category == SPELL_CATEGORY_DH_EYE_BEAM || category == SPELL_CATEGORY_DH_BLADE_DANCE;
470 }, true);
471 }
472
477};
478
479// 213010 - Charred Warblades
481{
482 bool Validate(SpellInfo const* /*spellInfo*/) override
483 {
485 }
486
487 bool CheckProc(ProcEventInfo& eventInfo)
488 {
489 return eventInfo.GetDamageInfo() && eventInfo.GetDamageInfo()->GetSchoolMask() & SPELL_SCHOOL_MASK_FIRE;
490 }
491
493 {
494 _healAmount += CalculatePct(eventInfo.GetDamageInfo()->GetDamage(), GetEffect(EFFECT_0)->GetAmount());
495 }
496
497 void HandleDummyTick(AuraEffect const* aurEff)
498 {
499 if (_healAmount == 0)
500 return;
501
504 .SetTriggeringAura(aurEff)
505 .AddSpellBP0(_healAmount));
506
507 _healAmount = 0;
508 }
509
516
517private:
519};
520
521// Called by 212084 - Fel Devastation and 198013 - Eye Beam
558
559// 391057 - Eye Beam
581
582// 473662 - Consume
584{
585 bool Validate(SpellInfo const* /*spellInfo*/) override
586 {
588 }
589
597
602};
603
604// 203794 - Consume Soul
606{
607 bool Validate(SpellInfo const* /*spellInfo*/) override
608 {
610 }
611
612 void CalcHealingFromDamageTaken(SpellEffectInfo const& /*effectInfo*/, Unit const* victim, int32& /*healing*/, int32& flatMod, float& /*pctMod*/) const
613 {
615 if (!damageTakenTracker)
616 return;
617
618 Aura const* shearPassive = GetCaster()->GetAura(SPELL_DH_SHEAR_PASSIVE);
619 if (!shearPassive || !shearPassive->HasEffect(EFFECT_1) || !shearPassive->HasEffect(EFFECT_2))
620 return;
621
622 flatMod += std::max<SpellEffectValue>(CalculatePct(damageTakenTracker->CalculateAmount(GetCaster()), shearPassive->GetEffect(EFFECT_1)->GetAmount()),
623 victim->CountPctFromMaxHealth(shearPassive->GetEffect(EFFECT_2)->GetAmount()));
624 }
625
630};
631
632// 320413 - Critical Chaos
634{
635 void CalcAmount(AuraEffect const* /*aurEff*/, SpellEffectValue& amount, bool const& /*canBeRecalculated*/) const
636 {
637 if (AuraEffect const* amountHolder = GetEffect(EFFECT_1))
638 {
639 float critChanceDone = GetUnitOwner()->GetUnitCriticalChanceDone(BASE_ATTACK);
640 amount = CalculatePct(critChanceDone, amountHolder->GetAmount());
641 }
642 }
643
644 void UpdatePeriodic(AuraEffect const* aurEff) const
645 {
646 if (AuraEffect* bonus = GetEffect(EFFECT_0))
647 bonus->RecalculateAmount(aurEff);
648 }
649
655};
656
657// 1226019 - Reap
659{
660 bool Validate(SpellInfo const* /*spellInfo*/) override
661 {
663 }
664
672
677};
678
679// 389718 - Cycle of Binding
681{
683
684 bool Validate(SpellInfo const* /*spellInfo*/) override
685 {
687 }
688
689 void HandleEffectProc(AuraEffect const* aurEff, ProcEventInfo const& /*eventInfo*/) const
690 {
691 SpellHistory* history = GetTarget()->GetSpellHistory();
692 SpellHistory::Duration amount = duration_cast<SpellHistory::Duration>(FloatSeconds(-aurEff->GetAmount()));
693
694 for (uint32 spellId : SigilSpellsIds)
695 history->ModifyCooldown(spellId, amount);
696 }
697
702};
703
704// Called by 198013 - Eye Beam
706{
711
712 bool Load() override
713 {
715 }
716
718 {
719 Unit* caster = GetCaster();
720
721 // First calculate cooldown then add another stack
723 AuraEffect const* cycleOfHatred = caster->GetAuraEffect(SPELL_DH_CYCLE_OF_HATRED_TALENT, EFFECT_0);
724 caster->GetSpellHistory()->ModifyCooldown(GetSpellInfo(), -Milliseconds(static_cast<int64>(cycleOfHatred->GetAmount() * cycleOfHatredStack)));
725
729
732 }
733
738};
739
740// 1214890 - Cycle of Hatred
742{
743 bool Validate(SpellInfo const* /*spellInfo*/) override
744 {
746 }
747
748 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
749 {
751 aura->SetStackAmount(1);
752 }
753
758};
759
760// 258887 - Cycle of Hatred
785
786// Called by 212084 - Fel Devastation
788{
789 bool Validate(SpellInfo const* /*spellInfo*/) override
790 {
793 return false;
794
795 SpellInfo const* darkglareBoon = sSpellMgr->GetSpellInfo(SPELL_DH_DARKGLARE_BOON, DIFFICULTY_NONE);
796 return darkglareBoon->GetEffect(EFFECT_0).CalcValue() < darkglareBoon->GetEffect(EFFECT_1).CalcValue()
797 && darkglareBoon->GetEffect(EFFECT_2).CalcValue() < darkglareBoon->GetEffect(EFFECT_3).CalcValue();
798 }
799
800 bool Load() override
801 {
803 }
804
805 void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
806 {
807 // Tooltip mentions "fully channelled" being a requirement but ingame it always reduces cooldown and energizes, even when manually cancelled
808 //if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
809 // return;
810
811 Unit* target = GetTarget();
812 Aura const* darkglareBoon = target->GetAura(SPELL_DH_DARKGLARE_BOON);
813
814 SpellHistory::Duration cooldown, categoryCooldown;
815 SpellHistory::GetCooldownDurations(GetSpellInfo(), 0, &cooldown, nullptr, &categoryCooldown);
816 SpellEffectValue reductionPct = frand(darkglareBoon->GetEffect(EFFECT_0)->GetAmount(), darkglareBoon->GetEffect(EFFECT_1)->GetAmount());
817 SpellHistory::Duration cooldownReduction(CalculatePct(std::max(cooldown, categoryCooldown).count(), reductionPct));
818
819 SpellEffectValue energizeValue = frand(darkglareBoon->GetEffect(EFFECT_2)->GetAmount(), darkglareBoon->GetEffect(EFFECT_3)->GetAmount());
820
821 target->GetSpellHistory()->ModifyCooldown(SPELL_DH_FEL_DEVASTATION, -cooldownReduction);
822
825 .SpellValueOverrides = { { SPELLVALUE_BASE_POINT0, energizeValue } }
826 });
827 }
828
833};
834
835// 209426 - Darkness
837{
838 bool Validate(SpellInfo const* spellInfo) override
839 {
840 return ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
841 }
842
843 void CalculateAmount(AuraEffect const* /*aurEff*/, SpellEffectValue& amount, bool& /*canBeRecalculated*/)
844 {
845 // Set absorbtion amount to unlimited
846 amount = -1;
847 }
848
849 void Absorb(AuraEffect const* /*aurEff*/, DamageInfo& dmgInfo, uint32& absorbAmount) const
850 {
851 if (AuraEffect const* chanceEffect = GetEffect(EFFECT_1))
852 if (roll_chance(chanceEffect->GetAmount()))
853 absorbAmount = dmgInfo.GetDamage();
854 }
855
861};
862
863// 196718 - Darkness
864// Id: 6615
866{
869
870 void OnUnitEnter(Unit* unit) override
871 {
872 Unit* caster = at->GetCaster();
873 if (!caster || !caster->IsValidAssistTarget(unit, _absorbAuraInfo))
874 return;
875
878 .SpellValueOverrides = { { SPELLVALUE_DURATION, at->GetDuration() } }
879 });
880 }
881
882 void OnUnitExit(Unit* unit, AreaTriggerExitReason /*reason*/) override
883 {
885 }
886
887private:
889};
890
891// 203819 - Demon Spikes
893{
894 bool Validate(SpellInfo const* spellInfo) override
895 {
897 && ValidateSpellEffect({ { spellInfo->Id, EFFECT_0 } })
899 }
900
901 void HandleParryChance(WorldObject*& target) const
902 {
904 target = nullptr;
905 }
906
911};
912
913// 388111 - Demon Muzzle
915{
916 bool Validate(SpellInfo const* /*spellInfo*/) override
917 {
919 }
920
921 static void HandleProc(AuraScript const&, AuraEffect const*, ProcEventInfo const& procEvent)
922 {
924 .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
925 .TriggeringSpell = procEvent.GetProcSpell()
926 });
927 }
928
933};
934
935// 213410 - Demonic (attached to 212084 - Fel Devastation and 198013 - Eye Beam)
937{
938 bool Validate(SpellInfo const* /*spellInfo*/) override
939 {
942 && sSpellMgr->AssertSpellInfo(SPELL_DH_DEMONIC, DIFFICULTY_NONE)->GetEffect(EFFECT_0).IsAura();
943 }
944
945 bool Load() override
946 {
948 }
949
951 {
952 Unit* caster = GetCaster();
953 AuraEffect const* demonic = caster->GetAuraEffect(SPELL_DH_DEMONIC, EFFECT_0);
954 if (!demonic)
955 return;
956
957 int32 duration = demonic->GetAmountAsInt() + GetSpell()->GetChannelDuration();
958
959 if (Aura* aura = caster->GetAura(_transformSpellId))
960 {
961 aura->SetMaxDuration(aura->GetDuration() + duration);
962 aura->SetDuration(aura->GetMaxDuration());
963 return;
964 }
965
966 SpellCastTargets targets;
967 targets.SetUnitTarget(caster);
968
969 Spell* spell = new Spell(caster, sSpellMgr->AssertSpellInfo(_transformSpellId, DIFFICULTY_NONE),
971 ObjectGuid::Empty, GetSpell()->m_castId);
973 spell->m_SpellVisual.ScriptVisualID = 0;
974 spell->SetSpellValue({ SPELLVALUE_DURATION, duration });
975 spell->prepare(targets);
976 }
977
982
984
985public:
986 explicit spell_dh_demonic(uint32 transformSpellId) : _transformSpellId(transformSpellId) { }
987};
988
989// 206478 - Demonic Appetite
991{
996
997 static void ShatterLesserSoulFragment(AuraScript const&, ProcEventInfo const& procEvent)
998 {
999 procEvent.GetActionTarget()->CastSpell(procEvent.GetActor(),
1000 Trinity::Containers::SelectRandomContainerElement(std::array{ SPELL_DH_SHATTERED_SOUL_LESSER_RIGHT, SPELL_DH_SHATTERED_SOUL_LESSER_LEFT }),
1002 }
1003
1008};
1009
1010// 178963 - Consume Soul
1011// 202644 - Consume Soul
1012// 228532 - Consume Soul
1013// 328953 - Consume Soul
1014// 1238743 - Consume Soul
1016{
1017 bool Validate(SpellInfo const* /*spellInfo*/) override
1018 {
1020 }
1021
1022 bool Load() override
1023 {
1025 }
1026
1027 void Register() override
1028 {
1029 for (SpellEffectInfo const& spellEffectInfo : sSpellMgr->AssertSpellInfo(m_scriptSpellId, DIFFICULTY_NONE)->GetEffects())
1030 if (spellEffectInfo.IsEffect(SPELL_EFFECT_TRIGGER_SPELL) && spellEffectInfo.TriggerSpell == SPELL_DH_DEMONIC_APPETITE_ENERGIZE)
1032 }
1033};
1034
1035// 203720 - Demon Spikes
1037{
1038 bool Validate(SpellInfo const* /*spellInfo*/) override
1039 {
1041 }
1042
1050
1055};
1056
1058{
1060 static constexpr std::array<DemonHunterSpells, 2> HavocSpells = { SPELL_DH_SHATTERED_SOUL_LESSER_RIGHT, SPELL_DH_SHATTERED_SOUL_LESSER_LEFT };
1062
1069
1070 static void CreateFragments(Unit* source, Unit* dh, int32 count)
1071 {
1072 std::span<DemonHunterSpells const> spells = HavocSpells;
1073 if (Player* player = dh->ToPlayer())
1074 {
1075 if (player->GetPrimarySpecialization() == ChrSpecialization::DemonHunterDevourer)
1076 spells = DevourerSpells;
1077 else if (player->GetPrimarySpecialization() == ChrSpecialization::DemonHunterVengeance)
1078 spells = VengeanceSpells;
1079 }
1080
1081 for (int32 i = 0; i < count; ++i)
1083 }
1084};
1085
1086// 452410 - Enduring Torment
1088{
1093
1094 void HandlePeriodic(AuraEffect const* aurEff) const
1095 {
1096 Unit* target = GetTarget();
1098
1100 {
1101 if (statBuff)
1102 target->RemoveOwnedAura(statBuff);
1103 }
1104 else if (!statBuff)
1105 {
1108 .TriggeringAura = aurEff
1109 });
1110 }
1111 }
1112
1117};
1118
1119// 453314 - Enduring Torment
1121{
1122 bool Load() override
1123 {
1124 return GetCaster()->IsPlayer();
1125 }
1126
1127 template <ChrSpecialization Spec>
1128 void PreventEffect(WorldObject*& target) const
1129 {
1130 if (GetCaster()->ToPlayer()->GetPrimarySpecialization() != Spec)
1131 target = nullptr;
1132 }
1133
1134 void Register() override
1135 {
1136 OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dh_enduring_torment_buff::PreventEffect<ChrSpecialization::DemonHunterHavoc>, EFFECT_0, TARGET_UNIT_CASTER);
1137 OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dh_enduring_torment_buff::PreventEffect<ChrSpecialization::DemonHunterHavoc>, EFFECT_1, TARGET_UNIT_CASTER);
1138 OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dh_enduring_torment_buff::PreventEffect<ChrSpecialization::DemonHunterDevourer>, EFFECT_2, TARGET_UNIT_CASTER);
1139 OnObjectTargetSelect += SpellObjectTargetSelectFn(spell_dh_enduring_torment_buff::PreventEffect<ChrSpecialization::DemonHunterDevourer>, EFFECT_3, TARGET_UNIT_CASTER);
1140 }
1141};
1142
1143// 307046 - Elysian Decree (Kyrian)
1144// 389860 - Sigil of Spite
1146{
1147public:
1148 spell_dh_elysian_decree(uint32 primarySpellId) : _primarySpellId(primarySpellId) { }
1149
1150 bool Validate(SpellInfo const* /*spellInfo*/) override
1151 {
1153 && sSpellMgr->AssertSpellInfo(_primarySpellId, DIFFICULTY_NONE)->GetEffect(EFFECT_2).IsEffect(SPELL_EFFECT_DUMMY)
1155 }
1156
1157 bool Load() override
1158 {
1159 _maxFragmentsToCreate = sSpellMgr->AssertSpellInfo(_primarySpellId, GetCastDifficulty())->GetEffect(EFFECT_2).CalcValueAsInt(GetCaster());
1161 return true;
1162 }
1163
1165 {
1166 // spawn more than 1 fragment per target if there are less than 3 total targets
1167 int32 fragments = 1 + std::max(int32(_maxFragmentsToCreate - GetUnitTargetCountForEffect(effIndex)), 0);
1168 fragments = std::min(fragments, _fragmentsToCreate);
1169
1171
1172 _fragmentsToCreate -= fragments;
1173 }
1174
1179
1180private:
1184};
1185
1186// 1225826 - Eradicate
1209
1210// 258860 - Essence Break
1212{
1213 bool Validate(SpellInfo const* /*spellInfo*/) override
1214 {
1216 }
1217
1218 void HandleDebuff(SpellEffIndex /*effIndex*/) const
1219 {
1220 Unit* caster = GetCaster();
1221
1222 // debuff application is slightly delayed on official servers (after animation fully finishes playing)
1223 caster->m_Events.AddEventAtOffset([caster, targets = CastSpellTargetArg(GetHitUnit())]() mutable
1224 {
1225 if (!targets.Targets)
1226 return;
1227
1228 targets.Targets->Update(caster);
1229
1231 }, 300ms);
1232 }
1233
1238};
1239
1240// 198013 - Eye Beam
1242{
1243 bool Validate(SpellInfo const* /*spellInfo*/) override
1244 {
1246 }
1247
1248 void HandleEffectPeriodic(AuraEffect const* aurEff) const
1249 {
1250 if (Unit* caster = GetCaster())
1251 caster->CastSpell(nullptr, SPELL_DH_EYE_BEAM_DAMAGE, CastSpellExtraArgsInit{
1253 .TriggeringAura = aurEff
1254 });
1255 }
1256
1261};
1262
1263// Called by 228477 - Soul Cleave
1265{
1266 bool Validate(SpellInfo const* /*spellInfo*/) override
1267 {
1269 }
1270
1271 bool Load() override
1272 {
1274 }
1275
1283
1288};
1289
1290// 212084 - Fel Devastation
1292{
1293 bool Validate(SpellInfo const* /*spellInfo*/) override
1294 {
1296 }
1297
1298 void HandlePeriodicEffect(AuraEffect const* aurEff) const
1299 {
1300 if (Unit* caster = GetCaster())
1301 caster->CastSpell(caster, SPELL_DH_FEL_DEVASTATION_HEAL, CastSpellExtraArgsInit{
1303 .TriggeringAura = aurEff
1304 });
1305 }
1306
1311};
1312
1313// Called by 258920 - Immolation Aura
1347
1348// 232893 - Felblade
1350{
1351 bool Validate(SpellInfo const* /*spellInfo*/) override
1352 {
1354 }
1355
1364
1369};
1370
1371// 213241 - Felblade Charge
1373{
1374 bool Validate(SpellInfo const* /*spellInfo*/) override
1375 {
1377 }
1378
1386
1391};
1392
1393// 203557 - Felblade (Vengeance cooldow reset proc aura)
1394// 236167 - Felblade (Havoc cooldow reset proc aura)
1396{
1397 bool Validate(SpellInfo const* /*spellInfo*/) override
1398 {
1400 }
1401
1402 void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& /*eventInfo*/) const
1403 {
1405 }
1406
1411};
1412
1413// 204021 - Fiery Brand
1435
1436// 206416 - First Blood
1438{
1439public:
1440 ObjectGuid const& GetFirstTarget() const { return _firstTargetGUID; }
1441 void SetFirstTarget(ObjectGuid const& targetGuid) { _firstTargetGUID = targetGuid; }
1442
1443private:
1444 void Register() override
1445 {
1446 }
1447
1448private:
1450};
1451
1452// Called by 198013 - Eye Beam
1454{
1455 bool Validate(SpellInfo const* /*spellInfo*/) override
1456 {
1458 }
1459
1460 bool Load() override
1461 {
1463 }
1464
1465 void HandleAfterRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) const
1466 {
1467 if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
1468 return;
1469
1470 Unit* target = GetTarget();
1473 .TriggeringAura = aurEff
1474 });
1475 }
1476
1481};
1482
1483// 342817 - Glaive Tempest
1484// ID - 21832
1486{
1488
1489 void OnCreate(Spell const* /*creatingSpell*/) override
1490 {
1491 _scheduler.Schedule(0ms, [this](TaskContext& task)
1492 {
1493 FloatMilliseconds period = 500ms; // 500ms, affected by haste
1494 if (Unit* caster = at->GetCaster())
1495 {
1496 period *= *caster->m_unitData->ModHaste;
1497 caster->CastSpell(at->GetPosition(), SPELL_DH_GLAIVE_TEMPEST, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
1498 caster->CastSpell(at->GetPosition(), SPELL_DH_GLAIVE_TEMPEST, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
1499 }
1500 task.Repeat(duration_cast<Milliseconds>(period));
1501 });
1502 }
1503
1504 void OnUpdate(uint32 diff) override
1505 {
1506 _scheduler.Update(diff);
1507 }
1508
1509private:
1511};
1512
1513// Called by 162264 - Metamorphosis
1515{
1516 bool Validate(SpellInfo const* /*spell*/) override
1517 {
1519 }
1520
1521 bool Load() override
1522 {
1523 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)
1524 }
1525
1526 void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
1527 {
1528 Unit* target = GetTarget();
1531 });
1532 }
1533
1538};
1539
1540// 390139 - Inner Demon
1541// ID - 26749
1543{
1545
1546 void OnInitialize() override
1547 {
1548 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(at->GetSpellId(), DIFFICULTY_NONE);
1549 if (!spellInfo)
1550 return;
1551
1552 Unit* caster = at->GetCaster();
1553 if (!caster)
1554 return;
1555
1557 PathGenerator path(at);
1558
1559 path.CalculatePath(destPos.GetPositionX(), destPos.GetPositionY(), destPos.GetPositionZ(), false);
1560
1561 at->InitSplines(path.GetPath());
1562 }
1563
1564 void OnRemove() override
1565 {
1566 if (Unit* caster = at->GetCaster())
1568 }
1569};
1570
1571// 388118 - Know Your Enemy
1573{
1574 void CalcAmount(AuraEffect const* /*aurEff*/, SpellEffectValue& amount, bool const& /*canBeRecalculated*/) const
1575 {
1576 if (AuraEffect const* amountHolder = GetEffect(EFFECT_1))
1577 {
1578 float critChanceDone = GetUnitOwner()->GetUnitCriticalChanceDone(BASE_ATTACK);
1579 amount = CalculatePct(critChanceDone, amountHolder->GetAmount());
1580 }
1581 }
1582
1583 void UpdatePeriodic(AuraEffect const* aurEff) const
1584 {
1585 if (AuraEffect* bonus = GetEffect(EFFECT_0))
1586 bonus->RecalculateAmount(aurEff);
1587 }
1588
1594};
1595
1596// 209258 - Last Resort
1598{
1599 bool Validate(SpellInfo const* spellInfo) override
1600 {
1602 && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } });
1603 }
1604
1605 void HandleAbsorb(AuraEffect const* /*aurEff*/, DamageInfo const& /*dmgInfo*/, uint32& absorbAmount)
1606 {
1607 Unit* target = GetTarget();
1608 if (target->HasAura(SPELL_DH_UNCONTAINED_FEL))
1609 {
1610 absorbAmount = 0;
1611 return;
1612 }
1613
1615
1617
1618 target->CastSpell(target, SPELL_DH_METAMORPHOSIS_VENGEANCE_TRANSFORM, castArgs);
1619 target->CastSpell(target, SPELL_DH_UNCONTAINED_FEL, castArgs);
1620
1621 target->SetHealth(target->CountPctFromMaxHealth(GetEffectInfo(EFFECT_1).CalcValue(target)));
1622 }
1623
1628};
1629
1630// 1238488 - Moment of Craving (attached to 473728 - Void Ray)
1632{
1637
1638 bool Load() override
1639 {
1641 }
1642
1643 void HandleAfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
1644 {
1645 if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
1646 return;
1647
1648 Unit* target = GetTarget();
1649 target->GetSpellHistory()->RestoreCharge(sSpellMgr->AssertSpellInfo(SPELL_DH_REAP, GetCastDifficulty())->ChargeCategoryId);
1651 }
1652
1657};
1658
1659// 452414 - Monster Rising
1661{
1666
1667 void HandlePeriodic(AuraEffect const* aurEff) const
1668 {
1669 Unit* target = GetTarget();
1671
1673 {
1674 if (statBuff)
1675 target->RemoveAura(statBuff);
1676 }
1677 else if (!statBuff)
1678 {
1681 .TriggeringAura = aurEff
1682 });
1683 }
1684 }
1685
1690};
1691
1692// 207387 - Painbringer
1694{
1695 bool Validate(SpellInfo const* /*spellInfo*/) override
1696 {
1698 }
1699
1700 void HandleProc(ProcEventInfo const& eventInfo) const
1701 {
1702 Unit* target = eventInfo.GetActor();
1705 .TriggeringSpell = eventInfo.GetProcSpell()
1706 });
1707 }
1708
1709 void Register() override
1710 {
1712 }
1713};
1714
1715// 212988 - Painbringer
1717{
1718 bool Validate(SpellInfo const* /*spell*/) override
1719 {
1721 }
1722
1723 void OnApply(AuraEffect const* aurEff, AuraEffectHandleModes mode) const
1724 {
1725 Unit* target = GetTarget();
1726
1727 if (mode & AURA_EFFECT_HANDLE_REAL)
1730 .TriggeringAura = aurEff
1731 });
1732
1733 target->m_Events.AddEventAtOffset([self = GetAura()->GetWeakPtr()]
1734 {
1735 if (Trinity::unique_strong_ref_ptr<Aura> aura = self.lock())
1736 aura->ModStackAmount(-1, AURA_REMOVE_BY_EXPIRE, false);
1738 }
1739
1740 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
1741 {
1743 }
1744
1750};
1751
1752// 188499 - Blade Dance
1753// 210152 - Death Sweep
1755{
1756 bool Validate(SpellInfo const* /*spellInfo*/) override
1757 {
1759 }
1760
1761 void DecideFirstTarget(std::list<WorldObject*>& targetList)
1762 {
1763 if (targetList.empty())
1764 return;
1765
1767 if (!aura)
1768 return;
1769
1770 ObjectGuid firstTargetGUID = ObjectGuid::Empty;
1771 ObjectGuid selectedTarget = GetCaster()->GetTarget();
1772
1773 // Prefer the selected target if he is one of the enemies
1774 if (targetList.size() > 1 && !selectedTarget.IsEmpty())
1775 {
1776 auto it = std::find_if(targetList.begin(), targetList.end(), [selectedTarget](WorldObject* object)
1777 {
1778 return object->GetGUID() == selectedTarget;
1779 });
1780 if (it != targetList.end())
1781 firstTargetGUID = (*it)->GetGUID();
1782 }
1783
1784 if (firstTargetGUID.IsEmpty())
1785 firstTargetGUID = targetList.front()->GetGUID();
1786
1788 script->SetFirstTarget(firstTargetGUID);
1789 }
1790
1795};
1796
1797// 199552 - Blade Dance
1798// 200685 - Blade Dance
1799// 210153 - Death Sweep
1800// 210155 - Death Sweep
1802{
1803 bool Validate(SpellInfo const* /*spellInfo*/) override
1804 {
1806 }
1807
1809 {
1810 int32 damage = GetHitDamage();
1811
1812 if (AuraEffect* aurEff = GetCaster()->GetAuraEffect(SPELL_DH_FIRST_BLOOD, EFFECT_0))
1813 if (spell_dh_first_blood* script = aurEff->GetBase()->GetScript<spell_dh_first_blood>())
1814 if (GetHitUnit()->GetGUID() == script->GetFirstTarget())
1815 AddPct(damage, aurEff->GetAmount());
1816
1817 SetHitDamage(damage);
1818 }
1819
1824};
1825
1826// 131347 - Glide
1828{
1833
1835 {
1836 Unit* caster = GetCaster();
1837 if (caster->IsMounted() || caster->GetVehicleBase())
1839
1840 if (!caster->IsFalling())
1842
1843 return SPELL_CAST_OK;
1844 }
1845
1847 {
1848 Player* caster = GetCaster()->ToPlayer();
1849 if (!caster)
1850 return;
1851
1852 caster->CastSpell(caster, SPELL_DH_GLIDE_KNOCKBACK, true);
1853 caster->CastSpell(caster, SPELL_DH_GLIDE_DURATION, true);
1854
1855 caster->GetSpellHistory()->StartCooldown(sSpellMgr->AssertSpellInfo(SPELL_DH_VENGEFUL_RETREAT_TRIGGER, GetCastDifficulty()), 0, nullptr, false, 250ms);
1856 caster->GetSpellHistory()->StartCooldown(sSpellMgr->AssertSpellInfo(SPELL_DH_FEL_RUSH, GetCastDifficulty()), 0, nullptr, false, 250ms);
1857 }
1858
1864};
1865
1866// 131347 - Glide
1868{
1869 bool Validate(SpellInfo const* /*spellInfo*/) override
1870 {
1872 }
1873
1874 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1875 {
1877 }
1878
1883};
1884
1885// 197154 - Glide
1887{
1888 bool Validate(SpellInfo const* /*spellInfo*/) override
1889 {
1891 }
1892
1893 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
1894 {
1896 }
1897
1902};
1903
1904// 1226019 - Reap
1906{
1907 bool Validate(SpellInfo const* /*spellInfo*/) override
1908 {
1910 }
1911
1919
1924};
1925
1926// 339895 - Repeat Decree (attached to 307046 - Elysian Decree and 389860 - Sigil of Spite)
1928{
1929 bool Validate(SpellInfo const* /*spellInfo*/) override
1930 {
1932 }
1933
1934 bool Load() override
1935 {
1937 }
1938
1943};
1944
1945// Called by 162264 - Metamorphosis
1947{
1948 bool Validate(SpellInfo const* /*spellInfo*/) override
1949 {
1951 && sSpellCategoryStore.HasRecord(sSpellMgr->AssertSpellInfo(SPELL_DH_FEL_RUSH, DIFFICULTY_NONE)->ChargeCategoryId);
1952 }
1953
1954 bool Load() override
1955 {
1957 }
1958
1959 void OnRemove(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) const
1960 {
1961 Unit* target = GetTarget();
1962
1965 .TriggeringAura = aurEff
1966 });
1967
1968 target->GetSpellHistory()->RestoreCharge(sSpellMgr->AssertSpellInfo(SPELL_DH_FEL_RUSH, GetCastDifficulty())->ChargeCategoryId);
1969 }
1970
1975};
1976
1977// 389729 - Retaliation (attached to 203819 - Demon Spikes)
2010
2011// 388116 - Shattered Destiny
2013{
2014 bool Validate(SpellInfo const* spellInfo) override
2015 {
2017 && ValidateSpellEffect({ { spellInfo->Id, EFFECT_1 } })
2018 && spellInfo->GetEffect(EFFECT_0).IsAura()
2019 && spellInfo->GetEffect(EFFECT_1).IsAura();
2020 }
2021
2022 bool CheckFurySpent(ProcEventInfo const& eventInfo)
2023 {
2024 Spell const* procSpell = eventInfo.GetProcSpell();
2025 if (!procSpell)
2026 return false;
2027
2029 return false;
2030
2031 _furySpent += procSpell->GetPowerTypeCostAmount(POWER_FURY).value_or(0);
2033 }
2034
2035 void HandleProc(ProcEventInfo const& /*eventInfo*/)
2036 {
2038 if (!metamorphosis)
2039 return;
2040
2041 int32 requiredFuryAmount = GetEffect(EFFECT_1)->GetAmountAsInt();
2042 metamorphosis->SetDuration(metamorphosis->GetDuration() + _furySpent / requiredFuryAmount * GetEffect(EFFECT_0)->GetAmountAsInt());
2043 _furySpent %= requiredFuryAmount;
2044 }
2045
2051
2052private:
2054};
2055
2056// 389824 - Shattered Restoration (attached to 202644, 228532, 178963, 210042, 203794 - Consume Soul)
2058{
2059 bool Validate(SpellInfo const* /*spellInfo*/) override
2060 {
2062 }
2063
2064 void CalculateHealingBonus(SpellEffectInfo const& /*spellEffectInfo*/, Unit const* /*victim*/, int32 const& /*healing*/, int32 const& /*flatMod*/, float& pctMod) const
2065 {
2066 if (AuraEffect* const shatteredRestoration = GetCaster()->GetAuraEffect(SPELL_DH_SHATTERED_RESTORATION, EFFECT_0))
2067 AddPct(pctMod, shatteredRestoration->GetAmount());
2068 }
2069
2074};
2075
2076// 178940 - Shattered Souls
2077// 204254 - Shattered Souls
2079{
2080public:
2081 spell_dh_shattered_souls(uint32 triggeredSpellId) : _triggeredSpellId(triggeredSpellId) { }
2082
2083 bool Validate(SpellInfo const* /*spellInfo*/) override
2084 {
2086 }
2087
2088 void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo) const
2089 {
2090 Unit* caster = eventInfo.GetActor();
2091 Unit* target = eventInfo.GetProcTarget();
2092
2093 if (!caster || !target)
2094 return;
2095
2097 }
2098
2103
2104private:
2106};
2107
2108// 1227619 - Shattered Souls
2110{
2111 bool Validate(SpellInfo const* /*spellInfo*/) override
2112 {
2115 }
2116
2117 static bool CheckProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& /*eventInfo*/)
2118 {
2119 return roll_chance(aurEff->GetAmount());
2120 }
2121
2122 static bool CheckReapSoulGatheringProc(AuraScript const&, AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo)
2123 {
2124 // Eradicate, Reap and Cull
2125 return eventInfo.GetSpellInfo()->IsAffected(SPELLFAMILY_DEMON_HUNTER, { 0x0, 0x0, 0x0, 0x40 });
2126 }
2127
2128 static void HandleProc(AuraScript const&, AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo)
2129 {
2131 }
2132
2133 static void HandleSoulsGathering(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
2134 {
2135 Unit* caster = eventInfo.GetActor();
2136 float range = eventInfo.GetSpellInfo()->GetMaxRange();
2137
2138 std::vector<AreaTrigger*> soulFragments = caster->GetAreaTriggers(SPELL_DH_SOUL_FRAGMENT_DEVOURER);
2139 Trinity::Containers::EraseIf(soulFragments, [caster, range](AreaTrigger const* at) { return !at->IsWithinDist(caster, range); });
2140 if (soulFragments.empty())
2141 return;
2142
2143 uint32 maxTargets = aurEff->GetAmountAsInt();
2144 if (soulFragments.size() > maxTargets)
2145 soulFragments.resize(maxTargets);
2146
2147 for (AreaTrigger* soulFragment : soulFragments)
2148 {
2149 caster->CastSpell(soulFragment->GetPosition(), SPELL_DH_CONSUME_SOUL_DEVOURER, CastSpellExtraArgsInit{
2151 .TriggeringSpell = eventInfo.GetProcSpell()
2152 });
2153 soulFragment->Remove();
2154 }
2155 }
2156
2164};
2165
2166// 1223450 - Shattered Souls
2187
2188// 209651 - Shattered Souls
2189// 210038 - Shatter Soul
2190// 1223445 - Shattered Souls
2191// 1223448 - Shattered Souls
2193{
2194public:
2195 spell_dh_shattered_souls_trigger(uint32 triggeredSpellId, uint32 triggeredSpellIdDemon)
2196 : _triggeredSpellId(triggeredSpellId), _triggeredSpellIdDemon(triggeredSpellIdDemon) { }
2197
2198 bool Validate(SpellInfo const* /*spellInfo*/) override
2199 {
2202 }
2203
2204 void HandleSoulFragment(SpellEffIndex /*effIndex*/) const
2205 {
2206 if (Unit* target = GetExplTargetUnit())
2207 target->CastSpell(GetHitDest()->GetPosition(), _triggeredSpellIdDemon && GetCaster()->GetCreatureType() == CREATURE_TYPE_DEMON ? _triggeredSpellIdDemon : _triggeredSpellId, CastSpellExtraArgsInit{
2209 .TriggeringSpell = GetSpell()
2210 });
2211 }
2212
2217
2218private:
2221};
2222
2223// 209693 - Shattered Souls, 209788 - Shattered Souls and 1223412 - Soul Fragment
2224// Id - 3680, 6659 and 36671
2225template<uint32 SpellId>
2227{
2229
2230 void OnUnitEnter(Unit* unit) override
2231 {
2233 at->Remove();
2234 }
2235
2236 void OnInitialize() override
2237 {
2238 if (Unit* caster = at->GetCaster())
2239 {
2240 if (caster->HasAura(SPELL_DH_SHATTERED_SOULS_VENGEANCE))
2242 else if (caster->HasAura(SPELL_DH_SHATTERED_SOULS_DEVOURER))
2244 }
2245 }
2246
2247 void OnRemove() override
2248 {
2249 if (Unit* caster = at->GetCaster())
2250 {
2251 caster->RemoveAuraFromStack(SPELL_DH_SOUL_FRAGMENT_COUNTER);
2252 caster->RemoveAuraFromStack(SPELL_DH_SOUL_FRAGMENTS_DEVOURER_COUNTER);
2253 }
2254 }
2255};
2256
2264
2265// 1234796 - Shift
2267{
2268 bool Validate(SpellInfo const* /*spellInfo*/) override
2269 {
2271 }
2272
2273 void HandleEffectDummy(SpellEffIndex /*effIndex*/) const
2274 {
2275 Unit* caster = GetCaster();
2276 WorldLocation const& target = *GetHitDest();
2277
2278 CastSpellExtraArgs args;
2280 args.TriggeringSpell = GetSpell();
2281
2282 caster->CastSpell(target, SPELL_DH_SHIFT_VISUAL_DEST, args);
2283 caster->CastSpell(target, SPELL_DH_SHIFT_CHARGE, args);
2284 }
2285
2290};
2291
2292// 207407 - Soul Carver
2294{
2295 bool Validate(SpellInfo const* spellInfo) override
2296 {
2297 return ValidateSpellEffect({ { spellInfo->Id, EFFECT_2 } })
2299 }
2300
2305
2310};
2311
2313{
2314 bool Validate(SpellInfo const* /*spellInfo*/) override
2315 {
2317 }
2318
2319 void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) const
2320 {
2321 if (Unit* caster = GetCaster())
2323 }
2324
2329};
2330
2331// 210788 - Soul Fragments
2333{
2334 bool Validate(SpellInfo const* /*spellInfo*/) override
2335 {
2337 }
2338
2339 bool Load() override
2340 {
2342 if (!seconds)
2343 return false;
2344
2345 _damagePerSecond.resize(seconds->GetAmountAsInt());
2346 return !_damagePerSecond.empty();
2347 }
2348
2349 static bool CheckProc(AuraScript const&, ProcEventInfo const& eventInfo)
2350 {
2351 return eventInfo.GetDamageInfo() != nullptr;
2352 }
2353
2354 void Update(AuraEffect* /*aurEff*/)
2355 {
2356 // Move backwards all datas by one from [23][0][0][0][0] -> [0][23][0][0][0]
2357 std::move_backward(_damagePerSecond.begin(), std::next(_damagePerSecond.begin(), std::ssize(_damagePerSecond) - 1), _damagePerSecond.end());
2358 _damagePerSecond[0] = 0;
2359 }
2360
2361 void HandleCalcAmount(AuraEffect const* /*aurEff*/, SpellEffectValue& amount, bool& canBeRecalculated)
2362 {
2363 canBeRecalculated = true;
2364 amount = std::reduce(_damagePerSecond.begin(), _damagePerSecond.end(), 0u);
2365 }
2366
2367 void HandleProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& eventInfo)
2368 {
2369 _damagePerSecond[0] += eventInfo.GetDamageInfo()->GetDamage();
2370 }
2371
2379
2380private:
2381 std::vector<uint32> _damagePerSecond;
2382};
2383
2384// 389711 - Soulmonger
2386{
2387 bool Validate(SpellInfo const* /*spellInfo*/) override
2388 {
2390 }
2391
2392 static bool CheckProc(AuraScript const&, ProcEventInfo const& eventInfo)
2393 {
2394 return eventInfo.GetActionTarget()->HealthAbovePctHealed(100, eventInfo.GetHealInfo()->GetHeal());
2395 }
2396
2397 static void HandleEffectProc(AuraScript const&, AuraEffect const* aurEff, ProcEventInfo const& eventInfo)
2398 {
2399 Unit* target = eventInfo.GetActionTarget();
2400 SpellEffectValue amount = eventInfo.GetHealInfo()->GetHeal();
2401 if (AuraEffect const* existingAbsorb = target->GetAuraEffect(SPELL_DH_SOULMONGER_ABSORB, EFFECT_0))
2402 amount += existingAbsorb->GetAmount();
2403
2404 amount = std::min(amount, SpellEffectValue(target->CountPctFromMaxHealth(aurEff->GetAmount())));
2405
2408 .TriggeringAura = aurEff,
2409 .SpellValueOverrides = { { SPELLVALUE_BASE_POINT0, amount } }
2410 });
2411 }
2412
2418};
2419
2420// 391166 - Soul Furnace
2422{
2423 bool Validate(SpellInfo const* /*spellInfo*/) override
2424 {
2426 }
2427
2428 void CalculateSpellMod(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
2429 {
2430 if (GetStackAmount() == GetAura()->CalcMaxStackAmount())
2431 {
2433 Remove();
2434 }
2435 }
2436
2441};
2442
2443// 339424 - Soul Furnace
2445{
2446 void CalculateSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod)
2447 {
2448 if (aurEff->GetAmountAsInt() == 10)
2449 {
2450 if (!spellMod)
2451 {
2453 static_cast<SpellPctModifierByClassMask*>(spellMod)->value = GetEffect(EFFECT_1)->GetAmount() + 1;
2454 }
2455 }
2456 }
2457
2462};
2463
2464// 395446 - Soul Sigils
2466{
2467 void HandleOnProc(AuraEffect const* aurEff, ProcEventInfo const& eventInfo) const
2468 {
2470 }
2471
2476};
2477
2478// 202138 - Sigil of Chains
2479// 204596 - Sigil of Flame
2480// 207684 - Sigil of Misery
2481// 202137 - Sigil of Silence
2482// 390163 - Sigil of Spite
2483template<uint32 TriggerSpellId, uint32 TriggerSpellId2 = 0>
2485{
2487
2488 void OnRemove() override
2489 {
2490 if (Unit* caster = at->GetCaster())
2491 {
2493 if constexpr (TriggerSpellId2 != 0)
2494 caster->CastSpell(at->GetPosition(), TriggerSpellId2, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR);
2495 }
2496 }
2497};
2498
2505
2506// 208673 - Sigil of Chains
2508{
2509 bool Validate(SpellInfo const* /*spellInfo*/) override
2510 {
2512 }
2513
2515 {
2516 if (WorldLocation const* loc = GetExplTargetDest())
2517 {
2519 GetHitUnit()->CastSpell(loc->GetPosition(), SPELL_DH_SIGIL_OF_CHAINS_GRIP, true);
2520 }
2521 }
2522
2527};
2528
2529// 204596 - Sigil of Flame
2531{
2532 bool Validate(SpellInfo const* /*spellInfo*/) override
2533 {
2535 }
2536
2537 void HandleEnergize(SpellEffIndex /*effIndex*/) const
2538 {
2539 Unit* caster = GetCaster();
2542 .TriggeringSpell = GetSpell()
2543 });
2544 }
2545
2550};
2551
2552// Called by 204598 - Sigil of Flame
2575
2576// Called by 198793 - Vengeful Retreat
2578{
2579 bool Validate(SpellInfo const* /*spellInfo*/) override
2580 {
2582 }
2583
2584 bool Load() override
2585 {
2587 }
2588
2596
2601};
2602
2603// 444931 - Unhindered Assault
2605{
2606 bool Validate(SpellInfo const* /*spellInfo*/) override
2607 {
2609 }
2610
2611 void HandleOnProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& /*eventInfo*/) const
2612 {
2614 }
2615
2620};
2621
2622// 198813 - Vengeful Retreat
2624{
2625 bool Validate(SpellInfo const* /*spellInfo*/) override
2626 {
2628 }
2629
2630 void HandleVengefulBonds(std::list<WorldObject*>& targets)
2631 {
2633 targets.clear();
2634 }
2635
2640};
2641
2642// 452409 - Violent Transformation
2644{
2649
2650 void HandleOnProc(AuraEffect const* /*aurEff*/, ProcEventInfo const& /*eventInfo*/) const
2651 {
2652 Unit* target = GetTarget();
2653 target->GetSpellHistory()->RestoreCharge(sSpellMgr->AssertSpellInfo(SPELL_DH_SIGIL_OF_FLAME, GetCastDifficulty())->ChargeCategoryId);
2654
2657 else
2658 target->GetSpellHistory()->RestoreCharge(sSpellMgr->AssertSpellInfo(SPELL_DH_IMMOLATION_AURA, GetCastDifficulty())->ChargeCategoryId);
2659 }
2660
2665};
2666
2667// 1245412 - Voidblade
2689
2690// 1241285 - Voidblade Charge
2711
2712// 1240202 - Voidglare Boon (attached to 473728 - Void Ray)
2714{
2715 bool Validate(SpellInfo const* /*spellInfo*/) override
2716 {
2718 }
2719
2720 bool Load() override
2721 {
2723 }
2724
2725 void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
2726 {
2727 if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE)
2728 return;
2729
2730 Unit* target = GetTarget();
2732 }
2733
2738};
2739
2740// 473728 - Void Ray
2742{
2743 bool Validate(SpellInfo const* /*spellInfo*/) override
2744 {
2746 }
2747
2748 void HandleEffectPeriodic(AuraEffect const* aurEff) const
2749 {
2750 if (Unit* caster = GetCaster())
2751 caster->CastSpell(nullptr, SPELL_DH_VOID_RAY_DAMAGE, CastSpellExtraArgsInit{
2753 .TriggeringAura = aurEff
2754 });
2755 }
2756
2761};
2762
2763// 179057 - Chaos Nova
2765{
2766 bool Validate(SpellInfo const* /*spellInfo*/) override
2767 {
2769 }
2770
2771 bool Load() override
2772 {
2774 }
2775
2776 void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
2777 {
2778 if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_DEATH)
2779 return;
2780
2781 if (Unit* caster = GetCaster())
2783 }
2784
2789};
2790
2792{
2852 RegisterSpellScriptWithArgs(spell_dh_shattered_souls, "spell_dh_shattered_souls_vengeance", SPELL_DH_SHATTER_SOUL);
2857 RegisterSpellScriptWithArgs(spell_dh_shattered_souls_trigger, "spell_dh_shattered_souls_vengeance_trigger_lesser", SPELL_DH_SHATTERED_SOUL, 0);
2885
2892
2893 // Havoc
2894
2895 /* Spells & Auras */
2896
2897 /* Auras */
2898
2900
2901 /* AreaTrigger */
2902
2903 /* Spells */
2904
2907
2908 // Vengeance
2910
2911 // Vengeance & Havoc
2912
2915
2916 // Soulbind conduits
2918}
AreaTriggerExitReason
Definition AreaTrigger.h:69
DB2Storage< SpellCategoryEntry > sSpellCategoryStore("SpellCategory.db2", &SpellCategoryLoadInfo::Instance)
@ DIFFICULTY_NONE
Definition DBCEnums.h:933
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:55
bool roll_chance(T chance)
Definition Random.h:55
#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
@ TARGET_UNIT_SRC_AREA_ENEMY
@ TARGET_UNIT_CASTER
@ SPELL_SCHOOL_MASK_FIRE
@ CREATURE_TYPE_DEMON
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_TRIGGER_SPELL
@ SPELL_EFFECT_CHARGE
@ SPELL_EFFECT_SCHOOL_DAMAGE
@ BASE_ATTACK
@ POWER_FURY
SpellCastResult
@ SPELL_FAILED_NOT_ON_GROUND
@ SPELL_FAILED_DONT_REPORT
@ SPELL_CAST_OK
@ 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:449
uint32 GetDamage() const
Definition Unit.h:452
void AddEventAtOffset(BasicEvent *event, Milliseconds offset)
uint32 GetHeal() const
Definition Unit.h:482
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:512
Unit * GetActionTarget() const
Definition Unit.h:500
Spell const * GetProcSpell() const
Definition Unit.h:514
SpellInfo const * GetSpellInfo() const
Definition Unit.cpp:281
DamageInfo * GetDamageInfo() const
Definition Unit.h:511
Unit * GetProcTarget() const
Definition Unit.h:501
Unit * GetActor() const
Definition Unit.h:499
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:588
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)
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:8790
Optional< int32 > GetPowerTypeCostAmount(Powers power) const
Definition Spell.cpp:8157
SpellCastResult prepare(SpellCastTargets const &targets, AuraEffect const *triggeredByAura=nullptr)
Definition Spell.cpp:3419
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:635
bool IsWithinMeleeRange(Unit const *obj) const
Definition Unit.h:710
void RemoveOwnedAura(AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3751
void SetHealth(uint64 val)
Definition Unit.cpp:9973
uint64 CountPctFromMaxHealth(float pct) const
Definition Unit.h:797
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3828
bool HealthAbovePctHealed(float pct, uint32 heal) const
Definition Unit.h:795
Aura * GetOwnedAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, Aura *except=nullptr) const
Definition Unit.cpp:3812
Unit * GetVehicleBase() const
Definition Unit.cpp:12111
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition Unit.cpp:4604
uint32 GetAuraCount(uint32 spellId) const
Definition Unit.cpp:4788
bool HasAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid caster=ObjectGuid::Empty) const
Definition Unit.cpp:4774
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4700
float GetUnitCriticalChanceDone(WeaponAttackType attackType) const
Definition Unit.cpp:2876
bool IsMounted() const
Definition Unit.h:912
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4804
SpellHistory * GetSpellHistory()
Definition Unit.h:1498
std::vector< AreaTrigger * > GetAreaTriggers(uint32 spellId) const
Definition Unit.cpp:5475
AuraApplication * GetAuraApplication(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraApplication *except=nullptr) const
Definition Unit.cpp:4646
bool IsFalling() const
Definition Unit.cpp:12939
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3974
ObjectGuid GetTarget() const
Definition Unit.h:1831
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2217
bool IsValidAssistTarget(WorldObject const *target, SpellInfo const *bySpell=nullptr) const
Definition Object.cpp:2482
EventProcessor m_Events
Definition Object.h:561
Position GetFirstCollisionPosition(float dist, float angle)
Definition Object.cpp:2762
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
Definition Object.cpp:496
void Register() override
Definition spell_dh.cpp:291
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:273
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:333
bool Validate(SpellInfo const *spellInfo) override
Definition spell_dh.cpp:328
void Register() override
Definition spell_dh.cpp:319
void HandleAfterRemove(AuraEffect const *aurEff, AuraEffectHandleModes) const
Definition spell_dh.cpp:310
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:300
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:371
void HandleHit(SpellEffIndex) const
Definition spell_dh.cpp:376
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:348
void Register() override
Definition spell_dh.cpp:362
void HandleEffectProc(AuraEffect const *, ProcEventInfo const &eventInfo)
Definition spell_dh.cpp:353
void Prepare(ProcEventInfo const &)
Definition spell_dh.cpp:436
bool Load() override
Definition spell_dh.cpp:403
void ChaosTheory() const
Definition spell_dh.cpp:408
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:393
void Register() override
Definition spell_dh.cpp:427
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:452
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:482
void Register() override
Definition spell_dh.cpp:510
void HandleAfterProc(ProcEventInfo &eventInfo)
Definition spell_dh.cpp:492
void HandleDummyTick(AuraEffect const *aurEff)
Definition spell_dh.cpp:497
bool CheckProc(ProcEventInfo &eventInfo)
Definition spell_dh.cpp:487
void HandleEffectPeriodic(AuraEffect const *aurEff) const
Definition spell_dh.cpp:567
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:562
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:524
void HandleFelDevastation() const
Definition spell_dh.cpp:542
void Register() override
Definition spell_dh.cpp:598
void HandleAfterCast() const
Definition spell_dh.cpp:590
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:585
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:607
void CalcHealingFromDamageTaken(SpellEffectInfo const &, Unit const *victim, int32 &, int32 &flatMod, float &) const
Definition spell_dh.cpp:612
void Register() override
Definition spell_dh.cpp:650
void UpdatePeriodic(AuraEffect const *aurEff) const
Definition spell_dh.cpp:644
void CalcAmount(AuraEffect const *, SpellEffectValue &amount, bool const &) const
Definition spell_dh.cpp:635
void Register() override
Definition spell_dh.cpp:673
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:660
void HandleDamage(SpellEffIndex) const
Definition spell_dh.cpp:665
static constexpr std::array< uint32, 5 > SigilSpellsIds
Definition spell_dh.cpp:682
void HandleEffectProc(AuraEffect const *aurEff, ProcEventInfo const &) const
Definition spell_dh.cpp:689
void Register() override
Definition spell_dh.cpp:698
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:684
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:743
void OnRemove(AuraEffect const *, AuraEffectHandleModes) const
Definition spell_dh.cpp:748
void OnRemove(AuraEffect const *, AuraEffectHandleModes) const
Definition spell_dh.cpp:774
void OnApply(AuraEffect const *, AuraEffectHandleModes) const
Definition spell_dh.cpp:768
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:763
bool Load() override
Definition spell_dh.cpp:712
void Register() override
Definition spell_dh.cpp:734
void HandleCycleOfHatred() const
Definition spell_dh.cpp:717
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:707
bool Load() override
Definition spell_dh.cpp:800
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:789
void Register() override
Definition spell_dh.cpp:829
void HandleEffectRemove(AuraEffect const *, AuraEffectHandleModes) const
Definition spell_dh.cpp:805
bool Validate(SpellInfo const *spellInfo) override
Definition spell_dh.cpp:838
void Absorb(AuraEffect const *, DamageInfo &dmgInfo, uint32 &absorbAmount) const
Definition spell_dh.cpp:849
void CalculateAmount(AuraEffect const *, SpellEffectValue &amount, bool &)
Definition spell_dh.cpp:843
void Register() override
Definition spell_dh.cpp:856
void HandleParryChance(WorldObject *&target) const
Definition spell_dh.cpp:901
bool Validate(SpellInfo const *spellInfo) override
Definition spell_dh.cpp:894
void Register() override
Definition spell_dh.cpp:907
void Register() override
Definition spell_dh.cpp:929
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:916
static void HandleProc(AuraScript const &, AuraEffect const *, ProcEventInfo const &procEvent)
Definition spell_dh.cpp:921
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:997
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:992
uint32 _transformSpellId
Definition spell_dh.cpp:983
void TriggerMetamorphosis() const
Definition spell_dh.cpp:950
spell_dh_demonic(uint32 transformSpellId)
Definition spell_dh.cpp:986
void Register() override
Definition spell_dh.cpp:978
bool Validate(SpellInfo const *) override
Definition spell_dh.cpp:938
bool Load() override
Definition spell_dh.cpp:945
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
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:265
@ SPELL_CATEGORY_DH_EYE_BEAM
Definition spell_dh.cpp:266
@ SPELL_CATEGORY_DH_BLADE_DANCE
Definition spell_dh.cpp:267
void AddSC_demon_hunter_spell_scripts()
DemonHunterSpells
Definition spell_dh.cpp:41
@ SPELL_DH_DEFLECTING_SPIKES
Definition spell_dh.cpp:83
@ SPELL_DH_RESTLESS_HUNTER_TALENT
Definition spell_dh.cpp:185
@ SPELL_DH_METAMORPHOSIS_DUMMY
Definition spell_dh.cpp:157
@ SPELL_DH_SHATTERED_SOUL_LESSER_LEFT
Definition spell_dh.cpp:200
@ SPELL_DH_FEL_RUSH_GROUND
Definition spell_dh.cpp:118
@ SPELL_DH_NEMESIS_ELEMENTALS
Definition spell_dh.cpp:171
@ SPELL_DH_VOID_METAMORPHOSIS_BUFF
Definition spell_dh.cpp:258
@ SPELL_DH_JAGGED_SPIKES
Definition spell_dh.cpp:151
@ SPELL_DH_CYCLE_OF_HATRED_TALENT
Definition spell_dh.cpp:77
@ SPELL_DH_INNER_DEMON_DAMAGE
Definition spell_dh.cpp:146
@ SPELL_DH_NEMESIS_DEMONS
Definition spell_dh.cpp:169
@ SPELL_DH_VOIDBLADE_DAMAGE
Definition spell_dh.cpp:255
@ SPELL_DH_REPEAT_DECREE_CONDUIT
Definition spell_dh.cpp:184
@ SPELL_DH_SIGIL_OF_SPITE
Definition spell_dh.cpp:229
@ SPELL_DH_SHATTERED_SOUL_LESSER_RIGHT
Definition spell_dh.cpp:199
@ SPELL_DH_FEL_FLAME_FORTIFICATION_MOD_DAMAGE
Definition spell_dh.cpp:115
@ SPELL_DH_SIGIL_OF_CHAINS_SNARE
Definition spell_dh.cpp:217
@ SPELL_DH_NEMESIS_ABERRATIONS
Definition spell_dh.cpp:166
@ SPELL_DH_DEMONIC_ORIGINS
Definition spell_dh.cpp:91
@ SPELL_DH_SHIFT_VISUAL_DEST
Definition spell_dh.cpp:211
@ SPELL_DH_ENDURING_TORMENT_BUFF
Definition spell_dh.cpp:98
@ SPELL_DH_BLADE_WARD
Definition spell_dh.cpp:48
@ SPELL_DH_CONSUME_SOUL_HAVOC_DEMON
Definition spell_dh.cpp:70
@ SPELL_DH_EYE_OF_LEOTHERAS_DMG
Definition spell_dh.cpp:104
@ SPELL_DH_DEMONIC_APPETITE_ENERGIZE
Definition spell_dh.cpp:90
@ SPELL_DH_MOMENT_OF_CRAVING_BUFF
Definition spell_dh.cpp:164
@ SPELL_DH_SHATTERED_SOUL
Definition spell_dh.cpp:194
@ SPELL_DH_METAMORPHOSIS_IMPACT_DAMAGE
Definition spell_dh.cpp:158
@ SPELL_DH_JAGGED_SPIKES_DMG
Definition spell_dh.cpp:152
@ SPELL_DH_CONSUME_SOUL_VENGEANCE_LESSER
Definition spell_dh.cpp:74
@ SPELL_DH_SHIFT_CHARGE
Definition spell_dh.cpp:212
@ SPELL_DH_INFERNAL_STRIKE_JUMP
Definition spell_dh.cpp:150
@ SPELL_DH_DEMON_SPIKES
Definition spell_dh.cpp:86
@ SPELL_DH_SIGIL_OF_CHAINS_GRIP
Definition spell_dh.cpp:214
@ SPELL_DH_FIERY_BRAND_RANK_2
Definition spell_dh.cpp:127
@ SPELL_DH_ELYSIAN_DECREE
Definition spell_dh.cpp:96
@ SPELL_DH_INNER_DEMON_TALENT
Definition spell_dh.cpp:147
@ SPELL_DH_SHATTERED_SOULS_HAVOC
Definition spell_dh.cpp:203
@ SPELL_DH_ANNIHILATION_MH
Definition spell_dh.cpp:44
@ SPELL_DH_TACTICAL_RETREAT_TALENT
Definition spell_dh.cpp:247
@ SPELL_DH_SOUL_CLEAVE
Definition spell_dh.cpp:233
@ SPELL_DH_METAMORPHOSIS
Definition spell_dh.cpp:155
@ SPELL_DH_DARKGLARE_BOON
Definition spell_dh.cpp:80
@ SPELL_DH_SIGIL_OF_CHAINS_VISUAL
Definition spell_dh.cpp:219
@ SPELL_DH_SIGIL_OF_FLAME_ENERGIZE
Definition spell_dh.cpp:222
@ SPELL_DH_SIGIL_OF_FLAME_AOE
Definition spell_dh.cpp:221
@ SPELL_DH_CONSUME_SOUL_VENGEANCE_SHATTERED
Definition spell_dh.cpp:75
@ SPELL_DH_COLLECTIVE_ANGUISH_EYE_BEAM
Definition spell_dh.cpp:65
@ SPELL_DH_NEMESIS_MECHANICALS
Definition spell_dh.cpp:174
@ SPELL_DH_REAP_DAMAGE
Definition spell_dh.cpp:183
@ SPELL_DH_SHATTERED_SOULS_HAVOC_LESSER_TRIGGER
Definition spell_dh.cpp:205
@ SPELL_DH_COLLECTIVE_ANGUISH
Definition spell_dh.cpp:64
@ SPELL_DH_GLIDE_KNOCKBACK
Definition spell_dh.cpp:139
@ SPELL_DH_SPIRIT_BOMB_VISUAL
Definition spell_dh.cpp:243
@ SPELL_DH_FEL_BARRAGE
Definition spell_dh.cpp:108
@ SPELL_DH_COLLECTIVE_ANGUISH_EYE_BEAM_DAMAGE
Definition spell_dh.cpp:66
@ SPELL_DH_SHATTERED_SOULS_V_SHATTERED_TRIGGER
Definition spell_dh.cpp:196
@ SPELL_DH_RAIN_OF_CHAOS_IMPACT
Definition spell_dh.cpp:180
@ SPELL_DH_CHAOS_NOVA
Definition spell_dh.cpp:55
@ SPELL_DH_FEL_BARRAGE_DMG
Definition spell_dh.cpp:109
@ SPELL_DH_RAIN_OF_CHAOS
Definition spell_dh.cpp:179
@ SPELL_DH_CHAOS_STRIKE_OH
Definition spell_dh.cpp:59
@ SPELL_DH_GLIDE_DURATION
Definition spell_dh.cpp:138
@ SPELL_DH_FELBLADE_COOLDOWN_RESET_PROC_VENGEANCE
Definition spell_dh.cpp:123
@ SPELL_DH_FELBLADE_COOLDOWN_RESET_PROC_VISUAL
Definition spell_dh.cpp:124
@ SPELL_DH_SIGIL_OF_SILENCE_AOE
Definition spell_dh.cpp:228
@ SPELL_DH_CHAOS_STRIKE_MH
Definition spell_dh.cpp:58
@ SPELL_DH_MOMENTUM
Definition spell_dh.cpp:162
@ SPELL_DH_BLUR_TRIGGER
Definition spell_dh.cpp:50
@ SPELL_DH_SHATTERED_RESTORATION
Definition spell_dh.cpp:190
@ SPELL_DH_FEL_RUSH
Definition spell_dh.cpp:116
@ SPELL_DH_VOID_RAY_DAMAGE
Definition spell_dh.cpp:259
@ SPELL_DH_SIGIL_OF_SPITE_AOE
Definition spell_dh.cpp:230
@ SPELL_DH_CHAOTIC_TRANSFORMATION
Definition spell_dh.cpp:62
@ SPELL_DH_METAMORPHOSIS_RESET
Definition spell_dh.cpp:159
@ SPELL_DH_SIGIL_OF_FLAME
Definition spell_dh.cpp:220
@ SPELL_DH_SPIRIT_BOMB_DAMAGE
Definition spell_dh.cpp:241
@ SPELL_DH_SHATTERED_SOUL_DEVOURER_LESSER_LEFT
Definition spell_dh.cpp:198
@ SPELL_DH_VENGEFUL_RETREAT
Definition spell_dh.cpp:252
@ SPELL_DH_SHATTERED_SOULS_DEVOURER_DUMMY
Definition spell_dh.cpp:202
@ SPELL_DH_SHEAR
Definition spell_dh.cpp:209
@ SPELL_DH_EYE_BEAM_DAMAGE
Definition spell_dh.cpp:103
@ SPELL_DH_SOUL_FURNACE_DAMAGE_BUFF
Definition spell_dh.cpp:239
@ SPELL_DH_FLAME_CRASH
Definition spell_dh.cpp:131
@ SPELL_DH_ILLIDANS_GRASP_JUMP_DEST
Definition spell_dh.cpp:143
@ SPELL_DH_STUDENT_OF_SUFFERING_TALENT
Definition spell_dh.cpp:244
@ SPELL_DH_CONSUME_ENERGIZE
Definition spell_dh.cpp:68
@ SPELL_DH_WAVE_OF_DEBILITATION_SLOW
Definition spell_dh.cpp:261
@ SPELL_DH_ANNIHILATION_OH
Definition spell_dh.cpp:45
@ SPELL_DH_PAINBRINGER_STACK
Definition spell_dh.cpp:177
@ SPELL_DH_SHATTERED_SOUL_DEVOURER_LESSER_RIGHT
Definition spell_dh.cpp:197
@ SPELL_DH_CHAOS_THEORY_CRIT
Definition spell_dh.cpp:61
@ SPELL_DH_VOIDGLARE_BOON_ENERGIZE
Definition spell_dh.cpp:256
@ SPELL_DH_FIERY_BRAND_DEBUFF_RANK_2
Definition spell_dh.cpp:129
@ SPELL_DH_SHATTER_SOUL_VENGEANCE_FRONT_RIGHT
Definition spell_dh.cpp:192
@ SPELL_DH_FURIOUS_THROWS
Definition spell_dh.cpp:135
@ SPELL_DH_SOUL_RENDING
Definition spell_dh.cpp:240
@ SPELL_DH_VOIDGLARE_BOON_TALENT
Definition spell_dh.cpp:257
@ SPELL_DH_FEL_DEVASTATION_DMG
Definition spell_dh.cpp:112
@ SPELL_DH_RAZOR_SPIKES
Definition spell_dh.cpp:181
@ SPELL_DH_SHATTER_SOUL_VENGEANCE_BACK_RIGHT
Definition spell_dh.cpp:193
@ SPELL_DH_SIGIL_OF_MISERY_AOE
Definition spell_dh.cpp:226
@ SPELL_DH_CULL_DAMAGE
Definition spell_dh.cpp:76
@ SPELL_DH_ERADICATE_DAMAGE_METAMORPHOSIS
Definition spell_dh.cpp:100
@ SPELL_DH_INNER_DEMON_BUFF
Definition spell_dh.cpp:145
@ SPELL_DH_ANNIHILATION
Definition spell_dh.cpp:43
@ SPELL_DH_ILLIDANS_GRASP_DAMAGE
Definition spell_dh.cpp:142
@ SPELL_DH_AWAKEN_THE_DEMON_WITHIN_CD
Definition spell_dh.cpp:47
@ SPELL_DH_VENGEANCE_DEMON_HUNTER
Definition spell_dh.cpp:250
@ SPELL_DH_METAMORPHOSIS_DEVOURER_TRANSFORM
Definition spell_dh.cpp:156
@ SPELL_DH_FEL_RUSH_WATER_AIR
Definition spell_dh.cpp:119
@ SPELL_DH_NEMESIS_UNDEAD
Definition spell_dh.cpp:175
@ SPELL_DH_SHATTERED_SOULS_HAVOC_SHATTERED_TRIGGER
Definition spell_dh.cpp:206
@ SPELL_DH_FELBLADE_CHARGE
Definition spell_dh.cpp:121
@ SPELL_DH_SOUL_FRAGMENTS_DAMAGE_TAKEN_TRACKER
Definition spell_dh.cpp:238
@ SPELL_DH_DEMONS_BITE
Definition spell_dh.cpp:95
@ SPELL_DH_EYE_BEAM
Definition spell_dh.cpp:102
@ SPELL_DH_DARKNESS_ABSORB
Definition spell_dh.cpp:82
@ SPELL_DH_JAGGED_SPIKES_PROC
Definition spell_dh.cpp:153
@ SPELL_DH_RETALIATION_TALENT
Definition spell_dh.cpp:187
@ SPELL_DH_ABYSSAL_STRIKE
Definition spell_dh.cpp:42
@ SPELL_DH_MOMENT_OF_CRAVING_TALENT
Definition spell_dh.cpp:163
@ SPELL_DH_SOUL_FRAGMENT_COUNTER
Definition spell_dh.cpp:235
@ SPELL_DH_IMMOLATION_AURA
Definition spell_dh.cpp:144
@ SPELL_DH_METAMORPHOSIS_VENGEANCE_TRANSFORM
Definition spell_dh.cpp:161
@ SPELL_DH_FURIOUS_GAZE_BUFF
Definition spell_dh.cpp:134
@ SPELL_DH_SIGIL_OF_CHAINS
Definition spell_dh.cpp:213
@ SPELL_DH_CALCIFIED_SPIKES_MOD_DAMAGE
Definition spell_dh.cpp:54
@ SPELL_DH_DEMONIC_APPETITE
Definition spell_dh.cpp:89
@ SPELL_DH_PAINBRINGER_DUMMY
Definition spell_dh.cpp:176
@ SPELL_DH_SIGIL_OF_FLAME_VISUAL
Definition spell_dh.cpp:224
@ SPELL_DH_FELBLADE
Definition spell_dh.cpp:120
@ SPELL_DH_FIRST_BLOOD
Definition spell_dh.cpp:130
@ SPELL_DH_FELBLADE_DAMAGE
Definition spell_dh.cpp:125
@ SPELL_DH_CONSUME_SOUL_DEVOURER
Definition spell_dh.cpp:69
@ SPELL_DH_FEL_BARRAGE_PROC
Definition spell_dh.cpp:110
@ SPELL_DH_BLUR
Definition spell_dh.cpp:49
@ SPELL_DH_FEL_RUSH_DMG
Definition spell_dh.cpp:117
@ SPELL_DH_INFERNAL_STRIKE_IMPACT_DAMAGE
Definition spell_dh.cpp:149
@ SPELL_DH_VENGEFUL_BONDS
Definition spell_dh.cpp:251
@ SPELL_DH_ELYSIAN_DECREE_AOE
Definition spell_dh.cpp:97
@ SPELL_DH_DEMONIC_ORIGINS_BUFF
Definition spell_dh.cpp:92
@ SPELL_DH_MONSTER_RISING_AGILITY
Definition spell_dh.cpp:165
@ SPELL_DH_SHATTERED_SOULS_HAVOC_DEMON_TRIGGER
Definition spell_dh.cpp:204
@ SPELL_DH_NEMESIS_BEASTS
Definition spell_dh.cpp:167
@ SPELL_DH_FEED_THE_DEMON
Definition spell_dh.cpp:107
@ SPELL_DH_SHATTERED_SOULS_V_DEMON_TRIGGER
Definition spell_dh.cpp:195
@ SPELL_DH_SOUL_CLEAVE_DMG
Definition spell_dh.cpp:234
@ SPELL_DH_DARKGLARE_BOON_ENERGIZE
Definition spell_dh.cpp:81
@ SPELL_DH_RAIN_FROM_ABOVE
Definition spell_dh.cpp:178
@ SPELL_DH_SOUL_BARRIER
Definition spell_dh.cpp:232
@ SPELL_DH_METAMORPHOSIS_TRANSFORM
Definition spell_dh.cpp:160
@ SPELL_DH_ERADICATE_DAMAGE
Definition spell_dh.cpp:99
@ SPELL_DH_SOULMONGER_ABSORB
Definition spell_dh.cpp:231
@ SPELL_DH_FEL_FLAME_FORTIFICATION_TALENT
Definition spell_dh.cpp:114
@ SPELL_DH_HAVOC_MASTERY
Definition spell_dh.cpp:140
@ SPELL_DH_SHATTER_SOUL
Definition spell_dh.cpp:191
@ SPELL_DH_VOIDBLADE_CHARGE
Definition spell_dh.cpp:254
@ SPELL_DH_CHAOS_THEORY_TALENT
Definition spell_dh.cpp:60
@ SPELL_DH_STUDENT_OF_SUFFERING_AURA
Definition spell_dh.cpp:245
@ SPELL_DH_CALCIFIED_SPIKES_TALENT
Definition spell_dh.cpp:53
@ SPELL_DH_DEMONIC
Definition spell_dh.cpp:88
@ SPELL_DH_SPIRIT_BOMB_HEAL
Definition spell_dh.cpp:242
@ SPELL_DH_NEMESIS_HUMANOIDS
Definition spell_dh.cpp:173
@ SPELL_DH_ESSENCE_BREAK_DEBUFF
Definition spell_dh.cpp:101
@ SPELL_DH_DEMONIC_TRAMPLE_STUN
Definition spell_dh.cpp:94
@ SPELL_DH_DEMON_SPIKES_TRIGGER
Definition spell_dh.cpp:87
@ SPELL_DH_REAP
Definition spell_dh.cpp:182
@ SPELL_DH_SIGIL_OF_CHAINS_SLOW
Definition spell_dh.cpp:216
@ SPELL_DH_NEMESIS_CRITTERS
Definition spell_dh.cpp:168
@ SPELL_DH_SIGIL_OF_FLAME_FLAME_CRASH
Definition spell_dh.cpp:223
@ SPELL_DH_FEAST_OF_SOULS
Definition spell_dh.cpp:105
@ SPELL_DH_CYCLE_OF_HATRED_COOLDOWN_REDUCTION
Definition spell_dh.cpp:78
@ SPELL_DH_SHEAR_PASSIVE
Definition spell_dh.cpp:210
@ SPELL_DH_FEL_DEVASTATION_HEAL
Definition spell_dh.cpp:113
@ SPELL_DH_WAVE_OF_DEBILITATION_TALENT
Definition spell_dh.cpp:260
@ SPELL_DH_SIGIL_OF_SILENCE
Definition spell_dh.cpp:227
@ SPELL_DH_GLAIVE_TEMPEST
Definition spell_dh.cpp:136
@ SPELL_DH_INFERNAL_STRIKE_CAST
Definition spell_dh.cpp:148
@ SPELL_DH_VENGEFUL_RETREAT_TRIGGER
Definition spell_dh.cpp:253
@ 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:172
@ SPELL_DH_DEMON_BLADES_DMG
Definition spell_dh.cpp:84
@ SPELL_DH_ILLIDANS_GRASP
Definition spell_dh.cpp:141
@ SPELL_DH_BURNING_ALIVE
Definition spell_dh.cpp:51
@ SPELL_DH_FRAILTY
Definition spell_dh.cpp:132
@ SPELL_DH_CONSUME_SOUL_VENGEANCE_DEMON
Definition spell_dh.cpp:73
@ SPELL_DH_SIGIL_OF_CHAINS_JUMP
Definition spell_dh.cpp:215
@ SPELL_DH_CONSUME_SOUL_HAVOC_LESSER
Definition spell_dh.cpp:71
@ SPELL_DH_SOUL_FRAGMENTS_DEVOURER_COUNTER
Definition spell_dh.cpp:237
@ SPELL_DH_SOUL_FRAGMENT_DEVOURER
Definition spell_dh.cpp:236
@ SPELL_DH_SHATTERED_SOULS_VENGEANCE
Definition spell_dh.cpp:208
@ SPELL_DH_GLIDE
Definition spell_dh.cpp:137
@ SPELL_DH_CHARRED_WARBLADES_HEAL
Definition spell_dh.cpp:63
@ SPELL_DH_SIGIL_OF_MISERY
Definition spell_dh.cpp:225
@ SPELL_DH_FURIOUS_GAZE
Definition spell_dh.cpp:133
@ SPELL_DH_FELBLADE_COOLDOWN_RESET_PROC_HAVOC
Definition spell_dh.cpp:122
@ SPELL_DH_ARMY_UNTO_ONESELF
Definition spell_dh.cpp:46
@ SPELL_DH_SHATTERED_SOULS_MARKER
Definition spell_dh.cpp:207
@ SPELL_DH_FIERY_BRAND
Definition spell_dh.cpp:126
@ SPELL_DH_DEMON_MUZZLE_PROC
Definition spell_dh.cpp:85
@ SPELL_DH_COLLECTIVE_ANGUISH_FEL_DEVASTATION
Definition spell_dh.cpp:67
@ SPELL_DH_FEAST_OF_SOULS_PERIODIC_HEAL
Definition spell_dh.cpp:106
@ SPELL_DH_MANA_RIFT_DMG_POWER_BURN
Definition spell_dh.cpp:154
@ SPELL_DH_THROW_GLAIVE
Definition spell_dh.cpp:248
@ SPELL_DH_RESTLESS_HUNTER_BUFF
Definition spell_dh.cpp:186
@ SPELL_DH_NEMESIS_DRAGONKIN
Definition spell_dh.cpp:170
@ SPELL_DH_RETALIATION_PROC
Definition spell_dh.cpp:188
@ SPELL_DH_SIGIL_OF_CHAINS_TARGET_SELECT
Definition spell_dh.cpp:218
@ SPELL_DH_FIERY_BRAND_DEBUFF_RANK_1
Definition spell_dh.cpp:128
@ SPELL_DH_CYCLE_OF_HATRED_REMOVE_STACKS
Definition spell_dh.cpp:79
@ SPELL_DH_CONSUME_SOUL_HAVOC_SHATTERED
Definition spell_dh.cpp:72
@ SPELL_DH_TACTICAL_RETREAT_ENERGIZE
Definition spell_dh.cpp:246
@ SPELL_DH_SHATTERED_SOULS_DEVOURER
Definition spell_dh.cpp:201
@ SPELL_DH_DEMONIC_TRAMPLE_DMG
Definition spell_dh.cpp:93
@ SPELL_DH_CHAOS_STRIKE
Definition spell_dh.cpp:56
@ SPELL_DH_FEL_DEVASTATION
Definition spell_dh.cpp:111
@ SPELL_DH_UNCONTAINED_FEL
Definition spell_dh.cpp:249
@ SPELL_DH_SEVER
Definition spell_dh.cpp:189
TriggerCastFlags TriggerFlags
Spell const * TriggeringSpell
CastSpellExtraArgs & SetTriggeringSpell(Spell const *triggeringSpell)
Definition Spell.cpp:9707
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:867
void OnUnitEnter(Unit *unit) override
Definition spell_dh.cpp:870
void OnUnitExit(Unit *unit, AreaTriggerExitReason) override
Definition spell_dh.cpp:882
SpellInfo const * _absorbAuraInfo
Definition spell_dh.cpp:888
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