diff --git a/r5dev/common/callback.cpp b/r5dev/common/callback.cpp index 4ad424ca..83a522ed 100644 --- a/r5dev/common/callback.cpp +++ b/r5dev/common/callback.cpp @@ -384,7 +384,7 @@ Pak_RequestLoad_f */ void Pak_RequestLoad_f(const CCommand& args) { - g_pakLoadApi->LoadAsync(args.Arg(1)); + g_pakLoadApi->LoadAsync(args.Arg(1), AlignedMemAlloc(), NULL, 0); } @@ -431,7 +431,7 @@ void Pak_Swap_f(const CCommand& args) while (pakInfo->m_nStatus != RPakStatus_t::PAK_STATUS_FREED) // Wait till this slot gets free'd. std::this_thread::sleep_for(std::chrono::seconds(1)); - g_pakLoadApi->LoadAsync(pakName.c_str()); + g_pakLoadApi->LoadAsync(pakName.c_str(), AlignedMemAlloc(), NULL, 0); } catch (const std::exception& e) { diff --git a/r5dev/common/opcodes.cpp b/r5dev/common/opcodes.cpp index 95452066..b37203a4 100644 --- a/r5dev/common/opcodes.cpp +++ b/r5dev/common/opcodes.cpp @@ -387,5 +387,5 @@ void RuntimePtc_Init() /* .TEXT */ #endif }; - p_CPakFile_OpenFileOffset.Patch(starPakOpenFile); + p_Pak_OpenFileOffset.Patch(starPakOpenFile); } diff --git a/r5dev/materialsystem/cmaterialsystem.cpp b/r5dev/materialsystem/cmaterialsystem.cpp index 1df6f162..335592b1 100644 --- a/r5dev/materialsystem/cmaterialsystem.cpp +++ b/r5dev/materialsystem/cmaterialsystem.cpp @@ -22,7 +22,7 @@ InitReturnVal_t CMaterialSystem::Init(CMaterialSystem* thisptr) #ifdef MATERIALSYSTEM_NODX // Only load the 'startup.rpak' file, as 'common_early.rpak' has assets // that references assets in 'startup.rpak'. - RPakHandle_t pakHandle = g_pakLoadApi->LoadAsync("startup.rpak", AlignedMemAlloc(), 5); + RPakHandle_t pakHandle = g_pakLoadApi->LoadAsync("startup.rpak", AlignedMemAlloc(), 5, 0); g_pakLoadApi->WaitAsync(pakHandle); // Trick: return INIT_FAILED to disable the loading of hardware diff --git a/r5dev/rtech/rtech_game.cpp b/r5dev/rtech/rtech_game.cpp index ac5995d4..7e37916e 100644 --- a/r5dev/rtech/rtech_game.cpp +++ b/r5dev/rtech/rtech_game.cpp @@ -24,7 +24,7 @@ CUtlVector g_vLoadedPakHandle; // bUnk - // Output : pak file handle on success, INVALID_PAK_HANDLE on failure //----------------------------------------------------------------------------- -RPakHandle_t CPakFile::LoadAsync(const char* szPakFileName, CAlignedMemAlloc* pMalloc, int nIdx, bool bUnk) +RPakHandle_t Pak_LoadAsync(const char* szPakFileName, CAlignedMemAlloc* pMalloc, int nIdx, bool bUnk) { RPakHandle_t pakHandle = INVALID_PAK_HANDLE; @@ -37,7 +37,7 @@ RPakHandle_t CPakFile::LoadAsync(const char* szPakFileName, CAlignedMemAlloc* pM if (FileExists(pakOverridePath.Get()) || FileExists(pakBasePath.Get())) { Msg(eDLL_T::RTECH, "Loading pak file: '%s'\n", szPakFileName); - pakHandle = CPakFile_LoadAsync(szPakFileName, pMalloc, nIdx, bUnk); + pakHandle = v_Pak_LoadAsync(szPakFileName, pMalloc, nIdx, bUnk); if (pakHandle == INVALID_PAK_HANDLE) { @@ -56,7 +56,7 @@ RPakHandle_t CPakFile::LoadAsync(const char* szPakFileName, CAlignedMemAlloc* pM // Purpose: unloads loaded pak files // Input : handle - //----------------------------------------------------------------------------- -void CPakFile::UnloadPak(RPakHandle_t handle) +void Pak_UnloadPak(RPakHandle_t handle) { RPakLoadedInfo_t* pakInfo = g_pRTech->GetPakLoadedInfo(handle); @@ -68,20 +68,20 @@ void CPakFile::UnloadPak(RPakHandle_t handle) s_bBasePaksInitialized = false; } - CPakFile_UnloadPak(handle); + v_Pak_UnloadPak(handle); } void V_RTechGame::Attach() const { - DetourAttach(&CPakFile_LoadAsync, &CPakFile::LoadAsync); - DetourAttach(&CPakFile_UnloadPak, &CPakFile::UnloadPak); + DetourAttach(&v_Pak_LoadAsync, &Pak_LoadAsync); + DetourAttach(&v_Pak_UnloadPak, &Pak_UnloadPak); } void V_RTechGame::Detach() const { - DetourDetach(&CPakFile_LoadAsync, &CPakFile::LoadAsync); - DetourDetach(&CPakFile_UnloadPak, &CPakFile::UnloadPak); + DetourDetach(&v_Pak_LoadAsync, &Pak_LoadAsync); + DetourDetach(&v_Pak_UnloadPak, &Pak_UnloadPak); } // Symbols taken from R2 dll's. -CPakFile* g_pakLoadApi = new CPakFile(); +PakLoadFuncs_t* g_pakLoadApi = nullptr; diff --git a/r5dev/rtech/rtech_game.h b/r5dev/rtech/rtech_game.h index c3d24ebc..834186f9 100644 --- a/r5dev/rtech/rtech_game.h +++ b/r5dev/rtech/rtech_game.h @@ -1,31 +1,67 @@ #pragma once #include "tier0/tslist.h" +#include "launcher/launcher.h" #include "public/rtech/ipakfile.h" /* ==== RTECH_GAME ====================================================================================================================================================== */ -inline CMemory p_CPakFile_LoadAsync; -inline RPakHandle_t(*CPakFile_LoadAsync)(const char* szPakFileName, CAlignedMemAlloc* pMalloc, int nIdx, bool bUnk); +inline CMemory p_Pak_LoadAsync; +inline RPakHandle_t(*v_Pak_LoadAsync)(const char* szPakFileName, CAlignedMemAlloc* pMalloc, int nIdx, bool bUnk); -inline CMemory p_CPakFile_WaitAsync; -inline RPakStatus_t(*CPakFile_WaitAsync)(RPakHandle_t handle, void* pFinishCallback); +inline CMemory p_Pak_WaitAsync; +inline RPakStatus_t(*v_Pak_WaitAsync)(RPakHandle_t handle, void* pFinishCallback); -inline CMemory p_CPakFile_LoadPak; -inline unsigned int (*CPakFile_LoadPak)(void* thisptr, void* a2, uint64_t a3); +inline CMemory p_Pak_LoadPak; +inline unsigned int (*v_Pak_LoadPak)(void* thisptr, void* a2, uint64_t a3); -inline CMemory p_CPakFile_UnloadPak; -inline void(*CPakFile_UnloadPak)(RPakHandle_t handle); +inline CMemory p_Pak_UnloadPak; +inline void(*v_Pak_UnloadPak)(RPakHandle_t handle); -inline CMemory p_CPakFile_OpenFileOffset; // Offset to inlined 'CPakFile::LoadPak_OpenFile'. +inline CMemory p_Pak_OpenFileOffset; // Offset to inlined 'Pak_OpenFile'. -class CPakFile +inline RPakStatus_t WaitAsync(RPakHandle_t handle, void* pFinishCallback = nullptr) { return v_Pak_WaitAsync(handle, pFinishCallback); } + +typedef struct PakLoadFuncs_s { -public: - static RPakHandle_t LoadAsync(const char* szPakFileName, CAlignedMemAlloc* pMalloc = AlignedMemAlloc(), int nIdx = NULL, bool bUnk = false); - static inline RPakStatus_t WaitAsync(RPakHandle_t handle, void* pFinishCallback = nullptr) { return CPakFile_WaitAsync(handle, pFinishCallback); } - static void UnloadPak(RPakHandle_t handle); -}; + void* LoadPatches; + void* RegisterAsset; + char unknown0[8]; + RPakHandle_t (*LoadAsync)(const char* pakFileName, CAlignedMemAlloc* allocator, int nIdx, bool bUnk); + void* Func4; + void (*UnloadPak)(RPakHandle_t handle); + void* Func6; + char unknown2[16]; + void* Func7; + void* Func8; + RPakStatus_t(*WaitAsync)(RPakHandle_t handle); + void* Func10; + void* Func11; + void* FindByGUID; + void* FindByName; + char unknown3[8]; + void* Func14; + void* Func15; + void* Func16; + void* Func17; + void* Func18; + void* IncrementStreamingAssetCount; + void* DecrementStreamingAssetCount; + void* IsFullStreamingInstall; + char unknown4[48]; + void* OpenFile; + void* CloseFile; + void* Func24; + void* Func25; + void* Func26; + void* QueueAsyncFileRead; + void* Func28; + void* Func29; + void* WaitForAsyncFileRead; + void* Func31; + void* Func32; + void* Func33; +} PakLoadFuncs_t; -extern CPakFile* g_pakLoadApi; +extern PakLoadFuncs_t* g_pakLoadApi; extern CUtlVector g_vLoadedPakHandle; /////////////////////////////////////////////////////////////////////////////// @@ -33,30 +69,34 @@ class V_RTechGame : public IDetour { virtual void GetAdr(void) const { - LogFunAdr("CPakFile::LoadAsync", p_CPakFile_LoadAsync.GetPtr()); - LogFunAdr("CPakFile::WaitAsync", p_CPakFile_WaitAsync.GetPtr()); - LogFunAdr("CPakFile::LoadPak", p_CPakFile_LoadPak.GetPtr()); - LogFunAdr("CPakFile::UnloadPak", p_CPakFile_UnloadPak.GetPtr()); - LogFunAdr("CPakFile::OpenFile", p_CPakFile_OpenFileOffset.GetPtr()); + LogFunAdr("Pak_LoadAsync", p_Pak_LoadAsync.GetPtr()); + LogFunAdr("Pak_WaitAsync", p_Pak_WaitAsync.GetPtr()); + LogFunAdr("Pak_LoadPak", p_Pak_LoadPak.GetPtr()); + LogFunAdr("Pak_UnloadPak", p_Pak_UnloadPak.GetPtr()); + LogFunAdr("Pak_OpenFile", p_Pak_OpenFileOffset.GetPtr()); + LogVarAdr("g_pakLoadApi", reinterpret_cast(g_pakLoadApi)); } virtual void GetFun(void) const { - p_CPakFile_LoadAsync = g_GameDll.FindPatternSIMD("E8 ?? ?? ?? ?? 89 03 8B 0B").FollowNearCallSelf(); - CPakFile_LoadAsync = p_CPakFile_LoadAsync.RCast(); + p_Pak_LoadAsync = g_GameDll.FindPatternSIMD("E8 ?? ?? ?? ?? 89 03 8B 0B").FollowNearCallSelf(); + v_Pak_LoadAsync = p_Pak_LoadAsync.RCast(); - p_CPakFile_WaitAsync = g_GameDll.FindPatternSIMD("40 53 55 48 83 EC 38 48 89 74 24 ??"); - CPakFile_WaitAsync = p_CPakFile_WaitAsync.RCast(); + p_Pak_WaitAsync = g_GameDll.FindPatternSIMD("40 53 55 48 83 EC 38 48 89 74 24 ??"); + v_Pak_WaitAsync = p_Pak_WaitAsync.RCast(); - p_CPakFile_LoadPak = g_GameDll.FindPatternSIMD("48 89 4C 24 ?? 56 41 55 48 81 EC ?? ?? ?? ?? 4C"); - CPakFile_LoadPak = p_CPakFile_LoadPak.RCast(); + p_Pak_LoadPak = g_GameDll.FindPatternSIMD("48 89 4C 24 ?? 56 41 55 48 81 EC ?? ?? ?? ?? 4C"); + v_Pak_LoadPak = p_Pak_LoadPak.RCast(); - p_CPakFile_UnloadPak = g_GameDll.FindPatternSIMD("E8 ?? ?? ?? ?? 85 FF 74 0C").FollowNearCallSelf(); - CPakFile_UnloadPak = p_CPakFile_UnloadPak.RCast(); + p_Pak_UnloadPak = g_GameDll.FindPatternSIMD("E8 ?? ?? ?? ?? 85 FF 74 0C").FollowNearCallSelf(); + v_Pak_UnloadPak = p_Pak_UnloadPak.RCast(); + } + virtual void GetVar(void) const + { + g_pakLoadApi = p_LauncherMain.Offset(0x800).FindPatternSelf("48 8D").ResolveRelativeAddressSelf(0x3, 0x7).RCast(); } - virtual void GetVar(void) const { } virtual void GetCon(void) const { - p_CPakFile_OpenFileOffset = g_GameDll.FindPatternSIMD("48 89 7C 24 30 C7 44 24 28 ?? ?? ?? 40"); + p_Pak_OpenFileOffset = g_GameDll.FindPatternSIMD("48 89 7C 24 30 C7 44 24 28 ?? ?? ?? 40"); } virtual void Attach(void) const; virtual void Detach(void) const; diff --git a/r5dev/rtech/rtech_utils.h b/r5dev/rtech/rtech_utils.h index 9ba79f0a..2d55d8a6 100644 --- a/r5dev/rtech/rtech_utils.h +++ b/r5dev/rtech/rtech_utils.h @@ -108,8 +108,8 @@ class V_RTechUtils : public IDetour s_pFileHandles = p_StreamDB_Init.Offset(0x70).FindPatternSelf("4C 8D", CMemory::Direction::DOWN, 512, 1).ResolveRelativeAddress(0x3, 0x7).RCast(); s_pFileArrayMutex = p_StreamDB_Init.Offset(0x70).FindPatternSelf("48 8D 0D", CMemory::Direction::DOWN, 512, 1).ResolveRelativeAddress(0x3, 0x7).RCast(); - g_pLoadedPakInfo = p_CPakFile_UnloadPak.FindPattern("48 8D 05", CMemory::Direction::DOWN).ResolveRelativeAddressSelf(0x3, 0x7).RCast(); - g_pRequestedPakCount = p_CPakFile_UnloadPak.FindPattern("66 89", CMemory::Direction::DOWN, 450).ResolveRelativeAddressSelf(0x3, 0x7).RCast(); + g_pLoadedPakInfo = p_Pak_UnloadPak.FindPattern("48 8D 05", CMemory::Direction::DOWN).ResolveRelativeAddressSelf(0x3, 0x7).RCast(); + g_pRequestedPakCount = p_Pak_UnloadPak.FindPattern("66 89", CMemory::Direction::DOWN, 450).ResolveRelativeAddressSelf(0x3, 0x7).RCast(); g_pLoadedPakCount = &*g_pRequestedPakCount - 1; // '-1' shifts it back with sizeof(int16_t). g_pPakGlobals = g_GameDll.FindPatternSIMD("48 8D 1D ?? ?? ?? ?? 45 8D 5A 0E").ResolveRelativeAddressSelf(0x3, 0x7).RCast(); /*48 8D 1D ? ? ? ? 45 8D 5A 0E*/