diff options
-rwxr-xr-x | src/server/game/Grids/Grid.h | 18 | ||||
-rwxr-xr-x | src/server/game/Grids/GridLoader.h | 13 | ||||
-rwxr-xr-x | src/server/game/Grids/GridStates.cpp | 5 | ||||
-rwxr-xr-x | src/server/game/Grids/NGrid.h | 14 | ||||
-rwxr-xr-x | src/server/game/Grids/ObjectGridLoader.cpp | 98 | ||||
-rwxr-xr-x | src/server/game/Grids/ObjectGridLoader.h | 74 | ||||
-rwxr-xr-x | src/server/game/Maps/Map.cpp | 19 | ||||
-rwxr-xr-x | src/server/game/Maps/Map.h | 2 |
8 files changed, 75 insertions, 168 deletions
diff --git a/src/server/game/Grids/Grid.h b/src/server/game/Grids/Grid.h index a6e1316718e..a90915d49f0 100755 --- a/src/server/game/Grids/Grid.h +++ b/src/server/game/Grids/Grid.h @@ -72,26 +72,26 @@ class Grid /** Refreshes/update the grid. This required for remote grids. */ - void RefreshGrid(void) { /* TBI */} + //void RefreshGrid(void) { /* TBI */} /** Locks a grid. Any object enters must wait until the grid is unlock. */ - void LockGrid(void) { /* TBI */ } + //void LockGrid(void) { /* TBI */ } /** Unlocks the grid. */ - void UnlockGrid(void) { /* TBI */ } + //void UnlockGrid(void) { /* TBI */ } - /** Grid visitor for grid objects - */ - template<class T> void Visit(TypeContainerVisitor<T, TypeMapContainer<GRID_OBJECT_TYPES> > &visitor) + // Visit grid objects + template<class T> + void Visit(TypeContainerVisitor<T, TypeMapContainer<GRID_OBJECT_TYPES> > &visitor) { visitor.Visit(i_container); } - /** Grid visitor for world objects - */ - template<class T> void Visit(TypeContainerVisitor<T, TypeMapContainer<WORLD_OBJECT_TYPES> > &visitor) + // Visit world objects + template<class T> + void Visit(TypeContainerVisitor<T, TypeMapContainer<WORLD_OBJECT_TYPES> > &visitor) { visitor.Visit(i_objects); } diff --git a/src/server/game/Grids/GridLoader.h b/src/server/game/Grids/GridLoader.h index 0e762d3a07e..43564c920e2 100755 --- a/src/server/game/Grids/GridLoader.h +++ b/src/server/game/Grids/GridLoader.h @@ -30,6 +30,8 @@ GridLoader manages the grid (both local and remote). */ +//I cannot see why this cannot be replaced by a Grid::Visit +/* #include "Define.h" #include "Grid.h" #include "TypeContainerVisitor.h" @@ -44,8 +46,7 @@ class GridLoader { public: - /** Loads the grid - */ + // Loads the grid template<class LOADER> void Load(Grid<ACTIVE_OBJECT, WORLD_OBJECT_TYPES, GRID_OBJECT_TYPES> &grid, LOADER &loader) { @@ -54,8 +55,7 @@ class GridLoader grid.UnlockGrid(); } - /** Stop the grid - */ + // Stop the grid template<class STOPER> void Stop(Grid<ACTIVE_OBJECT, WORLD_OBJECT_TYPES, GRID_OBJECT_TYPES> &grid, STOPER &stoper) { @@ -63,8 +63,8 @@ class GridLoader stoper.Stop(grid); grid.UnlockGrid(); } - /** Unloads the grid - */ + + // Unloads the grid template<class UNLOADER> void Unload(Grid<ACTIVE_OBJECT, WORLD_OBJECT_TYPES, GRID_OBJECT_TYPES> &grid, UNLOADER &unloader) { @@ -73,5 +73,6 @@ class GridLoader grid.UnlockGrid(); } }; +*/ #endif diff --git a/src/server/game/Grids/GridStates.cpp b/src/server/game/Grids/GridStates.cpp index 91bb926fd02..dcf7c3bf1ad 100755 --- a/src/server/game/Grids/GridStates.cpp +++ b/src/server/game/Grids/GridStates.cpp @@ -35,8 +35,9 @@ ActiveState::Update(Map &m, NGridType &grid, GridInfo & info, const uint32 x, co { if (grid.ActiveObjectsInGrid() == 0 && !m.ActiveObjectsNearGrid(x, y)) { - ObjectGridStoper stoper(grid); - stoper.StopN(); + ObjectGridStoper worker; + TypeContainerVisitor<ObjectGridStoper, GridTypeMapContainer> visitor(worker); + grid.VisitAllGrids(visitor); grid.SetGridState(GRID_STATE_IDLE); sLog->outDebug(LOG_FILTER_MAPS, "Grid[%u, %u] on map %u moved to IDLE state", x, y, m.GetId()); } diff --git a/src/server/game/Grids/NGrid.h b/src/server/game/Grids/NGrid.h index 4d087d5a03f..bcd03edb2b8 100755 --- a/src/server/game/Grids/NGrid.h +++ b/src/server/game/Grids/NGrid.h @@ -69,7 +69,7 @@ typedef enum template < -unsigned int N, +uint32 N, class ACTIVE_OBJECT, class WORLD_OBJECT_TYPES, class GRID_OBJECT_TYPES @@ -131,14 +131,18 @@ class NGrid getGridType(x, y).RemoveWorldObject(obj); } - template<class T, class TT> void Visit(TypeContainerVisitor<T, TypeMapContainer<TT> > &visitor) + // Visit all Grids (cells) in NGrid (grid) + template<class T, class TT> + void VisitAllGrids(TypeContainerVisitor<T, TypeMapContainer<TT> > &visitor) { - for (unsigned int x=0; x < N; ++x) - for (unsigned int y=0; y < N; ++y) + for (uint32 x = 0; x < N; ++x) + for (uint32 y = 0; y < N; ++y) getGridType(x, y).Visit(visitor); } - template<class T, class TT> void Visit(const uint32 x, const uint32 y, TypeContainerVisitor<T, TypeMapContainer<TT> > &visitor) + // Visit a single Grid (cell) in NGrid (grid) + template<class T, class TT> + void VisitGrid(const uint32 x, const uint32 y, TypeContainerVisitor<T, TypeMapContainer<TT> > &visitor) { getGridType(x, y).Visit(visitor); } diff --git a/src/server/game/Grids/ObjectGridLoader.cpp b/src/server/game/Grids/ObjectGridLoader.cpp index 68fc39b39eb..a696e02fdec 100755 --- a/src/server/game/Grids/ObjectGridLoader.cpp +++ b/src/server/game/Grids/ObjectGridLoader.cpp @@ -28,26 +28,7 @@ #include "CellImpl.h" #include "CreatureAI.h" -class ObjectGridRespawnMover -{ - public: - ObjectGridRespawnMover() {} - - void Move(GridType &grid); - - template<class T> void Visit(GridRefManager<T> &) {} - void Visit(CreatureMapType &m); -}; - -void -ObjectGridRespawnMover::Move(GridType &grid) -{ - TypeContainerVisitor<ObjectGridRespawnMover, GridTypeMapContainer > mover(*this); - grid.Visit(mover); -} - -void -ObjectGridRespawnMover::Visit(CreatureMapType &m) +void ObjectGridEvacuator::Visit(CreatureMapType &m) { // creature in unloading grid can have respawn point in another grid // if it will be unloaded then it will not respawn in original grid until unload/load original grid @@ -188,22 +169,6 @@ ObjectWorldLoader::Visit(CorpseMapType &m) LoadHelper(cell_guids.corpses, cellCoord, m, i_corpses, i_map); } -void -ObjectGridLoader::Load(GridType &grid) -{ - { - TypeContainerVisitor<ObjectGridLoader, GridTypeMapContainer > loader(*this); - grid.Visit(loader); - } - - { - ObjectWorldLoader wloader(*this); - TypeContainerVisitor<ObjectWorldLoader, WorldTypeMapContainer > loader(wloader); - grid.Visit(loader); - i_corpses = wloader.i_corpses; - } -} - void ObjectGridLoader::LoadN(void) { i_gameObjects = 0; i_creatures = 0; i_corpses = 0; @@ -214,35 +179,27 @@ void ObjectGridLoader::LoadN(void) for (unsigned int y=0; y < MAX_NUMBER_OF_CELLS; ++y) { i_cell.data.Part.cell_y = y; - GridLoader<Player, AllWorldObjectTypes, AllGridObjectTypes> loader; - loader.Load(i_grid(x, y), *this); - } - } - sLog->outDebug(LOG_FILTER_MAPS, "%u GameObjects, %u Creatures, and %u Corpses/Bones loaded for grid %u on map %u", i_gameObjects, i_creatures, i_corpses, i_grid.GetGridId(), i_map->GetId()); -} -void ObjectGridUnloader::MoveToRespawnN() -{ - for (unsigned int x=0; x < MAX_NUMBER_OF_CELLS; ++x) - { - for (unsigned int y=0; y < MAX_NUMBER_OF_CELLS; ++y) - { - ObjectGridRespawnMover mover; - mover.Move(i_grid(x, y)); + //Load creatures and game objects + { + TypeContainerVisitor<ObjectGridLoader, GridTypeMapContainer> visitor(*this); + i_grid.VisitGrid(x, y, visitor); + } + + //Load corpses (not bones) + { + ObjectWorldLoader worker(*this); + TypeContainerVisitor<ObjectWorldLoader, WorldTypeMapContainer> visitor(worker); + i_grid.VisitGrid(x, y, visitor); + i_corpses += worker.i_corpses; + } } } -} - -void -ObjectGridUnloader::Unload(GridType &grid) -{ - TypeContainerVisitor<ObjectGridUnloader, GridTypeMapContainer > unloader(*this); - grid.Visit(unloader); + sLog->outDebug(LOG_FILTER_MAPS, "%u GameObjects, %u Creatures, and %u Corpses/Bones loaded for grid %u on map %u", i_gameObjects, i_creatures, i_corpses, i_grid.GetGridId(), i_map->GetId()); } template<class T> -void -ObjectGridUnloader::Visit(GridRefManager<T> &m) +void ObjectGridUnloader::Visit(GridRefManager<T> &m) { while (!m.isEmpty()) { @@ -255,15 +212,7 @@ ObjectGridUnloader::Visit(GridRefManager<T> &m) } } -void -ObjectGridStoper::Stop(GridType &grid) -{ - TypeContainerVisitor<ObjectGridStoper, GridTypeMapContainer > stoper(*this); - grid.Visit(stoper); -} - -void -ObjectGridStoper::Visit(CreatureMapType &m) +void ObjectGridStoper::Visit(CreatureMapType &m) { // stop any fights at grid de-activation and remove dynobjects created at cast by creatures for (CreatureMapType::iterator iter=m.begin(); iter != m.end(); ++iter) @@ -278,23 +227,14 @@ ObjectGridStoper::Visit(CreatureMapType &m) } } -void -ObjectGridCleaner::Stop(GridType &grid) -{ - TypeContainerVisitor<ObjectGridCleaner, GridTypeMapContainer > stoper(*this); - grid.Visit(stoper); -} - -void -ObjectGridCleaner::Visit(CreatureMapType &m) +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) +void ObjectGridCleaner::Visit(GridRefManager<T> &m) { for (typename GridRefManager<T>::iterator iter = m.begin(); iter != m.end(); ++iter) iter->getSource()->RemoveFromWorld(); diff --git a/src/server/game/Grids/ObjectGridLoader.h b/src/server/game/Grids/ObjectGridLoader.h index e87860fa0ee..411cae10a90 100755 --- a/src/server/game/Grids/ObjectGridLoader.h +++ b/src/server/game/Grids/ObjectGridLoader.h @@ -36,7 +36,6 @@ class ObjectGridLoader : i_cell(cell), i_grid(grid), i_map(map), i_gameObjects(0), i_creatures(0), i_corpses (0) {} - void Load(GridType &grid); void Visit(GameObjectMapType &m); void Visit(CreatureMapType &m); void Visit(CorpseMapType &) const {} @@ -55,79 +54,34 @@ class ObjectGridLoader uint32 i_corpses; }; -class ObjectGridUnloader +//Stop the creatures before unloading the NGrid +class ObjectGridStoper { public: - ObjectGridUnloader(NGridType &grid) : i_grid(grid) {} - - void MoveToRespawnN(); - void UnloadN() - { - 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.Unload(i_grid(x, y), *this); - } - } - } - - void Unload(GridType &grid); - template<class T> void Visit(GridRefManager<T> &m); - private: - NGridType &i_grid; + void Visit(CreatureMapType &m); + template<class T> void Visit(GridRefManager<T> &) {} }; -class ObjectGridStoper +//Move the foreign creatures back to respawn positions before unloading the NGrid +class ObjectGridEvacuator { public: - ObjectGridStoper(NGridType &grid) : i_grid(grid) {} - - void StopN() - { - 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 NONACTIVE> void Visit(GridRefManager<NONACTIVE> &) {} - private: - NGridType &i_grid; + template<class T> void Visit(GridRefManager<T> &) {} }; +//Clean up and remove from world class 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; +//Delete objects before deleting NGrid +class ObjectGridUnloader +{ + public: + template<class T> void Visit(GridRefManager<T> &m); +}; #endif - diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 66038d51655..5fdd56dd97f 100755 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -962,8 +962,6 @@ bool Map::UnloadGrid(const uint32 x, const uint32 y, bool unloadAll) sLog->outDebug(LOG_FILTER_MAPS, "Unloading grid[%u, %u] for map %u", x, y, GetId()); - ObjectGridUnloader unloader(*grid); - if (!unloadAll) { // Finish creature moves, remove and delete all creatures with delayed remove before moving to respawn grids @@ -971,18 +969,27 @@ bool Map::UnloadGrid(const uint32 x, const uint32 y, bool unloadAll) MoveAllCreaturesInMoveList(); // move creatures to respawn grids if this is diff.grid or to remove list - unloader.MoveToRespawnN(); + ObjectGridEvacuator worker; + TypeContainerVisitor<ObjectGridEvacuator, GridTypeMapContainer> visitor(worker); + grid->VisitAllGrids(visitor); // Finish creature moves, remove and delete all creatures with delayed remove before unload MoveAllCreaturesInMoveList(); } - ObjectGridCleaner cleaner(*grid); - cleaner.CleanN(); + { + ObjectGridCleaner worker; + TypeContainerVisitor<ObjectGridCleaner, GridTypeMapContainer> visitor(worker); + grid->VisitAllGrids(visitor); + } RemoveAllObjectsInRemoveList(); - unloader.UnloadN(); + { + ObjectGridUnloader worker; + TypeContainerVisitor<ObjectGridUnloader, GridTypeMapContainer> visitor(worker); + grid->VisitAllGrids(visitor); + } ASSERT(i_objectsToRemove.empty()); diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 33d898d1af7..2247908fb08 100755 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -626,7 +626,7 @@ Map::Visit(const Cell& cell, TypeContainerVisitor<T, CONTAINER> &visitor) if (!cell.NoCreate() || IsGridLoaded(GridCoord(x, y))) { EnsureGridLoaded(cell); - getNGrid(x, y)->Visit(cell_x, cell_y, visitor); + getNGrid(x, y)->VisitGrid(cell_x, cell_y, visitor); } } |