315 .TriggeringAura = aurEff
336 damagePctTaken->ChangeAmount(damagePctTaken->GetAmount() + 1);
504 .SetTriggeringAura(aurEff)
572 .TriggeringAura = aurEff
615 if (!damageTakenTracker)
640 amount =
CalculatePct(critChanceDone, amountHolder->GetAmount());
647 bonus->RecalculateAmount(aurEff);
751 aura->SetStackAmount(1);
924 .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR,
925 .TriggeringSpell = procEvent.GetProcSpell()
961 aura->SetMaxDuration(aura->GetDuration() + duration);
962 aura->SetDuration(aura->GetMaxDuration());
1072 std::span<DemonHunterSpells const> spells =
HavocSpells;
1081 for (
int32 i = 0; i < count; ++i)
1108 .TriggeringAura = aurEff
1127 template <ChrSpecialization Spec>
1130 if (
GetCaster()->ToPlayer()->GetPrimarySpecialization() !=
Spec)
1225 if (!targets.Targets)
1228 targets.Targets->Update(caster);
1253 .TriggeringAura = aurEff
1303 .TriggeringAura = aurEff
1331 .TriggeringAura = aurEff,
1332 .OriginalCastId = aurEff->
GetBase()->GetCastId()
1473 .TriggeringAura = aurEff
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);
1500 task.
Repeat(duration_cast<Milliseconds>(period));
1579 amount =
CalculatePct(critChanceDone, amountHolder->GetAmount());
1586 bonus->RecalculateAmount(aurEff);
1681 .TriggeringAura = aurEff
1730 .TriggeringAura = aurEff
1763 if (targetList.empty())
1774 if (targetList.size() > 1 && !selectedTarget.
IsEmpty())
1776 auto it = std::find_if(targetList.begin(), targetList.end(), [selectedTarget](
WorldObject*
object)
1778 return object->GetGUID() == selectedTarget;
1780 if (it != targetList.end())
1781 firstTargetGUID = (*it)->GetGUID();
1784 if (firstTargetGUID.
IsEmpty())
1785 firstTargetGUID = targetList.front()->GetGUID();
1788 script->SetFirstTarget(firstTargetGUID);
1814 if (
GetHitUnit()->GetGUID() == script->GetFirstTarget())
1815 AddPct(damage, aurEff->GetAmount());
1965 .TriggeringAura = aurEff
1995 .TriggeringAura = aurEff
2067 AddPct(pctMod, shatteredRestoration->GetAmount());
2093 if (!caster || !target)
2140 if (soulFragments.empty())
2144 if (soulFragments.size() > maxTargets)
2145 soulFragments.resize(maxTargets);
2153 soulFragment->Remove();
2225template<u
int32 SpellId>
2363 canBeRecalculated =
true;
2402 amount += existingAbsorb->GetAmount();
2408 .TriggeringAura = aurEff,
2483template<u
int32 TriggerSpellId, u
int32 TriggerSpellId2 = 0>
2493 if constexpr (TriggerSpellId2 != 0)
2753 .TriggeringAura = aurEff
DB2Storage< SpellCategoryEntry > sSpellCategoryStore("SpellCategory.db2", &SpellCategoryLoadInfo::Instance)
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
std::chrono::duration< double, Seconds::period > FloatSeconds
std::chrono::duration< double, Milliseconds::period > FloatMilliseconds
float frand(float min, float max)
bool roll_chance(T chance)
#define RegisterSpellAndAuraScriptPair(script_1, script_2)
#define RegisterAreaTriggerAI(ai_name)
#define RegisterSpellScript(spell_script)
#define RegisterSpellScriptWithArgs(spell_script, script_name,...)
@ TARGET_UNIT_SRC_AREA_ENEMY
@ SPELL_EFFECT_TRIGGER_SPELL
@ SPELL_EFFECT_SCHOOL_DAMAGE
@ SPELL_FAILED_NOT_ON_GROUND
@ SPELL_FAILED_DONT_REPORT
@ SPELLFAMILY_DEMON_HUNTER
@ AURA_EFFECT_HANDLE_REAL_OR_REAPPLY_MASK
@ AURA_EFFECT_HANDLE_REAL
@ 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_MOD_CRIT_DAMAGE_BONUS
@ SPELL_AURA_SCHOOL_ABSORB
@ SPELL_AURA_PERIODIC_DUMMY
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
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.
#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 AuraEffectAbsorbFn(F, I)
#define AuraEffectApplyFn(F, I, N, M)
#define AuraEffectAbsorbOverkillFn(F, I)
#define AuraCheckProcFn(F)
#define AuraEffectCalcSpellModFn(F, I, N)
#define SpellCalcHealingFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
T CalculatePct(T base, U pct)
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
int32 GetAmountAsInt() 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
HookList< EffectUpdatePeriodicHandler > OnEffectUpdatePeriodic
HookList< EffectCalcSpellModHandler > DoEffectCalcSpellMod
SpellEffectInfo const & GetEffectInfo(SpellEffIndex effIndex) const
AuraEffect * GetEffect(uint8 effIndex) const
HookList< EffectAbsorbHandler > OnEffectAbsorb
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
void DropChargeDelayed(uint32 delay, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
bool HasEffect(uint8 effIndex) const
int32 GetDuration() const
AuraEffect * GetEffect(uint32 index) const
void SetDuration(int32 duration, bool withMods=false)
Script * GetScript() const
SpellSchoolMask GetSchoolMask() const
void AddEventAtOffset(BasicEvent *event, Milliseconds offset)
static ObjectGuid const Empty
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
Unit * GetActionTarget() const
Spell const * GetProcSpell() const
SpellInfo const * GetSpellInfo() const
DamageInfo * GetDamageInfo() const
Unit * GetProcTarget() const
void SetUnitTarget(Unit *target)
SpellEffectValue CalcValue(WorldObject const *caster=nullptr, SpellEffectValue const *basePoints=nullptr, Unit const *target=nullptr, float *variance=nullptr, uint32 castItemId=0, int32 itemLevel=-1) 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)
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
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
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
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
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
int32 GetChannelDuration() const
void SetSpellValue(CastSpellExtraArgsInit::SpellValueOverride const &value)
Optional< int32 > GetPowerTypeCostAmount(Powers power) const
SpellCastResult prepare(SpellCastTargets const &targets, AuraEffect const *triggeredByAura=nullptr)
SpellCastVisual m_SpellVisual
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...
bool IsWithinMeleeRange(Unit const *obj) const
void RemoveOwnedAura(AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
void SetHealth(uint64 val)
uint64 CountPctFromMaxHealth(float pct) const
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
bool HealthAbovePctHealed(float pct, uint32 heal) const
Aura * GetOwnedAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, Aura *except=nullptr) const
Unit * GetVehicleBase() const
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
uint32 GetAuraCount(uint32 spellId) const
bool HasAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid caster=ObjectGuid::Empty) const
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
float GetUnitCriticalChanceDone(WeaponAttackType attackType) const
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
SpellHistory * GetSpellHistory()
std::vector< AreaTrigger * > GetAreaTriggers(uint32 spellId) const
AuraApplication * GetAuraApplication(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraApplication *except=nullptr) const
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
ObjectGuid GetTarget() const
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
bool IsValidAssistTarget(WorldObject const *target, SpellInfo const *bySpell=nullptr) const
Position GetFirstCollisionPosition(float dist, float angle)
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) const
void ApplyBladeWard() const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void DecideFirstTarget(std::list< WorldObject * > &targetList)
void HandlePeriodic(AuraEffect const *) const
bool Validate(SpellInfo const *spellInfo) override
void HandleAfterRemove(AuraEffect const *aurEff, AuraEffectHandleModes) const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleHit(SpellEffIndex) const
bool Validate(SpellInfo const *) override
void HandleEffectProc(AuraEffect const *, ProcEventInfo const &eventInfo)
void Prepare(ProcEventInfo const &)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleAfterProc(ProcEventInfo &eventInfo)
void HandleDummyTick(AuraEffect const *aurEff)
bool CheckProc(ProcEventInfo &eventInfo)
void HandleEffectPeriodic(AuraEffect const *aurEff) const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleEyeBeam() const
void HandleFelDevastation() const
void HandleAfterCast() const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void CalcHealingFromDamageTaken(SpellEffectInfo const &, Unit const *victim, int32 &, int32 &flatMod, float &) const
void UpdatePeriodic(AuraEffect const *aurEff) const
void CalcAmount(AuraEffect const *, SpellEffectValue &amount, bool const &) const
bool Validate(SpellInfo const *) override
void HandleDamage(SpellEffIndex) const
static constexpr std::array< uint32, 5 > SigilSpellsIds
void HandleEffectProc(AuraEffect const *aurEff, ProcEventInfo const &) const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void OnRemove(AuraEffect const *, AuraEffectHandleModes) const
void OnRemove(AuraEffect const *, AuraEffectHandleModes) const
void OnApply(AuraEffect const *, AuraEffectHandleModes) const
bool Validate(SpellInfo const *) override
void HandleCycleOfHatred() const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleEffectRemove(AuraEffect const *, AuraEffectHandleModes) const
bool Validate(SpellInfo const *spellInfo) override
void Absorb(AuraEffect const *, DamageInfo &dmgInfo, uint32 &absorbAmount) const
void CalculateAmount(AuraEffect const *, SpellEffectValue &amount, bool &)
void HandleParryChance(WorldObject *&target) const
bool Validate(SpellInfo const *spellInfo) override
bool Validate(SpellInfo const *) override
static void HandleProc(AuraScript const &, AuraEffect const *, ProcEventInfo const &procEvent)
void HandleArmor(SpellEffIndex)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
static void ShatterLesserSoulFragment(AuraScript const &, ProcEventInfo const &procEvent)
bool Validate(SpellInfo const *) override
void TriggerMetamorphosis() const
spell_dh_demonic(uint32 transformSpellId)
bool Validate(SpellInfo const *) override
spell_dh_elysian_decree(uint32 primarySpellId)
int32 _maxFragmentsToCreate
bool Validate(SpellInfo const *) override
void CreateLesserSoulFragments(SpellEffIndex effIndex)
void PreventEffect(WorldObject *&target) const
bool Validate(SpellInfo const *) override
void HandlePeriodic(AuraEffect const *aurEff) const
bool Validate(SpellInfo const *) override
void HandleDamage(SpellEffIndex) const
void HandleDebuff(SpellEffIndex) const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleEffectPeriodic(AuraEffect const *aurEff) const
bool Validate(SpellInfo const *) 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 HandleDamage(SpellEffIndex) const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleProc(AuraEffect const *, ProcEventInfo const &) const
bool Validate(SpellInfo const *) override
void HandleCharge(SpellEffIndex) const
bool Validate(SpellInfo const *) override
void HandleDamage(SpellEffIndex) const
ObjectGuid const & GetFirstTarget() const
ObjectGuid _firstTargetGUID
void SetFirstTarget(ObjectGuid const &targetGuid)
bool Validate(SpellInfo const *) override
void HandleAfterRemove(AuraEffect const *aurEff, AuraEffectHandleModes) const
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
SpellCastResult CheckCast()
bool Validate(SpellInfo const *) override
void OnApply(AuraEffect const *, AuraEffectHandleModes) const
bool Validate(SpellInfo const *) override
void UpdatePeriodic(AuraEffect const *aurEff) const
void CalcAmount(AuraEffect const *, SpellEffectValue &amount, bool const &) const
void HandleAbsorb(AuraEffect const *, DamageInfo const &, uint32 &absorbAmount)
bool Validate(SpellInfo const *spellInfo) override
bool Validate(SpellInfo const *) override
void HandleAfterRemove(AuraEffect const *, AuraEffectHandleModes) const
bool Validate(SpellInfo const *) 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 HandleProc(ProcEventInfo const &eventInfo) const
bool Validate(SpellInfo const *) override
void HandleDamage(SpellEffIndex) const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void OnRemove(AuraEffect const *aurEff, AuraEffectHandleModes) const
bool Validate(SpellInfo const *) 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
uint32 _triggeredSpellIdDemon
void HandleProc(AuraEffect const *, ProcEventInfo const &eventInfo) const
spell_dh_shattered_souls(uint32 triggeredSpellId)
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleEffectDummy(SpellEffIndex) const
bool Validate(SpellInfo const *) override
void HandleEffectHitTarget(SpellEffIndex)
void HandleEnergize(SpellEffIndex) const
bool Validate(SpellInfo const *) override
bool Validate(SpellInfo const *) override
void HandleEffectPeriodic(AuraEffect const *) const
bool Validate(SpellInfo const *spellInfo) override
void HandleSoulFragments(SpellEffIndex) const
void HandleCalcAmount(AuraEffect const *, SpellEffectValue &amount, bool &canBeRecalculated)
std::vector< uint32 > _damagePerSecond
void Update(AuraEffect *)
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)
bool Validate(SpellInfo const *) override
void CalculateSpellMod(AuraEffect const *, AuraEffectHandleModes)
void HandleOnProc(AuraEffect const *aurEff, ProcEventInfo const &eventInfo) const
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 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 HandleEffectPeriodic(AuraEffect const *aurEff) const
bool Validate(SpellInfo const *) override
void HandleDamage(SpellEffIndex) const
bool Validate(SpellInfo const *) override
void HandleCharge(SpellEffIndex) const
bool Validate(SpellInfo const *) override
void HandleEffectRemove(AuraEffect const *, AuraEffectHandleModes) const
void OnRemove(AuraEffect const *, AuraEffectHandleModes)
bool Validate(SpellInfo const *) override
constexpr void EraseIf(Container &c, Predicate p)
auto SelectRandomContainerElement(C const &container) -> std::add_const_t< decltype(*std::ranges::begin(container))> &
DemonHunterSpellCategories
@ SPELL_CATEGORY_DH_EYE_BEAM
@ SPELL_CATEGORY_DH_BLADE_DANCE
void AddSC_demon_hunter_spell_scripts()
@ SPELL_DH_DEFLECTING_SPIKES
@ SPELL_DH_RESTLESS_HUNTER_TALENT
@ SPELL_DH_METAMORPHOSIS_DUMMY
@ SPELL_DH_SHATTERED_SOUL_LESSER_LEFT
@ SPELL_DH_FEL_RUSH_GROUND
@ SPELL_DH_NEMESIS_ELEMENTALS
@ SPELL_DH_VOID_METAMORPHOSIS_BUFF
@ SPELL_DH_CYCLE_OF_HATRED_TALENT
@ SPELL_DH_INNER_DEMON_DAMAGE
@ SPELL_DH_NEMESIS_DEMONS
@ SPELL_DH_VOIDBLADE_DAMAGE
@ SPELL_DH_REPEAT_DECREE_CONDUIT
@ SPELL_DH_SIGIL_OF_SPITE
@ SPELL_DH_SHATTERED_SOUL_LESSER_RIGHT
@ SPELL_DH_FEL_FLAME_FORTIFICATION_MOD_DAMAGE
@ SPELL_DH_SIGIL_OF_CHAINS_SNARE
@ SPELL_DH_NEMESIS_ABERRATIONS
@ SPELL_DH_DEMONIC_ORIGINS
@ SPELL_DH_SHIFT_VISUAL_DEST
@ SPELL_DH_ENDURING_TORMENT_BUFF
@ SPELL_DH_CONSUME_SOUL_HAVOC_DEMON
@ SPELL_DH_EYE_OF_LEOTHERAS_DMG
@ SPELL_DH_DEMONIC_APPETITE_ENERGIZE
@ SPELL_DH_MOMENT_OF_CRAVING_BUFF
@ SPELL_DH_SHATTERED_SOUL
@ SPELL_DH_METAMORPHOSIS_IMPACT_DAMAGE
@ SPELL_DH_JAGGED_SPIKES_DMG
@ SPELL_DH_CONSUME_SOUL_VENGEANCE_LESSER
@ SPELL_DH_INFERNAL_STRIKE_JUMP
@ SPELL_DH_SIGIL_OF_CHAINS_GRIP
@ SPELL_DH_FIERY_BRAND_RANK_2
@ SPELL_DH_ELYSIAN_DECREE
@ SPELL_DH_INNER_DEMON_TALENT
@ SPELL_DH_SHATTERED_SOULS_HAVOC
@ SPELL_DH_ANNIHILATION_MH
@ SPELL_DH_TACTICAL_RETREAT_TALENT
@ SPELL_DH_DARKGLARE_BOON
@ SPELL_DH_SIGIL_OF_CHAINS_VISUAL
@ SPELL_DH_SIGIL_OF_FLAME_ENERGIZE
@ SPELL_DH_SIGIL_OF_FLAME_AOE
@ SPELL_DH_CONSUME_SOUL_VENGEANCE_SHATTERED
@ SPELL_DH_COLLECTIVE_ANGUISH_EYE_BEAM
@ SPELL_DH_NEMESIS_MECHANICALS
@ SPELL_DH_SHATTERED_SOULS_HAVOC_LESSER_TRIGGER
@ SPELL_DH_COLLECTIVE_ANGUISH
@ SPELL_DH_GLIDE_KNOCKBACK
@ SPELL_DH_SPIRIT_BOMB_VISUAL
@ SPELL_DH_COLLECTIVE_ANGUISH_EYE_BEAM_DAMAGE
@ SPELL_DH_SHATTERED_SOULS_V_SHATTERED_TRIGGER
@ SPELL_DH_RAIN_OF_CHAOS_IMPACT
@ SPELL_DH_FEL_BARRAGE_DMG
@ SPELL_DH_CHAOS_STRIKE_OH
@ SPELL_DH_GLIDE_DURATION
@ SPELL_DH_FELBLADE_COOLDOWN_RESET_PROC_VENGEANCE
@ SPELL_DH_FELBLADE_COOLDOWN_RESET_PROC_VISUAL
@ SPELL_DH_SIGIL_OF_SILENCE_AOE
@ SPELL_DH_CHAOS_STRIKE_MH
@ SPELL_DH_SHATTERED_RESTORATION
@ SPELL_DH_VOID_RAY_DAMAGE
@ SPELL_DH_SIGIL_OF_SPITE_AOE
@ SPELL_DH_CHAOTIC_TRANSFORMATION
@ SPELL_DH_METAMORPHOSIS_RESET
@ SPELL_DH_SIGIL_OF_FLAME
@ SPELL_DH_SPIRIT_BOMB_DAMAGE
@ SPELL_DH_SHATTERED_SOUL_DEVOURER_LESSER_LEFT
@ SPELL_DH_VENGEFUL_RETREAT
@ SPELL_DH_SHATTERED_SOULS_DEVOURER_DUMMY
@ SPELL_DH_EYE_BEAM_DAMAGE
@ SPELL_DH_SOUL_FURNACE_DAMAGE_BUFF
@ SPELL_DH_ILLIDANS_GRASP_JUMP_DEST
@ SPELL_DH_STUDENT_OF_SUFFERING_TALENT
@ SPELL_DH_CONSUME_ENERGIZE
@ SPELL_DH_WAVE_OF_DEBILITATION_SLOW
@ SPELL_DH_ANNIHILATION_OH
@ SPELL_DH_PAINBRINGER_STACK
@ SPELL_DH_SHATTERED_SOUL_DEVOURER_LESSER_RIGHT
@ SPELL_DH_CHAOS_THEORY_CRIT
@ SPELL_DH_VOIDGLARE_BOON_ENERGIZE
@ SPELL_DH_FIERY_BRAND_DEBUFF_RANK_2
@ SPELL_DH_SHATTER_SOUL_VENGEANCE_FRONT_RIGHT
@ SPELL_DH_FURIOUS_THROWS
@ SPELL_DH_VOIDGLARE_BOON_TALENT
@ SPELL_DH_FEL_DEVASTATION_DMG
@ SPELL_DH_SHATTER_SOUL_VENGEANCE_BACK_RIGHT
@ SPELL_DH_SIGIL_OF_MISERY_AOE
@ SPELL_DH_ERADICATE_DAMAGE_METAMORPHOSIS
@ SPELL_DH_INNER_DEMON_BUFF
@ SPELL_DH_ILLIDANS_GRASP_DAMAGE
@ SPELL_DH_AWAKEN_THE_DEMON_WITHIN_CD
@ SPELL_DH_VENGEANCE_DEMON_HUNTER
@ SPELL_DH_METAMORPHOSIS_DEVOURER_TRANSFORM
@ SPELL_DH_FEL_RUSH_WATER_AIR
@ SPELL_DH_NEMESIS_UNDEAD
@ SPELL_DH_SHATTERED_SOULS_HAVOC_SHATTERED_TRIGGER
@ SPELL_DH_FELBLADE_CHARGE
@ SPELL_DH_SOUL_FRAGMENTS_DAMAGE_TAKEN_TRACKER
@ SPELL_DH_DARKNESS_ABSORB
@ SPELL_DH_JAGGED_SPIKES_PROC
@ SPELL_DH_RETALIATION_TALENT
@ SPELL_DH_ABYSSAL_STRIKE
@ SPELL_DH_MOMENT_OF_CRAVING_TALENT
@ SPELL_DH_SOUL_FRAGMENT_COUNTER
@ SPELL_DH_IMMOLATION_AURA
@ SPELL_DH_METAMORPHOSIS_VENGEANCE_TRANSFORM
@ SPELL_DH_FURIOUS_GAZE_BUFF
@ SPELL_DH_SIGIL_OF_CHAINS
@ SPELL_DH_CALCIFIED_SPIKES_MOD_DAMAGE
@ SPELL_DH_DEMONIC_APPETITE
@ SPELL_DH_PAINBRINGER_DUMMY
@ SPELL_DH_SIGIL_OF_FLAME_VISUAL
@ SPELL_DH_FELBLADE_DAMAGE
@ SPELL_DH_CONSUME_SOUL_DEVOURER
@ SPELL_DH_FEL_BARRAGE_PROC
@ SPELL_DH_INFERNAL_STRIKE_IMPACT_DAMAGE
@ SPELL_DH_VENGEFUL_BONDS
@ SPELL_DH_ELYSIAN_DECREE_AOE
@ SPELL_DH_DEMONIC_ORIGINS_BUFF
@ SPELL_DH_MONSTER_RISING_AGILITY
@ SPELL_DH_SHATTERED_SOULS_HAVOC_DEMON_TRIGGER
@ SPELL_DH_NEMESIS_BEASTS
@ SPELL_DH_FEED_THE_DEMON
@ SPELL_DH_SHATTERED_SOULS_V_DEMON_TRIGGER
@ SPELL_DH_SOUL_CLEAVE_DMG
@ SPELL_DH_DARKGLARE_BOON_ENERGIZE
@ SPELL_DH_RAIN_FROM_ABOVE
@ SPELL_DH_METAMORPHOSIS_TRANSFORM
@ SPELL_DH_ERADICATE_DAMAGE
@ SPELL_DH_SOULMONGER_ABSORB
@ SPELL_DH_FEL_FLAME_FORTIFICATION_TALENT
@ SPELL_DH_VOIDBLADE_CHARGE
@ SPELL_DH_CHAOS_THEORY_TALENT
@ SPELL_DH_STUDENT_OF_SUFFERING_AURA
@ SPELL_DH_CALCIFIED_SPIKES_TALENT
@ SPELL_DH_SPIRIT_BOMB_HEAL
@ SPELL_DH_NEMESIS_HUMANOIDS
@ SPELL_DH_ESSENCE_BREAK_DEBUFF
@ SPELL_DH_DEMONIC_TRAMPLE_STUN
@ SPELL_DH_DEMON_SPIKES_TRIGGER
@ SPELL_DH_SIGIL_OF_CHAINS_SLOW
@ SPELL_DH_NEMESIS_CRITTERS
@ SPELL_DH_SIGIL_OF_FLAME_FLAME_CRASH
@ SPELL_DH_FEAST_OF_SOULS
@ SPELL_DH_CYCLE_OF_HATRED_COOLDOWN_REDUCTION
@ SPELL_DH_FEL_DEVASTATION_HEAL
@ SPELL_DH_WAVE_OF_DEBILITATION_TALENT
@ SPELL_DH_SIGIL_OF_SILENCE
@ SPELL_DH_GLAIVE_TEMPEST
@ SPELL_DH_INFERNAL_STRIKE_CAST
@ SPELL_DH_VENGEFUL_RETREAT_TRIGGER
@ SPELL_DH_BURNING_ALIVE_TARGET_SELECTOR
@ SPELL_DH_CHAOS_STRIKE_ENERGIZE
@ SPELL_DH_NEMESIS_GIANTS
@ SPELL_DH_DEMON_BLADES_DMG
@ SPELL_DH_ILLIDANS_GRASP
@ SPELL_DH_CONSUME_SOUL_VENGEANCE_DEMON
@ SPELL_DH_SIGIL_OF_CHAINS_JUMP
@ SPELL_DH_CONSUME_SOUL_HAVOC_LESSER
@ SPELL_DH_SOUL_FRAGMENTS_DEVOURER_COUNTER
@ SPELL_DH_SOUL_FRAGMENT_DEVOURER
@ SPELL_DH_SHATTERED_SOULS_VENGEANCE
@ SPELL_DH_CHARRED_WARBLADES_HEAL
@ SPELL_DH_SIGIL_OF_MISERY
@ SPELL_DH_FELBLADE_COOLDOWN_RESET_PROC_HAVOC
@ SPELL_DH_ARMY_UNTO_ONESELF
@ SPELL_DH_SHATTERED_SOULS_MARKER
@ SPELL_DH_DEMON_MUZZLE_PROC
@ SPELL_DH_COLLECTIVE_ANGUISH_FEL_DEVASTATION
@ SPELL_DH_FEAST_OF_SOULS_PERIODIC_HEAL
@ SPELL_DH_MANA_RIFT_DMG_POWER_BURN
@ SPELL_DH_RESTLESS_HUNTER_BUFF
@ SPELL_DH_NEMESIS_DRAGONKIN
@ SPELL_DH_RETALIATION_PROC
@ SPELL_DH_SIGIL_OF_CHAINS_TARGET_SELECT
@ SPELL_DH_FIERY_BRAND_DEBUFF_RANK_1
@ SPELL_DH_CYCLE_OF_HATRED_REMOVE_STACKS
@ SPELL_DH_CONSUME_SOUL_HAVOC_SHATTERED
@ SPELL_DH_TACTICAL_RETREAT_ENERGIZE
@ SPELL_DH_SHATTERED_SOULS_DEVOURER
@ SPELL_DH_DEMONIC_TRAMPLE_DMG
@ SPELL_DH_FEL_DEVASTATION
@ SPELL_DH_UNCONTAINED_FEL
constexpr float GetPositionX() const
constexpr float GetPositionY() const
float GetRelativeAngle(float x, float y) const
constexpr void GetPosition(float &x, float &y) const
constexpr float GetPositionZ() const
uint32 SpellXSpellVisualID
areatrigger_dh_darkness(AreaTrigger *areaTrigger)
void OnUnitEnter(Unit *unit) override
void OnUnitExit(Unit *unit, AreaTriggerExitReason) override
SpellInfo const * _absorbAuraInfo
void OnUpdate(uint32 diff) override
void OnCreate(Spell const *) override
void OnInitialize() 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