From cb0937ed041c589250f17757cdbf2252a9a4047f Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Wed, 23 Nov 2022 10:34:11 +0100 Subject: [PATCH] Add 'KeyValues::LoadFromFile' to SDK Added 'KeyValues::LoadFromFile' to the SDK among with 'KeyValues::UsesEscapeSequences', and delete KeyValue memory after GameInfo.txt init. --- r5dev/vpc/keyvalues.cpp | 25 ++++++++++++++++++++++--- r5dev/vpc/keyvalues.h | 10 ++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/r5dev/vpc/keyvalues.cpp b/r5dev/vpc/keyvalues.cpp index 5cfd2c07..10bbadd0 100644 --- a/r5dev/vpc/keyvalues.cpp +++ b/r5dev/vpc/keyvalues.cpp @@ -1015,6 +1015,14 @@ void KeyValues::SetColor(const char* pszKeyName, Color color) } } +//----------------------------------------------------------------------------- +// Purpose: if parser should translate escape sequences ( /n, /t etc), set to true +//----------------------------------------------------------------------------- +void KeyValues::UsesEscapeSequences(bool bState) +{ + m_bHasEscapeSequences = bState; +} + //----------------------------------------------------------------------------- // Purpose: // Input : &src - @@ -1135,6 +1143,15 @@ void KeyValues::RecursiveSaveToFile(IBaseFileSystem* pFileSystem, FileHandle_t p KeyValues_RecursiveSaveToFile(this, pFileSystem, pHandle, pBuf, nIndentLevel); } +//----------------------------------------------------------------------------- +// Purpose: Save keyvalues from disk, if subkey values are detected, calls +// itself to save those +//----------------------------------------------------------------------------- +KeyValues* KeyValues::LoadFromFile(IBaseFileSystem* pFileSystem, const char* pszResourceName, const char* pszPathID, void* pfnEvaluateSymbolProc) +{ + return KeyValues_LoadFromFile(this, pFileSystem, pszResourceName, pszPathID, pfnEvaluateSymbolProc); +} + //----------------------------------------------------------------------------- // Purpose: Make a new copy of all subkeys, add them all to the passed-in keyvalues // Input : *pParent - @@ -1239,7 +1256,7 @@ void KeyValues::InitPlaylists(void) { if (*g_pPlaylistKeyValues) { - KeyValues* pPlaylists = (*g_pPlaylistKeyValues)->FindKey("Playlists", false); + KeyValues* pPlaylists = (*g_pPlaylistKeyValues)->FindKey("Playlists"); if (pPlaylists) { std::lock_guard l(g_PlaylistsVecMutex); @@ -1262,10 +1279,10 @@ void KeyValues::InitFileSystem(void) KeyValues* pMainFile = KeyValues::ReadKeyValuesFile(FileSystem(), "GameInfo.txt"); if (pMainFile) { - KeyValues* pFileSystemInfo = pMainFile->FindKey("FileSystem", false); + KeyValues* pFileSystemInfo = pMainFile->FindKey("FileSystem"); if (pFileSystemInfo) { - KeyValues* pSearchPaths = pFileSystemInfo->FindKey("SearchPaths", false); + KeyValues* pSearchPaths = pFileSystemInfo->FindKey("SearchPaths"); if (pSearchPaths) { g_vGameInfoPaths.clear(); @@ -1279,6 +1296,8 @@ void KeyValues::InitFileSystem(void) } } } + + pMainFile->DeleteThis(); } } diff --git a/r5dev/vpc/keyvalues.h b/r5dev/vpc/keyvalues.h index cc0e4d3e..e66e9181 100644 --- a/r5dev/vpc/keyvalues.h +++ b/r5dev/vpc/keyvalues.h @@ -38,6 +38,9 @@ inline auto KeyValues_ReadKeyValuesFile = p_KeyValues_ReadKeyValuesFile.RCast(); +inline CMemory p_KeyValues_LoadFromFile; +inline auto KeyValues_LoadFromFile = p_KeyValues_LoadFromFile.RCast(); + enum KeyValuesTypes_t : char { TYPE_NONE = 0x0, @@ -126,6 +129,7 @@ public: const char* GetString(const char* pszKeyName = nullptr, const char* pszDefaultValue = ""); const wchar_t* GetWString(const char* pszKeyName = nullptr, const wchar_t* pwszDefaultValue = L""); Color GetColor(const char* pszKeyName, const Color& defaultColor); + bool GetBool(const char* pszKeyName = nullptr, bool nDefaultValue = false) { return GetInt(pszKeyName, nDefaultValue ? 1 : 0) ? true : false; } KeyValuesTypes_t GetDataType(const char* pszKeyName); KeyValuesTypes_t GetDataType(void) const; @@ -141,10 +145,12 @@ public: void SetColor(const char* pszKeyName, Color color); void SetFloat(const char* pszKeyName, float flValue); void SetBool(const char* pszKeyName, bool bValue) { SetInt(pszKeyName, bValue ? 1 : 0); } + void UsesEscapeSequences(bool bState); void RecursiveCopyKeyValues(KeyValues& src); void RecursiveSaveToFile(CUtlBuffer& buf, int nIndentLevel); void RecursiveSaveToFile(IBaseFileSystem* pFileSystem, FileHandle_t pHandle, CUtlBuffer* pBuf, int nIndentLevel); + KeyValues* LoadFromFile(IBaseFileSystem* pFileSystem, const char* pszResourceName, const char* pszPathID, void* pfnEvaluateSymbolProc); void CopySubkeys(KeyValues* pParent) const; KeyValues* MakeCopy(void) const; @@ -195,6 +201,7 @@ class VKeyValues : public IDetour spdlog::debug("| FUN: KeyValues::GetCurrentPlaylist : {:#18x} |\n", p_KeyValues_GetCurrentPlaylist.GetPtr()); spdlog::debug("| FUN: KeyValues::ReadKeyValuesFile : {:#18x} |\n", p_KeyValues_ReadKeyValuesFile.GetPtr()); spdlog::debug("| FUN: KeyValues::RecursiveSaveToFile : {:#18x} |\n", p_KeyValues_RecursiveSaveToFile.GetPtr()); + spdlog::debug("| FUN: KeyValues::LoadFromFile : {:#18x} |\n", p_KeyValues_LoadFromFile.GetPtr()); spdlog::debug("| VAR: g_pPlaylistKeyValues : {:#18x} |\n", reinterpret_cast(g_pPlaylistKeyValues)); spdlog::debug("+----------------------------------------------------------------+\n"); } @@ -204,10 +211,12 @@ class VKeyValues : public IDetour p_KeyValues_FindKey = g_GameDll.FindPatternSIMD(reinterpret_cast("\x48\x89\x5C\x24\x10\x48\x89\x6C\x24\x18\x48\x89\x74\x24\x20\x57\x41\x54\x41\x55\x41\x56\x41\x57\x48\x81\xEC\x20\x01\x00\x00\x45"), "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); p_KeyValues_GetCurrentPlaylist = g_GameDll.FindPatternSIMD(reinterpret_cast("\x48\x8B\x0D\x00\x00\x00\x00\x48\x85\xC9\x75\x08\x48\x8D\x05\x00\x00\x00\x00"), "xxx????xxxxxxxx????"); p_KeyValues_ReadKeyValuesFile = g_GameDll.FindPatternSIMD(reinterpret_cast("\x48\x89\x5C\x24\x00\x55\x56\x57\x41\x54\x41\x57\x48\x8D\x6C\x24\x00"), "xxxx?xxxxxxxxxxx?"); + p_KeyValues_LoadFromFile = g_GameDll.FindPatternSIMD(reinterpret_cast("\x48\x89\x5C\x24\x00\x4C\x89\x4C\x24\x00\x4C\x89\x44\x24\x00\x48\x89\x4C\x24\x00\x55\x56\x57\x41\x54\x41\x55\x41\x56\x41\x57\x48\x8D\x6C\x24\x00"), "xxxx?xxxx?xxxx?xxxx?xxxxxxxxxxxxxxx?"); #elif defined (GAMEDLL_S2) || defined (GAMEDLL_S3) p_KeyValues_FindKey = g_GameDll.FindPatternSIMD(reinterpret_cast("\x40\x56\x57\x41\x57\x48\x81\xEC\x00\x00\x00\x00\x45"), "xxxxxxxx????x"); p_KeyValues_GetCurrentPlaylist = g_GameDll.FindPatternSIMD(reinterpret_cast("\x48\x8B\x05\x00\x00\x00\x00\x48\x85\xC0\x75\x08\x48\x8D\x05\x00\x00\x00\x00\xC3\x0F\xB7\x50\x2A"), "xxx????xxxxxxxx????xxxxx"); p_KeyValues_ReadKeyValuesFile = g_GameDll.FindPatternSIMD(reinterpret_cast("\x48\x8B\xC4\x55\x53\x57\x41\x54\x48\x8D\x68\xA1"), "xxxxxxxxxxxx"); + p_KeyValues_LoadFromFile = g_GameDll.FindPatternSIMD(reinterpret_cast("\x48\x89\x5C\x24\x00\x4C\x89\x4C\x24\x00\x48\x89\x4C\x24\x00\x55\x56\x57\x41\x54\x41\x55\x41\x56\x41\x57\x48\x8D\x6C\x24\x00"), "xxxx?xxxx?xxxx?xxxxxxxxxxxxxxx?"); #endif p_KeyValues_LoadPlaylists = g_GameDll.FindPatternSIMD(reinterpret_cast("\x48\x89\x5C\x24\x00\x48\x89\x6C\x24\x00\x56\x57\x41\x56\x48\x83\xEC\x40\x48\x8B\xF1"), "xxxx?xxxx?xxxxxxxxxxx"); p_KeyValues_ParsePlaylists = g_GameDll.FindPatternSIMD(reinterpret_cast("\xE8\x00\x00\x00\x00\x80\x3D\x00\x00\x00\x00\x00\x74\x0C"), "x????xx?????xx").FollowNearCallSelf(); @@ -219,6 +228,7 @@ class VKeyValues : public IDetour KeyValues_GetCurrentPlaylist = p_KeyValues_GetCurrentPlaylist.RCast(); /*48 8B 05 ?? ?? ?? ?? 48 85 C0 75 08 48 8D 05 ?? ?? ?? ?? C3 0F B7 50 2A*/ KeyValues_ReadKeyValuesFile = p_KeyValues_ReadKeyValuesFile.RCast(); /*48 8B C4 55 53 57 41 54 48 8D 68 A1*/ KeyValues_RecursiveSaveToFile = p_KeyValues_RecursiveSaveToFile.RCast(); /*48 8B C4 53 ?? 57 41 55 41 ?? 48 83*/ + KeyValues_LoadFromFile = p_KeyValues_LoadFromFile.RCast(); } virtual void GetVar(void) const {