aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorOvah <dreadkiller@gmx.de>2020-04-25 15:54:08 -0300
committerKeader <keader.android@gmail.com>2020-04-25 16:07:18 -0300
commitf1e4ee21f8da41c71f4cbafaa85e89c6275c1db2 (patch)
treeceafcc118375267a14fb381654147cfd4e1a9b27 /src
parent7c91c423d05aabc18d5c36af9ecc2a9c5f49970d (diff)
Core/AI: Implemented OnSpellCastInterrupt and OnSuccessfulSpellCast hooks
Ported from: 020825902c066cee532f1b9a24205c196da2662d and 1aa42e97a81e285fa34316ad9cfe9657865e3c35
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/CreatureAI.h6
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp3
-rw-r--r--src/server/game/Spells/Spell.cpp5
3 files changed, 14 insertions, 0 deletions
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 <class Container>