public bool unloadMap(uint mapId, uint x, uint y) { // check if we have this map loaded MMapData mmap = GetMMapData(mapId); if (mmap == null) { // file may not exist, therefore not loaded Log.outDebug(LogFilter.Maps, "MMAP:unloadMap: Asked to unload not loaded navmesh map. {0:D4}{1:D2}{2:D2}.mmtile", mapId, x, y); return(false); } // check if we have this tile loaded uint packedGridPos = packTileID((int)x, (int)y); if (!mmap.loadedTileRefs.ContainsKey(packedGridPos)) { // file may not exist, therefore not loaded Log.outDebug(LogFilter.Maps, "MMAP:unloadMap: Asked to unload not loaded navmesh tile. {0:D4}{1:D2}{2:D2}.mmtile", mapId, x, y); return(false); } ulong tileRef = mmap.loadedTileRefs.LookupByKey(packedGridPos); // unload, and mark as non loaded Detour.dtRawTileData data; if (Detour.dtStatusFailed(mmap.navMesh.removeTile(tileRef, out data))) { // this is technically a memory leak // if the grid is later reloaded, dtNavMesh.addTile will return error but no extra memory is used // we cannot recover from this error - assert out Log.outError(LogFilter.Maps, "MMAP:unloadMap: Could not unload {0:D4}{1:D2}{2:D2}.mmtile from navmesh", mapId, x, y); Contract.Assert(false); } else { mmap.loadedTileRefs.Remove(packedGridPos); --loadedTiles; Log.outInfo(LogFilter.Maps, "MMAP:unloadMap: Unloaded mmtile {0:D4}[{1:D2}, {2:D2}] from {3:D4}", mapId, x, y, mapId); var phasedMaps = phaseMapData.LookupByKey(mapId); if (!phasedMaps.Empty()) { mmap.DeleteBaseTile(packedGridPos); UnloadPhaseTile(phasedMaps, (int)x, (int)y); } return(true); } return(false); }
public bool unloadMap(uint mapId) { if (!loadedMMaps.ContainsKey(mapId)) { // file may not exist, therefore not loaded Log.outDebug(LogFilter.Maps, "MMAP:unloadMap: Asked to unload not loaded navmesh map {0:D4}", mapId); return(false); } // unload all tiles from given map MMapData mmap = loadedMMaps.LookupByKey(mapId); foreach (var i in mmap.loadedTileRefs) { uint x = (i.Key >> 16); uint y = (i.Key & 0x0000FFFF); Detour.dtRawTileData data; if (Detour.dtStatusFailed(mmap.navMesh.removeTile(i.Value, out data))) { Log.outError(LogFilter.Maps, "MMAP:unloadMap: Could not unload {0:D4}{1:D2}{2:D2}.mmtile from navmesh", mapId, x, y); } else { var phasedMaps = phaseMapData.LookupByKey(mapId); if (!phasedMaps.Empty()) { mmap.DeleteBaseTile(i.Key); UnloadPhaseTile(phasedMaps, (int)x, (int)y); } --loadedTiles; Log.outInfo(LogFilter.Maps, "MMAP:unloadMap: Unloaded mmtile {0:D4} [{1:D2}, {2:D2}] from {3:D4}", mapId, x, y, mapId); } } loadedMMaps.Remove(mapId); Log.outInfo(LogFilter.Maps, "MMAP:unloadMap: Unloaded {0:D4}.mmap", mapId); return(true); }