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 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
170 return (
static_cast<ScriptClass&
>(script).*
reinterpret_cast<Impl const*
>(callImpl.data())->Func)(args...);
172 return reinterpret_cast<Impl const*
>(callImpl.data())->Func(
static_cast<ScriptClass&
>(script), args...);
188#ifdef TRINITY_API_USE_DYNAMIC_LINKING
191 std::shared_ptr<ModuleReference> m_moduleReference;
207 virtual bool Load() {
return true; }
214 return ValidateSpellInfoImpl(spellIds.begin(), spellIds.end());
220 return ValidateSpellInfoImpl(std::cbegin(spellIds), std::cend(spellIds));
225 return ValidateSpellEffectsImpl(effects.begin(), effects.end());
231 return ValidateSpellEffectsImpl(std::cbegin(spellEffects), std::cend(spellEffects));
235 template<
typename Iterator>
238 bool allValid =
true;
241 if (!ValidateSpellInfoImpl(*begin))
249 template<
typename Iterator>
252 bool allValid =
true;
255 if (!ValidateSpellEffectImpl(begin->first, begin->second))
263 static bool ValidateSpellInfoImpl(
uint32 spellId);
295#define HOOK_SPELL_HIT_START SPELL_SCRIPT_HOOK_EFFECT_HIT
296#define HOOK_SPELL_HIT_END SPELL_SCRIPT_HOOK_AFTER_HIT + 1
302 template <
typename Ret,
typename... Args>
311 template<
typename ScriptFunc>
316 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
317 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
319 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&>,
320 R
""(CastHandler signature must be "void HandleCast()")"");
328 return _invoker.Thunk(*spellScript, _invoker.ImplStorage);
339 template<
typename ScriptFunc>
344 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
345 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
347 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
348 static_assert(std::is_invocable_r_v<SpellCastResult, ScriptFunc, ScriptClass&>,
349 R
""(CheckCastHandler signature must be "SpellCastResult CheckCast()")"");
351 static_assert(std::is_invocable_r_v<SpellCastResult, ScriptFunc, SpellScript&>,
352 R
""(CheckCastHandler signature must be "static SpellCastResult CheckCast(your_script_class& script, SpellScript&)")"");
360 return _invoker.Thunk(*spellScript, _invoker.ImplStorage);
375 std::string ToString()
const;
376 bool CheckEffect(
SpellInfo const* spellInfo,
uint8 effIndex)
const override;
386 template<
typename ScriptFunc>
392 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
393 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
395 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, SpellEffIndex>,
396 R
""(EffectHandler signature must be "void HandleEffect(SpellEffIndex effIndex)")"");
404 return _invoker.Thunk(*spellScript, effIndex, _invoker.ImplStorage);
415 template<
typename ScriptFunc>
420 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
421 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
423 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, SpellMissInfo>,
424 R
""(BeforeHitHandler signature must be "void HandleBeforeHit(SpellMissInfo missInfo)")"");
432 return _invoker.Thunk(*spellScript, missInfo, _invoker.ImplStorage);
443 template<
typename ScriptFunc>
448 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
449 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
451 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&>,
452 R
""(HitHandler signature must be "void HandleHit()")"");
460 return _invoker.Thunk(*spellScript, _invoker.ImplStorage);
471 template<
typename ScriptFunc>
476 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
477 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
479 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
480 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, Unit const*, float&>,
481 R
""(OnCalcCritChanceHandler signature must be "void CalcCritChance(Unit const* victim, float& critChance)")"");
483 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, Unit const*, float&>,
484 R
""(OnCalcCritChanceHandler signature must be "static void CalcCritChance(your_script_class& script, Unit const* victim, float& critChance)")"");
492 return _invoker.Thunk(*spellScript, victim, critChance, _invoker.ImplStorage);
507 bool CheckEffect(
SpellInfo const* spellInfo,
uint8 effIndex)
const override;
508 std::string ToString()
const;
521 template<
typename ScriptFunc>
523 :
TargetHook(effIndex, targetType, true, false)
527 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
528 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
530 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
531 static_assert(std::is_invocable_r_v<
void, ScriptFunc, ScriptClass&, std::list<WorldObject*>&>,
532 R
""(ObjectAreaTargetSelectHandler signature must be "void SetTargets(std::list<WorldObject*>& targets)")"");
534 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, std::list<WorldObject*>&>,
535 R
""(ObjectAreaTargetSelectHandler signature must be "static void SetTargets(your_script_class& script, std::list<WorldObject*>& targets)")"");
543 return _invoker.Thunk(*spellScript, targets, _invoker.ImplStorage);
559 template<
typename ScriptFunc>
561 :
TargetHook(effIndex, targetType, false, false)
565 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
566 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
568 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
569 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, WorldObject*&>,
570 R
""(ObjectTargetSelectHandler signature must be "void SetTarget(WorldObject*& target)")"");
572 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, WorldObject*&>,
573 R
""(ObjectTargetSelectHandler signature must be "static void SetTarget(your_script_class& script, WorldObject*& target)")"");
581 return _invoker.Thunk(*spellScript, target, _invoker.ImplStorage);
597 template<
typename ScriptFunc>
599 :
TargetHook(effIndex, targetType, false, true)
603 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
604 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
606 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
607 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, SpellDestination&>,
608 R
""(DestinationTargetSelectHandler signature must be "void SetTarget(SpellDestination& target)")"");
610 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, SpellDestination&>,
611 R
""(DestinationTargetSelectHandler signature must be "static void SetTarget(your_script_class& script, SpellDestination& target)")"");
619 return _invoker.Thunk(*spellScript, target, _invoker.ImplStorage);
630 template<
typename ScriptFunc>
635 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
636 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
638 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
639 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, SpellEffectInfo const&, Unit*, int32&, int32&, float&>,
640 R
""(DamageAndHealingCalcHandler signature must be "void CalcDamage(SpellEffectInfo const& spellEffectInfo, Unit* victim, int32& damageOrHealing, int32& flatMod, float& pctMod)")"");
642 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, SpellEffectInfo const&, Unit*, int32&, int32&, float&>,
643 R
""(DamageAndHealingCalcHandler signature must be "static void CalcDamage(your_script_class& script, SpellEffectInfo const& spellEffectInfo, Unit* victim, int32& damageOrHealing, int32& flatMod, float& pctMod)")"");
651 return _invoker.Thunk(*spellScript, spellEffectInfo, victim, damageOrHealing, flatMod, pctMod, _invoker.ImplStorage);
662 template<
typename ScriptFunc>
667 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
668 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
670 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
671 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, DamageInfo const&, uint32&, int32&>,
672 R
""(OnCalculateResistAbsorbHandler signature must be "void CalcAbsorbResist(DamageInfo const& damageInfo, uint32& resistAmount, int32& absorbAmount)")"");
674 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, DamageInfo const&, uint32&, int32&>,
675 R
""(OnCalculateResistAbsorbHandler signature must be "static void CalcAbsorbResist(your_script_class& script, DamageInfo const& damageInfo, uint32& resistAmount, int32& absorbAmount)")"");
683 return _invoker.Thunk(*spellScript, damageInfo, resistAmount, absorbAmount, _invoker.ImplStorage);
694 template<
typename ScriptFunc>
699 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
700 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
702 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, int32>,
703 R
""(EmpowerStageCompleted/EmpowerCompleted signature must be "void HandleEmpowerStageCompleted(int32 completedStagesCount)")"");
711 return _invoker.Thunk(*spellScript, completedStagesCount, _invoker.ImplStorage);
718 #define PrepareSpellScript(CLASSNAME)
722 bool _Validate(
SpellInfo const* entry) override;
723 bool _Load(
Spell* spell);
725 bool _IsEffectPrevented(
SpellEffIndex effIndex)
const {
return (m_hitPreventEffectMask & (1 << effIndex)) != 0; }
728 void _FinishScriptCall();
729 bool IsInCheckCastHook()
const;
730 bool IsAfterTargetSelectionPhase()
const;
731 bool IsInTargetHook()
const;
732 bool IsInModifiableHook()
const;
733 bool IsInHitPhase()
const;
734 bool IsInEffectHook()
const;
754 #define SpellCastFn(F) CastHandler(&F)
759 #define SpellCheckCastFn(F) CheckCastHandler(&F)
771 #define SpellEffectFn(F, I, N) EffectHandler(&F, I, N)
776 #define BeforeSpellHitFn(F) BeforeHitHandler(&F)
783 #define SpellHitFn(F) HitHandler(&F)
788 #define SpellOnCalcCritChanceFn(F) OnCalcCritChanceHandler(&F)
793 #define SpellObjectAreaTargetSelectFn(F, I, N) ObjectAreaTargetSelectHandler(&F, I, N)
798 #define SpellObjectTargetSelectFn(F, I, N) ObjectTargetSelectHandler(&F, I, N)
803 #define SpellDestinationTargetSelectFn(F, I, N) DestinationTargetSelectHandler(&F, I, N)
808 #define SpellCalcDamageFn(F) DamageAndHealingCalcHandler(&F)
813 #define SpellCalcHealingFn(F) DamageAndHealingCalcHandler(&F)
818 #define SpellOnResistAbsorbCalculateFn(F) OnCalculateResistAbsorbHandler(&F)
823 #define SpellOnEmpowerStageCompletedFn(F) EmpowerStageCompletedHandler(&F)
828 #define SpellOnEmpowerCompletedFn(F) EmpowerStageCompletedHandler(&F)
860 Unit* GetCaster()
const;
862 Unit* GetOriginalCaster()
const;
887 Unit* GetExplTargetUnit()
const;
893 Item* GetExplTargetItem()
const;
904 Unit* GetHitUnit()
const;
908 Player* GetHitPlayer()
const;
910 Item* GetHitItem()
const;
914 Corpse* GetHitCorpse()
const;
919 int32 GetHitDamage()
const;
920 void SetHitDamage(
int32 damage);
924 int32 GetHitHeal()
const;
925 void SetHitHeal(
int32 heal);
928 bool IsHitCrit()
const;
931 Aura* GetHitAura(
bool dynObjAura =
false,
bool withRemoved =
false)
const;
933 void PreventHitAura();
948 int32 GetEffectValueAsInt()
const;
951 float GetEffectVariance()
const;
952 void SetEffectVariance(
float variance);
955 Item* GetCastItem()
const;
961 SpellInfo const* GetTriggeringSpell()
const;
1016 template <
typename Ret,
typename... Args>
1025 template<
typename ScriptFunc>
1030 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1031 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1033 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1034 static_assert(std::is_invocable_r_v<bool, ScriptFunc, ScriptClass&, Unit*>,
1035 R
""(CheckAreaTargetHandler signature must be "bool CheckTarget(Unit* target)")"");
1037 static_assert(std::is_invocable_r_v<bool, ScriptFunc, ScriptClass&, Unit*>,
1038 R
""(CheckAreaTargetHandler signature must be "static bool CheckTarget(your_script_class& script, Unit* target)")"");
1046 return _invoker.Thunk(*auraScript, target, _invoker.ImplStorage);
1057 template<
typename ScriptFunc>
1062 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1063 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1065 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1066 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, DispelInfo*>,
1067 R
""(AuraDispelHandler signature must be "void HandleDispel(DispelInfo* dispelInfo)")"");
1069 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, DispelInfo*>,
1070 R
""(AuraDispelHandler signature must be "static void HandleDispel(your_script_class& script, DispelInfo* dispelInfo)")"");
1078 return _invoker.Thunk(*auraScript, dispelInfo, _invoker.ImplStorage);
1089 template<
typename ScriptFunc>
1094 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1095 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1097 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1098 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass>,
1099 R
""(AuraHeartbeatHandler signature must be "void HandleHeartbeat()")"");
1101 static_assert(std::is_invocable_r_v<void, ScriptFunc>,
1102 R
""(AuraHeartbeatHandler signature must be "static void HandleHeartbeat(your_script_class& script)")"");
1110 return _invoker.Thunk(*auraScript, _invoker.ImplStorage);
1125 std::string ToString()
const;
1126 bool CheckEffect(
SpellInfo const* spellInfo,
uint8 effIndex)
const override;
1136 template<
typename ScriptFunc>
1142 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1143 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1145 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1146 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*>,
1147 R
""(EffectPeriodicHandler signature must be "void HandlePeriodic(AuraEffect const* aurEff)")"");
1149 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*>,
1150 R
""(EffectPeriodicHandler signature must be "static void HandlePeriodic(your_script_class& script, AuraEffect const* aurEff)")"");
1158 return _invoker.Thunk(*auraScript, aurEff, _invoker.ImplStorage);
1169 template<
typename ScriptFunc>
1175 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1176 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1178 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1179 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect*>,
1180 R
""(EffectUpdatePeriodicHandler signature must be "void HandleUpdatePeriodic(AuraEffect* aurEff)")"");
1182 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect*>,
1183 R
""(EffectUpdatePeriodicHandler signature must be "static void HandleUpdatePeriodic(your_script_class& script, AuraEffect* aurEff)")"");
1191 return _invoker.Thunk(*auraScript, aurEff, _invoker.ImplStorage);
1202 template<
typename ScriptFunc>
1208 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1209 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1211 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1212 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*, SpellEffectValue&, bool&>,
1213 R
""(EffectCalcAmountHandler signature must be "void CalcAmount(AuraEffect const* aurEff, SpellEffectValue& amount, bool& canBeRecalculated)")"");
1215 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*, SpellEffectValue&, bool&>,
1216 R
""(EffectCalcAmountHandler signature must be "static void CalcAmount(your_script_class& script, AuraEffect const* aurEff, SpellEffectValue& amount, bool& canBeRecalculated)")"");
1224 return _invoker.Thunk(*auraScript, aurEff, amount, canBeRecalculated, _invoker.ImplStorage);
1235 template<
typename ScriptFunc>
1241 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1242 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1244 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1245 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*, bool&, int32&>,
1246 R
""(EffectCalcPeriodicHandler signature must be "void CalcPeriodic(AuraEffect const* aurEff, bool& isPeriodic, int32& periodicTimer)")"");
1248 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*, bool&, int32&>,
1249 R
""(EffectCalcPeriodicHandler signature must be "static void CalcPeriodic(your_script_class& script, AuraEffect const* aurEff, bool& isPeriodic, int32& periodicTimer)")"");
1257 return _invoker.Thunk(*auraScript, aurEff, isPeriodic, periodicTimer, _invoker.ImplStorage);
1268 template<
typename ScriptFunc>
1274 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1275 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1277 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1278 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*, SpellModifier*&>,
1279 R
""(EffectCalcSpellModHandler signature must be "void CalcSpellMod(AuraEffect const* aurEff, SpellModifier*& spellMod)")"");
1281 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*, SpellModifier*&>,
1282 R
""(EffectCalcSpellModHandler signature must be "static void CalcSpellMod(your_script_class& script, AuraEffect const* aurEff, SpellModifier*& spellMod)")"");
1290 return _invoker.Thunk(*auraScript, aurEff, spellMod, _invoker.ImplStorage);
1301 template<
typename ScriptFunc>
1307 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1308 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1310 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1311 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*, Unit const*, float&>,
1312 R
""(EffectCalcCritChanceHandler signature must be "void CalcCritChance(AuraEffect const* aurEff, Unit const* victim, float& critChance)")"");
1314 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*, Unit const*, float&>,
1315 R
""(EffectCalcCritChanceHandler signature must be "static void CalcCritChance(your_script_class& script, AuraEffect const* aurEff, Unit const* victim, float& critChance)")"");
1323 return _invoker.Thunk(*auraScript, aurEff, victim, critChance, _invoker.ImplStorage);
1334 template<
typename ScriptFunc>
1340 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1341 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1343 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1344 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*, Unit*, int32&, int32&, float&>,
1345 R
""(EffectCalcDamageAndHealingHandler signature must be "void CalcDamageAndHealing(AuraEffect const* aurEff, Unit* victim, int32& damageOrHealing, int32& flatMod, float& pctMod)")"");
1347 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*, Unit*, int32&, int32&, float&>,
1348 R
""(EffectCalcDamageAndHealingHandler signature must be "static void CalcDamageAndHealing(your_script_class& script, AuraEffect const* aurEff, Unit* victim, int32& damageOrHealing, int32& flatMod, float& pctMod)")"");
1356 return _invoker.Thunk(*auraScript, aurEff, victim, damageOrHealing, flatMod, pctMod, _invoker.ImplStorage);
1367 template<
typename ScriptFunc>
1369 :
EffectBase(effIndex, auraType), _mode(mode)
1373 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1374 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1376 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1377 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*, AuraEffectHandleModes>,
1378 R
""(EffectApplyHandler signature must be "void HandleApplyOrRemove(AuraEffect const* aurEff, AuraEffectHandleModes mode)")"");
1380 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect const*, AuraEffectHandleModes>,
1381 R
""(EffectApplyHandler signature must be "static void HandleApplyOrRemove(your_script_class& script, AuraEffect const* aurEff, AuraEffectHandleModes mode)")"");
1389 if (!(_mode & mode))
1392 return _invoker.Thunk(*auraScript, aurEff, mode, _invoker.ImplStorage);
1404 template<
typename ScriptFunc>
1410 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1411 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1413 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1414 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect*, DamageInfo&, uint32&>,
1415 R
""(EffectAbsorbHandler signature must be "void HandleAbsorb(AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount)")"");
1417 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect*, DamageInfo&, uint32&>,
1418 R
""(EffectAbsorbHandler signature must be "static void HandleAbsorb(your_script_class& script, AuraEffect* aurEff, DamageInfo& dmgInfo, uint32& absorbAmount)")"");
1426 return _invoker.Thunk(*auraScript, aurEff, dmgInfo, absorbAmount, _invoker.ImplStorage);
1437 template<
typename ScriptFunc>
1443 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1444 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1446 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1447 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect*, HealInfo&, uint32&>,
1448 R
""(EffectAbsorbHealHandler signature must be "void HandleAbsorb(AuraEffect* aurEff, HealInfo& healInfo, uint32& absorbAmount)")"");
1450 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect*, HealInfo&, uint32&>,
1451 R
""(EffectAbsorbHealHandler signature must be "static void HandleAbsorb(your_script_class& script, AuraEffect* aurEff, HealInfo& healInfo, uint32& absorbAmount)")"");
1459 return _invoker.Thunk(*auraScript, aurEff, healInfo, absorbAmount, _invoker.ImplStorage);
1470 template<
typename ScriptFunc>
1475 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1476 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1478 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1479 static_assert(std::is_invocable_r_v<bool, ScriptFunc, ScriptClass&, ProcEventInfo&>,
1480 R
""(CheckProcHandler signature must be "bool CheckProc(ProcEventInfo& eventInfo)")"");
1482 static_assert(std::is_invocable_r_v<bool, ScriptFunc, ScriptClass&, ProcEventInfo&>,
1483 R
""(CheckProcHandler signature must be "static bool CheckProc(your_script_class& script, ProcEventInfo& eventInfo)")"");
1491 return _invoker.Thunk(*auraScript, eventInfo, _invoker.ImplStorage);
1502 template<
typename ScriptFunc>
1508 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1509 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1511 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1512 static_assert(std::is_invocable_r_v<bool, ScriptFunc, ScriptClass&, AuraEffect const*, ProcEventInfo&>,
1513 R
""(CheckEffectProcHandler signature must be "bool CheckProc(AuraEffect const* aurEff, ProcEventInfo& eventInfo)")"");
1515 static_assert(std::is_invocable_r_v<bool, ScriptFunc, ScriptClass&, AuraEffect const*, ProcEventInfo&>,
1516 R
""(CheckEffectProcHandler signature must be "static bool CheckProc(your_script_class& script, AuraEffect const* aurEff, ProcEventInfo& eventInfo)")"");
1524 return _invoker.Thunk(*auraScript, aurEff, eventInfo, _invoker.ImplStorage);
1535 template<
typename ScriptFunc>
1540 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1541 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1543 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1544 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, ProcEventInfo&>,
1545 R
""(AuraProcHandler signature must be "void HandleProc(ProcEventInfo& eventInfo)")"");
1547 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, ProcEventInfo&>,
1548 R
""(AuraProcHandler signature must be "static void HandleProc(your_script_class& script, ProcEventInfo& eventInfo)")"");
1556 return _invoker.Thunk(*auraScript, eventInfo, _invoker.ImplStorage);
1567 template<
typename ScriptFunc>
1573 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1574 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1576 if constexpr (std::is_member_function_pointer_v<ScriptFunc>)
1577 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect*, ProcEventInfo&>,
1578 R
""(EffectProcHandler signature must be "void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo)")"");
1580 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass&, AuraEffect*, ProcEventInfo&>,
1581 R
""(EffectProcHandler signature must be "static void HandleProc(your_script_class& script, AuraEffect* aurEff, ProcEventInfo& eventInfo)")"");
1589 return _invoker.Thunk(*auraScript, aurEff, eventInfo, _invoker.ImplStorage);
1600 template<
typename ScriptFunc>
1605 static_assert(ScriptFuncInvoker::Size >=
sizeof(ScriptFunc));
1606 static_assert(ScriptFuncInvoker::Alignment >=
alignof(ScriptFunc));
1608 static_assert(std::is_invocable_r_v<void, ScriptFunc, ScriptClass, bool>,
1609 R
""(EnterLeaveCombatHandler signature must be "void HandleEnterLeaveCombat(bool isNowInCombat)")"");
1617 return _invoker.Thunk(*auraScript, isNowInCombat, _invoker.ImplStorage);
1624 #define PrepareAuraScript(CLASSNAME)
1629 bool _Validate(
SpellInfo const* entry) override;
1630 bool _Load(
Aura* aura);
1632 void _FinishScriptCall();
1633 bool _IsDefaultActionPrevented() const;
1637 bool m_defaultActionPrevented;
1646 : _auraApplication(auraApplication), _currentScriptState(currentScriptState), _defaultActionPrevented(defaultActionPrevented)
1661 #define AuraCheckAreaTargetFn(F) CheckAreaTargetHandler(&F)
1671 #define AuraDispelFn(F) AuraDispelHandler(&F)
1677 #define AuraHeartbeatFn(F) AuraHeartbeatHandler(&F)
1688 #define AuraEffectApplyFn(F, I, N, M) EffectApplyHandler(&F, I, N, M)
1699 #define AuraEffectRemoveFn(F, I, N, M) EffectApplyHandler(&F, I, N, M)
1705 #define AuraEffectPeriodicFn(F, I, N) EffectPeriodicHandler(&F, I, N)
1711 #define AuraEffectUpdatePeriodicFn(F, I, N) EffectUpdatePeriodicHandler(&F, I, N)
1717 #define AuraEffectCalcAmountFn(F, I, N) EffectCalcAmountHandler(&F, I, N)
1723 #define AuraEffectCalcPeriodicFn(F, I, N) EffectCalcPeriodicHandler(&F, I, N)
1729 #define AuraEffectCalcSpellModFn(F, I, N) EffectCalcSpellModHandler(&F, I, N)
1735 #define AuraEffectCalcCritChanceFn(F, I, N) EffectCalcCritChanceHandler(&F, I, N)
1742 #define AuraEffectCalcDamageFn(F, I, N) EffectCalcDamageAndHealingHandler(&F, I, N)
1743 #define AuraEffectCalcHealingFn(F, I, N) EffectCalcDamageAndHealingHandler(&F, I, N)
1744 #define AuraEffectCalcAbsorbFn(F, I) EffectCalcDamageAndHealingHandler(&F, I, SPELL_AURA_SCHOOL_ABSORB)
1750 #define AuraEffectAbsorbFn(F, I) EffectAbsorbHandler(&F, I, SPELL_AURA_SCHOOL_ABSORB)
1751 #define AuraEffectAbsorbOverkillFn(F, I) EffectAbsorbHandler(&F, I, SPELL_AURA_SCHOOL_ABSORB_OVERKILL)
1762 #define AuraEffectAbsorbHealFn(F, I) EffectAbsorbHealHandler(&F, I, SPELL_AURA_SCHOOL_HEAL_ABSORB)
1773 #define AuraEffectManaShieldFn(F, I) EffectAbsorbHandler(&F, I, SPELL_AURA_MANA_SHIELD)
1784 #define AuraEffectSplitFn(F, I) EffectAbsorbHandler(&F, I, SPELL_AURA_SPLIT_DAMAGE_PCT)
1790 #define AuraCheckProcFn(F) CheckProcHandler(&F)
1796 #define AuraCheckEffectProcFn(F, I, N) CheckEffectProcHandler(&F, I, N)
1810 #define AuraProcFn(F) AuraProcHandler(&F)
1820 #define AuraEffectProcFn(F, I, N) EffectProcHandler(&F, I, N)
1826 #define AuraEnterLeaveCombatFn(F) EnterLeaveCombatHandler(&F)
1831 void PreventDefaultAction();
1844 Unit* GetCaster()
const;
1850 Unit* GetUnitOwner()
const;
1857 Aura* GetAura()
const;
1863 int32 GetDuration()
const;
1864 void SetDuration(
int32 duration,
bool withMods =
false);
1866 void RefreshDuration();
1867 time_t GetApplyTime()
const;
1868 int32 GetMaxDuration()
const;
1869 void SetMaxDuration(
int32 duration);
1870 int32 CalcMaxDuration()
const;
1872 bool IsExpired()
const;
1874 bool IsPermanent()
const;
1877 uint8 GetCharges()
const;
1878 void SetCharges(
uint8 charges);
1879 uint8 CalcMaxCharges()
const;
1885 uint8 GetStackAmount()
const;
1886 void SetStackAmount(
uint8 num);
1890 bool IsPassive()
const;
1892 bool IsDeathPersistent()
const;
1895 bool HasEffect(
uint8 effIndex)
const;
1900 bool HasEffectType(
AuraType type)
const;
1908 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