// MapManager.cpp #include "Globals.h" #include "MapManager.h" #include "World.h" #include "WorldStorage/MapSerializer.h" cMapManager::cMapManager(cWorld * a_World) : m_World(a_World) { ASSERT(m_World != nullptr); } bool cMapManager::DoWithMap(UInt32 a_ID, cMapCallback & a_Callback) { cCSLock Lock(m_CS); cMap * Map = GetMapData(a_ID); if (Map == nullptr) { return false; } else { a_Callback.Item(Map); return true; } } bool cMapManager::ForEachMap(cMapCallback & a_Callback) { cCSLock Lock(m_CS); for (cMapList::iterator itr = m_MapData.begin(); itr != m_MapData.end(); ++itr) { cMap * Map = &(*itr); if (a_Callback.Item(Map)) { return false; } } // for itr - m_MapData[] return true; } cMap * cMapManager::GetMapData(unsigned int a_ID) { if (a_ID < m_MapData.size()) { return &m_MapData[a_ID]; } else { return nullptr; } } cMap * cMapManager::CreateMap(int a_CenterX, int a_CenterY, unsigned int a_Scale) { cCSLock Lock(m_CS); if (m_MapData.size() >= 65536) { LOGWARN("Could not craft map - Too many maps in use"); return nullptr; } cMap Map((unsigned)m_MapData.size(), a_CenterX, a_CenterY, m_World, a_Scale); m_MapData.push_back(Map); return &m_MapData[Map.GetID()]; } size_t cMapManager::GetNumMaps(void) const { return m_MapData.size(); } void cMapManager::LoadMapData(void) { cCSLock Lock(m_CS); cIDCountSerializer IDSerializer(m_World->GetName()); if (!IDSerializer.Load()) { return; } unsigned int MapCount = IDSerializer.GetMapCount(); m_MapData.clear(); for (unsigned int i = 0; i < MapCount; ++i) { cMap Map(i, m_World); cMapSerializer Serializer(m_World->GetName(), &Map); if (!Serializer.Load()) { LOGWARN("Could not load map #%i", Map.GetID()); } m_MapData.push_back(Map); } } void cMapManager::SaveMapData(void) { cCSLock Lock(m_CS); if (m_MapData.empty()) { return; } cIDCountSerializer IDSerializer(m_World->GetName()); IDSerializer.SetMapCount((unsigned)m_MapData.size()); if (!IDSerializer.Save()) { LOGERROR("Could not save idcounts.dat"); return; } for (cMapList::iterator it = m_MapData.begin(); it != m_MapData.end(); ++it) { cMap & Map = *it; cMapSerializer Serializer(m_World->GetName(), &Map); if (!Serializer.Save()) { LOGWARN("Could not save map #%i", Map.GetID()); } } }