From f1e4ee21f8da41c71f4cbafaa85e89c6275c1db2 Mon Sep 17 00:00:00 2001 From: Ovah Date: Sat, 25 Apr 2020 15:54:08 -0300 Subject: Core/AI: Implemented OnSpellCastInterrupt and OnSuccessfulSpellCast hooks Ported from: 020825902c066cee532f1b9a24205c196da2662d and 1aa42e97a81e285fa34316ad9cfe9657865e3c35 --- src/server/game/AI/CreatureAI.h | 6 ++++++ src/server/game/Entities/Unit/Unit.cpp | 3 +++ src/server/game/Spells/Spell.cpp | 5 +++++ 3 files changed, 14 insertions(+) (limited to 'src') diff --git a/src/server/game/AI/CreatureAI.h b/src/server/game/AI/CreatureAI.h index 0f9a7e5c817..fae81fdd4b8 100644 --- a/src/server/game/AI/CreatureAI.h +++ b/src/server/game/AI/CreatureAI.h @@ -145,6 +145,12 @@ class TC_GAME_API CreatureAI : public UnitAI virtual void SpellHitTarget(Unit* /*target*/, SpellInfo const* /*spellInfo*/) { } virtual void SpellHitTargetGameObject(GameObject* /*target*/, SpellInfo const* /*spellInfo*/) { } + // Called when a spell cast gets interrupted + virtual void OnSpellCastInterrupt(SpellInfo const* /*spell*/) { } + + // Called when a spell cast has been successfully finished + virtual void OnSuccessfulSpellCast(SpellInfo const* /*spell*/) { } + // Should return true if the NPC is currently being escorted virtual bool IsEscorted() const { return false; } diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 0deaf977e8f..8901b638c03 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -3011,6 +3011,9 @@ void Unit::InterruptSpell(CurrentSpellTypes spellType, bool withDelayed, bool wi m_currentSpells[spellType] = nullptr; spell->SetReferencedFromCurrent(false); } + + if (GetTypeId() == TYPEID_UNIT && IsAIEnabled()) + ToCreature()->AI()->OnSpellCastInterrupt(spell->GetSpellInfo()); } } diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 52c634cc05a..5a75f6a0388 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -3454,6 +3454,11 @@ void Spell::_cast(bool skipCheck) hitMask |= PROC_HIT_NORMAL; Unit::ProcSkillsAndAuras(m_originalCaster, nullptr, procAttacker, PROC_FLAG_NONE, PROC_SPELL_TYPE_MASK_ALL, PROC_SPELL_PHASE_CAST, hitMask, this, nullptr, nullptr); + + // Call CreatureAI hook OnSuccessfulSpellCast + if (Creature* caster = m_originalCaster->ToCreature()) + if (caster->IsAIEnabled()) + caster->AI()->OnSuccessfulSpellCast(GetSpellInfo()); } template -- cgit v1.2.3