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"
|
|
|
|
#include "engine/sys_utils.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-03-28 00:57:04 +02:00
|
|
|
|
2022-04-19 03:55:20 +02:00
|
|
|
vector<RPakHandle_t> g_LoadedPakHandle{ };
|
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 -
|
|
|
|
// Output : pak file handle on success, -1 (INVALID_PAK_HANDLE) on failure
|
2021-12-27 16:53:35 +01:00
|
|
|
//-----------------------------------------------------------------------------
|
2022-04-19 03:55:20 +02:00
|
|
|
RPakHandle_t CPakFile::AsyncLoad(const char* szPakFileName, uintptr_t pMalloc, int nIdx, bool bUnk)
|
2021-12-27 16:53:35 +01:00
|
|
|
{
|
2022-04-19 03:55:20 +02:00
|
|
|
RPakHandle_t pakHandle = -1;
|
|
|
|
#ifdef DEDICATED
|
|
|
|
// Extraneous files (useless on the dedicated server).
|
|
|
|
if (strcmp(szPakFileName, "ui.rpak") == 0)
|
2021-12-27 16:53:35 +01:00
|
|
|
{
|
2022-04-19 03:55:20 +02:00
|
|
|
static const char* szReplacement = "common_empty.rpak";
|
|
|
|
// Returning -1 (invalid handle) triggers engine error, call is inline.
|
|
|
|
// Replacing the ui.rpak file here with a stub to avoid having to patch.
|
|
|
|
Warning(eDLL_T::RTECH, "Replacing '%s' with '%s'\n", szPakFileName, szReplacement);
|
|
|
|
return pakHandle = CPakFile_AsyncLoad(szReplacement, pMalloc, nIdx, bUnk);
|
2021-12-27 16:53:35 +01:00
|
|
|
}
|
2022-04-19 03:55:20 +02:00
|
|
|
else if (strstr(szPakFileName, "ui")
|
|
|
|
|| strstr(szPakFileName, "loadscreen")
|
|
|
|
|| strstr(szPakFileName, "subtitles"))
|
|
|
|
{
|
|
|
|
return pakHandle;
|
|
|
|
}
|
|
|
|
#endif // DEDICATED
|
2021-12-27 16:53:35 +01:00
|
|
|
|
2022-04-25 04:05:42 +02:00
|
|
|
if (g_pHostState)
|
|
|
|
{
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-04-19 03:55:20 +02:00
|
|
|
string svPakFilePathMod = "paks\\Win32\\" + string(szPakFileName);
|
|
|
|
string svPakFilePathBase = "paks\\Win64\\" + string(szPakFileName);
|
2021-12-27 16:53:35 +01:00
|
|
|
|
|
|
|
if (FileExists(svPakFilePathMod.c_str()) || FileExists(svPakFilePathBase.c_str()))
|
|
|
|
{
|
2022-04-19 03:55:20 +02:00
|
|
|
pakHandle = CPakFile_AsyncLoad(szPakFileName, pMalloc, nIdx, bUnk);
|
2021-12-27 16:53:35 +01:00
|
|
|
|
2022-04-19 03:55:20 +02:00
|
|
|
if (pakHandle == -1)
|
2021-12-27 16:53:35 +01:00
|
|
|
{
|
2022-04-19 03:55:20 +02:00
|
|
|
Error(eDLL_T::RTECH, "%s: Failed read '%s' results '%u'\n", __FUNCTION__, szPakFileName, pakHandle);
|
2021-12-27 16:53:35 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2022-04-19 03:55:20 +02:00
|
|
|
Error(eDLL_T::RTECH, "%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
|
|
|
}
|
|
|
|
|
|
|
|
void RTech_Game_Attach()
|
|
|
|
{
|
2022-04-19 03:55:20 +02:00
|
|
|
DetourAttach((LPVOID*)&CPakFile_AsyncLoad, &CPakFile::AsyncLoad);
|
2021-12-27 16:53:35 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void RTech_Game_Detach()
|
|
|
|
{
|
2022-04-19 03:55:20 +02:00
|
|
|
DetourDetach((LPVOID*)&CPakFile_AsyncLoad, &CPakFile::AsyncLoad);
|
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();
|