add mod vpk support
This commit is contained in:
parent
83ea828342
commit
9f0288d744
|
@ -25,6 +25,10 @@ typedef FileHandle_t(*ReadFileFromFilesystemType)(IFileSystem* filesystem, const
|
||||||
ReadFileFromFilesystemType readFileFromFilesystem;
|
ReadFileFromFilesystemType readFileFromFilesystem;
|
||||||
FileHandle_t ReadFileFromFilesystemHook(IFileSystem* filesystem, const char* pPath, const char* pOptions, int64_t a4, uint32_t a5);
|
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;
|
bool readingOriginalFile;
|
||||||
std::string currentModPath;
|
std::string currentModPath;
|
||||||
SourceInterface<IFileSystem>* g_Filesystem;
|
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->ReadFromCache, &ReadFromCacheHook, reinterpret_cast<LPVOID*>(&readFromCache));
|
||||||
ENABLER_CREATEHOOK(hook, (*g_Filesystem)->m_vtable->AddSearchPath, &AddSearchPathHook, reinterpret_cast<LPVOID*>(&addSearchPathOriginal));
|
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, (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)
|
std::string ReadVPKFile(const char* path)
|
||||||
|
@ -155,4 +160,24 @@ FileHandle_t ReadFileFromFilesystemHook(IFileSystem* filesystem, const char* pPa
|
||||||
TryReplaceFile((char*)pPath, true);
|
TryReplaceFile((char*)pPath, true);
|
||||||
|
|
||||||
return readFileFromFilesystem(filesystem, pPath, pOptions, a4, a5);
|
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;
|
||||||
}
|
}
|
|
@ -247,9 +247,22 @@ void ModManager::LoadMods()
|
||||||
|
|
||||||
// read vpk paths
|
// read vpk paths
|
||||||
if (fs::exists(mod->ModDirectory / "vpk"))
|
if (fs::exists(mod->ModDirectory / "vpk"))
|
||||||
|
{
|
||||||
for (fs::directory_entry file : fs::directory_iterator(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
|
// read keyvalues paths
|
||||||
if (fs::exists(mod->ModDirectory / "keyvalues"))
|
if (fs::exists(mod->ModDirectory / "keyvalues"))
|
||||||
|
|
Loading…
Reference in New Issue