From 50e69bde548c5a1af3385f0eff6aa14c088c21c5 Mon Sep 17 00:00:00 2001 From: BobTheBob <32057864+BobTheBob9@users.noreply.github.com> Date: Tue, 15 Mar 2022 05:57:15 +0000 Subject: add mod binks, mod rpak loading, and support for non-preload vpks/rpaks --- NorthstarDedicatedTest/modmanager.cpp | 90 ++++++++++++++++++++++++++++++++++- 1 file changed, 88 insertions(+), 2 deletions(-) (limited to 'NorthstarDedicatedTest/modmanager.cpp') diff --git a/NorthstarDedicatedTest/modmanager.cpp b/NorthstarDedicatedTest/modmanager.cpp index 4f2bb416..79529c99 100644 --- a/NorthstarDedicatedTest/modmanager.cpp +++ b/NorthstarDedicatedTest/modmanager.cpp @@ -14,6 +14,7 @@ #include #include #include "filesystem.h" +#include "rpakfilesystem.h" #include "configurables.h" ModManager* g_ModManager; @@ -289,6 +290,26 @@ void ModManager::LoadMods() // read vpk paths if (fs::exists(mod.ModDirectory / "vpk")) { + // read vpk cfg + std::ifstream vpkJsonStream(mod.ModDirectory / "vpk/vpk.json"); + std::stringstream vpkJsonStringStream; + + bool bUseVPKJson = false; + rapidjson::Document dVpkJson; + + if (!vpkJsonStream.fail()) + { + while (vpkJsonStream.peek() != EOF) + vpkJsonStringStream << (char)vpkJsonStream.get(); + + vpkJsonStream.close(); + dVpkJson.Parse( + vpkJsonStringStream.str().c_str()); + + bUseVPKJson = + !dVpkJson.HasParseError() && dVpkJson.IsObject(); + } + for (fs::directory_entry file : fs::directory_iterator(mod.ModDirectory / "vpk")) { // a bunch of checks to make sure we're only adding dir vpks and their paths are good @@ -302,14 +323,71 @@ void ModManager::LoadMods() // this really fucking sucks but it'll work std::string vpkName = (file.path().parent_path() / formattedPath.substr(strlen("english"), formattedPath.find(".bsp") - 3)).string(); - mod.Vpks.push_back(vpkName); - if (m_hasLoadedMods) + ModVPKEntry& modVpk = mod.Vpks.emplace_back(); + modVpk.m_bAutoLoad = !bUseVPKJson || (dVpkJson.HasMember("Preload") && dVpkJson["Preload"].IsObject() && dVpkJson["Preload"].HasMember(vpkName) && dVpkJson["Preload"][vpkName].IsTrue()); + modVpk.m_sVpkPath = vpkName; + + if (m_hasLoadedMods && modVpk.m_bAutoLoad) (*g_Filesystem)->m_vtable->MountVPK(*g_Filesystem, vpkName.c_str()); } } } + // read rpak paths + if (fs::exists(mod.ModDirectory / "paks")) + { + // read rpak cfg + std::ifstream rpakJsonStream(mod.ModDirectory / "paks/rpak.json"); + std::stringstream rpakJsonStringStream; + + bool bUseRpakJson = false; + rapidjson::Document dRpakJson; + + if (!rpakJsonStream.fail()) + { + while (rpakJsonStream.peek() != EOF) + rpakJsonStringStream << (char)rpakJsonStream.get(); + + rpakJsonStream.close(); + dRpakJson.Parse( + rpakJsonStringStream.str().c_str()); + + bUseRpakJson = + !dRpakJson.HasParseError() && dRpakJson.IsObject(); + } + + // read pak aliases + if (bUseRpakJson && dRpakJson.HasMember("Aliases") && dRpakJson["Aliases"].IsObject()) + { + for (rapidjson::Value::ConstMemberIterator iterator = dRpakJson["Aliases"].MemberBegin(); + iterator != dRpakJson["Aliases"].MemberEnd(); iterator++) + { + if (!iterator->name.IsString() || !iterator->value.IsString()) + continue; + + mod.RpakAliases.insert(std::make_pair(iterator->name.GetString(), iterator->value.GetString())); + } + } + + for (fs::directory_entry file : fs::directory_iterator(mod.ModDirectory / "paks")) + { + // ensure we're only loading rpaks + if (fs::is_regular_file(file) && file.path().extension() == ".rpak") + { + std::string pakName(file.path().filename().string()); + + ModRpakEntry& modPak = mod.Rpaks.emplace_back(); + modPak.m_bAutoLoad = !bUseRpakJson || (dRpakJson.HasMember("Preload") && dRpakJson["Preload"].IsObject() && dRpakJson["Preload"].HasMember(pakName) && dRpakJson["Preload"][pakName].IsTrue()); + modPak.m_sPakPath = pakName; + + // not using atm because we need to resolve path to rpak + //if (m_hasLoadedMods && modPak.m_bAutoLoad) + // g_PakLoadManager->LoadPakAsync(pakName.c_str()); + } + } + } + // read keyvalues paths if (fs::exists(mod.ModDirectory / "keyvalues")) { @@ -340,6 +418,14 @@ void ModManager::LoadMods() } } + // read bink video paths + if (fs::exists(mod.ModDirectory / "media")) + { + for (fs::directory_entry file : fs::recursive_directory_iterator(mod.ModDirectory / "media")) + if (fs::is_regular_file(file) && file.path().extension() == ".bik") + mod.BinkVideos.push_back(file.path().filename().string()); + } + // try to load audio if (fs::exists(mod.ModDirectory / "audio")) { -- cgit v1.2.3