iw4x-client/src/Components/Modules/ZoneBuilder.cpp

149 lines
3.3 KiB
C++
Raw Normal View History

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;
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;
list.assetCount = 2;
list.assets = (Game::XAsset*)0xFFFFFFFF;
2016-01-04 18:49:34 -05:00
zoneBuffer.append((char*)&list, sizeof(list));
// 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));
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");
}
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())
{
auto data = Zone("penis").Build();
2016-01-04 18:49:34 -05:00
FILE* fp;
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);
}
//Utils::Hook(0x60B4AC, TestZoneLoading, HOOK_CALL).Install()->Quick();
2016-01-04 18:49:34 -05:00
}
}