30 uint32 pathLen =
sWorld->GetDataPath().length() + strlen(
"mmaps/%04i.mmap") + 1;
31 char* fileName =
new char[pathLen];
32 snprintf(fileName, pathLen, (
sWorld->GetDataPath() +
"mmaps/%04i.mmap").c_str(), mapId);
34 FILE* file = fopen(fileName,
"rb");
37 SF_LOG_DEBUG(
"maps",
"MMAP:loadMapData: Error: Could not open mmap file '%s'", fileName);
42 dtNavMeshParams params;
43 int count = fread(¶ms,
sizeof(dtNavMeshParams), 1, file);
47 SF_LOG_DEBUG(
"maps",
"MMAP:loadMapData: Error: Could not read params from file '%s'", fileName);
52 dtNavMesh* mesh = dtAllocNavMesh();
54 if (dtStatusFailed(mesh->init(¶ms)))
57 SF_LOG_ERROR(
"maps",
"MMAP:loadMapData: Failed to initialize dtNavMesh for mmap %04u from file %s", mapId, fileName);
64 SF_LOG_INFO(
"maps",
"MMAP:loadMapData: Loaded %04i.mmap", mapId);
69 loadedMMaps.insert(std::pair<uint32, MMapData*>(mapId, mmap_data));
75 return uint32(x << 16 | y);
94 uint32 pathLen =
sWorld->GetDataPath().length() + strlen(
"mmaps/%04i_%02i_%02i.mmtile") + 1;
95 char* fileName =
new char[pathLen];
97 snprintf(fileName, pathLen, (
sWorld->GetDataPath() +
"mmaps/%04i_%02i_%02i.mmtile").c_str(), mapId, x, y);
99 FILE* file = fopen(fileName,
"rb");
102 SF_LOG_DEBUG(
"maps",
"MMAP:loadMap: Could not open mmtile file '%s'", fileName);
112 SF_LOG_ERROR(
"maps",
"MMAP:loadMap: Bad header in mmap %04u_%02i_%02i.mmtile", mapId, x, y);
119 SF_LOG_ERROR(
"maps",
"MMAP:loadMap: %04u_%02i_%02i.mmtile was built with generator v%f, expected v%f",
125 unsigned char* data = (
unsigned char*)dtAlloc(fileHeader.
size, DT_ALLOC_PERM);
128 size_t result = fread(data, fileHeader.
size, 1, file);
131 SF_LOG_ERROR(
"maps",
"MMAP:loadMap: Bad header or data in mmap %04u_%02i_%02i.mmtile", mapId, x, y);
138 dtMeshHeader* header = (dtMeshHeader*)data;
139 dtTileRef tileRef = 0;
142 if (dtStatusSucceed(mmap->
navMesh->addTile(data, fileHeader.
size, 0, 0, &tileRef)))
144 mmap->
loadedTileRefs.insert(std::pair<uint32, dtTileRef>(packedGridPos, tileRef));
146 SF_LOG_INFO(
"maps",
"MMAP:loadMap: Loaded mmtile %04i[%02i, %02i] into %04i[%02i, %02i]", mapId, x, y, mapId, header->x, header->y);
154 SF_LOG_ERROR(
"maps",
"MMAP:loadMap: Could not load %04u_%02i_%02i.mmtile into navmesh", mapId, x, y);
165 uint32 pathLen =
sWorld->GetDataPath().length() + strlen(
"mmaps/%04i_%02i_%02i.mmtile") + 1;
166 char* fileName =
new char[pathLen];
168 snprintf(fileName, pathLen, (
sWorld->GetDataPath() +
"mmaps/%04i_%02i_%02i.mmtile").c_str(), mapId, x, y);
170 FILE* file = fopen(fileName,
"rb");
185 SF_LOG_ERROR(
"phase",
"MMAP:LoadTile: Bad header in mmap %04u_%02i_%02i.mmtile", mapId, x, y);
193 SF_LOG_ERROR(
"phase",
"MMAP:LoadTile: %04u_%02i_%02i.mmtile was built with generator v%f, expected v%f",
206 SF_LOG_ERROR(
"phase",
"MMAP:LoadTile: Bad header or data in mmap %04u_%02i_%02i.mmtile", mapId, x, y);
219 SF_LOG_DEBUG(
"phase",
"MMAP:LoadPhaseTiles: Loading phased mmtiles for map %u, x: %i, y: %i", mapId, x, y);
227 if (map->rootPhaseMap == mapId)
233 SF_LOG_DEBUG(
"phase",
"MMAP:LoadPhaseTiles: Loaded phased %04u_%02i_%02i.mmtile for root phase map %u", map->MapID, x, y, mapId);
243 SF_LOG_DEBUG(
"phase",
"MMAP:UnloadPhaseTile: Unloading phased mmtile for map %u, x: %i, y: %i", mapId, x, y);
252 SF_LOG_DEBUG(
"phase",
"MMAP:UnloadPhaseTile: Unloaded phased %04u_%02i_%02i.mmtile for root phase map %u", mapId, x, y, rootMapId);
265 SF_LOG_DEBUG(
"maps",
"MMAP:unloadMap: Asked to unload not loaded navmesh map. %04u_%02i_%02i.mmtile", mapId, x, y);
276 SF_LOG_DEBUG(
"maps",
"MMAP:unloadMap: Asked to unload not loaded navmesh tile. %04u_%02i_%02i.mmtile", mapId, x, y);
283 if (dtStatusFailed(mmap->
navMesh->removeTile(tileRef, NULL, NULL)))
288 SF_LOG_ERROR(
"maps",
"MMAP:unloadMap: Could not unload %04u_%02i_%02i.mmtile from navmesh", mapId, x, y);
295 SF_LOG_INFO(
"maps",
"MMAP:unloadMap: Unloaded mmtile %04i[%02i, %02i] from %04i", mapId, x, y, mapId);
309 SF_LOG_DEBUG(
"maps",
"MMAP:unloadMap: Asked to unload not loaded navmesh map %04u", mapId);
317 uint32 x = (i->first >> 16);
318 uint32 y = (i->first & 0x0000FFFF);
319 if (dtStatusFailed(mmap->
navMesh->removeTile(i->second, NULL, NULL)))
320 SF_LOG_ERROR(
"maps",
"MMAP:unloadMap: Could not unload %04u_%02i_%02i.mmtile from navmesh", mapId, x, y);
325 SF_LOG_INFO(
"maps",
"MMAP:unloadMap: Unloaded mmtile %04i[%02i, %02i] from %04i", mapId, x, y, mapId);
331 SF_LOG_INFO(
"maps",
"MMAP:unloadMap: Unloaded %04i.mmap", mapId);
342 SF_LOG_DEBUG(
"maps",
"MMAP:unloadMapInstance: Asked to unload not loaded navmesh map %04u", mapId);
349 SF_LOG_DEBUG(
"maps",
"MMAP:unloadMapInstance: Asked to unload not loaded dtNavMeshQuery mapId %04u instanceId %u", mapId, instanceId);
355 dtFreeNavMeshQuery(query);
357 SF_LOG_INFO(
"maps",
"MMAP:unloadMapInstance: Unloaded mapId %04u instanceId %u", mapId, instanceId);
379 dtNavMeshQuery* query = dtAllocNavMeshQuery();
381 if (dtStatusFailed(query->init(mmap->
GetNavMesh(swaps), 1024)))
383 dtFreeNavMeshQuery(query);
384 SF_LOG_ERROR(
"maps",
"MMAP:GetNavMeshQuery: Failed to initialize dtNavMeshQuery for mapId %04u instanceId %u", mapId, instanceId);
388 SF_LOG_INFO(
"maps",
"MMAP:GetNavMeshQuery: created dtNavMeshQuery for mapId %04u instanceId %u", mapId, instanceId);
389 mmap->
navMeshQueries.insert(std::pair<uint32, dtNavMeshQuery*>(instanceId, query));
398 dtFreeNavMeshQuery(i->second);
404 delete (*i).second->data;
411 uint32 x = (packedXY >> 16);
412 uint32 y = (packedXY & 0x0000FFFF);
416 SF_LOG_DEBUG(
"phase",
"MMapData::RemoveSwap: mmtile %04u[%02i, %02i] unload skipped, due to not loaded", swap, x, y);
419 dtMeshHeader* header = (dtMeshHeader*)ptile->
data;
423 SF_LOG_ERROR(
"phase",
"MMapData::RemoveSwap: Could not unload phased %04u_%02i_%02i.mmtile from navmesh", swap, x, y);
426 SF_LOG_DEBUG(
"phase",
"MMapData::RemoveSwap: Unloaded phased %04u_%02i_%02i.mmtile from navmesh", swap, x, y);
431 SF_LOG_DEBUG(
"phase",
"MMapData::RemoveSwap: Loaded base mmtile %04u[%02i, %02i] into %04i[%02i, %02i]",
_mapId, x, y,
_mapId, header->x, header->y);
434 SF_LOG_ERROR(
"phase",
"MMapData::RemoveSwap: Could not load base %04u_%02i_%02i.mmtile to navmesh",
_mapId, x, y);
442 SF_LOG_DEBUG(
"phase",
"MMapData::RemoveSwap: Fully removed swap %u from map %u", swap,
_mapId);
448 uint32 x = (packedXY >> 16);
449 uint32 y = (packedXY & 0x0000FFFF);
453 SF_LOG_DEBUG(
"phase",
"MMapData::AddSwap: phased mmtile %04u[%02i, %02i] load skipped, due to not loaded base tile on map %u", swap, x, y,
_mapId);
458 SF_LOG_DEBUG(
"phase",
"MMapData::AddSwap: WARNING! phased mmtile %04u[%02i, %02i] load skipped, due to already loaded on map %u", swap, x, y,
_mapId);
463 dtMeshHeader* header = (dtMeshHeader*)ptile->
data;
468 SF_LOG_DEBUG(
"phase",
"MMapData::AddSwap: phased mmtile %04u[%02i, %02i] load skipped, due to not loaded base tile ref on map %u", swap, x, y,
_mapId);
472 uint32 old_x = oldTile->header->x;
473 uint32 old_y = oldTile->header->y;
476 memcpy(ptile->
data + 8, (
char*)& old_x, 4);
477 memcpy(ptile->
data + 12, (
char*)& old_y, 4);
483 SF_LOG_ERROR(
"phase",
"MMapData::AddSwap: Could not unload %04u_%02i_%02i.mmtile from navmesh",
_mapId, x, y);
486 SF_LOG_DEBUG(
"phase",
"MMapData::AddSwap: Unloaded %04u_%02i_%02i.mmtile from navmesh",
_mapId, x, y);
498 SF_LOG_DEBUG(
"phase",
"MMapData::AddSwap: Loaded phased mmtile %04u[%02i, %02i] into %04i[%02i, %02i]", swap, x, y,
_mapId, header->x, header->y);
501 SF_LOG_ERROR(
"phase",
"MMapData::AddSwap: Could not load %04u_%02i_%02i.mmtile to navmesh", swap, x, y);
509 if (swaps.find(swap) == swaps.end())
512 for (PhaseTileContainer::const_iterator itr = ptc.begin(); itr != ptc.end(); ++itr)
526 for (PhaseTileContainer::const_iterator itr = ptc.begin(); itr != ptc.end(); ++itr)
530 AddSwap(itr->second, swap, itr->first);
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
#define SF_LOG_DEBUG(filterType__,...)
#define SF_LOG_ERROR(filterType__,...)
#define SF_LOG_INFO(filterType__,...)
void RemoveSwap(PhasedTile *ptile, uint32 swap, uint32 packedXY)
TerrainSetMap loadedPhasedTiles
dtNavMesh * GetNavMesh(TerrainSet swaps)
PhaseTileContainer _baseTiles
std::set< uint32 > _activeSwaps
void AddSwap(PhasedTile *tile, uint32 swap, uint32 packedXY)
NavMeshQuerySet navMeshQueries
MMapTileSet loadedTileRefs
static MMapManager * createOrGetMMapManager()
dtNavMeshQuery const * GetNavMeshQuery(uint32 mapId, uint32 instanceId, TerrainSet swaps)
bool unloadMap(uint32 mapId, int32 x, int32 y)
bool loadMap(const std::string &basePath, uint32 mapId, int32 x, int32 y)
dtNavMesh const * GetNavMesh(uint32 mapId, TerrainSet swaps)
void UnloadPhaseTile(uint32 mapId, int32 x, int32 y)
bool loadMapData(uint32 mapId)
uint32 packTileID(int32 x, int32 y)
void LoadPhaseTiles(uint32 mapId, int32 x, int32 y)
bool unloadMapInstance(uint32 mapId, uint32 instanceId)
PhaseTileContainer GetPhaseTileContainer(uint32 mapId)
PhasedTile * LoadTile(uint32 mapId, int32 x, int32 y)
std::set< uint32 > TerrainSet
UNORDERED_MAP< uint32, PhasedTile * > PhaseTileContainer
MmapTileHeader fileHeader