diff options
author | megamage <none@none.none> | 2011-10-18 14:31:34 -0400 |
---|---|---|
committer | megamage <none@none.none> | 2011-10-18 14:31:34 -0400 |
commit | 7231ab959fcd42b653e46eb7306688af550a240d (patch) | |
tree | 82befe9bf51e4ddda95ed38e4c5cdabc1ec4e793 /src/server/game/Grids | |
parent | bb64e64463a8f8899cd375bca4d03cc48f490b01 (diff) |
Clean up grid system. Get rid of GridLoader. This patch should not change any logic, except the incorrect calculation of the number of loaded corpse (which only affects log).
Diffstat (limited to 'src/server/game/Grids')
-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 |
6 files changed, 61 insertions, 161 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 - |