18#ifndef TRINITY_SPELL_SCRIPT_H
19#define TRINITY_SPELL_SCRIPT_H
27#ifdef TRINITY_API_USE_DYNAMIC_LINKING
60#define SPELL_EFFECT_ANY ((uint16)-1)
61#define SPELL_AURA_ANY ((uint16)-1)
70#define SPELL_SCRIPT_STATE_END (SPELL_SCRIPT_STATE_UNLOADING + 1)
88 void _Init(std::string
const& scriptname,
uint32 spellId);
89 std::string_view GetScriptName()
const;
92 virtual bool _Validate(
SpellInfo const* entry);
99 HookList& operator+=(T&& t)
noexcept;
113 bool IsEffectAffected(
SpellInfo const* spellInfo,
uint8 effIndex)
const;
115 std::string EffIndexToString()
const;
127 template<
typename Return,
typename Class,
typename... Args>
133 template<
typename Return,
typename Class,
typename... Args>
139 template<
typename Return,
typename Class,
typename... Args>
142 using type = std::remove_const_t<Class>;
145 template<
typename ScriptFunc>
148 template <
typename Ret,
typename BaseClass,
typename... Args>
154 Ret(* Static)(BaseClass&, Args...);
160 struct alignas(Alignment)
StorageType : std::array<std::byte, Size> { };
162 template <
typename ScriptFunc>
169 return std::invoke(
reinterpret_cast<Impl const*
>(callImpl.data())->
Func,
static_cast<ScriptClass&
>(script), args...);
185#ifdef TRINITY_API_USE_DYNAMIC_LINKING
188 std::shared_ptr<ModuleReference> m_moduleReference;
204 virtual bool Load() {
return true; }
211 return ValidateSpellInfoImpl(spellIds.begin(), spellIds.end());
217 return ValidateSpellInfoImpl(std::cbegin(spellIds), std::cend(spellIds));
222 return ValidateSpellEffectsImpl(effects.begin(), effects.end());
228 return ValidateSpellEffectsImpl(std::cbegin(spellEffects), std::cend(spellEffects));
232 template<
typename Iterator>
235 bool allValid =
true;
238 if (!ValidateSpellInfoImpl(*begin))
246 template<
typename Iterator>
249 bool allValid =
true;
252 if (!ValidateSpellEffectImpl(begin->first, begin->second))
260 static bool ValidateSpellInfoImpl(
uint32 spellId);
292#define HOOK_SPELL_HIT_START SPELL_SCRIPT_HOOK_EFFECT_HIT
293#define HOOK_SPELL_HIT_END SPELL_SCRIPT_HOOK_AFTER_HIT + 1
299 template <
typename Ret,
typename... Args>
308 template<
typename ScriptFunc>
313 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
314 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
316 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&>,
317 R
""(CastHandler signature must be "void HandleCast()")"");
325 return _invoker.Thunk(*spellScript, _invoker.ImplStorage);
336 template<
typename ScriptFunc>
341 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
342 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
344 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
345 static_assert(std::is_invocable_r_v<SpellCastResult, ScriptFunc, ScriptClass&>,
346 R
""(CheckCastHandler signature must be "SpellCastResult CheckCast()")"");
348 static_assert(std::is_invocable_r_v<SpellCastResult, ScriptFunc, SpellScript&>,
349 R
""(CheckCastHandler signature must be "static SpellCastResult CheckCast(your_script_class& script, SpellScript&)")"");
357 return _invoker.Thunk(*spellScript, _invoker.ImplStorage);
372 std::string ToString()
const;
373 bool CheckEffect(
SpellInfo const* spellInfo,
uint8 effIndex)
const override;
383 template<
typename ScriptFunc>
389 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
390 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
392 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, SpellEffIndex>,
393 R
""(EffectHandler signature must be "void HandleEffect(SpellEffIndex effIndex)")"");
401 return _invoker.Thunk(*spellScript, effIndex, _invoker.ImplStorage);
412 template<
typename ScriptFunc>
417 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
418 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
420 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, SpellMissInfo>,
421 R
""(BeforeHitHandler signature must be "void HandleBeforeHit(SpellMissInfo missInfo)")"");
429 return _invoker.Thunk(*spellScript, missInfo, _invoker.ImplStorage);
440 template<
typename ScriptFunc>
445 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
446 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
448 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&>,
449 R
""(HitHandler signature must be "void HandleHit()")"");
457 return _invoker.Thunk(*spellScript, _invoker.ImplStorage);
468 template<
typename ScriptFunc>
473 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
474 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
476 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
477 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, Unit const*, float&>,
478 R
""(OnCalcCritChanceHandler signature must be "void CalcCritChance(Unit const* victim, float& critChance)")"");
480 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, Unit const*, float&>,
481 R
""(OnCalcCritChanceHandler signature must be "static void CalcCritChance(your_script_class& script, Unit const* victim, float& critChance)")"");
489 return _invoker.Thunk(*spellScript, victim, critChance, _invoker.ImplStorage);
504 bool CheckEffect(
SpellInfo const* spellInfo,
uint8 effIndex)
const override;
505 std::string ToString()
const;
518 template<
typename ScriptFunc>
520 :
TargetHook(effIndex, targetType, true, false)
524 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
525 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
527 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
528 static_assert(std::is_invocable_r_v<
void, ScriptFunc, ScriptClass&, std::list<WorldObject*>&>,
529 R
""(ObjectAreaTargetSelectHandler signature must be "void SetTargets(std::list<WorldObject*>& targets)")"");
531 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, std::list<WorldObject*>&>,
532 R
""(ObjectAreaTargetSelectHandler signature must be "static void SetTargets(your_script_class& script, std::list<WorldObject*>& targets)")"");
540 return _invoker.Thunk(*spellScript, targets, _invoker.ImplStorage);
556 template<
typename ScriptFunc>
558 :
TargetHook(effIndex, targetType, false, false)
562 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
563 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
565 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
566 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, WorldObject*&>,
567 R
""(ObjectTargetSelectHandler signature must be "void SetTarget(WorldObject*& target)")"");
569 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, WorldObject*&>,
570 R
""(ObjectTargetSelectHandler signature must be "static void SetTarget(your_script_class& script, WorldObject*& target)")"");
578 return _invoker.Thunk(*spellScript, target, _invoker.ImplStorage);
594 template<
typename ScriptFunc>
596 :
TargetHook(effIndex, targetType, false, true)
600 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
601 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
603 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
604 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, SpellDestination&>,
605 R
""(DestinationTargetSelectHandler signature must be "void SetTarget(SpellDestination& target)")"");
607 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, SpellDestination&>,
608 R
""(DestinationTargetSelectHandler signature must be "static void SetTarget(your_script_class& script, SpellDestination& target)")"");
616 return _invoker.Thunk(*spellScript, target, _invoker.ImplStorage);
627 template<
typename ScriptFunc>
632 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
633 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
635 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
636 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, SpellEffectInfo const&, Unit*, int32&, int32&, float&>,
637 R
""(DamageAndHealingCalcHandler signature must be "void CalcDamage(SpellEffectInfo const& spellEffectInfo, Unit* victim, int32& damageOrHealing, int32& flatMod, float& pctMod)")"");
639 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, SpellEffectInfo const&, Unit*, int32&, int32&, float&>,
640 R
""(DamageAndHealingCalcHandler signature must be "static void CalcDamage(your_script_class& script, SpellEffectInfo const& spellEffectInfo, Unit* victim, int32& damageOrHealing, int32& flatMod, float& pctMod)")"");
648 return _invoker.Thunk(*spellScript, spellEffectInfo, victim, damageOrHealing, flatMod, pctMod, _invoker.ImplStorage);
659 template<
typename ScriptFunc>
664 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
665 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
667 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
668 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, DamageInfo const&, uint32&, int32&>,
669 R
""(OnCalculateResistAbsorbHandler signature must be "void CalcAbsorbResist(DamageInfo const& damageInfo, uint32& resistAmount, int32& absorbAmount)")"");
671 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, DamageInfo const&, uint32&, int32&>,
672 R
""(OnCalculateResistAbsorbHandler signature must be "static void CalcAbsorbResist(your_script_class& script, DamageInfo const& damageInfo, uint32& resistAmount, int32& absorbAmount)")"");
680 return _invoker.Thunk(*spellScript, damageInfo, resistAmount, absorbAmount, _invoker.ImplStorage);
691 template<
typename ScriptFunc>
696 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
697 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
699 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, int32>,
700 R
""(EmpowerStageCompleted/EmpowerCompleted signature must be "void HandleEmpowerStageCompleted(int32 completedStagesCount)")"");
708 return _invoker.Thunk(*spellScript, completedStagesCount, _invoker.ImplStorage);
715 #define PrepareSpellScript(CLASSNAME)
719 bool _Validate(
SpellInfo const* entry) override;
720 bool _Load(
Spell* spell);
722 bool _IsEffectPrevented(
SpellEffIndex effIndex)
const {
return (m_hitPreventEffectMask & (1 << effIndex)) != 0; }
725 void _FinishScriptCall();
726 bool IsInCheckCastHook()
const;
727 bool IsAfterTargetSelectionPhase()
const;
728 bool IsInTargetHook()
const;
729 bool IsInModifiableHook()
const;
730 bool IsInHitPhase()
const;
731 bool IsInEffectHook()
const;
751 #define SpellCastFn(F) CastHandler(&F)
756 #define SpellCheckCastFn(F) CheckCastHandler(&F)
768 #define SpellEffectFn(F, I, N) EffectHandler(&F, I, N)
773 #define BeforeSpellHitFn(F) BeforeHitHandler(&F)
780 #define SpellHitFn(F) HitHandler(&F)
785 #define SpellOnCalcCritChanceFn(F) OnCalcCritChanceHandler(&F)
790 #define SpellObjectAreaTargetSelectFn(F, I, N) ObjectAreaTargetSelectHandler(&F, I, N)
795 #define SpellObjectTargetSelectFn(F, I, N) ObjectTargetSelectHandler(&F, I, N)
800 #define SpellDestinationTargetSelectFn(F, I, N) DestinationTargetSelectHandler(&F, I, N)
805 #define SpellCalcDamageFn(F) DamageAndHealingCalcHandler(&F)
810 #define SpellCalcHealingFn(F) DamageAndHealingCalcHandler(&F)
815 #define SpellOnResistAbsorbCalculateFn(F) OnCalculateResistAbsorbHandler(&F)
820 #define SpellOnEmpowerStageCompletedFn(F) EmpowerStageCompletedHandler(&F)
825 #define SpellOnEmpowerCompletedFn(F) EmpowerStageCompletedHandler(&F)
857 Unit* GetCaster()
const;
859 Unit* GetOriginalCaster()
const;
884 Unit* GetExplTargetUnit()
const;
890 Item* GetExplTargetItem()
const;
901 Unit* GetHitUnit()
const;
905 Player* GetHitPlayer()
const;
907 Item* GetHitItem()
const;
911 Corpse* GetHitCorpse()
const;
916 int32 GetHitDamage()
const;
917 void SetHitDamage(
int32 damage);
921 int32 GetHitHeal()
const;
922 void SetHitHeal(
int32 heal);
925 bool IsHitCrit()
const;
928 Aura* GetHitAura(
bool dynObjAura =
false,
bool withRemoved =
false)
const;
930 void PreventHitAura();
945 int32 GetEffectValueAsInt()
const;
948 float GetEffectVariance()
const;
949 void SetEffectVariance(
float variance);
952 Item* GetCastItem()
const;
958 SpellInfo const* GetTriggeringSpell()
const;
1013 template <
typename Ret,
typename... Args>
1022 template<
typename ScriptFunc>
1027 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1028 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1030 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1031 static_assert(std::is_invocable_r_v<bool, ScriptFunc, ScriptClass&, Unit*>,
1032 R
""(CheckAreaTargetHandler signature must be "bool CheckTarget(Unit* target)")"");
1034 static_assert(std::is_invocable_r_v<bool, ScriptFunc, ScriptClass&, Unit*>,
1035 R
""(CheckAreaTargetHandler signature must be "static bool CheckTarget(your_script_class& script, Unit* target)")"");
1043 return _invoker.Thunk(*auraScript, target, _invoker.ImplStorage);
1054 template<
typename ScriptFunc>
1059 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1060 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1062 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1063 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, DispelInfo*>,
1064 R
""(AuraDispelHandler signature must be "void HandleDispel(DispelInfo* dispelInfo)")"");
1066 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, DispelInfo*>,
1067 R
""(AuraDispelHandler signature must be "static void HandleDispel(your_script_class& script, DispelInfo* dispelInfo)")"");
1075 return _invoker.Thunk(*auraScript, dispelInfo, _invoker.ImplStorage);
1086 template<
typename ScriptFunc>
1091 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1092 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1094 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1095 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass>,
1096 R
""(AuraHeartbeatHandler signature must be "void HandleHeartbeat()")"");
1098 static_assert(std::is_invocable_r_v<void, ScriptFunc>,
1099 R
""(AuraHeartbeatHandler signature must be "static void HandleHeartbeat(your_script_class& script)")"");
1107 return _invoker.Thunk(*auraScript, _invoker.ImplStorage);
1122 std::string ToString()
const;
1123 bool CheckEffect(
SpellInfo const* spellInfo,
uint8 effIndex)
const override;
1133 template<
typename ScriptFunc>
1139 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1140 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1142 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1143 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*>,
1144 R
""(EffectPeriodicHandler signature must be "void HandlePeriodic(AuraEffect const* aurEff)")"");
1146 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*>,
1147 R
""(EffectPeriodicHandler signature must be "static void HandlePeriodic(your_script_class& script, AuraEffect const* aurEff)")"");
1155 return _invoker.Thunk(*auraScript, aurEff, _invoker.ImplStorage);
1166 template<
typename ScriptFunc>
1172 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1173 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1175 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1176 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect*>,
1177 R
""(EffectUpdatePeriodicHandler signature must be "void HandleUpdatePeriodic(AuraEffect* aurEff)")"");
1179 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect*>,
1180 R
""(EffectUpdatePeriodicHandler signature must be "static void HandleUpdatePeriodic(your_script_class& script, AuraEffect* aurEff)")"");
1188 return _invoker.Thunk(*auraScript, aurEff, _invoker.ImplStorage);
1199 template<
typename ScriptFunc>
1205 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1206 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1208 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1209 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*, SpellEffectValue&, bool&>,
1210 R
""(EffectCalcAmountHandler signature must be "void CalcAmount(AuraEffect const* aurEff, SpellEffectValue& amount, bool& canBeRecalculated)")"");
1212 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*, SpellEffectValue&, bool&>,
1213 R
""(EffectCalcAmountHandler signature must be "static void CalcAmount(your_script_class& script, AuraEffect const* aurEff, SpellEffectValue& amount, bool& canBeRecalculated)")"");
1221 return _invoker.Thunk(*auraScript, aurEff, amount, canBeRecalculated, _invoker.ImplStorage);
1232 template<
typename ScriptFunc>
1238 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1239 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1241 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1242 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*, bool&, int32&>,
1243 R
""(EffectCalcPeriodicHandler signature must be "void CalcPeriodic(AuraEffect const* aurEff, bool& isPeriodic, int32& periodicTimer)")"");
1245 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*, bool&, int32&>,
1246 R
""(EffectCalcPeriodicHandler signature must be "static void CalcPeriodic(your_script_class& script, AuraEffect const* aurEff, bool& isPeriodic, int32& periodicTimer)")"");
1254 return _invoker.Thunk(*auraScript, aurEff, isPeriodic, periodicTimer, _invoker.ImplStorage);
1265 template<
typename ScriptFunc>
1271 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1272 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1274 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1275 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*, SpellModifier*&>,
1276 R
""(EffectCalcSpellModHandler signature must be "void CalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod)")"");
1278 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*, SpellModifier*&>,
1279 R
""(EffectCalcSpellModHandler signature must be "static void CalcSpellMod(your_script_class& script, AuraEffect const* aurEff, SpellModifier*& spellMod)")"");
1287 return _invoker.Thunk(*auraScript, aurEff, spellMod, _invoker.ImplStorage);
1298 template<
typename ScriptFunc>
1304 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1305 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1307 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1308 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*, Unit const*, float&>,
1309 R
""(EffectCalcCritChanceHandler signature must be "void CalcCritChance(AuraEffect const* aurEff, Unit const* victim, float& critChance)")"");
1311 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*, Unit const*, float&>,
1312 R
""(EffectCalcCritChanceHandler signature must be "static void CalcCritChance(your_script_class& script, AuraEffect const* aurEff, Unit const* victim, float& critChance)")"");
1320 return _invoker.Thunk(*auraScript, aurEff, victim, critChance, _invoker.ImplStorage);
1331 template<
typename ScriptFunc>
1337 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1338 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1340 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1341 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*, Unit*, int32&, int32&, float&>,
1342 R
""(EffectCalcDamageAndHealingHandler signature must be "void CalcDamageAndHealing(AuraEffect const* aurEff, Unit* victim, int32& damageOrHealing, int32& flatMod, float& pctMod)")"");
1344 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*, Unit*, int32&, int32&, float&>,
1345 R
""(EffectCalcDamageAndHealingHandler signature must be "static void CalcDamageAndHealing(your_script_class& script, AuraEffect const* aurEff, Unit* victim, int32& damageOrHealing, int32& flatMod, float& pctMod)")"");
1353 return _invoker.Thunk(*auraScript, aurEff, victim, damageOrHealing, flatMod, pctMod, _invoker.ImplStorage);
1364 template<
typename ScriptFunc>
1366 :
EffectBase(effIndex, auraType), _mode(mode)
1370 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1371 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1373 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1374 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*, AuraEffectHandleModes>,
1375 R
""(EffectApplyHandler signature must be "void HandleApplyOrRemove(AuraEffect const* aurEff, AuraEffectHandleModes mode)")"");
1377 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*, AuraEffectHandleModes>,
1378 R
""(EffectApplyHandler signature must be "static void HandleApplyOrRemove(your_script_class& script, AuraEffect const* aurEff, AuraEffectHandleModes mode)")"");
1386 if (!(_mode & mode))
1389 return _invoker.Thunk(*auraScript, aurEff, mode, _invoker.ImplStorage);
1401 template<
typename ScriptFunc>
1407 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1408 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1410 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1411 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect*, DamageInfo&, uint32&>,
1412 R
""(EffectAbsorbHandler signature must be "void HandleAbsorb(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount)")"");
1414 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect*, DamageInfo&, uint32&>,
1415 R
""(EffectAbsorbHandler signature must be "static void HandleAbsorb(your_script_class& script, AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount)")"");
1423 return _invoker.Thunk(*auraScript, aurEff, dmgInfo, absorbAmount, _invoker.ImplStorage);
1434 template<
typename ScriptFunc>
1440 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1441 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1443 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1444 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect*, HealInfo&, uint32&>,
1445 R
""(EffectAbsorbHealHandler signature must be "void HandleAbsorb(AuraEffect* aurEff, HealInfo& healInfo, uint32& absorbAmount)")"");
1447 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect*, HealInfo&, uint32&>,
1448 R
""(EffectAbsorbHealHandler signature must be "static void HandleAbsorb(your_script_class& script, AuraEffect* aurEff, HealInfo& healInfo, uint32& absorbAmount)")"");
1456 return _invoker.Thunk(*auraScript, aurEff, healInfo, absorbAmount, _invoker.ImplStorage);
1467 template<
typename ScriptFunc>
1472 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1473 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1475 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1476 static_assert(std::is_invocable_r_v<bool, ScriptFunc, ScriptClass&, ProcEventInfo&>,
1477 R
""(CheckProcHandler signature must be "bool CheckProc(ProcEventInfo& eventInfo)")"");
1479 static_assert(std::is_invocable_r_v<bool, ScriptFunc, ScriptClass&, ProcEventInfo&>,
1480 R
""(CheckProcHandler signature must be "static bool CheckProc(your_script_class& script, ProcEventInfo& eventInfo)")"");
1488 return _invoker.Thunk(*auraScript, eventInfo, _invoker.ImplStorage);
1499 template<
typename ScriptFunc>
1505 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1506 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1508 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1509 static_assert(std::is_invocable_r_v<bool, ScriptFunc, ScriptClass&, AuraEffect const*, ProcEventInfo&>,
1510 R
""(CheckEffectProcHandler signature must be "bool CheckProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)")"");
1512 static_assert(std::is_invocable_r_v<bool, ScriptFunc, ScriptClass&, AuraEffect const*, ProcEventInfo&>,
1513 R
""(CheckEffectProcHandler signature must be "static bool CheckProc(your_script_class& script, AuraEffect const* aurEff, ProcEventInfo& eventInfo)")"");
1521 return _invoker.Thunk(*auraScript, aurEff, eventInfo, _invoker.ImplStorage);
1532 template<
typename ScriptFunc>
1537 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1538 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1540 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1541 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, ProcEventInfo&>,
1542 R
""(AuraProcHandler signature must be "void HandleProc(ProcEventInfo& eventInfo)")"");
1544 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, ProcEventInfo&>,
1545 R
""(AuraProcHandler signature must be "static void HandleProc(your_script_class& script, ProcEventInfo& eventInfo)")"");
1553 return _invoker.Thunk(*auraScript, eventInfo, _invoker.ImplStorage);
1564 template<
typename ScriptFunc>
1570 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1571 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1573 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1574 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect*, ProcEventInfo&>,
1575 R
""(EffectProcHandler signature must be "void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)")"");
1577 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect*, ProcEventInfo&>,
1578 R
""(EffectProcHandler signature must be "static void HandleProc(your_script_class& script, AuraEffect* aurEff, ProcEventInfo& eventInfo)")"");
1586 return _invoker.Thunk(*auraScript, aurEff, eventInfo, _invoker.ImplStorage);
1597 template<
typename ScriptFunc>
1602 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1603 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1605 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass, bool>,
1606 R
""(EnterLeaveCombatHandler signature must be "void HandleEnterLeaveCombat(bool isNowInCombat)")"");
1614 return _invoker.Thunk(*auraScript, isNowInCombat, _invoker.ImplStorage);
1621 #define PrepareAuraScript(CLASSNAME)
1626 bool _Validate(
SpellInfo const* entry) override;
1627 bool _Load(
Aura* aura);
1629 void _FinishScriptCall();
1630 bool _IsDefaultActionPrevented() const;
1634 bool m_defaultActionPrevented;
1643 : _auraApplication(auraApplication), _currentScriptState(currentScriptState), _defaultActionPrevented(defaultActionPrevented)
1658 #define AuraCheckAreaTargetFn(F) CheckAreaTargetHandler(&F)
1668 #define AuraDispelFn(F) AuraDispelHandler(&F)
1674 #define AuraHeartbeatFn(F) AuraHeartbeatHandler(&F)
1685 #define AuraEffectApplyFn(F, I, N, M) EffectApplyHandler(&F, I, N, M)
1696 #define AuraEffectRemoveFn(F, I, N, M) EffectApplyHandler(&F, I, N, M)
1702 #define AuraEffectPeriodicFn(F, I, N) EffectPeriodicHandler(&F, I, N)
1708 #define AuraEffectUpdatePeriodicFn(F, I, N) EffectUpdatePeriodicHandler(&F, I, N)
1714 #define AuraEffectCalcAmountFn(F, I, N) EffectCalcAmountHandler(&F, I, N)
1720 #define AuraEffectCalcPeriodicFn(F, I, N) EffectCalcPeriodicHandler(&F, I, N)
1726 #define AuraEffectCalcSpellModFn(F, I, N) EffectCalcSpellModHandler(&F, I, N)
1732 #define AuraEffectCalcCritChanceFn(F, I, N) EffectCalcCritChanceHandler(&F, I, N)
1739 #define AuraEffectCalcDamageFn(F, I, N) EffectCalcDamageAndHealingHandler(&F, I, N)
1740 #define AuraEffectCalcHealingFn(F, I, N) EffectCalcDamageAndHealingHandler(&F, I, N)
1741 #define AuraEffectCalcAbsorbFn(F, I) EffectCalcDamageAndHealingHandler(&F, I, SPELL_AURA_SCHOOL_ABSORB)
1747 #define AuraEffectAbsorbFn(F, I) EffectAbsorbHandler(&F, I, SPELL_AURA_SCHOOL_ABSORB)
1748 #define AuraEffectAbsorbOverkillFn(F, I) EffectAbsorbHandler(&F, I, SPELL_AURA_SCHOOL_ABSORB_OVERKILL)
1759 #define AuraEffectAbsorbHealFn(F, I) EffectAbsorbHealHandler(&F, I, SPELL_AURA_SCHOOL_HEAL_ABSORB)
1770 #define AuraEffectManaShieldFn(F, I) EffectAbsorbHandler(&F, I, SPELL_AURA_MANA_SHIELD)
1781 #define AuraEffectSplitFn(F, I) EffectAbsorbHandler(&F, I, SPELL_AURA_SPLIT_DAMAGE_PCT)
1787 #define AuraCheckProcFn(F) CheckProcHandler(&F)
1793 #define AuraCheckEffectProcFn(F, I, N) CheckEffectProcHandler(&F, I, N)
1807 #define AuraProcFn(F) AuraProcHandler(&F)
1817 #define AuraEffectProcFn(F, I, N) EffectProcHandler(&F, I, N)
1823 #define AuraEnterLeaveCombatFn(F) EnterLeaveCombatHandler(&F)
1828 void PreventDefaultAction();
1841 Unit* GetCaster()
const;
1847 Unit* GetUnitOwner()
const;
1854 Aura* GetAura()
const;
1860 int32 GetDuration()
const;
1861 void SetDuration(
int32 duration,
bool withMods =
false);
1863 void RefreshDuration();
1864 time_t GetApplyTime()
const;
1865 int32 GetMaxDuration()
const;
1866 void SetMaxDuration(
int32 duration);
1867 int32 CalcMaxDuration()
const;
1869 bool IsExpired()
const;
1871 bool IsPermanent()
const;
1874 uint8 GetCharges()
const;
1875 void SetCharges(
uint8 charges);
1876 uint8 CalcMaxCharges()
const;
1882 uint8 GetStackAmount()
const;
1883 void SetStackAmount(
uint8 num);
1887 bool IsPassive()
const;
1889 bool IsDeathPersistent()
const;
1892 bool HasEffect(
uint8 effIndex)
const;
1897 bool HasEffectType(
AuraType type)
const;
1905 Unit* GetTarget()
const;
double SpellEffectValue
This is a double instead of float to be able to store full range of int32.
@ AURA_SCRIPT_HOOK_EFFECT_CALC_PERIODIC
@ AURA_SCRIPT_HOOK_CHECK_EFFECT_PROC
@ AURA_SCRIPT_HOOK_EFFECT_CALC_DAMAGE_AND_HEALING
@ AURA_SCRIPT_HOOK_EFFECT_CALC_AMOUNT
@ AURA_SCRIPT_HOOK_EFFECT_REMOVE
@ AURA_SCRIPT_HOOK_EFFECT_CALC_CRIT_CHANCE
@ AURA_SCRIPT_HOOK_EFFECT_AFTER_MANASHIELD
@ AURA_SCRIPT_HOOK_PREPARE_PROC
@ AURA_SCRIPT_HOOK_ON_HEARTBEAT
@ AURA_SCRIPT_HOOK_EFFECT_AFTER_APPLY
@ AURA_SCRIPT_HOOK_EFFECT_AFTER_REMOVE
@ AURA_SCRIPT_HOOK_AFTER_PROC
@ AURA_SCRIPT_HOOK_CHECK_AREA_TARGET
@ AURA_SCRIPT_HOOK_EFFECT_MANASHIELD
@ AURA_SCRIPT_HOOK_EFFECT_AFTER_ABSORB
@ AURA_SCRIPT_HOOK_DISPEL
@ AURA_SCRIPT_HOOK_EFFECT_APPLY
@ AURA_SCRIPT_HOOK_EFFECT_PERIODIC
@ AURA_SCRIPT_HOOK_EFFECT_AFTER_PROC
@ AURA_SCRIPT_HOOK_EFFECT_ABSORB
@ AURA_SCRIPT_HOOK_EFFECT_PROC
@ AURA_SCRIPT_HOOK_EFFECT_SPLIT
@ AURA_SCRIPT_HOOK_EFFECT_CALC_SPELLMOD
@ AURA_SCRIPT_HOOK_AFTER_DISPEL
@ AURA_SCRIPT_HOOK_CHECK_PROC
@ AURA_SCRIPT_HOOK_ENTER_LEAVE_COMBAT
@ AURA_SCRIPT_HOOK_EFFECT_UPDATE_PERIODIC
@ SPELL_SCRIPT_STATE_NONE
@ SPELL_SCRIPT_STATE_LOADING
@ SPELL_SCRIPT_STATE_UNLOADING
@ SPELL_SCRIPT_STATE_REGISTRATION
#define SPELL_SCRIPT_STATE_END
@ SPELL_SCRIPT_HOOK_AFTER_CAST
@ SPELL_SCRIPT_HOOK_EFFECT_HIT
@ SPELL_SCRIPT_HOOK_AFTER_HIT
@ SPELL_SCRIPT_HOOK_EFFECT_SUCCESSFUL_DISPEL
@ SPELL_SCRIPT_HOOK_CALC_HEALING
@ SPELL_SCRIPT_HOOK_EFFECT_LAUNCH
@ SPELL_SCRIPT_HOOK_OBJECT_AREA_TARGET_SELECT
@ SPELL_SCRIPT_HOOK_BEFORE_HIT
@ SPELL_SCRIPT_HOOK_CALC_DAMAGE
@ SPELL_SCRIPT_HOOK_CHECK_CAST
@ SPELL_SCRIPT_HOOK_EFFECT_LAUNCH_TARGET
@ SPELL_SCRIPT_HOOK_CALC_CAST_TIME
@ SPELL_SCRIPT_HOOK_EMPOWER_STAGE_COMPLETED
@ SPELL_SCRIPT_HOOK_EMPOWER_COMPLETED
@ SPELL_SCRIPT_HOOK_BEFORE_CAST
@ SPELL_SCRIPT_HOOK_ON_RESIST_ABSORB_CALCULATION
@ SPELL_SCRIPT_HOOK_DESTINATION_TARGET_SELECT
@ SPELL_SCRIPT_HOOK_OBJECT_TARGET_SELECT
@ SPELL_SCRIPT_HOOK_EFFECT_HIT_TARGET
@ SPELL_SCRIPT_HOOK_CALC_CRIT_CHANCE
@ SPELL_SCRIPT_HOOK_ON_CAST
@ SPELL_SCRIPT_HOOK_ON_PRECAST
AuraDispelHandler(ScriptFunc handler)
void Call(AuraScript *auraScript, DispelInfo *dispelInfo) const
ScriptFuncInvoker _invoker
ScriptFuncInvoker _invoker
void Call(AuraScript *auraScript) const
AuraHeartbeatHandler(ScriptFunc handler)
AuraProcHandler(ScriptFunc handler)
void Call(AuraScript *auraScript, ProcEventInfo &eventInfo) const
ScriptFuncInvoker _invoker
bool Call(AuraScript *auraScript, Unit *target) const
CheckAreaTargetHandler(ScriptFunc handler)
ScriptFuncInvoker _invoker
CheckEffectProcHandler(ScriptFunc handler, uint8 effIndex, uint16 auraType)
bool Call(AuraScript *auraScript, AuraEffect const *aurEff, ProcEventInfo &eventInfo) const
ScriptFuncInvoker _invoker
bool Call(AuraScript *auraScript, ProcEventInfo &eventInfo) const
ScriptFuncInvoker _invoker
CheckProcHandler(ScriptFunc handler)
ScriptFuncInvoker _invoker
void Call(AuraScript *auraScript, AuraEffect *aurEff, DamageInfo &dmgInfo, uint32 &absorbAmount) const
EffectAbsorbHandler(ScriptFunc handler, uint8 effIndex, uint16 auraType)
ScriptFuncInvoker _invoker
EffectAbsorbHealHandler(ScriptFunc handler, uint8 effIndex, uint16 auraType)
void Call(AuraScript *auraScript, AuraEffect *aurEff, HealInfo &healInfo, uint32 &absorbAmount) const
void Call(AuraScript *auraScript, AuraEffect const *aurEff, AuraEffectHandleModes mode) const
EffectApplyHandler(ScriptFunc handler, uint8 effIndex, uint16 auraType, AuraEffectHandleModes mode)
ScriptFuncInvoker _invoker
AuraEffectHandleModes _mode
EffectBase & operator=(EffectBase const &right)=delete
EffectBase & operator=(EffectBase &&right) noexcept
EffectBase(EffectBase &&right) noexcept
EffectBase(EffectBase const &right)=delete
ScriptFuncInvoker _invoker
void Call(AuraScript *auraScript, AuraEffect const *aurEff, SpellEffectValue &amount, bool &canBeRecalculated) const
EffectCalcAmountHandler(ScriptFunc handler, uint8 effIndex, uint16 auraType)
void Call(AuraScript *auraScript, AuraEffect const *aurEff, Unit const *victim, float &critChance) const
EffectCalcCritChanceHandler(ScriptFunc handler, uint8 effIndex, uint16 auraType)
ScriptFuncInvoker _invoker
ScriptFuncInvoker _invoker
EffectCalcDamageAndHealingHandler(ScriptFunc handler, uint8 effIndex, uint16 auraType)
void Call(AuraScript *auraScript, AuraEffect const *aurEff, Unit *victim, int32 &damageOrHealing, int32 &flatMod, float &pctMod) const
EffectCalcPeriodicHandler(ScriptFunc handler, uint8 effIndex, uint16 auraType)
ScriptFuncInvoker _invoker
void Call(AuraScript *auraScript, AuraEffect const *aurEff, bool &isPeriodic, int32 &periodicTimer) const
EffectCalcSpellModHandler(ScriptFunc handler, uint8 effIndex, uint16 auraType)
ScriptFuncInvoker _invoker
void Call(AuraScript *auraScript, AuraEffect const *aurEff, SpellModifier *&spellMod) const
void Call(AuraScript *auraScript, AuraEffect const *aurEff) const
ScriptFuncInvoker _invoker
EffectPeriodicHandler(ScriptFunc handler, uint8 effIndex, uint16 auraType)
ScriptFuncInvoker _invoker
EffectProcHandler(ScriptFunc handler, uint8 effIndex, uint16 auraType)
void Call(AuraScript *auraScript, AuraEffect *aurEff, ProcEventInfo &eventInfo) const
void Call(AuraScript *auraScript, AuraEffect *aurEff) const
ScriptFuncInvoker _invoker
EffectUpdatePeriodicHandler(ScriptFunc handler, uint8 effIndex, uint16 auraType)
void Call(AuraScript *auraScript, bool isNowInCombat) const
ScriptFuncInvoker _invoker
EnterLeaveCombatHandler(ScriptFunc handler)
ScriptStateStore(uint8 currentScriptState, AuraApplication const *auraApplication, bool defaultActionPrevented)
bool _defaultActionPrevented
uint8 _currentScriptState
AuraApplication const * _auraApplication
HookList< EffectAbsorbHandler > OnEffectManaShield
HookList< EffectCalcDamageAndHealingHandler > DoEffectCalcDamageAndHealing
HookList< EffectAbsorbHealHandler > OnEffectAbsorbHeal
HookList< EffectCalcPeriodicHandler > DoEffectCalcPeriodic
HookList< AuraHeartbeatHandler > OnHeartbeat
HookList< EffectApplyHandler > AfterEffectRemove
HookList< CheckEffectProcHandler > DoCheckEffectProc
HookList< EffectPeriodicHandler > OnEffectPeriodic
HookList< EffectApplyHandler > AfterEffectApply
HookList< EffectProcHandler > AfterEffectProc
HookList< EffectAbsorbHandler > AfterEffectAbsorb
HookList< EffectCalcAmountHandler > DoEffectCalcAmount
HookList< EffectUpdatePeriodicHandler > OnEffectUpdatePeriodic
HookList< EffectCalcSpellModHandler > DoEffectCalcSpellMod
HookList< EnterLeaveCombatHandler > OnEnterLeaveCombat
HookList< EffectAbsorbHandler > OnEffectAbsorb
std::stack< ScriptStateStore > ScriptStateStack
HookList< EffectCalcCritChanceHandler > DoEffectCalcCritChance
HookList< EffectAbsorbHandler > AfterEffectManaShield
HookList< CheckAreaTargetHandler > DoCheckAreaTarget
HookList< EffectAbsorbHealHandler > AfterEffectAbsorbHeal
HookList< AuraProcHandler > AfterProc
HookList< AuraDispelHandler > OnDispel
HookList< CheckProcHandler > DoCheckProc
HookList< EffectApplyHandler > OnEffectRemove
HookList< AuraDispelHandler > AfterDispel
ScriptStateStack m_scriptStates
HookList< EffectProcHandler > OnEffectProc
HookList< AuraProcHandler > DoPrepareProc
HookList< AuraProcHandler > OnProc
HookList< EffectApplyHandler > OnEffectApply
HookList< EffectAbsorbHandler > OnEffectSplit
EffectHook & operator=(EffectHook &&right) noexcept
EffectHook(EffectHook const &right)=delete
EffectHook(EffectHook &&right) noexcept
virtual bool CheckEffect(SpellInfo const *spellInfo, uint8 effIndex) const =0
EffectHook & operator=(EffectHook const &right)=delete
SpellScriptBase(SpellScriptBase const &right)=delete
uint8 m_currentScriptState
virtual void Register()=0
virtual bool Validate(SpellInfo const *spellInfo)
std::string_view m_scriptName
static bool ValidateSpellEffect(T const &spellEffects)
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
static bool ValidateSpellEffect(std::initializer_list< std::pair< uint32, SpellEffIndex > > effects)
static bool ValidateSpellInfo(T const &spellIds)
static bool ValidateSpellEffectsImpl(Iterator begin, Iterator end)
static bool ValidateSpellInfoImpl(Iterator begin, Iterator end)
typename GetScriptClass< ScriptFunc >::type GetScriptClass_t
SpellScriptBase & operator=(SpellScriptBase &&right)=delete
SpellScriptBase(SpellScriptBase &&right)=delete
virtual ~SpellScriptBase()
SpellScriptBase & operator=(SpellScriptBase const &right)=delete
void Call(SpellScript *spellScript, SpellMissInfo missInfo) const
BeforeHitHandler(ScriptFunc handler)
ScriptFuncInvoker _invoker
CastHandler(ScriptFunc handler)
ScriptFuncInvoker _invoker
void Call(SpellScript *spellScript) const
ScriptFuncInvoker _invoker
SpellCastResult Call(SpellScript *spellScript) const
CheckCastHandler(ScriptFunc handler)
void Call(SpellScript *spellScript, SpellEffectInfo const &spellEffectInfo, Unit *victim, int32 &damageOrHealing, int32 &flatMod, float &pctMod) const
DamageAndHealingCalcHandler(ScriptFunc handler)
ScriptFuncInvoker _invoker
ScriptFuncInvoker _invoker
DestinationTargetSelectHandler(ScriptFunc handler, uint8 effIndex, uint16 targetType)
void Call(SpellScript *spellScript, SpellDestination &target) const
EffectBase(EffectBase const &right)=delete
EffectBase(EffectBase &&right) noexcept
EffectBase & operator=(EffectBase const &right)=delete
EffectBase & operator=(EffectBase &&right) noexcept
EffectHandler(ScriptFunc handler, uint8 effIndex, uint16 effName)
void Call(SpellScript *spellScript, SpellEffIndex effIndex) const
ScriptFuncInvoker _invoker
EmpowerStageCompletedHandler(ScriptFunc handler)
void Call(SpellScript *spellScript, int32 completedStagesCount) const
ScriptFuncInvoker _invoker
void Call(SpellScript *spellScript) const
ScriptFuncInvoker _invoker
HitHandler(ScriptFunc handler)
void Call(SpellScript *spellScript, std::list< WorldObject * > &targets) const
ScriptFuncInvoker _invoker
bool HasSameTargetFunctionAs(ObjectAreaTargetSelectHandler const &other) const
ObjectAreaTargetSelectHandler(ScriptFunc handler, uint8 effIndex, uint16 targetType)
bool HasSameTargetFunctionAs(ObjectTargetSelectHandler const &other) const
ObjectTargetSelectHandler(ScriptFunc handler, uint8 effIndex, uint16 targetType)
void Call(SpellScript *spellScript, WorldObject *&target) const
ScriptFuncInvoker _invoker
void Call(SpellScript *spellScript, Unit const *victim, float &critChance) const
OnCalcCritChanceHandler(ScriptFunc handler)
ScriptFuncInvoker _invoker
OnCalculateResistAbsorbHandler(ScriptFunc handler)
ScriptFuncInvoker _invoker
void Call(SpellScript *spellScript, DamageInfo const &damageInfo, uint32 &resistAmount, int32 &absorbAmount) const
TargetHook(TargetHook &&right) noexcept
TargetHook & operator=(TargetHook &&right) noexcept
TargetHook(TargetHook const &right)=delete
TargetHook & operator=(TargetHook const &right)=delete
bool _IsDefaultEffectPrevented(SpellEffIndex effIndex) const
HookList< DamageAndHealingCalcHandler > CalcDamage
HookList< CastHandler > AfterCast
HookList< CheckCastHandler > OnCheckCast
HookList< EmpowerStageCompletedHandler > OnEmpowerStageCompleted
HookList< HitHandler > AfterHit
HookList< DestinationTargetSelectHandler > OnDestinationTargetSelect
uint32 m_hitPreventDefaultEffectMask
HookList< HitHandler > OnHit
uint32 m_hitPreventEffectMask
HookList< EffectHandler > OnEffectHit
HookList< EffectHandler > OnEffectHitTarget
HookList< ObjectTargetSelectHandler > OnObjectTargetSelect
HookList< CastHandler > OnCast
HookList< OnCalculateResistAbsorbHandler > OnCalculateResistAbsorb
HookList< CastHandler > BeforeCast
virtual int32 CalcCastTime(int32 castTime)
HookList< EffectHandler > OnEffectLaunchTarget
HookList< BeforeHitHandler > BeforeHit
HookList< EffectHandler > OnEffectSuccessfulDispel
HookList< OnCalcCritChanceHandler > OnCalcCritChance
HookList< EmpowerStageCompletedHandler > OnEmpowerCompleted
HookList< EffectHandler > OnEffectLaunch
HookList< DamageAndHealingCalcHandler > CalcHealing
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
std::remove_const_t< Class > type
static Ret Invoke(BaseClass &script, Args... args, StorageType callImpl)
GetScriptClass_t< ScriptFunc > ScriptClass