diff options
author | Shauren <shauren.trinity@gmail.com> | 2015-10-30 17:51:19 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2015-10-30 17:51:19 +0100 |
commit | a94bdd00a9f31dcd9e4134987531937ca57975d6 (patch) | |
tree | 5936af26328920ee503902a357d31fab0771f3d4 /src | |
parent | 4245c2c59dd7923b3c607ed16bb6b0976e16e12d (diff) |
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
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Grids/ObjectGridLoader.cpp | 9 | ||||
-rw-r--r-- | src/server/game/Grids/ObjectGridLoader.h | 1 | ||||
-rw-r--r-- | src/server/game/Maps/Map.h | 2 |
3 files changed, 9 insertions, 3 deletions
diff --git a/src/server/game/Grids/ObjectGridLoader.cpp b/src/server/game/Grids/ObjectGridLoader.cpp index efbbf1abf72..2c292c43785 100644 --- a/src/server/game/Grids/ObjectGridLoader.cpp +++ b/src/server/game/Grids/ObjectGridLoader.cpp @@ -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 &); diff --git a/src/server/game/Grids/ObjectGridLoader.h b/src/server/game/Grids/ObjectGridLoader.h index 54dadaefdb3..9abbcce4c30 100644 --- a/src/server/game/Grids/ObjectGridLoader.h +++ b/src/server/game/Grids/ObjectGridLoader.h @@ -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 diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index c658d60f08b..0962bcc9d6c 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -561,7 +561,7 @@ class Map : public GridRefManager<NGridType> { _updateObjects.insert(obj); } - + void RemoveUpdateObject(Object* obj) { _updateObjects.erase(obj); |