#include "..\STDInclude.hpp" namespace Components { std::vector FastFiles::ZonePaths; void FastFiles::LoadDLCUIZones(Game::XZoneInfo *zoneInfo, unsigned int zoneCount, int sync) { Game::XZoneInfo* data = new Game::XZoneInfo[zoneCount + 2]; memcpy(data, zoneInfo, sizeof(Game::XZoneInfo) * zoneCount); data[zoneCount].name = "dlc1_ui_mp"; data[zoneCount].allocFlags = 2; data[zoneCount].freeFlags = 0; zoneCount++; data[zoneCount].name = "dlc2_ui_mp"; data[zoneCount].allocFlags = 2; data[zoneCount].freeFlags = 0; zoneCount++; Game::DB_LoadXAssets(data, zoneCount, sync); delete[] data; } const char* FastFiles::GetZoneLocation(const char* file) { const char* dir = Dvar::Var("fs_basepath").Get(); for (auto &path : FastFiles::ZonePaths) { std::string absoluteFile = Utils::VA("%s\\%s%s", dir, path.data(), file); // No ".ff" appended, append it manually if (!Utils::EndsWith(file, ".ff")) { absoluteFile.append(".ff"); } // Check if FastFile exists if (GetFileAttributes(absoluteFile.data()) != INVALID_FILE_ATTRIBUTES) { return Utils::VA("%s", path.data()); } } return Utils::VA("zone\\%s\\", Game::Win_GetLanguage()); } void FastFiles::AddZonePath(std::string path) { FastFiles::ZonePaths.push_back(path); } std::string FastFiles::Current() { const char* file = (Utils::Hook::Get(0x112A680) + 4); if ((int)file == 4) { return ""; } return file; } FastFiles::FastFiles() { // Redirect zone paths Utils::Hook(0x44DA90, FastFiles::GetZoneLocation, HOOK_JUMP).Install()->Quick(); // Allow dlc ui zone loading Utils::Hook(0x506BC7, FastFiles::LoadDLCUIZones, HOOK_CALL).Install()->Quick(); Utils::Hook(0x60B4AC, FastFiles::LoadDLCUIZones, HOOK_CALL).Install()->Quick(); // basic checks (hash jumps, both normal and playlist) Utils::Hook::Nop(0x5B97A3, 2); Utils::Hook::Nop(0x5BA493, 2); Utils::Hook::Nop(0x5B991C, 2); Utils::Hook::Nop(0x5BA60C, 2); Utils::Hook::Nop(0x5B97B4, 2); Utils::Hook::Nop(0x5BA4A4, 2); // allow loading of IWffu (unsigned) files Utils::Hook::Set(0x4158D9, 0xEB); // main function Utils::Hook::Nop(0x4A1D97, 2); // DB_AuthLoad_InflateInit // some other, unknown, check Utils::Hook::Set(0x5B9912, 0xB8); Utils::Hook::Set(0x5B9913, 1); Utils::Hook::Set(0x5BA602, 0xB8); Utils::Hook::Set(0x5BA603, 1); // Add custom zone paths FastFiles::AddZonePath("zone\\patch\\"); FastFiles::AddZonePath("zone\\dlc\\"); } FastFiles::~FastFiles() { FastFiles::ZonePaths.clear(); } }