From d499633cb513f7438ed38cf99ff33af061a5b6ea Mon Sep 17 00:00:00 2001 From: tb Date: Sun, 21 Sep 2025 00:16:11 -0400 Subject: [PATCH 1/2] Add support for new OnAuraApplication spell hook. --- src/server/game/LuaEngine | 2 +- src/server/game/Spells/Auras/SpellAuraEffects.cpp | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/server/game/LuaEngine b/src/server/game/LuaEngine index b2ffc72fec..908dff2d01 160000 --- a/src/server/game/LuaEngine +++ b/src/server/game/LuaEngine @@ -1 +1 @@ -Subproject commit b2ffc72fecf8fe9d0c6eac71d757b97caaebdbfe +Subproject commit 908dff2d01a84bd3af3a519324c4046d10e78e31 diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index ec185b795f..4c05ed0959 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -720,6 +720,11 @@ void AuraEffect::HandleEffect(AuraApplication * aurApp, uint8 mode, bool apply) ApplySpellMod(aurApp->GetTarget(), apply); // call scripts helping/replacing effect handlers +#ifdef ELUNA + if (aurApp->GetTarget()) + if (Eluna* e = aurApp->GetTarget()->GetEluna()) + e->OnAuraApplication(GetBase(), uint8(GetEffIndex()), mode, apply); +#endif bool prevented = false; if (apply) prevented = GetBase()->CallScriptEffectApplyHandlers(this, aurApp, (AuraEffectHandleModes)mode); From 0926b009ef1fa04c5bf4c3ae7fcd694105070035 Mon Sep 17 00:00:00 2001 From: tb Date: Tue, 23 Sep 2025 12:59:55 -0400 Subject: [PATCH 2/2] Add weakptr for auraeffect, add support new spell aura script hooks. --- .../game/Spells/Auras/SpellAuraEffects.cpp | 8 +-- .../game/Spells/Auras/SpellAuraEffects.h | 3 ++ src/server/game/Spells/Auras/SpellAuras.cpp | 53 +++++++++++++++++++ 3 files changed, 58 insertions(+), 6 deletions(-) diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 4c05ed0959..264e9a7f05 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -385,7 +385,7 @@ AuraEffect::AuraEffect(Aura* base, SpellEffectInfo const& spellEfffectInfo, int3 m_base(base), m_spellInfo(base->GetSpellInfo()), m_spellEffectInfo(spellEfffectInfo), m_baseAmount(baseAmount ? *baseAmount : spellEfffectInfo.BasePoints), _amount(), m_spellmod(nullptr), _periodicTimer(0), _amplitude(0), _ticksDone(0), -m_canBeRecalculated(true), m_isPeriodic(false) +m_canBeRecalculated(true), m_isPeriodic(false), m_scriptRef(this, NoopAuraEffectDeleter()) { CalculatePeriodic(caster, true, false); @@ -396,6 +396,7 @@ m_canBeRecalculated(true), m_isPeriodic(false) AuraEffect::~AuraEffect() { + m_scriptRef = nullptr; delete m_spellmod; } @@ -720,11 +721,6 @@ void AuraEffect::HandleEffect(AuraApplication * aurApp, uint8 mode, bool apply) ApplySpellMod(aurApp->GetTarget(), apply); // call scripts helping/replacing effect handlers -#ifdef ELUNA - if (aurApp->GetTarget()) - if (Eluna* e = aurApp->GetTarget()->GetEluna()) - e->OnAuraApplication(GetBase(), uint8(GetEffIndex()), mode, apply); -#endif bool prevented = false; if (apply) prevented = GetBase()->CallScriptEffectApplyHandlers(this, aurApp, (AuraEffectHandleModes)mode); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h index 419f4abdef..c078f0667c 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.h +++ b/src/server/game/Spells/Auras/SpellAuraEffects.h @@ -99,6 +99,7 @@ class TC_GAME_API AuraEffect SpellEffectInfo const& GetSpellEffectInfo() const { return m_spellEffectInfo; } + Trinity::unique_weak_ptr GetWeakPtr() const { return m_scriptRef; } private: Aura* const m_base; @@ -120,6 +121,8 @@ class TC_GAME_API AuraEffect float GetCritChanceFor(Unit const* caster, Unit const* target) const; + struct NoopAuraEffectDeleter { void operator()(AuraEffect*) const { /*noop - not managed*/ } }; + Trinity::unique_trackable_ptr m_scriptRef; public: // aura effect apply/remove handlers void HandleNULL(AuraApplication const* /*aurApp*/, uint8 /*mode*/, bool /*apply*/) const diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index dcac910c34..b8f2b88ee4 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -37,6 +37,9 @@ #include "Vehicle.h" #include "World.h" #include "WorldPacket.h" +#ifdef ELUNA +#include "LuaEngine.h" +#endif AuraCreateInfo::AuraCreateInfo(SpellInfo const* spellInfo, uint8 auraEffMask, WorldObject* owner) : _spellInfo(spellInfo), _auraEffectMask(auraEffMask), _owner(owner) @@ -2203,6 +2206,12 @@ void Aura::CallScriptDispel(DispelInfo* dispelInfo) (*scritr)->_FinishScriptCall(); } + +#ifdef ELUNA + if (GetCaster()) + if (Eluna* e = GetCaster()->GetEluna()) + e->OnAuraDispel(this, dispelInfo); +#endif } void Aura::CallScriptAfterDispel(DispelInfo* dispelInfo) @@ -2235,6 +2244,15 @@ bool Aura::CallScriptEffectApplyHandlers(AuraEffect const* aurEff, AuraApplicati (*scritr)->_FinishScriptCall(); } +#ifdef ELUNA + if (!preventDefault) + { + if (aurApp->GetTarget()) + if (Eluna* e = aurApp->GetTarget()->GetEluna()) + preventDefault = e->OnAuraApplication(aurApp->GetBase(), aurEff, aurApp->GetTarget(), mode, true); + } +#endif + return preventDefault; } @@ -2254,6 +2272,16 @@ bool Aura::CallScriptEffectRemoveHandlers(AuraEffect const* aurEff, AuraApplicat (*scritr)->_FinishScriptCall(); } + +#ifdef ELUNA + if (!preventDefault) + { + if (aurApp->GetTarget()) + if (Eluna* e = aurApp->GetTarget()->GetEluna()) + preventDefault = e->OnAuraApplication(aurApp->GetBase(), aurEff, aurApp->GetTarget(), mode, false); + } +#endif + return preventDefault; } @@ -2302,6 +2330,15 @@ bool Aura::CallScriptEffectPeriodicHandlers(AuraEffect const* aurEff, AuraApplic (*scritr)->_FinishScriptCall(); } +#ifdef ELUNA + if (!preventDefault) + { + if (aurApp->GetTarget()) + if (Eluna* e = aurApp->GetTarget()->GetEluna()) + preventDefault = e->OnPerodicTick(aurApp->GetBase(), aurEff, aurApp->GetTarget()); + } +#endif + return preventDefault; } @@ -2317,6 +2354,12 @@ void Aura::CallScriptEffectUpdatePeriodicHandlers(AuraEffect* aurEff) (*scritr)->_FinishScriptCall(); } + +#ifdef ELUNA + if (aurEff->GetCaster()) + if (Eluna* e = aurEff->GetCaster()->GetEluna()) + e->OnPerodicTick(aurEff->GetBase(), aurEff); +#endif } void Aura::CallScriptEffectCalcAmountHandlers(AuraEffect const* aurEff, int32& amount, bool& canBeRecalculated) @@ -2331,6 +2374,11 @@ void Aura::CallScriptEffectCalcAmountHandlers(AuraEffect const* aurEff, int32& a (*scritr)->_FinishScriptCall(); } +#ifdef ELUNA + if (aurEff->GetCaster()) + if (Eluna* e = aurEff->GetCaster()->GetEluna()) + e->OnAuraCalcAmount(aurEff->GetBase(), aurEff, amount, canBeRecalculated); +#endif } void Aura::CallScriptEffectCalcPeriodicHandlers(AuraEffect const* aurEff, bool& isPeriodic, int32& amplitude) @@ -2345,6 +2393,11 @@ void Aura::CallScriptEffectCalcPeriodicHandlers(AuraEffect const* aurEff, bool& (*scritr)->_FinishScriptCall(); } +#ifdef ELUNA + if (aurEff->GetCaster()) + if (Eluna* e = aurEff->GetCaster()->GetEluna()) + e->OnCalcPerodic(aurEff->GetBase(), aurEff, isPeriodic, amplitude); +#endif } void Aura::CallScriptEffectCalcSpellModHandlers(AuraEffect const* aurEff, SpellModifier*& spellMod)