From 2045f52ad82c6556231fd5f50357b4051e59dc06 Mon Sep 17 00:00:00 2001 From: PixieCore <41352111+PixieCore@users.noreply.github.com> Date: Mon, 28 Mar 2022 00:57:04 +0200 Subject: [PATCH] Unloading rpaks poperly now that we load on map load. --- r5dev/engine/cmodel_bsp.cpp | 7 ++----- r5dev/engine/host_state.cpp | 15 +++++++-------- r5dev/rtech/rtech_game.cpp | 3 ++- r5dev/rtech/rtech_game.h | 2 +- 4 files changed, 12 insertions(+), 15 deletions(-) diff --git a/r5dev/engine/cmodel_bsp.cpp b/r5dev/engine/cmodel_bsp.cpp index d999952f..1cc7e5f7 100644 --- a/r5dev/engine/cmodel_bsp.cpp +++ b/r5dev/engine/cmodel_bsp.cpp @@ -35,14 +35,12 @@ void MOD_PreloadPak(const std::string& svSetFile) { if (!jsIn["rpak"].is_null()) { - int iPakIdx{}; for (auto it = jsIn["rpak"].begin(); it != jsIn["rpak"].end(); ++it) { if (it.value().is_string()) { std::string svToLoad = it.value().get() + ".rpak"; - unsigned int nPakId = 0; - nPakId = RTech_AsyncLoad((void*)svToLoad.c_str(), g_pMallocPool.GetPtr(), 4, 0); + std::uint32_t nPakId = RTech_AsyncLoad((void*)svToLoad.c_str(), g_pMallocPool.GetPtr(), 4, 0); if (nPakId == -1) { @@ -50,8 +48,7 @@ void MOD_PreloadPak(const std::string& svSetFile) } else { - g_nLoadedPakFileId[iPakIdx] = nPakId; - iPakIdx++; + g_nLoadedPakFileId.push_back(nPakId); } } } diff --git a/r5dev/engine/host_state.cpp b/r5dev/engine/host_state.cpp index ce96da79..90f14a84 100644 --- a/r5dev/engine/host_state.cpp +++ b/r5dev/engine/host_state.cpp @@ -85,11 +85,13 @@ FORCEINLINE void CHostState::FrameUpdate(void* rcx, void* rdx, float time) case HostStates_t::HS_CHANGE_LEVEL_SP: { g_pHostState->State_ChangeLevelSP(); + g_pHostState->UnloadPakFile(); // Unload our loaded rpaks. Calling this before the actual level change happens kills the game. break; } case HostStates_t::HS_CHANGE_LEVEL_MP: { g_pHostState->State_ChangeLevelMP(); + g_pHostState->UnloadPakFile(); // Unload our loaded rpaks. Calling this before the actual level change happens kills the game. break; } case HostStates_t::HS_RUN: @@ -101,6 +103,7 @@ FORCEINLINE void CHostState::FrameUpdate(void* rcx, void* rdx, float time) { DevMsg(eDLL_T::ENGINE, "%s - Shutdown host game\n", "CHostState::FrameUpdate"); + g_pHostState->UnloadPakFile(); g_bLevelResourceInitialized = false; Host_Game_ShutdownFn(g_pHostState); break; @@ -275,18 +278,14 @@ FORCEINLINE void CHostState::GameShutDown(void) //----------------------------------------------------------------------------- FORCEINLINE void CHostState::UnloadPakFile(void) { - for (int i = 0; i < sizeof(g_nLoadedPakFileId); i++) + for (auto& it : g_nLoadedPakFileId) { - if (g_nLoadedPakFileId[i] > 0) + if (it >= 0) // [ PIXIE ] TODO: Create RTech function to get RPakLoadedInfo by ID and print which rpak is getting unloaded. { - RTech_UnloadPak(g_nLoadedPakFileId[i]); - } - else - { - memset(g_nLoadedPakFileId, '\0', sizeof(g_nLoadedPakFileId)); - break; + RTech_UnloadPak(it); } } + g_nLoadedPakFileId.clear(); } //----------------------------------------------------------------------------- diff --git a/r5dev/rtech/rtech_game.cpp b/r5dev/rtech/rtech_game.cpp index 8ca99438..346f577c 100644 --- a/r5dev/rtech/rtech_game.cpp +++ b/r5dev/rtech/rtech_game.cpp @@ -7,7 +7,8 @@ #include "engine/host_cmd.h" #include "engine/sys_utils.h" #include "rtech/rtech_game.h" -int g_nLoadedPakFileId[256]{}; + +std::vector g_nLoadedPakFileId{ }; //----------------------------------------------------------------------------- // Purpose: unloads asset files from the memory pool diff --git a/r5dev/rtech/rtech_game.h b/r5dev/rtech/rtech_game.h index f2b0d824..6fd2d87e 100644 --- a/r5dev/rtech/rtech_game.h +++ b/r5dev/rtech/rtech_game.h @@ -58,7 +58,7 @@ void HRtech_AsyncLoad(std::string svPakFileName); void RTech_Game_Attach(); void RTech_Game_Detach(); -extern int g_nLoadedPakFileId[256]; +extern std::vector g_nLoadedPakFileId; /////////////////////////////////////////////////////////////////////////////// class HRTechGame : public IDetour {