aboutsummaryrefslogtreecommitdiff
path: root/src/server/collision/Management/MMapManager.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/collision/Management/MMapManager.h')
-rw-r--r--src/server/collision/Management/MMapManager.h70
1 files changed, 55 insertions, 15 deletions
diff --git a/src/server/collision/Management/MMapManager.h b/src/server/collision/Management/MMapManager.h
index 2169d82bb3e..b7356716a9d 100644
--- a/src/server/collision/Management/MMapManager.h
+++ b/src/server/collision/Management/MMapManager.h
@@ -23,8 +23,10 @@
#include "DetourAlloc.h"
#include "DetourNavMesh.h"
#include "DetourNavMeshQuery.h"
+#include "World.h"
#include <string>
#include <unordered_map>
+#include <set>
// move map related classes
namespace MMAP
@@ -32,24 +34,54 @@ namespace MMAP
typedef std::unordered_map<uint32, dtTileRef> MMapTileSet;
typedef std::unordered_map<uint32, dtNavMeshQuery*> NavMeshQuerySet;
- // dummy struct to hold map's mmap data
- struct MMapData
- {
- MMapData(dtNavMesh* mesh) : navMesh(mesh) { }
- ~MMapData()
- {
- for (NavMeshQuerySet::iterator i = navMeshQueries.begin(); i != navMeshQueries.end(); ++i)
- dtFreeNavMeshQuery(i->second);
- if (navMesh)
- dtFreeNavMesh(navMesh);
- }
+ typedef std::set<uint32> TerrainSet;
+ struct NavMeshHolder
+ {
+ // Pre-built navMesh
dtNavMesh* navMesh;
+ // List of terrain swap map ids used to build the navMesh
+ TerrainSet terrainIds;
+
+ MMapTileSet loadedTileRefs;
+ };
+
+ struct PhasedTile
+ {
+ unsigned char* data;
+ MmapTileHeader fileHeader;
+ int32 dataSize;
+ };
+
+ typedef std::unordered_map<uint32, PhasedTile*> PhaseTileContainer;
+ typedef std::unordered_map<uint32, PhaseTileContainer> PhaseTileMap;
+
+
+ typedef std::unordered_map<uint32, TerrainSet> TerrainSetMap;
+
+ class MMapData
+ {
+ public:
+ MMapData(dtNavMesh* mesh, uint32 mapId);
+ ~MMapData();
+
+ dtNavMesh* GetNavMesh(TerrainSet swaps);
+
// we have to use single dtNavMeshQuery for every instance, since those are not thread safe
NavMeshQuerySet navMeshQueries; // instanceId to query
- MMapTileSet mmapLoadedTiles; // maps [map grid coords] to [dtTile]
+
+ dtNavMesh* navMesh;
+ MMapTileSet loadedTileRefs;
+ TerrainSetMap loadedPhasedTiles;
+
+ private:
+ uint32 _mapId;
+ PhaseTileContainer _baseTiles;
+ std::set<uint32> _activeSwaps;
+ void RemoveSwap(PhasedTile* ptile, uint32 swap, uint32 packedXY);
+ void AddSwap(PhasedTile* tile, uint32 swap, uint32 packedXY);
};
@@ -69,17 +101,25 @@ namespace MMAP
bool unloadMapInstance(uint32 mapId, uint32 instanceId);
// the returned [dtNavMeshQuery const*] is NOT threadsafe
- dtNavMeshQuery const* GetNavMeshQuery(uint32 mapId, uint32 instanceId);
- dtNavMesh const* GetNavMesh(uint32 mapId);
+ dtNavMeshQuery const* GetNavMeshQuery(uint32 mapId, uint32 instanceId, TerrainSet swaps);
+ dtNavMesh const* GetNavMesh(uint32 mapId, TerrainSet swaps);
uint32 getLoadedTilesCount() const { return loadedTiles; }
- uint32 getLoadedMapsCount() const { return uint32(loadedMMaps.size()); }
+ uint32 getLoadedMapsCount() const { return loadedMMaps.size(); }
+
+ void LoadPhaseTiles(uint32 mapId, int32 x, int32 y);
+ void UnloadPhaseTile(uint32 mapId, int32 x, int32 y);
+ PhaseTileContainer GetPhaseTileContainer(uint32 mapId) { return _phaseTiles[mapId]; }
+
private:
bool loadMapData(uint32 mapId);
uint32 packTileID(int32 x, int32 y);
MMapDataSet loadedMMaps;
uint32 loadedTiles;
+
+ PhasedTile* LoadTile(uint32 mapId, int32 x, int32 y);
+ PhaseTileMap _phaseTiles;
};
}