From 713bafc416c3d4055901da6c5a66368ebbd3f0d0 Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Tue, 3 May 2022 17:36:42 +0200 Subject: [PATCH] See description Fixed 'MOD_PreloadPak()' being called recursively. Fixed wrong datatype for pak handle. Use new and better method of parsing JSON files. Don't unload pak files if user issued 'ChangeLevel' to the same level. NOTE: This is still not complete and currently under development. --- r5dev/engine/cmodel_bsp.cpp | 21 +++++++++------------ r5dev/engine/cmodel_bsp.h | 2 +- r5dev/rtech/rtech_game.cpp | 21 ++++++--------------- 3 files changed, 16 insertions(+), 28 deletions(-) diff --git a/r5dev/engine/cmodel_bsp.cpp b/r5dev/engine/cmodel_bsp.cpp index a4bb4b57..5363454c 100644 --- a/r5dev/engine/cmodel_bsp.cpp +++ b/r5dev/engine/cmodel_bsp.cpp @@ -16,7 +16,7 @@ // Purpose: loads required pakfile assets for specified BSP // Input : svSetFile - //----------------------------------------------------------------------------- -void MOD_PreloadPak(const string& svSetFile) +void MOD_PreloadPak() { ostringstream ostream; ostream << "platform\\scripts\\levels\\settings\\" << g_pHostState->m_levelName << ".json"; @@ -27,29 +27,26 @@ void MOD_PreloadPak(const string& svSetFile) nlohmann::json jsIn; try { - ifstream iPakLoadDefFile(fsPath, std::ios::binary); // Parse prerequisites file. - iPakLoadDefFile >> jsIn; + ifstream iPakLoadDefFile(fsPath.string().c_str(), std::ios::binary); // Load prerequisites file. + + jsIn = nlohmann::json::parse(iPakLoadDefFile); iPakLoadDefFile.close(); if (!jsIn.is_null()) { if (!jsIn["rpak"].is_null()) { - for (auto it = jsIn["rpak"].begin(); it != jsIn["rpak"].end(); ++it) + for (auto& it : jsIn["rpak"]) { - if (it.value().is_string()) + if (it.is_string()) { - string svToLoad = it.value().get() + ".rpak"; - uint32_t nPakId = g_pakLoadApi->AsyncLoad(svToLoad.c_str(), g_pMallocPool.GetPtr(), 4, 0); + string svToLoad = it.get() + ".rpak"; + RPakHandle_t nPakId = g_pakLoadApi->AsyncLoad(svToLoad.c_str(), g_pMallocPool.GetPtr(), 4, 0); if (nPakId == -1) - { - Error(eDLL_T::RTECH, "RTech_AsyncLoad: failed read '%s' results '%u'\n", fsPath.string().c_str(), nPakId); - } + Error(eDLL_T::ENGINE, "%s: unable to load pak '%s' results '%d'\n", __FUNCTION__, svToLoad.c_str(), nPakId); else - { g_LoadedPakHandle.push_back(nPakId); - } } } } diff --git a/r5dev/engine/cmodel_bsp.h b/r5dev/engine/cmodel_bsp.h index f4b2e556..b3d4f3cf 100644 --- a/r5dev/engine/cmodel_bsp.h +++ b/r5dev/engine/cmodel_bsp.h @@ -3,7 +3,7 @@ inline CMemory p_CollisionBSPData_LinkPhysics; inline auto CollisionBSPData_LinkPhysics = p_CollisionBSPData_LinkPhysics.RCast(); -void MOD_PreloadPak(const string& svSetFile); +void MOD_PreloadPak(); /////////////////////////////////////////////////////////////////////////////// class HModel_BSP : public IDetour { diff --git a/r5dev/rtech/rtech_game.cpp b/r5dev/rtech/rtech_game.cpp index 2f1cb930..3cc0dcbe 100644 --- a/r5dev/rtech/rtech_game.cpp +++ b/r5dev/rtech/rtech_game.cpp @@ -40,23 +40,14 @@ RPakHandle_t CPakFile::AsyncLoad(const char* szPakFileName, uintptr_t pMalloc, i return pakHandle; } #endif // DEDICATED + static bool bBasePaksLoaded = false; - if (g_pHostState) + if (strcmp(szPakFileName, "mp_lobby.rpak") == 0 || !g_bLevelResourceInitialized && !g_pHostState->m_bActiveGame && + bBasePaksLoaded) { - string svLevelName = g_pHostState->m_levelName; - string svMapPakName = svLevelName + ".rpak"; - static bool bBasePaksLoaded = false; - - if (!g_bLevelResourceInitialized && !g_pHostState->m_bActiveGame && - bBasePaksLoaded || !strcmp(szPakFileName, "mp_lobby.rpak")) - { - // Attempt to load level dependencies if they exist. - MOD_PreloadPak(svLevelName); - - // By the time mp_lobby.rpak is loaded, all the base paks are loaded as well and we can load anything else. - bBasePaksLoaded = true; - g_bLevelResourceInitialized = true; - } + bBasePaksLoaded = true; // By the time mp_lobby.rpak is loaded, all the base paks are loaded as well and we can load anything else. + g_bLevelResourceInitialized = true; + MOD_PreloadPak(); } string svPakFilePathMod = "paks\\Win32\\" + string(szPakFileName);