aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/tools/mmaps_generator/MapBuilder.cpp12
-rw-r--r--src/tools/mmaps_generator/PathCommon.h11
-rw-r--r--src/tools/mmaps_generator/PathGenerator.cpp39
-rw-r--r--src/tools/mmaps_generator/TerrainBuilder.cpp8
4 files changed, 45 insertions, 25 deletions
diff --git a/src/tools/mmaps_generator/MapBuilder.cpp b/src/tools/mmaps_generator/MapBuilder.cpp
index 8a33fd61210..86fb194997c 100644
--- a/src/tools/mmaps_generator/MapBuilder.cpp
+++ b/src/tools/mmaps_generator/MapBuilder.cpp
@@ -22,8 +22,6 @@
#include "ModelInstance.h"
#include "PathCommon.h"
#include "StringFormat.h"
-#include "VMapFactory.h"
-#include "VMapManager2.h"
#include <DetourCommon.h>
#include <DetourNavMesh.h>
#include <DetourNavMeshBuilder.h>
@@ -448,9 +446,13 @@ namespace MMAP
void MapBuilder::buildNavMesh(uint32 mapID, dtNavMesh* &navMesh)
{
// if map has a parent we use that to generate dtNavMeshParams - worldserver will load all missing tiles from that map
- int32 navMeshParamsMapId = static_cast<VMapManager2*>(VMapFactory::createOrGetVMapManager())->getParentMapId(mapID);
- if (navMeshParamsMapId == -1)
- navMeshParamsMapId = mapID;
+ int32 navMeshParamsMapId = mapID;
+ int32 parentMapId = sMapStore[mapID].ParentMapID;
+ while (parentMapId != -1)
+ {
+ navMeshParamsMapId = parentMapId;
+ parentMapId = sMapStore[parentMapId].ParentMapID;
+ }
std::set<uint32>* tiles = getTileList(navMeshParamsMapId);
diff --git a/src/tools/mmaps_generator/PathCommon.h b/src/tools/mmaps_generator/PathCommon.h
index 173f091e2ac..fed5698b119 100644
--- a/src/tools/mmaps_generator/PathCommon.h
+++ b/src/tools/mmaps_generator/PathCommon.h
@@ -35,6 +35,11 @@
#include <cerrno>
#endif
+namespace VMAP
+{
+ class VMapManager2;
+}
+
namespace MMAP
{
inline bool matchWildcardFilter(char const* filter, char const* str)
@@ -127,10 +132,16 @@ namespace MMAP
{
uint8 MapType = 0;
int8 InstanceType = 0;
+ int16 ParentMapID = -1;
int32 Flags = 0;
};
extern std::unordered_map<uint32, MapEntry> sMapStore;
+
+ namespace VMapFactory
+ {
+ std::unique_ptr<VMAP::VMapManager2> CreateVMapManager();
+}
}
#endif
diff --git a/src/tools/mmaps_generator/PathGenerator.cpp b/src/tools/mmaps_generator/PathGenerator.cpp
index b927cf067f5..abc115ce159 100644
--- a/src/tools/mmaps_generator/PathGenerator.cpp
+++ b/src/tools/mmaps_generator/PathGenerator.cpp
@@ -23,7 +23,6 @@
#include "PathCommon.h"
#include "Timer.h"
#include "Util.h"
-#include "VMapFactory.h"
#include "VMapManager2.h"
#include <boost/filesystem/operations.hpp>
#include <unordered_map>
@@ -34,18 +33,34 @@ constexpr char Readme[] =
#include "Info/readme.txt"
};
+namespace
+{
+ std::unordered_map<uint32, uint8> _liquidTypes;
+ std::unordered_map<uint32, std::vector<uint32>> _mapDataForVmapInitialization;
+}
+
namespace MMAP
{
std::unordered_map<uint32, MapEntry> sMapStore;
+
+ namespace VMapFactory
+ {
+ std::unique_ptr<VMAP::VMapManager2> CreateVMapManager()
+ {
+ std::unique_ptr<VMAP::VMapManager2> vmgr = std::make_unique<VMAP::VMapManager2>();
+ vmgr->InitializeThreadUnsafe(_mapDataForVmapInitialization);
+ vmgr->GetLiquidFlagsPtr = [](uint32 liquidId) -> uint32
+ {
+ auto itr = _liquidTypes.find(liquidId);
+ return itr != _liquidTypes.end() ? (1 << itr->second) : 0;
+ };
+ return vmgr;
+ }
+ }
}
using namespace MMAP;
-namespace
-{
- std::unordered_map<uint32, uint8> _liquidTypes;
-}
-
bool checkDirectories(bool debugOutput, std::vector<std::string>& dbcLocales)
{
if (getDirContents(dbcLocales, "dbc") == LISTFILE_DIRECTORY_NOT_FOUND || dbcLocales.empty())
@@ -346,6 +361,7 @@ std::unordered_map<uint32, std::vector<uint32>> LoadMap(std::string const& local
MapEntry& map = sMapStore[record.GetId()];
map.MapType = record.GetUInt8("MapType");
map.InstanceType = record.GetUInt8("InstanceType");
+ map.ParentMapID = parentMapId;
map.Flags = record.GetInt32("Flags1");
}
}
@@ -404,14 +420,7 @@ int main(int argc, char** argv)
_liquidTypes = LoadLiquid(dbcLocales[0], silent, -5);
- std::unordered_map<uint32, std::vector<uint32>> mapData = LoadMap(dbcLocales[0], silent, -4);
-
- static_cast<VMAP::VMapManager2*>(VMAP::VMapFactory::createOrGetVMapManager())->InitializeThreadUnsafe(mapData);
- static_cast<VMAP::VMapManager2*>(VMAP::VMapFactory::createOrGetVMapManager())->GetLiquidFlagsPtr = [](uint32 liquidId) -> uint32
- {
- auto itr = _liquidTypes.find(liquidId);
- return itr != _liquidTypes.end() ? (1 << itr->second) : 0;
- };
+ _mapDataForVmapInitialization = LoadMap(dbcLocales[0], silent, -4);
MapBuilder builder(maxAngle, maxAngleNotSteep, skipLiquid, skipContinents, skipJunkMaps,
skipBattlegrounds, debugOutput, bigBaseUnit, mapnum, offMeshInputPath);
@@ -426,8 +435,6 @@ int main(int argc, char** argv)
else
builder.buildAllMaps(threads);
- VMAP::VMapFactory::clear();
-
if (!silent)
printf("Finished. MMAPS were built in %s\n", secsToTimeString(GetMSTimeDiffToNow(start) / 1000).c_str());
return 0;
diff --git a/src/tools/mmaps_generator/TerrainBuilder.cpp b/src/tools/mmaps_generator/TerrainBuilder.cpp
index 10de95f15cb..22127611fc3 100644
--- a/src/tools/mmaps_generator/TerrainBuilder.cpp
+++ b/src/tools/mmaps_generator/TerrainBuilder.cpp
@@ -22,7 +22,6 @@
#include "MMapDefines.h"
#include "ModelInstance.h"
#include "Util.h"
-#include "VMapFactory.h"
#include "VMapManager2.h"
namespace MMAP
@@ -86,11 +85,12 @@ namespace MMAP
FILE* mapFile = fopen(mapFileName, "rb");
if (!mapFile)
{
- int32 parentMapId = static_cast<VMapManager2*>(VMapFactory::createOrGetVMapManager())->getParentMapId(mapID);
- if (parentMapId != -1)
+ int32 parentMapId = sMapStore[mapID].ParentMapID;
+ while (!mapFile && parentMapId != -1)
{
sprintf(mapFileName, "maps/%04d_%02u_%02u.map", parentMapId, tileY, tileX);
mapFile = fopen(mapFileName, "rb");
+ parentMapId = sMapStore[parentMapId].ParentMapID;
}
}
@@ -587,7 +587,7 @@ namespace MMAP
/**************************************************************************/
bool TerrainBuilder::loadVMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData)
{
- VMapManager2* vmapManager = static_cast<VMapManager2*>(VMapFactory::createOrGetVMapManager());
+ std::unique_ptr<VMapManager2> vmapManager = VMapFactory::CreateVMapManager();
LoadResult result = vmapManager->loadSingleMap(mapID, "vmaps", tileX, tileY);
bool retval = false;