2016-01-04 18:49:34 -05:00
|
|
|
#include "STDInclude.hpp"
|
|
|
|
|
|
|
|
namespace Components
|
|
|
|
{
|
|
|
|
std::string ZoneBuilder::Zone::Build()
|
|
|
|
{
|
|
|
|
static_assert(sizeof(XFileHeader) == 21, "Invalid XFileHeader structure!");
|
|
|
|
static_assert(sizeof(XFile) == 40, "Invalid XFile structure!");
|
|
|
|
|
|
|
|
std::string buffer;
|
|
|
|
|
|
|
|
XFileHeader header = { XFILE_MAGIC_UNSIGNED, XFILE_VERSION, 0, 0, 0 };
|
|
|
|
|
|
|
|
FILETIME fileTime;
|
|
|
|
GetSystemTimeAsFileTime(&fileTime);
|
|
|
|
|
|
|
|
header.lowDateTime = fileTime.dwLowDateTime;
|
|
|
|
header.highDateTime = fileTime.dwHighDateTime;
|
|
|
|
|
|
|
|
buffer.append((char*)&header, sizeof(header));
|
|
|
|
|
|
|
|
std::string zoneBuffer;
|
2016-01-05 08:39:04 -05:00
|
|
|
|
|
|
|
XFile file;
|
|
|
|
ZeroMemory(&file, sizeof(file));
|
|
|
|
zoneBuffer.append((char*)&file, sizeof(file));
|
2016-01-04 18:49:34 -05:00
|
|
|
|
|
|
|
// Fill zone
|
|
|
|
XAssetList list;
|
|
|
|
list.assetCount = 0;
|
|
|
|
list.assets = 0;
|
|
|
|
list.stringList.count = 0;
|
|
|
|
list.stringList.strings = 0;
|
|
|
|
|
2016-01-05 08:39:04 -05:00
|
|
|
list.assetCount = 2;
|
|
|
|
|
|
|
|
list.assets = (Game::XAsset*)0xFFFFFFFF;
|
|
|
|
|
2016-01-04 18:49:34 -05:00
|
|
|
zoneBuffer.append((char*)&list, sizeof(list));
|
|
|
|
|
2016-01-05 08:39:04 -05:00
|
|
|
// Crappy assetlist entry
|
|
|
|
DWORD type = Game::XAssetType::ASSET_TYPE_LOCALIZE;
|
|
|
|
zoneBuffer.append((char*)&type, sizeof(type));
|
|
|
|
zoneBuffer.append((char*)&list.assets, sizeof(list.assets)); // Hue
|
|
|
|
|
|
|
|
type = Game::XAssetType::ASSET_TYPE_RAWFILE;
|
|
|
|
zoneBuffer.append((char*)&type, sizeof(type));
|
|
|
|
zoneBuffer.append((char*)&list.assets, sizeof(list.assets)); // Hue
|
|
|
|
|
|
|
|
// Localized entry
|
|
|
|
zoneBuffer.append((char*)&list.assets, sizeof(list.assets)); // Hue
|
|
|
|
zoneBuffer.append((char*)&list.assets, sizeof(list.assets)); // Hue
|
|
|
|
zoneBuffer.append("MENU_PENIS");
|
|
|
|
zoneBuffer.append("\0", 1);
|
|
|
|
|
|
|
|
zoneBuffer.append("PENIS");
|
|
|
|
zoneBuffer.append("\0", 1);
|
|
|
|
|
|
|
|
// Obligatory rawfile
|
|
|
|
struct Rawfile
|
|
|
|
{
|
|
|
|
const char* name;
|
|
|
|
int sizeCompressed;
|
|
|
|
int sizeUnCompressed;
|
|
|
|
char * compressedData;
|
|
|
|
};
|
|
|
|
|
|
|
|
char* _data = "map mp_rust";
|
|
|
|
|
|
|
|
Rawfile data;
|
|
|
|
data.name = (char*)0xFFFFFFFF;
|
|
|
|
data.compressedData = (char*)0xFFFFFFFF;
|
|
|
|
data.sizeUnCompressed = 0;
|
|
|
|
data.sizeCompressed = strlen(_data) + 1;
|
|
|
|
|
|
|
|
zoneBuffer.append((char*)&data, sizeof(data));
|
|
|
|
|
|
|
|
zoneBuffer.append("zob.cfg");
|
|
|
|
zoneBuffer.append("\0", 1);
|
|
|
|
|
|
|
|
zoneBuffer.append(_data);
|
|
|
|
zoneBuffer.append("\0", 1);
|
|
|
|
|
2016-01-04 18:49:34 -05:00
|
|
|
XFile* zone = (XFile*)zoneBuffer.data();
|
|
|
|
ZeroMemory(zone, sizeof(XFile));
|
|
|
|
|
2016-01-05 08:39:04 -05:00
|
|
|
zone->size = zoneBuffer.size() - 40;
|
|
|
|
|
|
|
|
zone->blockSize[3] = zoneBuffer.size() * 2;
|
|
|
|
zone->blockSize[0] = zoneBuffer.size() * 2;
|
|
|
|
|
|
|
|
// for (int i = 0; i < 8; i++)
|
|
|
|
// {
|
|
|
|
// zone->blockSize[i] = zoneBuffer.size() * 2;
|
|
|
|
// }
|
2016-01-04 18:49:34 -05:00
|
|
|
|
|
|
|
auto compressedData = Utils::Compression::ZLib::Compress(zoneBuffer);
|
|
|
|
buffer.append(compressedData);
|
|
|
|
|
|
|
|
return buffer;
|
|
|
|
}
|
|
|
|
|
|
|
|
ZoneBuilder::Zone::Zone(std::string zoneName) : ZoneName(zoneName)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
ZoneBuilder::Zone::~Zone()
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
bool ZoneBuilder::IsEnabled()
|
|
|
|
{
|
|
|
|
return Flags::HasFlag("zonebuilder");
|
|
|
|
}
|
|
|
|
|
2016-01-05 08:39:04 -05:00
|
|
|
void TestZoneLoading(Game::XZoneInfo *zoneInfo, unsigned int zoneCount, int sync)
|
|
|
|
{
|
|
|
|
std::vector<Game::XZoneInfo> data;
|
|
|
|
Utils::Merge(data, zoneInfo, zoneCount);
|
|
|
|
|
|
|
|
data.push_back({ "penis", zoneInfo->allocFlags, zoneInfo->freeFlags });
|
|
|
|
|
|
|
|
Game::DB_LoadXAssets(data.data(), data.size(), sync);
|
|
|
|
}
|
|
|
|
|
2016-01-04 18:49:34 -05:00
|
|
|
ZoneBuilder::ZoneBuilder()
|
|
|
|
{
|
|
|
|
if (ZoneBuilder::IsEnabled())
|
|
|
|
{
|
2016-01-05 08:39:04 -05:00
|
|
|
auto data = Zone("penis").Build();
|
2016-01-04 18:49:34 -05:00
|
|
|
|
|
|
|
FILE* fp;
|
2016-01-05 08:39:04 -05:00
|
|
|
fopen_s(&fp, "zone/patch/penis.ff", "wb");
|
2016-01-04 18:49:34 -05:00
|
|
|
|
|
|
|
if (fp)
|
|
|
|
{
|
|
|
|
fwrite(data.data(), 1, data.size(), fp);
|
|
|
|
fclose(fp);
|
|
|
|
}
|
|
|
|
|
|
|
|
ExitProcess(0);
|
|
|
|
}
|
2016-01-05 08:39:04 -05:00
|
|
|
|
|
|
|
//Utils::Hook(0x60B4AC, TestZoneLoading, HOOK_CALL).Install()->Quick();
|
2016-01-04 18:49:34 -05:00
|
|
|
}
|
|
|
|
}
|