Core/Units: Make summoned gameobject cleanup consistent for all overloads of Unit::RemoveGameObject

This commit is contained in:
luis
2026-09-22 20:56:24 -03:00
parent 89c539930f
commit 6aee5fae08
2 changed files with 23 additions and 31 deletions
+22 -31
View File
@@ -5504,21 +5504,13 @@ void Unit::AddGameObject(GameObject* gameObj)
ToCreature()->AI()->JustSummonedGameobject(gameObj);
}
void Unit::RemoveGameObject(GameObject* gameObj, bool del)
void Unit::RemoveGameObjectImpl(GameObject* gameObj, bool del)
{
if (!gameObj || gameObj->GetOwnerGUID() != GetGUID())
return;
gameObj->SetOwnerGUID(ObjectGuid::Empty);
for (uint8 i = 0; i < MAX_GAMEOBJECT_SLOT; ++i)
{
if (m_ObjectSlot[i] == gameObj->GetGUID())
{
m_ObjectSlot[i].Clear();
break;
}
}
auto objectSlotItr = std::ranges::find(m_ObjectSlot, gameObj->GetGUID());
if (objectSlotItr != std::ranges::end(m_ObjectSlot))
objectSlotItr->Clear();
// GO created by some spell
if (uint32 spellid = gameObj->GetSpellId())
@@ -5532,8 +5524,6 @@ void Unit::RemoveGameObject(GameObject* gameObj, bool del)
GetSpellHistory()->SendCooldownEvent(createBySpell);
}
m_gameObj.remove(gameObj);
if (GetTypeId() == TYPEID_UNIT && ToCreature()->IsAIEnabled())
ToCreature()->AI()->SummonedGameobjectDespawn(gameObj);
@@ -5544,27 +5534,30 @@ void Unit::RemoveGameObject(GameObject* gameObj, bool del)
}
}
void Unit::RemoveGameObject(GameObject* gameObj, bool del)
{
if (!gameObj || gameObj->GetOwnerGUID() != GetGUID())
return;
RemoveGameObjectImpl(gameObj, del);
m_gameObj.remove(gameObj);
}
void Unit::RemoveGameObject(uint32 spellid, bool del)
{
if (m_gameObj.empty())
return;
GameObjectList::iterator i, next;
for (i = m_gameObj.begin(); i != m_gameObj.end(); i = next)
for (auto i = m_gameObj.begin(); i != m_gameObj.end(); )
{
next = i;
if (spellid == 0 || (*i)->GetSpellId() == spellid)
{
(*i)->SetOwnerGUID(ObjectGuid::Empty);
if (del)
{
(*i)->SetRespawnTime(0);
(*i)->Delete();
}
next = m_gameObj.erase(i);
RemoveGameObjectImpl(*i, del);
i = m_gameObj.erase(i);
}
else
++next;
++i;
}
}
@@ -5573,11 +5566,9 @@ void Unit::RemoveAllGameObjects()
// remove references to unit
while (!m_gameObj.empty())
{
GameObjectList::iterator i = m_gameObj.begin();
(*i)->SetOwnerGUID(ObjectGuid::Empty);
(*i)->SetRespawnTime(0);
(*i)->Delete();
m_gameObj.erase(i);
GameObject* gameObj = m_gameObj.front();
m_gameObj.pop_front();
RemoveGameObjectImpl(gameObj, true);
}
}
+1
View File
@@ -1968,6 +1968,7 @@ class TC_GAME_API Unit : public WorldObject
DynObjectList m_dynObj;
typedef std::list<GameObject*> GameObjectList;
void RemoveGameObjectImpl(GameObject* gameObj, bool del);
GameObjectList m_gameObj;
typedef std::vector<AreaTrigger*> AreaTriggerList;