aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/AI/CreatureAI.h8
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp44
-rw-r--r--src/server/game/Entities/Unit/Unit.h4
3 files changed, 43 insertions, 13 deletions
diff --git a/src/server/game/AI/CreatureAI.h b/src/server/game/AI/CreatureAI.h
index f175050e107..a2c5bb0db3e 100644
--- a/src/server/game/AI/CreatureAI.h
+++ b/src/server/game/AI/CreatureAI.h
@@ -127,6 +127,14 @@ class TC_GAME_API CreatureAI : public UnitAI
virtual void SummonedCreatureDespawn(Creature* /*summon*/) { }
virtual void SummonedCreatureDies(Creature* /*summon*/, Unit* /*killer*/) { }
+ // Called when the creature successfully summons a gameobject
+ virtual void JustSummonedGameobject(GameObject* /*gameobject*/) { }
+ virtual void SummonedGameobjectDespawn(GameObject* /*gameobject*/) { }
+
+ // Called when the creature successfully registers a dynamicobject
+ virtual void JustRegisteredDynObject(DynamicObject* /*dynObject*/) { }
+ virtual void JustUnregisteredDynObject(DynamicObject* /*dynObject*/) { }
+
// Called when hit by a spell
virtual void SpellHit(Unit* /*caster*/, SpellInfo const* /*spell*/) { }
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index fac87a7723c..f7e5fe94ac5 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -4669,24 +4669,31 @@ void Unit::ApplyStatPercentBuffMod(Stats stat, float val, bool apply)
void Unit::_RegisterDynObject(DynamicObject* dynObj)
{
m_dynObj.push_back(dynObj);
+ if (GetTypeId() == TYPEID_UNIT && IsAIEnabled)
+ ToCreature()->AI()->JustRegisteredDynObject(dynObj);
}
void Unit::_UnregisterDynObject(DynamicObject* dynObj)
{
m_dynObj.remove(dynObj);
+ if (GetTypeId() == TYPEID_UNIT && IsAIEnabled)
+ ToCreature()->AI()->JustUnregisteredDynObject(dynObj);
}
-DynamicObject* Unit::GetDynObject(uint32 spellId)
+DynamicObject* Unit::GetDynObject(uint32 spellId) const
{
- if (m_dynObj.empty())
- return NULL;
- for (DynObjectList::const_iterator i = m_dynObj.begin(); i != m_dynObj.end();++i)
- {
- DynamicObject* dynObj = *i;
- if (dynObj->GetSpellId() == spellId)
- return dynObj;
- }
- return NULL;
+ std::vector<DynamicObject*> dynamicobjects = GetDynObjects(spellId);
+ return dynamicobjects.empty() ? nullptr : dynamicobjects.front();
+}
+
+std::vector<DynamicObject*> Unit::GetDynObjects(uint32 spellId) const
+{
+ std::vector<DynamicObject*> dynamicobjects;
+ for (DynObjectList::const_iterator i = m_dynObj.begin(); i != m_dynObj.end(); ++i)
+ if ((*i)->GetSpellId() == spellId)
+ dynamicobjects.push_back(*i);
+
+ return dynamicobjects;
}
void Unit::RemoveDynObject(uint32 spellId)
@@ -4714,11 +4721,18 @@ void Unit::RemoveAllDynObjects()
GameObject* Unit::GetGameObject(uint32 spellId) const
{
+ std::vector<GameObject*> gameobjects = GetGameObjects(spellId);
+ return gameobjects.empty() ? nullptr : gameobjects.front();
+}
+
+std::vector<GameObject*> Unit::GetGameObjects(uint32 spellId) const
+{
+ std::vector<GameObject*> gameobjects;
for (GameObjectList::const_iterator i = m_gameObj.begin(); i != m_gameObj.end(); ++i)
if ((*i)->GetSpellId() == spellId)
- return *i;
+ gameobjects.push_back(*i);
- return NULL;
+ return gameobjects;
}
void Unit::AddGameObject(GameObject* gameObj)
@@ -4737,6 +4751,9 @@ void Unit::AddGameObject(GameObject* gameObj)
// note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
GetSpellHistory()->StartCooldown(createBySpell, 0, nullptr, true);
}
+
+ if (GetTypeId() == TYPEID_UNIT && ToCreature()->IsAIEnabled)
+ ToCreature()->AI()->JustSummonedGameobject(gameObj);
}
void Unit::RemoveGameObject(GameObject* gameObj, bool del)
@@ -4769,6 +4786,9 @@ void Unit::RemoveGameObject(GameObject* gameObj, bool del)
m_gameObj.remove(gameObj);
+ if (GetTypeId() == TYPEID_UNIT && ToCreature()->IsAIEnabled)
+ ToCreature()->AI()->SummonedGameobjectDespawn(gameObj);
+
if (del)
{
gameObj->SetRespawnTime(0);
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index f94dd08505d..8f50f242e8e 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -2029,11 +2029,13 @@ class TC_GAME_API Unit : public WorldObject
// DynamicObject management
void _RegisterDynObject(DynamicObject* dynObj);
void _UnregisterDynObject(DynamicObject* dynObj);
- DynamicObject* GetDynObject(uint32 spellId);
+ DynamicObject* GetDynObject(uint32 spellId) const;
+ std::vector<DynamicObject*> GetDynObjects(uint32 spellId) const;
void RemoveDynObject(uint32 spellId);
void RemoveAllDynObjects();
GameObject* GetGameObject(uint32 spellId) const;
+ std::vector<GameObject*> GetGameObjects(uint32 spellId) const;
void AddGameObject(GameObject* gameObj);
void RemoveGameObject(GameObject* gameObj, bool del);
void RemoveGameObject(uint32 spellid, bool del);