diff --git a/src/game/GridStates.h b/src/game/GridStates.h index c41853c5b5c..503b9df15ed 100644 --- a/src/game/GridStates.h +++ b/src/game/GridStates.h @@ -24,21 +24,7 @@ class MANGOS_DLL_DECL GridState { public: -#ifdef MANGOS_DEBUG -#define MAGIC_TESTVAL 0xFBE823BA - GridState() { i_Magic = MAGIC_TESTVAL; } - bool checkMagic() - { - if(i_Magic != MAGIC_TESTVAL) - { - sLog.outError("!!! GridState: Magic value gone !!!"); - return false; - } - return true; - } - void setMagic() { i_Magic = MAGIC_TESTVAL; } - unsigned int i_Magic; -#endif + virtual void Update(Map &, NGridType&, GridInfo &, const uint32 &x, const uint32 &y, const uint32 &t_diff) const = 0; }; @@ -69,4 +55,5 @@ class MANGOS_DLL_DECL RemovalState : public GridState void Update(Map &, NGridType &, GridInfo &, const uint32 &x, const uint32 &y, const uint32 &t_diff) const; }; + #endif diff --git a/src/game/Map.cpp b/src/game/Map.cpp index 15ff06b3685..bca4cca367f 100644 --- a/src/game/Map.cpp +++ b/src/game/Map.cpp @@ -40,8 +40,6 @@ #include "VMapFactory.h" #include "BattleGroundMgr.h" -GridState* si_GridStates[MAX_GRID_STATE]; - struct ScriptAction { uint64 sourceGUID; @@ -126,22 +124,6 @@ void Map::LoadMapAndVMap(int gx,int gy) LoadVMap(gx, gy); // Only load the data for the base map } -void Map::InitStateMachine() -{ - si_GridStates[GRID_STATE_INVALID] = new InvalidState; - si_GridStates[GRID_STATE_ACTIVE] = new ActiveState; - si_GridStates[GRID_STATE_IDLE] = new IdleState; - si_GridStates[GRID_STATE_REMOVAL] = new RemovalState; -} - -void Map::DeleteStateMachine() -{ - delete si_GridStates[GRID_STATE_INVALID]; - delete si_GridStates[GRID_STATE_ACTIVE]; - delete si_GridStates[GRID_STATE_IDLE]; - delete si_GridStates[GRID_STATE_REMOVAL]; -} - Map::Map(uint32 id, time_t expiry, uint32 InstanceId, uint8 SpawnMode, Map* _parent) : i_mapEntry (sMapStore.LookupEntry(id)), i_spawnMode(SpawnMode), i_id(id), i_InstanceId(InstanceId), m_unloadTimer(0), @@ -648,7 +630,7 @@ void Map::Update(const uint32 &t_diff) GridInfo *info = i->getSource()->getGridInfoRef(); ++i; // The update might delete the map and we need the next map before the iterator gets invalid ASSERT(grid->GetGridState() >= 0 && grid->GetGridState() < MAX_GRID_STATE); - si_GridStates[grid->GetGridState()]->Update(*this, *grid, *info, grid->getX(), grid->getY(), t_diff); + sMapMgr.UpdateGridState(grid->GetGridState(), *this, *grid, *info, grid->getX(), grid->getY(), t_diff); } } diff --git a/src/game/Map.h b/src/game/Map.h index 7607b49da50..5193d2c7b59 100644 --- a/src/game/Map.h +++ b/src/game/Map.h @@ -144,9 +144,6 @@ class MANGOS_DLL_SPEC Map : public GridRefManager, public MaNGOS::Obj time_t GetGridExpiry(void) const { return i_gridExpiry; } uint32 GetId(void) const { return i_id; } - static void InitStateMachine(); - static void DeleteStateMachine(); - Map const * GetParent() const { return m_parentMap; } // some calls like isInWater should not use vmaps due to processor power diff --git a/src/game/MapManager.cpp b/src/game/MapManager.cpp index 7feb5ece6d7..5f9622d2f0f 100644 --- a/src/game/MapManager.cpp +++ b/src/game/MapManager.cpp @@ -34,9 +34,8 @@ INSTANTIATE_SINGLETON_2(MapManager, CLASS_LOCK); INSTANTIATE_CLASS_MUTEX(MapManager, ACE_Thread_Mutex); -extern GridState* si_GridStates[]; // debugging code, should be deleted some day - -MapManager::MapManager() : i_gridCleanUpDelay(sWorld.getConfig(CONFIG_UINT32_INTERVAL_GRIDCLEAN)) +MapManager::MapManager() + : i_gridCleanUpDelay(sWorld.getConfig(CONFIG_UINT32_INTERVAL_GRIDCLEAN)) { i_timer.SetInterval(sWorld.getConfig(CONFIG_UINT32_INTERVAL_MAPUPDATE)); } @@ -49,57 +48,45 @@ MapManager::~MapManager() for(TransportSet::iterator i = m_Transports.begin(); i != m_Transports.end(); ++i) delete *i; - Map::DeleteStateMachine(); + DeleteStateMachine(); } void MapManager::Initialize() { - Map::InitStateMachine(); + InitStateMachine(); + InitMaxInstanceId(); +} - // debugging code, should be deleted some day - { - for(int i=0;iInitVisibilityDistance(); + // TODO: The grid state array itself is static and therefore 100% safe, however, the data + // the state classes in it accesses is not, since grids are shared across maps (for example + // in instances), so some sort of locking will be necessary later. + + si_GridStates[state]->Update(map, ngrid, ginfo, x, y, t_diff); } -// debugging code, should be deleted some day -void MapManager::checkAndCorrectGridStatesArray() +void MapManager::InitializeVisibilityDistanceInfo() { - bool ok = true; - for(int i=0;icheckMagic()) - { - ok = false; - si_GridStates[i]->setMagic(); - } - #endif - } - if(!ok) - ++i_GridStateErrorCount; - if(i_GridStateErrorCount > 2) - ASSERT(false); // force a crash. Too many errors + for(MapMapType::iterator iter=i_maps.begin(); iter != i_maps.end(); ++iter) + (*iter).second->InitVisibilityDistance(); } Map* @@ -259,10 +246,7 @@ MapManager::Update(uint32 diff) return; for(MapMapType::iterator iter=i_maps.begin(); iter != i_maps.end(); ++iter) - { - checkAndCorrectGridStatesArray(); // debugging code, should be deleted some day iter->second->Update((uint32)i_timer.GetCurrent()); - } for (TransportSet::iterator iter = m_Transports.begin(); iter != m_Transports.end(); ++iter) (*iter)->Update(i_timer.GetCurrent()); diff --git a/src/game/MapManager.h b/src/game/MapManager.h index c07a7c11ad9..c48f821ba79 100644 --- a/src/game/MapManager.h +++ b/src/game/MapManager.h @@ -43,6 +43,8 @@ class MANGOS_DLL_DECL MapManager : public MaNGOS::Singleton(this)->_createBaseMap(id); } Map* FindMap(uint32 mapid, uint32 instanceId = 0) const; + void UpdateGridState(grid_state_t state, Map& map, NGridType& ngrid, GridInfo& ginfo, const uint32 &x, const uint32 &y, const uint32 &t_diff); + // only const version for outer users void DeleteInstance(uint32 mapid, uint32 instanceId); @@ -130,17 +132,22 @@ class MANGOS_DLL_DECL MapManager : public MaNGOS::Singleton