diff options
author | offl <11556157+offl@users.noreply.github.com> | 2025-09-24 14:06:06 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-09-24 13:06:06 +0200 |
commit | 3bb4f5677359e3af9fe4b80e42157816786dca49 (patch) | |
tree | b95fb0c8b02d6f9fb22bd1a0ef3d332312c6db7f /src | |
parent | 5a7455334655b9851f340f7012c27b61b5ce04af (diff) |
Core/AI: Implement OnAuraApplied and OnAuraRemoved hooks (#31288)
Closes #26894
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/AI/CreatureAI.h | 7 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartAI.cpp | 11 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartAI.h | 6 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 2 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 4 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.h | 8 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.cpp | 13 |
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) |