Core/Corpses: Prevent deleting corpses by ObjectGridUnloader, fixes accessing freed memory in multiple places due to the corpse still being registered in Map containers

Closes #15775
Closes #15781
This commit is contained in:
Shauren
2015-10-30 17:51:19 +01:00
parent 4245c2c59d
commit a94bdd00a9
3 changed files with 9 additions and 3 deletions

View File

@@ -152,7 +152,12 @@ void ObjectWorldLoader::Visit(CorpseMapType& /*m*/)
for (Corpse* corpse : *corpses)
{
corpse->AddToWorld();
i_grid.GetGridType(i_cell.CellX(), i_cell.CellY()).AddWorldObject(corpse);
GridType& cell = i_grid.GetGridType(i_cell.CellX(), i_cell.CellY());
if (corpse->IsWorldObject())
cell.AddWorldObject(corpse);
else
cell.AddGridObject(corpse);
++i_corpses;
}
}
@@ -230,7 +235,7 @@ void ObjectGridCleaner::Visit(GridRefManager<T> &m)
template void ObjectGridUnloader::Visit(CreatureMapType &);
template void ObjectGridUnloader::Visit(GameObjectMapType &);
template void ObjectGridUnloader::Visit(DynamicObjectMapType &);
template void ObjectGridUnloader::Visit(CorpseMapType &);
template void ObjectGridCleaner::Visit(CreatureMapType &);
template void ObjectGridCleaner::Visit<GameObject>(GameObjectMapType &);
template void ObjectGridCleaner::Visit<DynamicObject>(DynamicObjectMapType &);

View File

@@ -82,6 +82,7 @@ class ObjectGridCleaner
class ObjectGridUnloader
{
public:
void Visit(CorpseMapType& m) { } // corpses are deleted with Map
template<class T> void Visit(GridRefManager<T> &m);
};
#endif

View File

@@ -561,7 +561,7 @@ class Map : public GridRefManager<NGridType>
{
_updateObjects.insert(obj);
}
void RemoveUpdateObject(Object* obj)
{
_updateObjects.erase(obj);