111 lines
2.9 KiB
C++
111 lines
2.9 KiB
C++
/*
|
|
* Copyright (C) 2016+ AzerothCore <www.azerothcore.org>, released under GNU GPL v2 license: http://github.com/azerothcore/azerothcore-wotlk/LICENSE-GPL2
|
|
* Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
|
|
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
|
|
*/
|
|
|
|
#include "model.h"
|
|
#include "dbcfile.h"
|
|
#include "adtfile.h"
|
|
#include "vmapexport.h"
|
|
|
|
#include <algorithm>
|
|
#include <stdio.h>
|
|
|
|
bool ExtractSingleModel(std::string& fname)
|
|
{
|
|
char* name = GetPlainName((char*)fname.c_str());
|
|
char* ext = GetExtension(name);
|
|
|
|
// < 3.1.0 ADT MMDX section store filename.mdx filenames for corresponded .m2 file
|
|
if (!strcmp(ext, ".mdx"))
|
|
{
|
|
// replace .mdx -> .m2
|
|
fname.erase(fname.length() - 2, 2);
|
|
fname.append("2");
|
|
}
|
|
// >= 3.1.0 ADT MMDX section store filename.m2 filenames for corresponded .m2 file
|
|
// nothing do
|
|
|
|
std::string output(szWorkDirWmo);
|
|
output += "/";
|
|
output += name;
|
|
|
|
if (FileExists(output.c_str()))
|
|
return true;
|
|
|
|
Model mdl(fname);
|
|
if (!mdl.open())
|
|
return false;
|
|
|
|
return mdl.ConvertToVMAPModel(output.c_str());
|
|
}
|
|
|
|
void ExtractGameobjectModels()
|
|
{
|
|
printf("Extracting GameObject models...");
|
|
DBCFile dbc("DBFilesClient\\GameObjectDisplayInfo.dbc");
|
|
if (!dbc.open())
|
|
{
|
|
printf("Fatal error: Invalid GameObjectDisplayInfo.dbc file format!\n");
|
|
exit(1);
|
|
}
|
|
|
|
std::string basepath = szWorkDirWmo;
|
|
basepath += "/";
|
|
std::string path;
|
|
|
|
std::string modelListPath = basepath + "temp_gameobject_models";
|
|
FILE* model_list = fopen(modelListPath.c_str(), "wb");
|
|
if (!model_list)
|
|
{
|
|
printf("Fatal error: Could not open file %s\n", modelListPath.c_str());
|
|
return;
|
|
}
|
|
|
|
for (const auto & it : dbc)
|
|
{
|
|
path = it.getString(1);
|
|
|
|
if (path.length() < 4)
|
|
continue;
|
|
|
|
fixnamen((char*)path.c_str(), path.size());
|
|
char* name = GetPlainName((char*)path.c_str());
|
|
fixname2(name, strlen(name));
|
|
|
|
char* ch_ext = GetExtension(name);
|
|
if (!ch_ext)
|
|
continue;
|
|
|
|
strToLower(ch_ext);
|
|
|
|
bool result = false;
|
|
if (!strcmp(ch_ext, ".wmo"))
|
|
{
|
|
result = ExtractSingleWmo(path);
|
|
}
|
|
else if (!strcmp(ch_ext, ".mdl"))
|
|
{
|
|
// TODO: extract .mdl files, if needed
|
|
continue;
|
|
}
|
|
else //if (!strcmp(ch_ext, ".mdx") || !strcmp(ch_ext, ".m2"))
|
|
{
|
|
result = ExtractSingleModel(path);
|
|
}
|
|
|
|
if (result)
|
|
{
|
|
uint32 displayId = it.getUInt(0);
|
|
uint32 path_length = strlen(name);
|
|
fwrite(&displayId, sizeof(uint32), 1, model_list);
|
|
fwrite(&path_length, sizeof(uint32), 1, model_list);
|
|
fwrite(name, sizeof(char), path_length, model_list);
|
|
}
|
|
}
|
|
|
|
fclose(model_list);
|
|
|
|
printf("Done!\n");
|
|
}
|