mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-23 02:25:38 +01:00
Tools/MapExtractor: Fix a warning reported by gcc 4.9
/var/lib/jenkins/jobs/tc_335_release_gcc49/workspace/src/tools/map_extractor/System.cpp:113:25: error: ignoring return value of ‘int chdir(const char*)’, declared with attribute warn_unused_result [-Werror=unused-result]
chdir("../");
*NO reextraction of dbcs/maps needed*
Binary compatibility is ensured
(cherry picked from commit f0c7061f0b)
Conflicts:
src/tools/map_extractor/CMakeLists.txt
src/tools/map_extractor/System.cpp
src/tools/map_extractor/loadlib.cpp
src/tools/map_extractor/loadlib/loadlib.h
src/tools/map_extractor/mpq_libmpq04.h
This commit is contained in:
@@ -12,9 +12,11 @@
|
||||
file(GLOB_RECURSE sources *.cpp *.h)
|
||||
|
||||
include_directories (
|
||||
${CMAKE_SOURCE_DIR}/src/common
|
||||
${CMAKE_SOURCE_DIR}/src/server/shared
|
||||
${CMAKE_SOURCE_DIR}/dep/CascLib/src
|
||||
${CMAKE_SOURCE_DIR}/dep/cppformat
|
||||
${CMAKE_SOURCE_DIR}/src/common
|
||||
${CMAKE_SOURCE_DIR}/src/common/Utilities
|
||||
${CMAKE_SOURCE_DIR}/src/server/shared
|
||||
${CMAKE_CURRENT_SOURCE_DIR}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/loadlib
|
||||
)
|
||||
@@ -28,6 +30,7 @@ add_executable(mapextractor
|
||||
target_link_libraries(mapextractor
|
||||
casc
|
||||
common
|
||||
format
|
||||
${BZIP2_LIBRARIES}
|
||||
${ZLIB_LIBRARIES}
|
||||
${Boost_LIBRARIES}
|
||||
|
||||
@@ -20,19 +20,11 @@
|
||||
|
||||
#include <cstdio>
|
||||
#include <deque>
|
||||
#include <list>
|
||||
#include <fstream>
|
||||
#include <set>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
|
||||
#ifdef _WIN32
|
||||
#include "direct.h"
|
||||
#else
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#define ERROR_PATH_NOT_FOUND ERROR_FILE_NOT_FOUND
|
||||
#endif
|
||||
|
||||
#include <boost/filesystem/path.hpp>
|
||||
#include <boost/filesystem/operations.hpp>
|
||||
|
||||
@@ -43,26 +35,10 @@
|
||||
#include "DBFilesClientList.h"
|
||||
#include "CascLib.h"
|
||||
#include "dbcfile.h"
|
||||
#include "StringFormat.h"
|
||||
|
||||
#include "adt.h"
|
||||
#include "wdt.h"
|
||||
#include <fcntl.h>
|
||||
|
||||
#if defined( __GNUC__ )
|
||||
#define _open open
|
||||
#define _close close
|
||||
#ifndef O_BINARY
|
||||
#define O_BINARY 0
|
||||
#endif
|
||||
#else
|
||||
#include <io.h>
|
||||
#endif
|
||||
|
||||
#ifdef O_LARGEFILE
|
||||
#define OPEN_FLAGS (O_RDONLY | O_BINARY | O_LARGEFILE)
|
||||
#else
|
||||
#define OPEN_FLAGS (O_RDONLY | O_BINARY)
|
||||
#endif
|
||||
|
||||
namespace
|
||||
{
|
||||
@@ -162,31 +138,14 @@ uint32 WowLocaleToCascLocaleFlags[12] =
|
||||
CASC_LOCALE_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;
|
||||
if (!fs::create_directory(path))
|
||||
throw new std::runtime_error("Unable to create directory" + path.string());
|
||||
}
|
||||
|
||||
void Usage(char const* prg)
|
||||
@@ -275,7 +234,7 @@ void HandleArgs(int argc, char* arg[])
|
||||
uint32 ReadBuild(int locale)
|
||||
{
|
||||
// include build info file also
|
||||
std::string filename = std::string("component.wow-") + localeNames[locale] + ".txt";
|
||||
std::string filename = Trinity::StringFormat("component.wow-%s.txt", localeNames[locale]);
|
||||
//printf("Read %s file... ", filename.c_str());
|
||||
|
||||
HANDLE dbcFile;
|
||||
@@ -355,7 +314,7 @@ uint32 ReadMapDBC()
|
||||
}
|
||||
|
||||
CascCloseFile(dbcFile);
|
||||
printf("Done! (%u maps loaded)\n", uint32(map_count));
|
||||
printf("Done! (" SZFMTD " maps loaded)\n", map_count);
|
||||
return map_count;
|
||||
}
|
||||
|
||||
@@ -385,7 +344,7 @@ void ReadAreaTableDBC()
|
||||
areas[dbc.getRecord(x).getUInt(0)] = dbc.getRecord(x).getUInt(3);
|
||||
|
||||
CascCloseFile(dbcFile);
|
||||
printf("Done! (%u areas loaded)\n", uint32(area_count));
|
||||
printf("Done! (" SZFMTD " areas loaded)\n", area_count);
|
||||
}
|
||||
|
||||
void ReadLiquidTypeTableDBC()
|
||||
@@ -414,7 +373,7 @@ void ReadLiquidTypeTableDBC()
|
||||
LiqType[dbc.getRecord(x).getUInt(0)] = dbc.getRecord(x).getUInt(3);
|
||||
|
||||
CascCloseFile(dbcFile);
|
||||
printf("Done! (%u LiqTypes loaded)\n", (uint32)liqTypeCount);
|
||||
printf("Done! (" SZFMTD " LiqTypes loaded)\n", liqTypeCount);
|
||||
}
|
||||
|
||||
//
|
||||
@@ -529,17 +488,17 @@ bool TransformToHighRes(uint16 holes, uint8 hiResHoles[8])
|
||||
return *((uint64*)hiResHoles) != 0;
|
||||
}
|
||||
|
||||
bool ConvertADT(char *filename, char *filename2, int /*cell_y*/, int /*cell_x*/, uint32 build)
|
||||
bool ConvertADT(std::string const& inputPath, std::string const& outputPath, int /*cell_y*/, int /*cell_x*/, uint32 build)
|
||||
{
|
||||
ChunkedFile adt;
|
||||
|
||||
if (!adt.loadFile(CascStorage, filename))
|
||||
if (!adt.loadFile(CascStorage, inputPath))
|
||||
return false;
|
||||
|
||||
// Prepare map header
|
||||
map_fileheader map;
|
||||
map.mapMagic = *(uint32 const*)MAP_MAGIC;
|
||||
map.versionMagic = *(uint32 const*)MAP_VERSION_MAGIC;
|
||||
map.mapMagic = *reinterpret_cast<uint32 const*>(MAP_MAGIC);
|
||||
map.versionMagic = *reinterpret_cast<uint32 const*>(MAP_VERSION_MAGIC);
|
||||
map.buildMagic = build;
|
||||
|
||||
// Get area flags data
|
||||
@@ -734,7 +693,7 @@ bool ConvertADT(char *filename, char *filename2, int /*cell_y*/, int /*cell_x*/,
|
||||
case LIQUID_TYPE_MAGMA: liquid_flags[i][j] |= MAP_LIQUID_TYPE_MAGMA; break;
|
||||
case LIQUID_TYPE_SLIME: liquid_flags[i][j] |= MAP_LIQUID_TYPE_SLIME; break;
|
||||
default:
|
||||
printf("\nCan't find Liquid type %u for map %s\nchunk %d,%d\n", h->liquidType, filename, i, j);
|
||||
printf("\nCan't find Liquid type %u for map %s\nchunk %d,%d\n", h->liquidType, inputPath.c_str(), i, j);
|
||||
break;
|
||||
}
|
||||
// Dark water detect
|
||||
@@ -790,7 +749,7 @@ bool ConvertADT(char *filename, char *filename2, int /*cell_y*/, int /*cell_x*/,
|
||||
map.areaMapSize = sizeof(map_areaHeader);
|
||||
|
||||
map_areaHeader areaHeader;
|
||||
areaHeader.fourcc = *(uint32 const*)MAP_AREA_MAGIC;
|
||||
areaHeader.fourcc = *reinterpret_cast<uint32 const*>(MAP_AREA_MAGIC);
|
||||
areaHeader.flags = 0;
|
||||
if (fullAreaData)
|
||||
{
|
||||
@@ -800,7 +759,7 @@ bool ConvertADT(char *filename, char *filename2, int /*cell_y*/, int /*cell_x*/,
|
||||
else
|
||||
{
|
||||
areaHeader.flags |= MAP_AREA_NO_AREA;
|
||||
areaHeader.gridArea = (uint16)areaflag;
|
||||
areaHeader.gridArea = static_cast<uint16>(areaflag);
|
||||
}
|
||||
|
||||
//============================================
|
||||
@@ -848,7 +807,7 @@ bool ConvertADT(char *filename, char *filename2, int /*cell_y*/, int /*cell_x*/,
|
||||
map.heightMapSize = sizeof(map_heightHeader);
|
||||
|
||||
map_heightHeader heightHeader;
|
||||
heightHeader.fourcc = *(uint32 const*)MAP_HEIGHT_MAGIC;
|
||||
heightHeader.fourcc = *reinterpret_cast<uint32 const*>(MAP_HEIGHT_MAGIC);
|
||||
heightHeader.flags = 0;
|
||||
heightHeader.gridHeight = minHeight;
|
||||
heightHeader.gridMaxHeight = maxHeight;
|
||||
@@ -958,7 +917,7 @@ bool ConvertADT(char *filename, char *filename2, int /*cell_y*/, int /*cell_x*/,
|
||||
}
|
||||
map.liquidMapOffset = map.heightMapOffset + map.heightMapSize;
|
||||
map.liquidMapSize = sizeof(map_liquidHeader);
|
||||
liquidHeader.fourcc = *(uint32 const*)MAP_LIQUID_MAGIC;
|
||||
liquidHeader.fourcc = *reinterpret_cast<uint32 const*>(MAP_LIQUID_MAGIC);
|
||||
liquidHeader.flags = 0;
|
||||
liquidHeader.liquidType = 0;
|
||||
liquidHeader.offsetX = minX;
|
||||
@@ -997,61 +956,62 @@ bool ConvertADT(char *filename, char *filename2, int /*cell_y*/, int /*cell_x*/,
|
||||
map.holesSize = 0;
|
||||
|
||||
// Ok all data prepared - store it
|
||||
FILE* output = fopen(filename2, "wb");
|
||||
if (!output)
|
||||
std::ofstream outFile(outputPath, std::ofstream::out | std::ofstream::binary);
|
||||
if (!outFile)
|
||||
{
|
||||
printf("Can't create the output file '%s'\n", filename2);
|
||||
printf("Can't create the output file '%s'\n", outputPath.c_str());
|
||||
return false;
|
||||
}
|
||||
fwrite(&map, sizeof(map), 1, output);
|
||||
|
||||
outFile.write(reinterpret_cast<const char*>(&map), sizeof(map));
|
||||
// Store area data
|
||||
fwrite(&areaHeader, sizeof(areaHeader), 1, output);
|
||||
outFile.write(reinterpret_cast<const char*>(&areaHeader), sizeof(areaHeader));
|
||||
if (!(areaHeader.flags&MAP_AREA_NO_AREA))
|
||||
fwrite(area_flags, sizeof(area_flags), 1, output);
|
||||
outFile.write(reinterpret_cast<const char*>(area_flags), sizeof(area_flags));
|
||||
|
||||
// Store height data
|
||||
fwrite(&heightHeader, sizeof(heightHeader), 1, output);
|
||||
outFile.write(reinterpret_cast<const char*>(&heightHeader), sizeof(heightHeader));
|
||||
if (!(heightHeader.flags & MAP_HEIGHT_NO_HEIGHT))
|
||||
{
|
||||
if (heightHeader.flags & MAP_HEIGHT_AS_INT16)
|
||||
{
|
||||
fwrite(uint16_V9, sizeof(uint16_V9), 1, output);
|
||||
fwrite(uint16_V8, sizeof(uint16_V8), 1, output);
|
||||
outFile.write(reinterpret_cast<const char*>(uint16_V9), sizeof(uint16_V9));
|
||||
outFile.write(reinterpret_cast<const char*>(uint16_V8), sizeof(uint16_V8));
|
||||
}
|
||||
else if (heightHeader.flags & MAP_HEIGHT_AS_INT8)
|
||||
{
|
||||
fwrite(uint8_V9, sizeof(uint8_V9), 1, output);
|
||||
fwrite(uint8_V8, sizeof(uint8_V8), 1, output);
|
||||
outFile.write(reinterpret_cast<const char*>(uint8_V9), sizeof(uint8_V9));
|
||||
outFile.write(reinterpret_cast<const char*>(uint8_V8), sizeof(uint8_V8));
|
||||
}
|
||||
else
|
||||
{
|
||||
fwrite(V9, sizeof(V9), 1, output);
|
||||
fwrite(V8, sizeof(V8), 1, output);
|
||||
outFile.write(reinterpret_cast<const char*>(V9), sizeof(V9));
|
||||
outFile.write(reinterpret_cast<const char*>(V8), sizeof(V8));
|
||||
}
|
||||
}
|
||||
|
||||
// Store liquid data if need
|
||||
if (map.liquidMapOffset)
|
||||
{
|
||||
fwrite(&liquidHeader, sizeof(liquidHeader), 1, output);
|
||||
outFile.write(reinterpret_cast<const char*>(&liquidHeader), sizeof(liquidHeader));
|
||||
if (!(liquidHeader.flags & MAP_LIQUID_NO_TYPE))
|
||||
{
|
||||
fwrite(liquid_entry, sizeof(liquid_entry), 1, output);
|
||||
fwrite(liquid_flags, sizeof(liquid_flags), 1, output);
|
||||
outFile.write(reinterpret_cast<const char*>(liquid_entry), sizeof(liquid_entry));
|
||||
outFile.write(reinterpret_cast<const char*>(liquid_flags), sizeof(liquid_flags));
|
||||
}
|
||||
|
||||
if (!(liquidHeader.flags & MAP_LIQUID_NO_HEIGHT))
|
||||
{
|
||||
for (int y = 0; y < liquidHeader.height; y++)
|
||||
fwrite(&liquid_height[y + liquidHeader.offsetY][liquidHeader.offsetX], sizeof(float), liquidHeader.width, output);
|
||||
outFile.write(reinterpret_cast<const char*>(&liquid_height[y + liquidHeader.offsetY][liquidHeader.offsetX]), sizeof(float) * liquidHeader.width);
|
||||
}
|
||||
}
|
||||
|
||||
// store hole data
|
||||
if (hasHoles)
|
||||
fwrite(holes, map.holesSize, 1, output);
|
||||
outFile.write(reinterpret_cast<const char*>(holes), map.holesSize);
|
||||
|
||||
fclose(output);
|
||||
outFile.close();
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -1075,8 +1035,8 @@ void ExtractWmos(ChunkedFile& file, std::set<std::string>& wmoList)
|
||||
|
||||
void ExtractMaps(uint32 build)
|
||||
{
|
||||
char storagePath[1024];
|
||||
char output_filename[1024];
|
||||
std::string storagePath;
|
||||
std::string outputFileName;
|
||||
|
||||
printf("Extracting maps...\n");
|
||||
|
||||
@@ -1096,7 +1056,7 @@ void ExtractMaps(uint32 build)
|
||||
{
|
||||
printf("Extract %s (%d/%u) \n", map_ids[z].name, z+1, map_count);
|
||||
// Loadup map grid data
|
||||
sprintf(storagePath, "World\\Maps\\%s\\%s.wdt", map_ids[z].name, map_ids[z].name);
|
||||
storagePath = Trinity::StringFormat("World\\Maps\\%s\\%s.wdt", map_ids[z].name, map_ids[z].name);
|
||||
ChunkedFile wdt;
|
||||
if (!wdt.loadFile(CascStorage, storagePath, false))
|
||||
continue;
|
||||
@@ -1111,11 +1071,11 @@ void ExtractMaps(uint32 build)
|
||||
if (!(chunk->As<wdt_MAIN>()->adt_list[y][x].flag & 0x1))
|
||||
continue;
|
||||
|
||||
sprintf(storagePath, "World\\Maps\\%s\\%s_%u_%u.adt", map_ids[z].name, map_ids[z].name, x, y);
|
||||
sprintf(output_filename, "%s/maps/%04u_%02u_%02u.map", output_path, map_ids[z].id, y, x);
|
||||
ConvertADT(storagePath, output_filename, y, x, build);
|
||||
storagePath = Trinity::StringFormat("World\\Maps\\%s\\%s_%u_%u.adt", map_ids[z].name, map_ids[z].name, x, y);
|
||||
outputFileName = Trinity::StringFormat("%s/maps/%04u_%02u_%02u.map", output_path, map_ids[z].id, y, x);
|
||||
ConvertADT(storagePath, outputFileName, y, x, build);
|
||||
|
||||
sprintf(storagePath, "World\\Maps\\%s\\%s_%u_%u_obj0.adt", map_ids[z].name, map_ids[z].name, x, y);
|
||||
storagePath = Trinity::StringFormat("World\\Maps\\%s\\%s_%u_%u_obj0.adt", map_ids[z].name, map_ids[z].name, x, y);
|
||||
ChunkedFile adtObj;
|
||||
if (adtObj.loadFile(CascStorage, storagePath, false))
|
||||
ExtractWmos(adtObj, wmoList);
|
||||
@@ -1142,12 +1102,12 @@ void ExtractMaps(uint32 build)
|
||||
delete[] map_ids;
|
||||
}
|
||||
|
||||
bool ExtractFile(HANDLE fileInArchive, char const* filename)
|
||||
bool ExtractFile(HANDLE fileInArchive, std::string 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;
|
||||
}
|
||||
|
||||
@@ -1191,8 +1151,8 @@ void ExtractDBFilesClient(int l)
|
||||
{
|
||||
filename = outputPath + filename.substr(filename.rfind('\\') + 1);
|
||||
|
||||
if (!FileExists(filename.c_str()))
|
||||
if (ExtractFile(dbcFile, filename.c_str()))
|
||||
if (!boost::filesystem::exists(filename))
|
||||
if (ExtractFile(dbcFile, filename))
|
||||
++count;
|
||||
|
||||
CascCloseFile(dbcFile);
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
#define _CRT_SECURE_NO_DEPRECATE
|
||||
|
||||
#include "loadlib.h"
|
||||
#include <cstdio>
|
||||
|
||||
u_map_fcc MverMagic = { { 'R','E','V','M' } };
|
||||
|
||||
@@ -34,20 +33,20 @@ ChunkedFile::~ChunkedFile()
|
||||
free();
|
||||
}
|
||||
|
||||
bool ChunkedFile::loadFile(HANDLE mpq, char* filename, bool log)
|
||||
bool ChunkedFile::loadFile(HANDLE mpq, std::string const& fileName, bool log)
|
||||
{
|
||||
free();
|
||||
HANDLE file;
|
||||
if (!CascOpenFile(mpq, filename, CASC_LOCALE_ALL, 0, &file))
|
||||
if (!CascOpenFile(mpq, fileName.c_str(), CASC_LOCALE_ALL, 0, &file))
|
||||
{
|
||||
if (log)
|
||||
printf("No such file %s\n", filename);
|
||||
printf("No such file %s\n", fileName.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
data_size = CascGetFileSize(file, NULL);
|
||||
data_size = CascGetFileSize(file, nullptr);
|
||||
data = new uint8[data_size];
|
||||
CascReadFile(file, data, data_size, NULL/*bytesRead*/);
|
||||
CascReadFile(file, data, data_size, nullptr/*bytesRead*/);
|
||||
parseChunks();
|
||||
if (prepareLoadedData())
|
||||
{
|
||||
@@ -55,7 +54,7 @@ bool ChunkedFile::loadFile(HANDLE mpq, char* filename, bool log)
|
||||
return true;
|
||||
}
|
||||
|
||||
printf("Error loading %s\n", filename);
|
||||
printf("Error loading %s\n", fileName.c_str());
|
||||
CascCloseFile(file);
|
||||
free();
|
||||
|
||||
|
||||
@@ -19,19 +19,12 @@
|
||||
#ifndef LOAD_LIB_H
|
||||
#define LOAD_LIB_H
|
||||
|
||||
#include "Define.h"
|
||||
#ifdef PLATFORM_WINDOWS
|
||||
#undef PLATFORM_WINDOWS
|
||||
#endif
|
||||
#include "CascLib.h"
|
||||
#include <map>
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
|
||||
typedef int64_t int64;
|
||||
typedef int32_t int32;
|
||||
typedef int16_t int16;
|
||||
typedef int8_t int8;
|
||||
typedef uint64_t uint64;
|
||||
typedef uint32_t uint32;
|
||||
typedef uint16_t uint16;
|
||||
typedef uint8_t uint8;
|
||||
|
||||
#ifndef _WIN32
|
||||
int GetLastError();
|
||||
@@ -95,7 +88,7 @@ public:
|
||||
ChunkedFile();
|
||||
virtual ~ChunkedFile();
|
||||
bool prepareLoadedData();
|
||||
bool loadFile(HANDLE mpq, char *filename, bool log = true);
|
||||
bool loadFile(HANDLE mpq, std::string const& fileName, bool log = true);
|
||||
void free();
|
||||
|
||||
void parseChunks();
|
||||
|
||||
Reference in New Issue
Block a user