diff options
author | Krudor <erikstrandberg93@hotmail.com> | 2016-07-12 18:04:19 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2016-07-12 18:04:19 +0200 |
commit | cf60c492eca0b583d50818038ebfb90a00881959 (patch) | |
tree | 0be1b7b7c7f033f68982aa686dede2c0781fc288 /src | |
parent | 03c5e7207b9e56ba48c32775be7d7ca08cb3c240 (diff) |
Core/AI: Add better support for tracking DynObjs (#17562)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/AI/CreatureAI.h | 8 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 44 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 4 |
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); |