aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoroffl <11556157+offl@users.noreply.github.com>2025-09-24 14:06:06 +0300
committerGitHub <noreply@github.com>2025-09-24 13:06:06 +0200
commit3bb4f5677359e3af9fe4b80e42157816786dca49 (patch)
treeb95fb0c8b02d6f9fb22bd1a0ef3d332312c6db7f
parent5a7455334655b9851f340f7012c27b61b5ce04af (diff)
Core/AI: Implement OnAuraApplied and OnAuraRemoved hooks (#31288)
Closes #26894
-rw-r--r--src/server/game/AI/CreatureAI.h7
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.cpp11
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.h6
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp2
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp4
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h8
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp13
7 files changed, 49 insertions, 2 deletions
diff --git a/src/server/game/AI/CreatureAI.h b/src/server/game/AI/CreatureAI.h
index b628fd830b6..69bc6343b09 100644
--- a/src/server/game/AI/CreatureAI.h
+++ b/src/server/game/AI/CreatureAI.h
@@ -25,6 +25,7 @@
#include "UnitAI.h"
class AreaBoundary;
+class AuraApplication;
class Creature;
class DynamicObject;
class GameObject;
@@ -156,6 +157,12 @@ class TC_GAME_API CreatureAI : public UnitAI
// Called when a channeled spell finishes
virtual void OnChannelFinished(SpellInfo const* /*spell*/) { }
+ // Called when aura is applied
+ virtual void OnAuraApplied(AuraApplication const* /*aurApp*/) { }
+
+ // Called when aura is removed
+ virtual void OnAuraRemoved(AuraApplication const* /*aurApp*/) { }
+
// Should return true if the NPC is currently being escorted
virtual bool IsEscorted() const { return false; }
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp
index abf92e01479..3fd35ac39d1 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.cpp
+++ b/src/server/game/AI/SmartScripts/SmartAI.cpp
@@ -27,6 +27,7 @@
#include "PetDefines.h"
#include "Player.h"
#include "ScriptMgr.h"
+#include "SpellAuras.h"
#include "Vehicle.h"
SmartAI::SmartAI(Creature* creature) : CreatureAI(creature), _charmed(false), _followCreditType(0), _followArrivedTimer(0), _followCredit(0), _followArrivedEntry(0), _followDistance(0.f), _followAngle(0.f),
@@ -634,6 +635,16 @@ void SmartAI::OnSpellStart(SpellInfo const* spellInfo)
GetScript()->ProcessEventsFor(SMART_EVENT_ON_SPELL_START, nullptr, 0, 0, false, spellInfo);
}
+void SmartAI::OnAuraApplied(AuraApplication const* aurApp)
+{
+ GetScript()->ProcessEventsFor(SMART_EVENT_ON_AURA_APPLIED, nullptr, 0, 0, false, aurApp->GetBase()->GetSpellInfo());
+}
+
+void SmartAI::OnAuraRemoved(AuraApplication const* aurApp)
+{
+ GetScript()->ProcessEventsFor(SMART_EVENT_ON_AURA_REMOVED, nullptr, 0, 0, false, aurApp->GetBase()->GetSpellInfo());
+}
+
void SmartAI::DamageTaken(Unit* doneBy, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/)
{
GetScript()->ProcessEventsFor(SMART_EVENT_DAMAGED, doneBy, damage);
diff --git a/src/server/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h
index b4bf355ab72..bc7339e4c59 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.h
+++ b/src/server/game/AI/SmartScripts/SmartAI.h
@@ -132,6 +132,12 @@ class TC_GAME_API SmartAI : public CreatureAI
// Called when a spell starts
void OnSpellStart(SpellInfo const* spellInfo) override;
+ // Called when aura is applied
+ void OnAuraApplied(AuraApplication const* aurApp) override;
+
+ // Called when aura is removed
+ void OnAuraRemoved(AuraApplication const* aurApp) override;
+
// Called at any Damage from any attacker (before damage apply)
void DamageTaken(Unit* doneBy, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override;
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index ce1e8053f57..ac3c8cf4932 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -2965,6 +2965,8 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
case SMART_EVENT_ON_SPELL_CAST:
case SMART_EVENT_ON_SPELL_FAILED:
case SMART_EVENT_ON_SPELL_START:
+ case SMART_EVENT_ON_AURA_APPLIED:
+ case SMART_EVENT_ON_AURA_REMOVED:
{
if (!spell)
return;
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index 270dafa6cbc..f7e93b85a6b 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -774,6 +774,8 @@ bool SmartAIMgr::CheckUnusedEventParams(SmartScriptHolder const& e)
case SMART_EVENT_ON_SPELL_CAST: return sizeof(SmartEvent::spellCast);
case SMART_EVENT_ON_SPELL_FAILED: return sizeof(SmartEvent::spellCast);
case SMART_EVENT_ON_SPELL_START: return sizeof(SmartEvent::spellCast);
+ case SMART_EVENT_ON_AURA_APPLIED: return sizeof(SmartEvent::spellCast);
+ case SMART_EVENT_ON_AURA_REMOVED: return sizeof(SmartEvent::spellCast);
case SMART_EVENT_ON_DESPAWN: return NO_PARAMS;
default:
TC_LOG_WARN("sql.sql", "SmartAIMgr: Entry {} SourceType {} Event {} Action {} is using an event with no unused params specified in SmartAIMgr::CheckUnusedEventParams(), please report this.",
@@ -1108,6 +1110,8 @@ bool SmartAIMgr::IsEventValid(SmartScriptHolder& e)
case SMART_EVENT_ON_SPELL_CAST:
case SMART_EVENT_ON_SPELL_FAILED:
case SMART_EVENT_ON_SPELL_START:
+ case SMART_EVENT_ON_AURA_APPLIED:
+ case SMART_EVENT_ON_AURA_REMOVED:
{
if (!IsSpellValid(e, e.event.spellCast.spell))
return false;
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index d94a3473646..350503e0755 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -189,8 +189,10 @@ enum SMART_EVENT
SMART_EVENT_ON_DESPAWN = 86, // NONE
SMART_EVENT_SEND_EVENT_TRIGGER = 87, // UNUSED NEEDS CHERRYPICK
SMART_EVENT_AREATRIGGER_EXIT = 88, // don't use on 3.3.5a
+ SMART_EVENT_ON_AURA_APPLIED = 89, // SpellID, CooldownMin, CooldownMax
+ SMART_EVENT_ON_AURA_REMOVED = 90, // SpellID, CooldownMin, CooldownMax
- SMART_EVENT_END = 89
+ SMART_EVENT_END = 91
};
struct SmartEvent
@@ -1528,7 +1530,9 @@ const uint32 SmartAIEventMask[SMART_EVENT_END][2] =
{SMART_EVENT_ON_SPELL_START, SMART_SCRIPT_TYPE_MASK_CREATURE },
{SMART_EVENT_ON_DESPAWN, SMART_SCRIPT_TYPE_MASK_CREATURE },
{SMART_EVENT_SEND_EVENT_TRIGGER, SMART_SCRIPT_TYPE_MASK_EVENT },
- {SMART_EVENT_AREATRIGGER_EXIT, SMART_SCRIPT_TYPE_MASK_AREATRIGGER_ENTITY }
+ {SMART_EVENT_AREATRIGGER_EXIT, SMART_SCRIPT_TYPE_MASK_AREATRIGGER_ENTITY },
+ {SMART_EVENT_ON_AURA_APPLIED, SMART_SCRIPT_TYPE_MASK_CREATURE },
+ {SMART_EVENT_ON_AURA_REMOVED, SMART_SCRIPT_TYPE_MASK_CREATURE },
};
enum SmartEventFlags
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index dcac910c347..52282250c81 100644
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -1788,6 +1788,19 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b
}
break;
}
+
+ if (apply)
+ {
+ if (Creature* creature = target->ToCreature())
+ if (CreatureAI* ai = creature->AI())
+ ai->OnAuraApplied(aurApp);
+ }
+ else
+ {
+ if (Creature* creature = target->ToCreature())
+ if (CreatureAI* ai = creature->AI())
+ ai->OnAuraRemoved(aurApp);
+ }
}
bool Aura::CanBeAppliedOn(Unit* target)