mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-15 23:20:36 +01:00
Tools/vmaps_extractor: Clean up filename normalization
This commit is contained in:
@@ -16,72 +16,46 @@
|
||||
*/
|
||||
|
||||
#include "adtfile.h"
|
||||
#include "Common.h"
|
||||
#include "Memory.h"
|
||||
#include "StringFormat.h"
|
||||
#include "Util.h"
|
||||
#include "vmapexport.h"
|
||||
#include <cstdio>
|
||||
|
||||
char const* GetPlainName(char const* FileName)
|
||||
std::string_view GetPlainName(std::string_view fileName)
|
||||
{
|
||||
const char * szTemp;
|
||||
std::size_t lastSeparatorPos = fileName.find_last_of("\\/"sv);
|
||||
|
||||
if((szTemp = strrchr(FileName, '\\')) != nullptr)
|
||||
FileName = szTemp + 1;
|
||||
return FileName;
|
||||
if (lastSeparatorPos != std::string_view::npos)
|
||||
fileName.remove_prefix(lastSeparatorPos + 1);
|
||||
|
||||
return fileName;
|
||||
}
|
||||
|
||||
char* GetPlainName(char* FileName)
|
||||
void NormalizeFileName(std::string& name)
|
||||
{
|
||||
char * szTemp;
|
||||
if (name.starts_with("FILE"sv)) // name is FileDataId formatted, do not normalize
|
||||
return;
|
||||
|
||||
if((szTemp = strrchr(FileName, '\\')) != nullptr)
|
||||
FileName = szTemp + 1;
|
||||
return FileName;
|
||||
}
|
||||
|
||||
void FixNameCase(char* name, size_t len)
|
||||
{
|
||||
char* ptr = name + len - 1;
|
||||
auto ptr = name.begin() + (name.length() - 1);
|
||||
|
||||
//extension in lowercase
|
||||
for (; *ptr != '.' && ptr >= name; --ptr)
|
||||
*ptr |= 0x20;
|
||||
|
||||
for (; ptr >= name; --ptr)
|
||||
{
|
||||
if (ptr > name && *ptr >= 'A' && *ptr <= 'Z' && isalpha(*(ptr - 1)))
|
||||
for (; *ptr != '.' && ptr >= name.begin(); --ptr)
|
||||
if (*ptr >= 'A' && *ptr <= 'Z')
|
||||
*ptr |= 0x20;
|
||||
else if ((ptr == name || !isalpha(*(ptr - 1))) && *ptr >= 'a' && *ptr <= 'z')
|
||||
|
||||
for (; ptr >= name.begin(); --ptr)
|
||||
{
|
||||
if (ptr > name.begin() && *ptr >= 'A' && *ptr <= 'Z' && isalpha(*(ptr - 1)))
|
||||
*ptr |= 0x20;
|
||||
else if ((ptr == name.begin() || !isalpha(*(ptr - 1))) && *ptr >= 'a' && *ptr <= 'z')
|
||||
*ptr &= ~0x20;
|
||||
else if (*ptr == ' ')
|
||||
*ptr = '_';
|
||||
}
|
||||
}
|
||||
|
||||
void FixNameSpaces(char* name, size_t len)
|
||||
{
|
||||
if (len < 3)
|
||||
return;
|
||||
|
||||
for (size_t i = 0; i < len - 3; i++)
|
||||
if (name[i] == ' ')
|
||||
name[i] = '_';
|
||||
}
|
||||
|
||||
void NormalizeFileName(char* name, size_t len)
|
||||
{
|
||||
if (len >= 4 && !memcmp(name, "FILE", 4)) // name is FileDataId formatted, do not normalize
|
||||
return;
|
||||
|
||||
FixNameCase(name, len);
|
||||
FixNameSpaces(name, len);
|
||||
}
|
||||
|
||||
char* GetExtension(char* FileName)
|
||||
{
|
||||
if (char* szTemp = strrchr(FileName, '.'))
|
||||
return szTemp;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
extern std::shared_ptr<CASC::Storage> CascStorage;
|
||||
|
||||
ADTFile::ADTFile(std::string const& filename, bool cache) : _file(CascStorage, filename.c_str(), false)
|
||||
@@ -130,46 +104,32 @@ bool ADTFile::init(uint32 map_num, uint32 originalMapId)
|
||||
{
|
||||
if (size)
|
||||
{
|
||||
char* buf = new char[size];
|
||||
_file.read(buf, size);
|
||||
char* p = buf;
|
||||
while (p < buf + size)
|
||||
char* p = _file.getPointer();
|
||||
_file.seekRelative(size);
|
||||
char* end = _file.getPointer();
|
||||
while (p < end)
|
||||
{
|
||||
std::string path(p);
|
||||
std::size_t length = std::ranges::distance(p, CStringSentinel.Checked(end));
|
||||
ModelInstanceNames.emplace_back(p, length);
|
||||
|
||||
char* s = GetPlainName(p);
|
||||
NormalizeFileName(s, strlen(s));
|
||||
|
||||
ModelInstanceNames.emplace_back(s);
|
||||
|
||||
ExtractSingleModel(path);
|
||||
|
||||
p += strlen(p) + 1;
|
||||
p += length + 1;
|
||||
}
|
||||
delete[] buf;
|
||||
}
|
||||
}
|
||||
else if (!strcmp(fourcc,"MWMO"))
|
||||
{
|
||||
if (size)
|
||||
{
|
||||
char* buf = new char[size];
|
||||
_file.read(buf, size);
|
||||
char* p = buf;
|
||||
while (p < buf + size)
|
||||
char* p = _file.getPointer();
|
||||
_file.seekRelative(size);
|
||||
char* end = _file.getPointer();
|
||||
while (p < end)
|
||||
{
|
||||
std::string path(p);
|
||||
std::size_t length = std::ranges::distance(p, CStringSentinel.Checked(end));
|
||||
WmoInstanceNames.emplace_back(p, length);
|
||||
|
||||
char* s = GetPlainName(p);
|
||||
NormalizeFileName(s, strlen(s));
|
||||
|
||||
WmoInstanceNames.emplace_back(s);
|
||||
|
||||
ExtractSingleWmo(path);
|
||||
|
||||
p += strlen(p) + 1;
|
||||
p += length + 1;
|
||||
}
|
||||
delete[] buf;
|
||||
}
|
||||
}
|
||||
//======================
|
||||
|
||||
@@ -72,10 +72,7 @@ public:
|
||||
bool initFromCache(uint32 map_num, uint32 originalMapId);
|
||||
};
|
||||
|
||||
char const* GetPlainName(char const* FileName);
|
||||
char* GetPlainName(char* FileName);
|
||||
char* GetExtension(char* FileName);
|
||||
void NormalizeFileName(char* name, size_t len);
|
||||
//void fixMapNamen(char *name, size_t len);
|
||||
std::string_view GetPlainName(std::string_view fileName);
|
||||
void NormalizeFileName(std::string& fileName);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
#include "Errors.h"
|
||||
#include "ExtractorDB2LoadInfo.h"
|
||||
#include "Memory.h"
|
||||
#include "StringConvert.h"
|
||||
#include "model.h"
|
||||
#include "StringFormat.h"
|
||||
#include "vmapexport.h"
|
||||
@@ -34,19 +35,16 @@ ExtractedModelData const* ExtractSingleModel(std::string& fname)
|
||||
if (fname.length() < 4)
|
||||
return nullptr;
|
||||
|
||||
std::string extension = fname.substr(fname.length() - 4, 4);
|
||||
if (extension == ".mdx" || extension == ".MDX" || extension == ".mdl" || extension == ".MDL")
|
||||
{
|
||||
fname.erase(fname.length() - 2, 2);
|
||||
fname.append("2");
|
||||
}
|
||||
std::string_view extension = std::string_view(fname).substr(fname.length() - 4, 4);
|
||||
if (StringEqualI(extension, ".mdx"sv) || StringEqualI(extension, ".mdl"sv))
|
||||
fname.replace(fname.length() - 2, 2, "2");
|
||||
|
||||
std::string originalName = fname;
|
||||
|
||||
char* name = GetPlainName((char*)fname.c_str());
|
||||
NormalizeFileName(name, strlen(name));
|
||||
fname = GetPlainName(fname);
|
||||
NormalizeFileName(fname);
|
||||
|
||||
auto [model, shouldExtract] = BeginModelExtraction(name);
|
||||
auto [model, shouldExtract] = BeginModelExtraction(fname);
|
||||
if (!shouldExtract)
|
||||
{
|
||||
model->Wait();
|
||||
@@ -61,7 +59,7 @@ ExtractedModelData const* ExtractSingleModel(std::string& fname)
|
||||
|
||||
std::string output(szWorkDirWmo);
|
||||
output += "/";
|
||||
output += name;
|
||||
output += fname;
|
||||
|
||||
if (!mdl.ConvertToVMAPModel(output.c_str()))
|
||||
return nullptr;
|
||||
|
||||
@@ -233,23 +233,17 @@ void Doodad::ExtractSet(WMODoodadData const& doodadData, ADT::MODF const& wmo, b
|
||||
|
||||
std::string ModelInstName;
|
||||
if (doodadData.Paths)
|
||||
ModelInstName = GetPlainName(&doodadData.Paths[doodad.NameIndex]);
|
||||
ModelInstName = &doodadData.Paths[doodad.NameIndex];
|
||||
else if (doodadData.FileDataIds)
|
||||
ModelInstName = Trinity::StringFormat("FILE{:08X}.xxx", doodadData.FileDataIds[doodad.NameIndex]);
|
||||
else
|
||||
ASSERT(false);
|
||||
|
||||
uint32 nlen = ModelInstName.length();
|
||||
NormalizeFileName(ModelInstName.data(), nlen);
|
||||
if (ModelInstName.ends_with(".mdx") || ModelInstName.ends_with(".mdl"))
|
||||
{
|
||||
ModelInstName.replace(ModelInstName.length() - 2, 2, "2");
|
||||
nlen = ModelInstName.length();
|
||||
}
|
||||
|
||||
if (!ExtractSingleModel(ModelInstName))
|
||||
continue;
|
||||
|
||||
uint32 nlen = ModelInstName.length();
|
||||
|
||||
ASSERT(doodadId < std::numeric_limits<uint16>::max());
|
||||
++doodadId;
|
||||
|
||||
|
||||
@@ -202,10 +202,10 @@ ExtractedModelData const* ExtractSingleWmo(std::string& fname)
|
||||
// Copy files from archive
|
||||
std::string originalName = fname;
|
||||
|
||||
char* plain_name = GetPlainName(&fname[0]);
|
||||
NormalizeFileName(plain_name, strlen(plain_name));
|
||||
fname = GetPlainName(fname);
|
||||
NormalizeFileName(fname);
|
||||
|
||||
auto [model, shouldExtract] = BeginModelExtraction(plain_name);
|
||||
auto [model, shouldExtract] = BeginModelExtraction(fname);
|
||||
if (!shouldExtract)
|
||||
{
|
||||
model->Wait();
|
||||
@@ -223,10 +223,10 @@ ExtractedModelData const* ExtractSingleWmo(std::string& fname)
|
||||
|
||||
int p = 0;
|
||||
// Select root wmo files
|
||||
char const* rchr = strrchr(plain_name, '_');
|
||||
if (rchr != nullptr)
|
||||
for (int i = 0; i < 4; ++i)
|
||||
if (isdigit(rchr[i]))
|
||||
std::size_t rchr = fname.find_last_of('_');
|
||||
if (rchr != std::string::npos)
|
||||
for (std::size_t i = 0; i < 4 && rchr + i < fname.length(); ++i)
|
||||
if (isdigit(fname[rchr + i]))
|
||||
p++;
|
||||
|
||||
if (p == 3)
|
||||
@@ -239,7 +239,7 @@ ExtractedModelData const* ExtractSingleWmo(std::string& fname)
|
||||
printf("Couldn't open RootWmo!!!\n");
|
||||
return nullptr;
|
||||
}
|
||||
std::string szLocalFile = Trinity::StringFormat("{}/{}", szWorkDirWmo, plain_name);
|
||||
std::string szLocalFile = Trinity::StringFormat("{}/{}", szWorkDirWmo, fname);
|
||||
FILE* output = fopen(szLocalFile.c_str(), "wb");
|
||||
if(!output)
|
||||
{
|
||||
@@ -260,7 +260,7 @@ ExtractedModelData const* ExtractSingleWmo(std::string& fname)
|
||||
WMOGroup& fgroup = groups.emplace_back(s);
|
||||
if (!fgroup.open(&froot))
|
||||
{
|
||||
printf("Could not open all Group file for: %s\n", plain_name);
|
||||
printf("Could not open all Group file for: %s\n", fname.c_str());
|
||||
file_ok = false;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "Errors.h"
|
||||
#include "Memory.h"
|
||||
#include "StringFormat.h"
|
||||
#include "Util.h"
|
||||
#include <cstdio>
|
||||
|
||||
extern std::shared_ptr<CASC::Storage> CascStorage;
|
||||
@@ -81,21 +82,16 @@ bool WDTFile::init(uint32 mapId)
|
||||
// global map objects
|
||||
if (size)
|
||||
{
|
||||
char *buf = new char[size];
|
||||
_file.read(buf, size);
|
||||
char *p = buf;
|
||||
while (p < buf + size)
|
||||
char* p = _file.getPointer();
|
||||
_file.seekRelative(size);
|
||||
char* end = _file.getPointer();
|
||||
while (p < end)
|
||||
{
|
||||
std::string path(p);
|
||||
std::size_t length = std::ranges::distance(p, CStringSentinel.Checked(end));
|
||||
_wmoNames.emplace_back(p, length);
|
||||
|
||||
char* s = GetPlainName(p);
|
||||
NormalizeFileName(s, strlen(s));
|
||||
p = p + strlen(p) + 1;
|
||||
_wmoNames.emplace_back(s);
|
||||
|
||||
ExtractSingleWmo(path);
|
||||
p += length + 1;
|
||||
}
|
||||
delete[] buf;
|
||||
}
|
||||
}
|
||||
else if (!strcmp(fourcc, "MODF"))
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include "vec3d.h"
|
||||
#include "VMapDefinitions.h"
|
||||
#include "wmo.h"
|
||||
#include "Util.h"
|
||||
#include <algorithm>
|
||||
#include <fstream>
|
||||
#include <map>
|
||||
@@ -86,19 +87,17 @@ bool WMORoot::open()
|
||||
{
|
||||
ASSERT(!DoodadData.FileDataIds);
|
||||
|
||||
char* ptr = f.getPointer();
|
||||
char* end = ptr + size;
|
||||
DoodadData.Paths = std::make_unique<char[]>(size);
|
||||
memcpy(DoodadData.Paths.get(), ptr, size);
|
||||
f.read(DoodadData.Paths.get(), size);
|
||||
char* ptr = DoodadData.Paths.get();
|
||||
char* end = ptr + size;
|
||||
while (ptr < end)
|
||||
{
|
||||
std::string path = ptr;
|
||||
std::size_t length = std::ranges::distance(ptr, CStringSentinel.Checked(end));
|
||||
std::string path(ptr, length);
|
||||
|
||||
char* s = GetPlainName(ptr);
|
||||
NormalizeFileName(s, strlen(s));
|
||||
|
||||
uint32 doodadNameIndex = ptr - f.getPointer();
|
||||
ptr += path.length() + 1;
|
||||
uint32 doodadNameIndex = ptr - DoodadData.Paths.get();
|
||||
ptr += length + 1;
|
||||
|
||||
if (ExtractSingleModel(path))
|
||||
ValidDoodadNames.insert(doodadNameIndex);
|
||||
|
||||
Reference in New Issue
Block a user