Core/Units: Make summoned gameobject cleanup consistent for all overloads of Unit::RemoveGameObject
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user