2022-03-02 01:16:35 +01:00
|
|
|
//=============================================================================//
|
|
|
|
//
|
|
|
|
// Purpose: RTech game utilities
|
|
|
|
//
|
|
|
|
//=============================================================================//
|
2021-12-27 16:53:35 +01:00
|
|
|
#include "core/stdafx.h"
|
|
|
|
#include "engine/host_cmd.h"
|
2022-04-25 04:05:42 +02:00
|
|
|
#include "engine/host_state.h"
|
|
|
|
#include "engine/cmodel_bsp.h"
|
2021-12-27 16:53:35 +01:00
|
|
|
#include "rtech/rtech_game.h"
|
2022-05-15 12:20:21 +02:00
|
|
|
#include "rtech/rtech_utils.h"
|
2022-03-28 00:57:04 +02:00
|
|
|
|
2023-07-03 02:14:39 +02:00
|
|
|
// Pak handles that have been loaded with the level
|
|
|
|
// from within the level settings KV (located in
|
|
|
|
// scripts/levels/settings/*.kv). On level unload,
|
|
|
|
// each pak listed in this vector gets unloaded.
|
|
|
|
CUtlVector<RPakHandle_t> g_vLoadedPakHandle;
|
2021-12-27 16:53:35 +01:00
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
2022-04-19 03:55:20 +02:00
|
|
|
// Purpose: load user-requested pak files on-demand
|
|
|
|
// Input : *szPakFileName -
|
|
|
|
// *pMalloc -
|
|
|
|
// nIdx -
|
|
|
|
// bUnk -
|
2022-08-06 22:17:47 +02:00
|
|
|
// Output : pak file handle on success, INVALID_PAK_HANDLE on failure
|
2021-12-27 16:53:35 +01:00
|
|
|
//-----------------------------------------------------------------------------
|
2023-05-06 17:48:43 +02:00
|
|
|
RPakHandle_t CPakFile::LoadAsync(const char* szPakFileName, CAlignedMemAlloc* pMalloc, int nIdx, bool bUnk)
|
2021-12-27 16:53:35 +01:00
|
|
|
{
|
2022-08-06 22:17:47 +02:00
|
|
|
RPakHandle_t pakHandle = INVALID_PAK_HANDLE;
|
2021-12-27 16:53:35 +01:00
|
|
|
|
2023-07-03 02:14:39 +02:00
|
|
|
CUtlString pakBasePath;
|
|
|
|
CUtlString pakOverridePath;
|
|
|
|
|
|
|
|
pakBasePath.Format(PLATFORM_PAK_PATH "%s", szPakFileName);
|
|
|
|
pakOverridePath.Format(PLATFORM_PAK_OVERRIDE_PATH "%s", szPakFileName);
|
|
|
|
|
|
|
|
if (FileExists(pakOverridePath.Get()) || FileExists(pakBasePath.Get()))
|
2021-12-27 16:53:35 +01:00
|
|
|
{
|
2022-05-16 20:44:19 +02:00
|
|
|
DevMsg(eDLL_T::RTECH, "Loading pak file: '%s'\n", szPakFileName);
|
2022-06-12 12:40:26 +02:00
|
|
|
pakHandle = CPakFile_LoadAsync(szPakFileName, pMalloc, nIdx, bUnk);
|
2021-12-27 16:53:35 +01:00
|
|
|
|
2022-08-06 22:17:47 +02:00
|
|
|
if (pakHandle == INVALID_PAK_HANDLE)
|
2021-12-27 16:53:35 +01:00
|
|
|
{
|
2022-09-14 01:14:51 +02:00
|
|
|
Error(eDLL_T::RTECH, NO_ERROR, "%s: Failed read '%s' results '%u'\n", __FUNCTION__, szPakFileName, pakHandle);
|
2021-12-27 16:53:35 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2023-04-08 20:15:16 +02:00
|
|
|
Error(eDLL_T::RTECH, NO_ERROR, "%s: Failed; file '%s' doesn't exist\n", __FUNCTION__, szPakFileName);
|
2021-12-27 16:53:35 +01:00
|
|
|
}
|
2022-04-19 03:55:20 +02:00
|
|
|
|
|
|
|
return pakHandle;
|
2021-12-27 16:53:35 +01:00
|
|
|
}
|
|
|
|
|
2022-05-15 12:20:21 +02:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Purpose: unloads loaded pak files
|
|
|
|
// Input : handle -
|
|
|
|
//-----------------------------------------------------------------------------
|
2022-06-12 12:40:26 +02:00
|
|
|
void CPakFile::UnloadPak(RPakHandle_t handle)
|
2022-05-15 12:20:21 +02:00
|
|
|
{
|
2022-05-19 00:47:16 +02:00
|
|
|
RPakLoadedInfo_t* pakInfo = g_pRTech->GetPakLoadedInfo(handle);
|
2022-05-15 12:20:21 +02:00
|
|
|
|
2023-03-16 20:24:34 +01:00
|
|
|
if (pakInfo && pakInfo->m_pszFileName)
|
2022-05-15 12:20:21 +02:00
|
|
|
{
|
2023-03-16 20:24:34 +01:00
|
|
|
DevMsg(eDLL_T::RTECH, "Unloading pak file: '%s'\n", pakInfo->m_pszFileName);
|
2022-05-15 12:20:21 +02:00
|
|
|
|
2023-03-16 20:24:34 +01:00
|
|
|
if (strcmp(pakInfo->m_pszFileName, "mp_lobby.rpak") == 0)
|
|
|
|
s_bBasePaksInitialized = false;
|
2022-05-15 12:20:21 +02:00
|
|
|
}
|
|
|
|
|
2022-06-12 12:40:26 +02:00
|
|
|
CPakFile_UnloadPak(handle);
|
2022-05-15 12:20:21 +02:00
|
|
|
}
|
|
|
|
|
2023-01-25 02:26:52 +01:00
|
|
|
void V_RTechGame::Attach() const
|
2021-12-27 16:53:35 +01:00
|
|
|
{
|
2023-01-25 02:26:52 +01:00
|
|
|
DetourAttach(&CPakFile_LoadAsync, &CPakFile::LoadAsync);
|
|
|
|
DetourAttach(&CPakFile_UnloadPak, &CPakFile::UnloadPak);
|
2021-12-27 16:53:35 +01:00
|
|
|
}
|
|
|
|
|
2023-01-25 02:26:52 +01:00
|
|
|
void V_RTechGame::Detach() const
|
2021-12-27 16:53:35 +01:00
|
|
|
{
|
2023-01-25 02:26:52 +01:00
|
|
|
DetourDetach(&CPakFile_LoadAsync, &CPakFile::LoadAsync);
|
|
|
|
DetourDetach(&CPakFile_UnloadPak, &CPakFile::UnloadPak);
|
2021-12-27 16:53:35 +01:00
|
|
|
}
|
2022-04-19 03:55:20 +02:00
|
|
|
|
|
|
|
// Symbols taken from R2 dll's.
|
|
|
|
CPakFile* g_pakLoadApi = new CPakFile();
|