diff options
-rw-r--r-- | src/game/Map.cpp | 18 | ||||
-rw-r--r-- | src/game/ObjectGridLoader.cpp | 49 | ||||
-rw-r--r-- | src/game/ObjectGridLoader.h | 25 |
3 files changed, 60 insertions, 32 deletions
diff --git a/src/game/Map.cpp b/src/game/Map.cpp index c00b774c68f..3511e7b5bca 100644 --- a/src/game/Map.cpp +++ b/src/game/Map.cpp @@ -1074,27 +1074,31 @@ bool Map::UnloadGrid(const uint32 &x, const uint32 &y, bool unloadAll) return false; DEBUG_LOG("Unloading grid[%u,%u] for map %u", x,y, i_id); + ObjectGridUnloader unloader(*grid); if(!unloadAll) { // Finish creature moves, remove and delete all creatures with delayed remove before moving to respawn grids // Must know real mob position before move - DoDelayedMovesAndRemoves(); + MoveAllCreaturesInMoveList(); // move creatures to respawn grids if this is diff.grid or to remove list unloader.MoveToRespawnN(); // Finish creature moves, remove and delete all creatures with delayed remove before unload - DoDelayedMovesAndRemoves(); + MoveAllCreaturesInMoveList(); } - else - RemoveAllObjectsInRemoveList(); - //assert(grid.NoWorldObjectInGrid()); + ObjectGridCleaner cleaner(*grid); + cleaner.CleanN(); + + RemoveAllObjectsInRemoveList(); + unloader.UnloadN(); - //assert(grid.NoWorldObjectInGrid()); - //assert(grid.NoGridObjectInGrid()); + + assert(i_objectsToRemove.empty()); + delete grid; setNGrid(NULL, x, y); } diff --git a/src/game/ObjectGridLoader.cpp b/src/game/ObjectGridLoader.cpp index 7c3c88756af..d6b2a765690 100644 --- a/src/game/ObjectGridLoader.cpp +++ b/src/game/ObjectGridLoader.cpp @@ -293,33 +293,11 @@ ObjectGridUnloader::Visit(GridRefManager<T> &m) // if option set then object already saved at this moment if(!sWorld.getConfig(CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY)) obj->SaveRespawnTime(); - ///- object must be out of world before delete - obj->RemoveFromWorld(); ///- object will get delinked from the manager when deleted delete obj; } } -template<> -void -ObjectGridUnloader::Visit(CreatureMapType &m) -{ - // remove all cross-reference before deleting - for(CreatureMapType::iterator iter=m.begin(); iter != m.end(); ++iter) - iter->getSource()->CleanupsBeforeDelete(); - - while(!m.isEmpty()) - { - Creature *obj = m.getFirst()->getSource(); - // if option set then object already saved at this moment - if(!sWorld.getConfig(CONFIG_SAVE_RESPAWN_TIME_IMMEDIATELY)) - obj->SaveRespawnTime(); - ///- object will get delinked from the manager when deleted - obj->CleanupsBeforeDelete(); - delete obj; - } -} - void ObjectGridStoper::Stop(GridType &grid) { @@ -339,6 +317,29 @@ ObjectGridStoper::Visit(CreatureMapType &m) } } -template void ObjectGridUnloader::Visit(GameObjectMapType &); -template void ObjectGridUnloader::Visit(DynamicObjectMapType &); +void +ObjectGridCleaner::Stop(GridType &grid) +{ + TypeContainerVisitor<ObjectGridCleaner, GridTypeMapContainer > stoper(*this); + grid.Visit(stoper); +} + +void +ObjectGridCleaner::Visit(CreatureMapType &m) +{ + for(CreatureMapType::iterator iter=m.begin(); iter != m.end(); ++iter) + iter->getSource()->CleanupsBeforeDelete(); +} + +template<class T> +void +ObjectGridCleaner::Visit(GridRefManager<T> &m) +{ + for(GridRefManager<T>::iterator iter = m.begin(); iter != m.end(); ++iter) + iter->getSource()->RemoveFromWorld(); +} +/*template void ObjectGridUnloader::Visit(GameObjectMapType &); +template void ObjectGridUnloader::Visit(DynamicObjectMapType &); +template void ObjectGridCleaner::Visit(GameObjectMapType &); +template void ObjectGridCleaner::Visit(DynamicObjectMapType &);*/ diff --git a/src/game/ObjectGridLoader.h b/src/game/ObjectGridLoader.h index 7b5c827b7ea..768f1f994db 100644 --- a/src/game/ObjectGridLoader.h +++ b/src/game/ObjectGridLoader.h @@ -85,7 +85,6 @@ class TRINITY_DLL_DECL ObjectGridStoper public: ObjectGridStoper(NGridType &grid) : i_grid(grid) {} - void MoveToRespawnN(); void StopN() { for(unsigned int x=0; x < MAX_NUMBER_OF_CELLS; ++x) @@ -106,6 +105,30 @@ class TRINITY_DLL_DECL ObjectGridStoper NGridType &i_grid; }; +class TRINITY_DLL_DECL ObjectGridCleaner +{ + public: + ObjectGridCleaner(NGridType &grid) : i_grid(grid) {} + + void CleanN() + { + for(unsigned int x=0; x < MAX_NUMBER_OF_CELLS; ++x) + { + for(unsigned int y=0; y < MAX_NUMBER_OF_CELLS; ++y) + { + GridLoader<Player, AllWorldObjectTypes, AllGridObjectTypes> loader; + loader.Stop(i_grid(x, y), *this); + } + } + } + + void Stop(GridType &grid); + void Visit(CreatureMapType &m); + template<class T> void Visit(GridRefManager<T> &); + private: + NGridType &i_grid; +}; + typedef GridLoader<Player, AllWorldObjectTypes, AllGridObjectTypes> GridLoaderType; #endif |