add mod vpk support

This commit is contained in:
BobTheBob 2021-08-29 04:51:22 +01:00
parent 83ea828342
commit 9f0288d744
2 changed files with 40 additions and 2 deletions

View File

@ -25,6 +25,10 @@ typedef FileHandle_t(*ReadFileFromFilesystemType)(IFileSystem* filesystem, const
ReadFileFromFilesystemType readFileFromFilesystem;
FileHandle_t ReadFileFromFilesystemHook(IFileSystem* filesystem, const char* pPath, const char* pOptions, int64_t a4, uint32_t a5);
typedef VPKData* (*MountVPKType)(IFileSystem* fileSystem, const char* vpkPath);
MountVPKType mountVPK;
VPKData* MountVPKHook(IFileSystem* fileSystem, const char* vpkPath);
bool readingOriginalFile;
std::string currentModPath;
SourceInterface<IFileSystem>* g_Filesystem;
@ -40,6 +44,7 @@ void InitialiseFilesystem(HMODULE baseAddress)
ENABLER_CREATEHOOK(hook, (*g_Filesystem)->m_vtable->ReadFromCache, &ReadFromCacheHook, reinterpret_cast<LPVOID*>(&readFromCache));
ENABLER_CREATEHOOK(hook, (*g_Filesystem)->m_vtable->AddSearchPath, &AddSearchPathHook, reinterpret_cast<LPVOID*>(&addSearchPathOriginal));
ENABLER_CREATEHOOK(hook, (char*)baseAddress + 0x15F20, &ReadFileFromFilesystemHook, reinterpret_cast<LPVOID*>(&readFileFromFilesystem));
ENABLER_CREATEHOOK(hook, (*g_Filesystem)->m_vtable->MountVPK, &MountVPKHook, reinterpret_cast<LPVOID*>(&mountVPK));
}
std::string ReadVPKFile(const char* path)
@ -155,4 +160,24 @@ FileHandle_t ReadFileFromFilesystemHook(IFileSystem* filesystem, const char* pPa
TryReplaceFile((char*)pPath, true);
return readFileFromFilesystem(filesystem, pPath, pOptions, a4, a5);
}
VPKData* MountVPKHook(IFileSystem* fileSystem, const char* vpkPath)
{
spdlog::info("MountVPK {}", vpkPath);
VPKData* ret = mountVPK(fileSystem, vpkPath);
for (Mod* mod : g_ModManager->m_loadedMods)
{
if (!mod->Enabled)
continue;
for (std::string& vpkPath : mod->Vpks)
{
spdlog::info(vpkPath);
spdlog::info((void*)mountVPK(fileSystem, vpkPath.c_str()));
}
}
return ret;
}

View File

@ -247,9 +247,22 @@ void ModManager::LoadMods()
// read vpk paths
if (fs::exists(mod->ModDirectory / "vpk"))
{
for (fs::directory_entry file : fs::directory_iterator(mod->ModDirectory / "vpk"))
if (fs::is_regular_file(file) && file.path().extension() == "vpk")
mod->Vpks.push_back(file.path().string());
{
// a bunch of checks to make sure we're only adding dir vpks and their paths are good
// note: the game will literally only load vpks with the english prefix
if (fs::is_regular_file(file) && file.path().extension() == ".vpk" &&
file.path().string().find("english") != std::string::npos && file.path().string().find(".bsp.pak000_dir") != std::string::npos)
{
std::string formattedPath = file.path().filename().string();
// this really fucking sucks but it'll work
mod->Vpks.push_back((file.path().parent_path() / formattedPath.substr(strlen("english"), formattedPath.find(".bsp") - 3)).string());
}
}
}
// read keyvalues paths
if (fs::exists(mod->ModDirectory / "keyvalues"))