Tools/MapExtractor: converted filenames and paths to strings
This commit is contained in:
1 parent
5f808b5247
commit
3cfee9d3d0
1 file changed
+159
-197
+159
-197
@@ -95,18 +95,20 @@ std::vector<map_id> map_ids;
|
||||
std::unordered_map<uint32, LiquidMaterialEntry> LiquidMaterials;
|
||||
std::unordered_map<uint32, LiquidObjectEntry> LiquidObjects;
|
||||
std::unordered_map<uint32, LiquidTypeEntry> LiquidTypes;
|
||||
#define MAX_PATH_LENGTH 128
|
||||
char output_path[MAX_PATH_LENGTH];
|
||||
char input_path[MAX_PATH_LENGTH];
|
||||
bool PrintProgress = true;
|
||||
boost::filesystem::path input_path;
|
||||
boost::filesystem::path output_path;
|
||||
|
||||
// **************************************************
|
||||
// Extractor options
|
||||
// **************************************************
|
||||
enum Extract
|
||||
enum Extract : uint8
|
||||
{
|
||||
EXTRACT_MAP = 1,
|
||||
EXTRACT_DBC = 2,
|
||||
EXTRACT_CAMERA = 4
|
||||
EXTRACT_MAP = 0x1,
|
||||
EXTRACT_DBC = 0x2,
|
||||
EXTRACT_CAMERA = 0x4,
|
||||
|
||||
EXTRACT_ALL = EXTRACT_MAP | EXTRACT_DBC | EXTRACT_CAMERA
|
||||
};
|
||||
|
||||
// Select data for extract
|
||||
@@ -123,8 +125,6 @@ float CONF_float_to_int16_limit = 2048.0f; // Max accuracy = val/65536
|
||||
float CONF_flat_height_delta_limit = 0.005f; // If max - min less this value - surface is flat
|
||||
float CONF_flat_liquid_delta_limit = 0.001f; // If max - min less this value - liquid surface is flat
|
||||
|
||||
uint32 CONF_TargetBuild = 15595; // 4.3.4.15595
|
||||
|
||||
// List MPQ for extract maps from
|
||||
char const* CONF_mpq_list[]=
|
||||
{
|
||||
@@ -139,6 +139,7 @@ char const* CONF_mpq_list[]=
|
||||
uint32 const Builds[] = {13164, 13205, 13287, 13329, 13596, 13623, 13914, 14007, 14333, 14480, 14545, 15005, 15050, 15211, 15354, 15595, 0};
|
||||
#define LAST_DBC_IN_DATA_BUILD 13623 // after this build mpqs with dbc are back to locale folder
|
||||
#define NEW_BASE_SET_BUILD 15211
|
||||
#define CLIENT_BUILD 15595
|
||||
|
||||
#define LOCALES_COUNT 15
|
||||
|
||||
@@ -173,43 +174,27 @@ uint8 const MpqToWowLocale[LOCALES_COUNT] =
|
||||
LOCALE_itIT
|
||||
};
|
||||
|
||||
TCHAR const* LocalesT[LOCALES_COUNT] =
|
||||
static char const* const LocalesT[LOCALES_COUNT] =
|
||||
{
|
||||
_T("enGB"), _T("enUS"),
|
||||
_T("deDE"), _T("esES"),
|
||||
_T("frFR"), _T("koKR"),
|
||||
_T("zhCN"), _T("zhTW"),
|
||||
_T("enCN"), _T("enTW"),
|
||||
_T("esMX"), _T("ruRU"),
|
||||
_T("ptBR"), _T("ptPT"),
|
||||
_T("itIT"),
|
||||
"enGB", "enUS",
|
||||
"deDE", "esES",
|
||||
"frFR", "koKR",
|
||||
"zhCN", "zhTW",
|
||||
"enCN", "enTW",
|
||||
"esMX", "ruRU",
|
||||
"ptBR", "ptPT",
|
||||
"itIT"
|
||||
};
|
||||
|
||||
void CreateDir(std::string const& path)
|
||||
void CreateDir(boost::filesystem::path const& path)
|
||||
{
|
||||
if (chdir(path.c_str()) == 0)
|
||||
{
|
||||
chdir("../");
|
||||
namespace fs = boost::filesystem;
|
||||
if (fs::exists(path))
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
_mkdir(path.c_str());
|
||||
#else
|
||||
mkdir(path.c_str(), S_IRWXU | S_IRWXG | S_IRWXO); // 0777
|
||||
#endif
|
||||
}
|
||||
|
||||
bool FileExists(TCHAR const* fileName)
|
||||
{
|
||||
int fp = _open(fileName, OPEN_FLAGS);
|
||||
if (fp != -1)
|
||||
{
|
||||
_close(fp);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
boost::system::error_code err;
|
||||
if (!fs::create_directory(path, err) || err)
|
||||
throw std::runtime_error("Unable to create directory" + path.string());
|
||||
}
|
||||
|
||||
void Usage(char const* prg)
|
||||
@@ -221,8 +206,7 @@ void Usage(char const* prg)
|
||||
"-o set output path\n"\
|
||||
"-e extract only MAP(1)/DBC(2)/Camera(4) - standard: all(7)\n"\
|
||||
"-f height stored as int (less map size but lost some accuracy) 1 by default\n"\
|
||||
"-b target build (default %u)\n"\
|
||||
"Example: %s -f 0 -i \"c:\\games\\game\"", prg, CONF_TargetBuild, prg);
|
||||
"Example: %s -f 0 -i \"c:\\games\\game\"", prg, prg);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -242,26 +226,20 @@ void HandleArgs(int argc, char* arg[])
|
||||
switch (arg[c][1])
|
||||
{
|
||||
case 'i':
|
||||
if (c + 1 < argc && strlen(arg[c + 1]) < MAX_PATH_LENGTH) // all ok
|
||||
{
|
||||
strncpy(input_path, arg[c++ + 1], MAX_PATH_LENGTH);
|
||||
input_path[MAX_PATH_LENGTH - 1] = '\0';
|
||||
}
|
||||
if (c + 1 < argc && strlen(arg[c + 1])) // all ok
|
||||
input_path = boost::filesystem::path(arg[c++ + 1]);
|
||||
else
|
||||
Usage(arg[0]);
|
||||
break;
|
||||
case 'o':
|
||||
if (c + 1 < argc && strlen(arg[c + 1]) < MAX_PATH_LENGTH) // all ok
|
||||
{
|
||||
strncpy(output_path, arg[c++ + 1], MAX_PATH_LENGTH);
|
||||
output_path[MAX_PATH_LENGTH - 1] = '\0';
|
||||
}
|
||||
if (c + 1 < argc && strlen(arg[c + 1])) // all ok
|
||||
output_path = boost::filesystem::path(arg[c++ + 1]);
|
||||
else
|
||||
Usage(arg[0]);
|
||||
break;
|
||||
case 'f':
|
||||
if (c + 1 < argc) // all ok
|
||||
CONF_allow_float_to_int = atoi(arg[c++ + 1])!=0;
|
||||
CONF_allow_float_to_int = atoi(arg[c++ + 1]) != 0;
|
||||
else
|
||||
Usage(arg[0]);
|
||||
break;
|
||||
@@ -269,18 +247,12 @@ void HandleArgs(int argc, char* arg[])
|
||||
if (c + 1 < argc) // all ok
|
||||
{
|
||||
CONF_extract = atoi(arg[c++ + 1]);
|
||||
if (!(CONF_extract > 0 && CONF_extract < 8))
|
||||
if (!(CONF_extract > 0 && CONF_extract <= EXTRACT_ALL))
|
||||
Usage(arg[0]);
|
||||
}
|
||||
else
|
||||
Usage(arg[0]);
|
||||
break;
|
||||
case 'b':
|
||||
if (c + 1 < argc) // all ok
|
||||
CONF_TargetBuild = atoi(arg[c++ + 1]);
|
||||
else
|
||||
Usage(arg[0]);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -333,7 +305,7 @@ uint32 ReadBuild(int locale)
|
||||
return build;
|
||||
}
|
||||
|
||||
uint32 ReadMapDBC()
|
||||
void ReadMapDBC()
|
||||
{
|
||||
printf("Read Map.dbc file... ");
|
||||
|
||||
@@ -361,7 +333,6 @@ uint32 ReadMapDBC()
|
||||
|
||||
SFileCloseFile(dbcFile);
|
||||
printf("Done! (%u maps loaded)\n", uint32(map_count));
|
||||
return map_count;
|
||||
}
|
||||
|
||||
void ReadLiquidMaterialTable()
|
||||
@@ -1067,32 +1038,27 @@ bool IsDeepWaterIgnored(uint32 mapId, uint32 x, uint32 y)
|
||||
|
||||
void ExtractMapsFromMpq(uint32 build)
|
||||
{
|
||||
char mpq_filename[1024];
|
||||
char output_filename[1024];
|
||||
char mpq_map_name[1024];
|
||||
std::string mpqFileName;
|
||||
std::string mpqMapName;
|
||||
std::string outputFileName;
|
||||
|
||||
printf("Extracting maps...\n");
|
||||
|
||||
uint32 map_count = ReadMapDBC();
|
||||
|
||||
ReadMapDBC();
|
||||
ReadLiquidMaterialTable();
|
||||
ReadLiquidObjectTable();
|
||||
ReadLiquidTypeTable();
|
||||
|
||||
std::string path = output_path;
|
||||
path += "/maps/";
|
||||
CreateDir(path);
|
||||
CreateDir(output_path / "maps");
|
||||
|
||||
printf("Convert map files\n");
|
||||
for (uint32 z = 0; z < map_count; ++z)
|
||||
for (std::size_t z = 0; z < map_ids.size(); ++z)
|
||||
{
|
||||
printf("Extract %s (%d/%u) \n", map_ids[z].name, z+1, map_count);
|
||||
// Loadup map grid data
|
||||
sprintf(mpq_map_name, "World\\Maps\\%s\\%s.wdt", map_ids[z].name, map_ids[z].name);
|
||||
printf("Extract %s (" SZFMTD "/" SZFMTD ") \n", map_ids[z].name, z + 1, map_ids.size());
|
||||
mpqMapName = Trinity::StringFormat("World\\Maps\\%s\\%s.wdt", map_ids[z].name, map_ids[z].name);
|
||||
ChunkedFile wdt;
|
||||
|
||||
std::bitset<(WDT_MAP_SIZE)* (WDT_MAP_SIZE)> existingTiles;
|
||||
if (wdt.loadFile(WorldMpq, mpq_map_name, false))
|
||||
if (wdt.loadFile(WorldMpq, mpqMapName, false))
|
||||
{
|
||||
FileChunk* main = wdt.GetChunk("MAIN");
|
||||
for (uint32 y = 0; y < WDT_MAP_SIZE; ++y)
|
||||
@@ -1102,18 +1068,19 @@ void ExtractMapsFromMpq(uint32 build)
|
||||
if (!(main->As<wdt_MAIN>()->adt_list[y][x].flag & 0x1))
|
||||
continue;
|
||||
|
||||
sprintf(mpq_filename, "World\\Maps\\%s\\%s_%u_%u.adt", map_ids[z].name, map_ids[z].name, x, y);
|
||||
sprintf(output_filename, "%s/maps/%03u%02u%02u.map", output_path, map_ids[z].id, y, x);
|
||||
mpqFileName = Trinity::StringFormat("World\\Maps\\%s\\%s_%u_%u.adt", map_ids[z].name, map_ids[z].name, x, y);
|
||||
outputFileName = Trinity::StringFormat("%s/maps/%03u%02u%02u.map", output_path.string(), map_ids[z].id, y, x);
|
||||
bool ignoreDeepWater = IsDeepWaterIgnored(map_ids[z].id, y, x);
|
||||
existingTiles[y * WDT_MAP_SIZE + x] = ConvertADT(mpq_filename, output_filename, y, x, build, ignoreDeepWater);
|
||||
existingTiles[y * WDT_MAP_SIZE + x] = ConvertADT(mpqFileName, outputFileName, y, x, build, ignoreDeepWater);
|
||||
}
|
||||
|
||||
// draw progress bar
|
||||
printf("Processing........................%d%%\r", (100 * (y + 1)) / WDT_MAP_SIZE);
|
||||
if (PrintProgress)
|
||||
printf("Processing........................%d%%\r", (100 * (y + 1)) / WDT_MAP_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
if (FILE* tileList = fopen(Trinity::StringFormat("%s/maps/%03u.tilelist", output_path, map_ids[z].id).c_str(), "wb"))
|
||||
if (FILE* tileList = fopen(Trinity::StringFormat("%s/maps/%03u.tilelist", output_path.string(), map_ids[z].id).c_str(), "wb"))
|
||||
{
|
||||
fwrite(MapMagic.data(), 1, MapMagic.size(), tileList);
|
||||
fwrite(&MapVersionMagic, 1, sizeof(MapVersionMagic), tileList);
|
||||
@@ -1126,12 +1093,12 @@ void ExtractMapsFromMpq(uint32 build)
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
bool ExtractFile(HANDLE fileInArchive, char const* filename)
|
||||
bool ExtractFile(HANDLE fileInArchive, std::string const& fileName)
|
||||
{
|
||||
FILE* output = fopen(filename, "wb");
|
||||
FILE* output = fopen(fileName.c_str(), "wb");
|
||||
if (!output)
|
||||
{
|
||||
printf("Can't create the output file '%s'\n", filename);
|
||||
printf("Can't create the output file '%s'\n", fileName.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1149,7 +1116,7 @@ bool ExtractFile(HANDLE fileInArchive, char const* filename)
|
||||
return true;
|
||||
}
|
||||
|
||||
void ExtractDBCFiles(int l)
|
||||
void ExtractDBCFiles(int locale)
|
||||
{
|
||||
printf("Extracting dbc files...\n");
|
||||
|
||||
@@ -1160,15 +1127,12 @@ void ExtractDBCFiles(int l)
|
||||
uint32 count = 0;
|
||||
if (listFile)
|
||||
{
|
||||
std::string outputPath = output_path;
|
||||
outputPath += "/dbc/";
|
||||
boost::filesystem::path localePath = output_path / "dbc" / localeNames[MpqToWowLocale[locale]];
|
||||
|
||||
CreateDir(outputPath);
|
||||
outputPath += localeNames[MpqToWowLocale[l]];
|
||||
outputPath += "/";
|
||||
CreateDir(outputPath);
|
||||
CreateDir(output_path / "dbc");
|
||||
CreateDir(localePath);
|
||||
|
||||
std::string filename;
|
||||
printf("locale %s output path %s\n", localeNames[MpqToWowLocale[locale]], localePath.string().c_str());
|
||||
|
||||
do
|
||||
{
|
||||
@@ -1178,14 +1142,11 @@ void ExtractDBCFiles(int l)
|
||||
continue;
|
||||
}
|
||||
|
||||
filename = foundFile.cFileName;
|
||||
filename = outputPath + filename.substr(filename.rfind('\\') + 1);
|
||||
boost::filesystem::path filePath = localePath / boost::filesystem::path(foundFile.cFileName).filename();
|
||||
|
||||
if (FileExists(filename.c_str()))
|
||||
continue;
|
||||
|
||||
if (ExtractFile(dbcFile, filename.c_str()))
|
||||
++count;
|
||||
if (!boost::filesystem::exists(filePath))
|
||||
if (ExtractFile(dbcFile, filePath.string()))
|
||||
++count;
|
||||
|
||||
SFileCloseFile(dbcFile);
|
||||
} while (SFileFindNextFile(listFile, &foundFile));
|
||||
@@ -1196,7 +1157,7 @@ void ExtractDBCFiles(int l)
|
||||
printf("Extracted %u DBC files\n\n", count);
|
||||
}
|
||||
|
||||
void ExtractDB2Files(int l)
|
||||
void ExtractDB2Files(int locale)
|
||||
{
|
||||
printf("Extracting db2 files...\n");
|
||||
|
||||
@@ -1207,12 +1168,9 @@ void ExtractDB2Files(int l)
|
||||
uint32 count = 0;
|
||||
if (listFile)
|
||||
{
|
||||
std::string outputPath = output_path;
|
||||
outputPath += "/dbc/";
|
||||
outputPath += localeNames[MpqToWowLocale[l]];
|
||||
outputPath += "/";
|
||||
boost::filesystem::path localePath = output_path / "dbc" / localeNames[MpqToWowLocale[locale]];
|
||||
|
||||
std::string filename;
|
||||
printf("locale %s output path %s\n", localeNames[MpqToWowLocale[locale]], localePath.string().c_str());
|
||||
|
||||
do
|
||||
{
|
||||
@@ -1222,9 +1180,10 @@ void ExtractDB2Files(int l)
|
||||
continue;
|
||||
}
|
||||
|
||||
filename = foundFile.cFileName;
|
||||
filename = outputPath + filename.substr(filename.rfind('\\') + 1);
|
||||
if (ExtractFile(dbcFile, filename.c_str()))
|
||||
boost::filesystem::path filePath = localePath / boost::filesystem::path(foundFile.cFileName).filename();
|
||||
|
||||
if (!boost::filesystem::exists(filePath))
|
||||
if (ExtractFile(dbcFile, filePath.string()))
|
||||
++count;
|
||||
|
||||
SFileCloseFile(dbcFile);
|
||||
@@ -1239,6 +1198,7 @@ void ExtractDB2Files(int l)
|
||||
void ExtractCameraFiles()
|
||||
{
|
||||
printf("Extracting camera files...\n");
|
||||
|
||||
HANDLE dbcFile;
|
||||
if (!SFileOpenFileEx(LocaleMpq, "DBFilesClient\\CinematicCamera.dbc", SFILE_OPEN_PATCHED_FILE, &dbcFile))
|
||||
{
|
||||
@@ -1254,6 +1214,7 @@ void ExtractCameraFiles()
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// get camera file list from DBC
|
||||
std::vector<std::string> camerafiles;
|
||||
size_t cam_count = camdbc.getRecordCount();
|
||||
@@ -1268,28 +1229,30 @@ void ExtractCameraFiles()
|
||||
}
|
||||
SFileCloseFile(dbcFile);
|
||||
|
||||
std::string path = output_path;
|
||||
path += "/Cameras/";
|
||||
CreateDir(path);
|
||||
boost::filesystem::path outputPath = output_path / "Cameras";
|
||||
|
||||
CreateDir(outputPath);
|
||||
|
||||
printf("output path %s\n", outputPath.string().c_str());
|
||||
|
||||
// extract M2s
|
||||
uint32 count = 0;
|
||||
for (std::string thisFile : camerafiles)
|
||||
for (std::string const& thisFile : camerafiles)
|
||||
{
|
||||
std::string filename = path;
|
||||
HANDLE dbcFile = nullptr;
|
||||
filename += (thisFile.c_str() + strlen("Cameras\\"));
|
||||
boost::filesystem::path filePath = outputPath / (thisFile.c_str() + strlen("Cameras\\"));
|
||||
|
||||
if (FileExists(filename.c_str()))
|
||||
if (boost::filesystem::exists(filePath))
|
||||
continue;
|
||||
|
||||
HANDLE dbcFile = nullptr;
|
||||
|
||||
if (!SFileOpenFileEx(WorldMpq, thisFile.c_str(), SFILE_OPEN_PATCHED_FILE, &dbcFile))
|
||||
{
|
||||
printf("Unable to open file %s in the archive\n", thisFile.c_str());
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ExtractFile(dbcFile, filename.c_str()))
|
||||
if (ExtractFile(dbcFile, filePath.string()))
|
||||
++count;
|
||||
|
||||
SFileCloseFile(dbcFile);
|
||||
@@ -1299,48 +1262,48 @@ void ExtractCameraFiles()
|
||||
|
||||
bool LoadLocaleMPQFile(int locale)
|
||||
{
|
||||
TCHAR buff[512];
|
||||
memset(buff, 0, sizeof(buff));
|
||||
_stprintf(buff, _T("%s/Data/%s/locale-%s.MPQ"), input_path, LocalesT[locale], LocalesT[locale]);
|
||||
if (!SFileOpenArchive(buff, 0, MPQ_OPEN_READ_ONLY, &LocaleMpq))
|
||||
std::string fileName = Trinity::StringFormat("%s/Data/%s/locale-%s.MPQ", input_path.string(), LocalesT[locale], LocalesT[locale]);
|
||||
|
||||
if (!SFileOpenArchive(fileName.c_str(), 0, MPQ_OPEN_READ_ONLY, &LocaleMpq))
|
||||
{
|
||||
if (GetLastError() != ERROR_PATH_NOT_FOUND)
|
||||
{
|
||||
_tprintf(_T("\nLoading %s locale MPQs\n"), LocalesT[locale]);
|
||||
_tprintf(_T("Cannot open archive %s\n"), buff);
|
||||
printf("\nLoading %s locale MPQs\n", LocalesT[locale]);
|
||||
printf("Cannot open archive %s\n", fileName.c_str());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
_tprintf(_T("\nLoading %s locale MPQs\n"), LocalesT[locale]);
|
||||
printf("\nLoading %s locale MPQs\n", LocalesT[locale]);
|
||||
char const* prefix = nullptr;
|
||||
for (int i = 0; Builds[i] && Builds[i] <= CONF_TargetBuild; ++i)
|
||||
for (int i = 0; Builds[i] && Builds[i] <= CLIENT_BUILD; ++i)
|
||||
{
|
||||
// Do not attempt to read older MPQ patch archives past this build, they were merged with base
|
||||
// and trying to read them together with new base will not end well
|
||||
if (CONF_TargetBuild >= NEW_BASE_SET_BUILD && Builds[i] < NEW_BASE_SET_BUILD)
|
||||
if (CLIENT_BUILD >= NEW_BASE_SET_BUILD && Builds[i] < NEW_BASE_SET_BUILD)
|
||||
continue;
|
||||
|
||||
memset(buff, 0, sizeof(buff));
|
||||
fileName.clear();
|
||||
|
||||
if (Builds[i] > LAST_DBC_IN_DATA_BUILD)
|
||||
{
|
||||
prefix = "";
|
||||
_stprintf(buff, _T("%s/Data/%s/wow-update-%s-%u.MPQ"), input_path, LocalesT[locale], LocalesT[locale], Builds[i]);
|
||||
fileName = Trinity::StringFormat("%s/Data/%s/wow-update-%s-%u.MPQ", input_path.string(), LocalesT[locale], LocalesT[locale], Builds[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
prefix = Locales[locale];
|
||||
_stprintf(buff, _T("%s/Data/wow-update-%u.MPQ"), input_path, Builds[i]);
|
||||
fileName = Trinity::StringFormat("%s/Data/wow-update-%u.MPQ", input_path.string(), Builds[i]);
|
||||
}
|
||||
|
||||
if (!SFileOpenPatchArchive(LocaleMpq, buff, prefix, 0))
|
||||
if (!SFileOpenPatchArchive(LocaleMpq, fileName.c_str(), prefix, 0))
|
||||
{
|
||||
if (GetLastError() != ERROR_FILE_NOT_FOUND)
|
||||
_tprintf(_T("Cannot open patch archive %s\n"), buff);
|
||||
printf("Cannot open patch archive %s\n", fileName.c_str());
|
||||
continue;
|
||||
}
|
||||
else
|
||||
_tprintf(_T("Loaded %s\n"), buff);
|
||||
printf("Loaded %s\n", fileName.c_str());
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
@@ -1349,13 +1312,12 @@ bool LoadLocaleMPQFile(int locale)
|
||||
|
||||
void LoadCommonMPQFiles(uint32 build)
|
||||
{
|
||||
TCHAR filename[512];
|
||||
_stprintf(filename, _T("%s/Data/world.MPQ"), input_path);
|
||||
_tprintf(_T("Loading common MPQ files\n"));
|
||||
if (!SFileOpenArchive(filename, 0, MPQ_OPEN_READ_ONLY, &WorldMpq))
|
||||
std::string filename = Trinity::StringFormat("%s/Data/world.MPQ", input_path.string());
|
||||
printf("Loading common MPQ files\n");
|
||||
if (!SFileOpenArchive(filename.c_str(), 0, MPQ_OPEN_READ_ONLY, &WorldMpq))
|
||||
{
|
||||
if (GetLastError() != ERROR_PATH_NOT_FOUND)
|
||||
_tprintf(_T("Cannot open archive %s\n"), filename);
|
||||
printf("Cannot open archive %s\n", filename.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1365,49 +1327,49 @@ void LoadCommonMPQFiles(uint32 build)
|
||||
if (build < NEW_BASE_SET_BUILD && !strcmp("world2.MPQ", CONF_mpq_list[i])) // 4.3.2 and higher MPQ
|
||||
continue;
|
||||
|
||||
_stprintf(filename, _T("%s/Data/%s"), input_path, CONF_mpq_list[i]);
|
||||
if (!SFileOpenPatchArchive(WorldMpq, filename, "", 0))
|
||||
filename = Trinity::StringFormat("%s/Data/%s", input_path.string(), CONF_mpq_list[i]);
|
||||
if (!SFileOpenPatchArchive(WorldMpq, filename.c_str(), "", 0))
|
||||
{
|
||||
if (GetLastError() != ERROR_PATH_NOT_FOUND)
|
||||
_tprintf(_T("Cannot open archive %s\n"), filename);
|
||||
printf("Cannot open archive %s\n", filename.c_str());
|
||||
else
|
||||
_tprintf(_T("Not found %s\n"), filename);
|
||||
printf("Not found %s\n", filename.c_str());
|
||||
}
|
||||
else
|
||||
_tprintf(_T("Loaded %s\n"), filename);
|
||||
printf("Loaded %s\n", filename.c_str());
|
||||
|
||||
}
|
||||
|
||||
char const* prefix = nullptr;
|
||||
for (int i = 0; Builds[i] && Builds[i] <= CONF_TargetBuild; ++i)
|
||||
for (int i = 0; Builds[i] && Builds[i] <= CLIENT_BUILD; ++i)
|
||||
{
|
||||
// Do not attempt to read older MPQ patch archives past this build, they were merged with base
|
||||
// and trying to read them together with new base will not end well
|
||||
if (CONF_TargetBuild >= NEW_BASE_SET_BUILD && Builds[i] < NEW_BASE_SET_BUILD)
|
||||
if (CLIENT_BUILD >= NEW_BASE_SET_BUILD && Builds[i] < NEW_BASE_SET_BUILD)
|
||||
continue;
|
||||
|
||||
memset(filename, 0, sizeof(filename));
|
||||
filename.clear();
|
||||
if (Builds[i] > LAST_DBC_IN_DATA_BUILD)
|
||||
{
|
||||
prefix = "";
|
||||
_stprintf(filename, _T("%s/Data/wow-update-base-%u.MPQ"), input_path, Builds[i]);
|
||||
filename = Trinity::StringFormat("%s/Data/wow-update-base-%u.MPQ", input_path.string(), Builds[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
prefix = "base";
|
||||
_stprintf(filename, _T("%s/Data/wow-update-%u.MPQ"), input_path, Builds[i]);
|
||||
filename = Trinity::StringFormat("%s/Data/wow-update-%u.MPQ", input_path.string(), Builds[i]);
|
||||
}
|
||||
|
||||
if (!SFileOpenPatchArchive(WorldMpq, filename, prefix, 0))
|
||||
if (!SFileOpenPatchArchive(WorldMpq, filename.c_str(), prefix, 0))
|
||||
{
|
||||
if (GetLastError() != ERROR_PATH_NOT_FOUND)
|
||||
_tprintf(_T("Cannot open patch archive %s\n"), filename);
|
||||
printf("Cannot open patch archive %s\n", filename.c_str());
|
||||
else
|
||||
_tprintf(_T("Not found %s\n"), filename);
|
||||
printf("Not found %s\n", filename.c_str());
|
||||
continue;
|
||||
}
|
||||
else
|
||||
_tprintf(_T("Loaded %s\n"), filename);
|
||||
printf("Loaded %s\n", filename.c_str());
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
@@ -1417,66 +1379,66 @@ int main(int argc, char * arg[])
|
||||
{
|
||||
Trinity::Banner::Show("Map & DBC Extractor", [](char const* text) { printf("%s\n", text); }, nullptr);
|
||||
|
||||
boost::filesystem::path current(boost::filesystem::current_path());
|
||||
strcpy(input_path, current.string().c_str());
|
||||
strcpy(output_path, current.string().c_str());
|
||||
PrintProgress = isatty(fileno(stdout));
|
||||
input_path = boost::filesystem::current_path();
|
||||
output_path = boost::filesystem::current_path();
|
||||
|
||||
HandleArgs(argc, arg);
|
||||
|
||||
int FirstLocale = -1;
|
||||
int32 firstInstalledLocale = -1;
|
||||
uint32 build = 0;
|
||||
|
||||
for (int i = 0; i < LOCALES_COUNT; ++i)
|
||||
{
|
||||
//Open MPQs
|
||||
if (!LoadLocaleMPQFile(i))
|
||||
std::string filename = Trinity::StringFormat("%s/Data/%s/locale-%s.MPQ", input_path.string(), Locales[i], Locales[i]);
|
||||
if (boost::filesystem::exists(filename))
|
||||
{
|
||||
if (GetLastError() != ERROR_PATH_NOT_FOUND)
|
||||
printf("Unable to load %s locale archives!\n", Locales[i]);
|
||||
continue;
|
||||
}
|
||||
printf("Detected locale: %s\n", Locales[i]);
|
||||
|
||||
printf("Detected locale: %s\n", Locales[i]);
|
||||
if ((CONF_extract & EXTRACT_DBC) == 0)
|
||||
{
|
||||
FirstLocale = i;
|
||||
build = ReadBuild(i);
|
||||
if (build > CONF_TargetBuild)
|
||||
//Open MPQs
|
||||
if (!LoadLocaleMPQFile(i))
|
||||
{
|
||||
printf("Base locale-%s.MPQ has build higher than target build (%u > %u), nothing extracted!\n", Locales[i], build, CONF_TargetBuild);
|
||||
return 0;
|
||||
if (GetLastError() != ERROR_PATH_NOT_FOUND)
|
||||
printf("Unable to load %s locale archives!\n", Locales[i]);
|
||||
continue;
|
||||
}
|
||||
|
||||
printf("Detected client build: %u\n", build);
|
||||
printf("\n");
|
||||
break;
|
||||
}
|
||||
if ((CONF_extract & EXTRACT_DBC) == 0)
|
||||
{
|
||||
firstInstalledLocale = i;
|
||||
build = ReadBuild(i);
|
||||
if (build > CLIENT_BUILD)
|
||||
{
|
||||
printf("Base locale-%s.MPQ has build higher than target build (%u > %u), nothing extracted!\n", Locales[i], build, uint32(CLIENT_BUILD));
|
||||
return 0;
|
||||
}
|
||||
|
||||
//Extract DBC files
|
||||
uint32 tempBuild = ReadBuild(i);
|
||||
printf("Detected client build %u for locale %s\n", tempBuild, Locales[i]);
|
||||
if (tempBuild > CONF_TargetBuild)
|
||||
{
|
||||
printf("Detected client build: %u\n", build);
|
||||
break;
|
||||
}
|
||||
|
||||
if (firstInstalledLocale < 0)
|
||||
{
|
||||
firstInstalledLocale = i;
|
||||
build = ReadBuild(i);
|
||||
if (build > CLIENT_BUILD)
|
||||
{
|
||||
printf("Base locale-%s.MPQ has build higher than target build (%u > %u), nothing extracted!\n", Locales[i], build, uint32(CLIENT_BUILD));
|
||||
return 0;
|
||||
}
|
||||
printf("Detected client build: %u\n", build);
|
||||
}
|
||||
|
||||
ExtractDBCFiles(i);
|
||||
ExtractDB2Files(i);
|
||||
|
||||
//Close MPQs
|
||||
SFileCloseArchive(LocaleMpq);
|
||||
printf("Base locale-%s.MPQ has build higher than target build (%u > %u), nothing extracted!\n", Locales[i], tempBuild, CONF_TargetBuild);
|
||||
continue;
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
ExtractDBCFiles(i);
|
||||
ExtractDB2Files(i);
|
||||
|
||||
if (FirstLocale < 0)
|
||||
{
|
||||
FirstLocale = i;
|
||||
build = tempBuild;
|
||||
}
|
||||
|
||||
//Close MPQs
|
||||
SFileCloseArchive(LocaleMpq);
|
||||
}
|
||||
|
||||
if (FirstLocale < 0)
|
||||
if (firstInstalledLocale < 0)
|
||||
{
|
||||
printf("No locales detected\n");
|
||||
return 0;
|
||||
@@ -1484,10 +1446,10 @@ int main(int argc, char * arg[])
|
||||
|
||||
if (CONF_extract & EXTRACT_CAMERA)
|
||||
{
|
||||
printf("Using locale: %s\n", Locales[FirstLocale]);
|
||||
printf("Using locale: %s\n", Locales[firstInstalledLocale]);
|
||||
|
||||
// Open MPQs
|
||||
LoadLocaleMPQFile(FirstLocale);
|
||||
LoadLocaleMPQFile(firstInstalledLocale);
|
||||
LoadCommonMPQFiles(build);
|
||||
|
||||
// Extract cameras
|
||||
@@ -1500,10 +1462,10 @@ int main(int argc, char * arg[])
|
||||
|
||||
if (CONF_extract & EXTRACT_MAP)
|
||||
{
|
||||
printf("Using locale: %s\n", Locales[FirstLocale]);
|
||||
printf("Using locale: %s\n", Locales[firstInstalledLocale]);
|
||||
|
||||
// Open MPQs
|
||||
LoadLocaleMPQFile(FirstLocale);
|
||||
LoadLocaleMPQFile(firstInstalledLocale);
|
||||
LoadCommonMPQFiles(build);
|
||||
|
||||
// Extract maps
|
||||
|
||||
Reference in new issue
Block a user