2021-12-25 22:36:38 +01:00
|
|
|
#pragma once
|
2022-05-28 02:05:54 +02:00
|
|
|
#include "filesystem/filesystem.h"
|
2021-12-25 22:36:38 +01:00
|
|
|
|
2022-04-09 16:16:40 +02:00
|
|
|
#define MAKE_3_BYTES_FROM_1_AND_2( x1, x2 ) (( (( uint16_t )x2) << 8 ) | (uint8_t)(x1))
|
2022-05-27 02:08:51 +02:00
|
|
|
extern vector<string> g_vAllPlaylists;
|
2022-05-28 02:05:54 +02:00
|
|
|
extern vector<string> g_vAllSearchPaths;
|
2021-12-25 22:36:38 +01:00
|
|
|
|
2022-04-09 06:05:47 +02:00
|
|
|
//---------------------------------------------------------------------------------
|
|
|
|
// Purpose: Forward declarations
|
|
|
|
//---------------------------------------------------------------------------------
|
|
|
|
class KeyValues;
|
2021-12-25 22:36:38 +01:00
|
|
|
|
2022-04-09 02:18:57 +02:00
|
|
|
/* ==== KEYVALUES ======================================================================================================================================================= */
|
2022-04-18 03:35:08 +02:00
|
|
|
inline CMemory p_KeyValues_Init;
|
2022-04-09 06:05:47 +02:00
|
|
|
inline auto KeyValues_Init = p_KeyValues_Init.RCast<void* (*)(KeyValues* thisptr, const char* pSymbol, int64_t a3, bool bCreate)>();
|
2021-12-25 22:36:38 +01:00
|
|
|
|
2022-04-18 03:35:08 +02:00
|
|
|
inline CMemory p_KeyValues_FindKey;
|
|
|
|
inline auto KeyValues_FindKey = p_KeyValues_FindKey.RCast<void* (*)(KeyValues* thisptr, const char* pkeyName, bool bCreate)>();
|
2021-12-25 22:36:38 +01:00
|
|
|
|
2022-05-28 02:05:54 +02:00
|
|
|
inline CMemory p_KeyValues_LoadPlaylist;
|
|
|
|
inline auto KeyValues_LoadPlaylist = p_KeyValues_LoadPlaylist.RCast<bool (*)(const char* pszPlaylist)>();
|
|
|
|
|
2022-04-18 03:35:08 +02:00
|
|
|
inline CMemory p_KeyValues_GetCurrentPlaylist;
|
|
|
|
inline auto KeyValues_GetCurrentPlaylist = p_KeyValues_GetCurrentPlaylist.RCast<const char* (*)(void)>();
|
|
|
|
|
2022-05-28 02:05:54 +02:00
|
|
|
inline CMemory p_KeyValues_ReadKeyValuesFile;
|
|
|
|
inline auto KeyValues_ReadKeyValuesFile = p_KeyValues_ReadKeyValuesFile.RCast<KeyValues* (*)(CFileSystem_Stdio* pFileSystem, const char* pFileName)>();
|
2022-04-09 06:05:47 +02:00
|
|
|
|
|
|
|
enum KeyValuesTypes
|
|
|
|
{
|
|
|
|
TYPE_NONE = 0x0,
|
|
|
|
TYPE_STRING = 0x1,
|
|
|
|
TYPE_INT = 0x2,
|
|
|
|
TYPE_FLOAT = 0x3,
|
|
|
|
TYPE_PTR = 0x4,
|
|
|
|
TYPE_WSTRING = 0x5,
|
|
|
|
TYPE_COLOR = 0x6,
|
|
|
|
TYPE_UINT64 = 0x7,
|
|
|
|
TYPE_COMPILED_INT_BYTE = 0x8,
|
|
|
|
TYPE_COMPILED_INT_0 = 0x9,
|
|
|
|
TYPE_COMPILED_INT_1 = 0xA,
|
|
|
|
TYPE_NUMTYPES = 0xB,
|
|
|
|
};
|
|
|
|
|
2021-12-25 22:36:38 +01:00
|
|
|
class KeyValues
|
|
|
|
{
|
|
|
|
public:
|
2022-04-09 16:16:40 +02:00
|
|
|
static void Init(void);
|
|
|
|
KeyValues* FindKey(const char* pKeyName, bool bCreate);
|
|
|
|
const char* GetName(void) const;
|
|
|
|
int GetInt(const char* pKeyName, int nDefaultValue);
|
|
|
|
void SetInt(const char* pKeyName, int iValue);
|
|
|
|
void SetFloat(const char* keyName, float flValue);
|
2021-12-25 22:36:38 +01:00
|
|
|
|
2022-05-28 02:05:54 +02:00
|
|
|
static void InitPlaylists(void);
|
|
|
|
static void InitFileSystem(void);
|
2022-04-09 16:16:40 +02:00
|
|
|
static bool LoadPlaylist(const char* szPlaylist);
|
2022-05-28 02:05:54 +02:00
|
|
|
static KeyValues* ReadKeyValuesFile(CFileSystem_Stdio* pFileSystem, const char* pFileName);
|
2021-12-25 22:36:38 +01:00
|
|
|
|
|
|
|
public:
|
|
|
|
uint32_t m_iKeyName : 24; // 0x0000
|
|
|
|
uint32_t m_iKeyNameCaseSensitive : 8; // 0x0003
|
|
|
|
char* m_sValue; // 0x0008
|
|
|
|
wchar_t* m_wsValue; // 0x0010
|
2022-05-27 02:08:51 +02:00
|
|
|
union // 0x0018
|
|
|
|
{
|
|
|
|
int m_iValue;
|
|
|
|
float m_flValue;
|
|
|
|
void* m_pValue;
|
|
|
|
unsigned char m_Color[4];
|
|
|
|
};
|
|
|
|
char m_szShortName[8]; // 0x0020
|
2021-12-25 22:36:38 +01:00
|
|
|
char m_iDataType; // 0x0028
|
|
|
|
uint16_t m_iKeyNameCaseSensitive2; // 0x002A
|
|
|
|
KeyValues* m_pPeer; // 0x0030
|
|
|
|
KeyValues* m_pSub; // 0x0038
|
|
|
|
KeyValues* m_pChain; // 0x0040
|
|
|
|
};
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
void CKeyValueSystem_Attach();
|
|
|
|
void CKeyValueSystem_Detach();
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
extern KeyValues** g_pPlaylistKeyValues;
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
2022-05-13 14:53:25 +02:00
|
|
|
class VKeyValues : public IDetour
|
2021-12-25 22:36:38 +01:00
|
|
|
{
|
2022-04-11 01:44:30 +02:00
|
|
|
virtual void GetAdr(void) const
|
2021-12-25 22:36:38 +01:00
|
|
|
{
|
2022-05-13 14:53:25 +02:00
|
|
|
spdlog::debug("| FUN: KeyValues::Init : {:#18x} |\n", p_KeyValues_Init.GetPtr());
|
|
|
|
spdlog::debug("| FUN: KeyValues::FindKey : {:#18x} |\n", p_KeyValues_FindKey.GetPtr());
|
|
|
|
spdlog::debug("| FUN: KeyValues::LoadPlaylist : {:#18x} |\n", p_KeyValues_LoadPlaylist.GetPtr());
|
|
|
|
spdlog::debug("| FUN: KeyValues::GetCurrentPlaylist : {:#18x} |\n", p_KeyValues_GetCurrentPlaylist.GetPtr());
|
2022-05-28 02:05:54 +02:00
|
|
|
spdlog::debug("| FUN: KeyValues::ReadKeyValuesFile : {:#18x} |\n", p_KeyValues_ReadKeyValuesFile.GetPtr());
|
2022-05-13 14:53:25 +02:00
|
|
|
spdlog::debug("| VAR: g_pPlaylistKeyValues : {:#18x} |\n", reinterpret_cast<uintptr_t>(g_pPlaylistKeyValues));
|
|
|
|
spdlog::debug("+----------------------------------------------------------------+\n");
|
2021-12-25 22:36:38 +01:00
|
|
|
}
|
2022-04-18 03:35:08 +02:00
|
|
|
virtual void GetFun(void) const
|
|
|
|
{
|
|
|
|
#if defined (GAMEDLL_S0) || defined (GAMEDLL_S1)
|
|
|
|
p_KeyValues_Init = g_mGameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x40\x53\x48\x83\xEC\x20\x48\x8B\xD9\xC7\x44\x24\x30\xFF\xFF\xFF"), "xxxxxxxxxxxxxxxx");
|
|
|
|
p_KeyValues_FindKey = g_mGameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\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_mGameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x48\x8B\x0D\x00\x00\x00\x00\x48\x85\xC9\x75\x08\x48\x8D\x05\x00\x00\x00\x00"), "xxx????xxxxxxxx????");
|
2022-05-28 02:05:54 +02:00
|
|
|
p_KeyValues_ReadKeyValuesFile = g_mGameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x48\x89\x5C\x24\x00\x55\x56\x57\x41\x54\x41\x57\x48\x8D\x6C\x24\x00"), "xxxx?xxxxxxxxxxx?");
|
2022-04-18 03:35:08 +02:00
|
|
|
#elif defined (GAMEDLL_S2) || defined (GAMEDLL_S3)
|
|
|
|
p_KeyValues_Init = g_mGameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x40\x53\x48\x83\xEC\x20\x48\x8B\x05\x00\x00\x00\x01\x48\x8B\xD9\x4C\x8B\xC2"), "xxxxxxxxx???xxxxxxx");
|
|
|
|
p_KeyValues_FindKey = g_mGameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x40\x56\x57\x41\x57\x48\x81\xEC\x00\x00\x00\x00\x45"), "xxxxxxxx????x");
|
|
|
|
p_KeyValues_GetCurrentPlaylist = g_mGameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\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");
|
2022-05-28 02:05:54 +02:00
|
|
|
p_KeyValues_ReadKeyValuesFile = g_mGameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\x48\x8B\xC4\x55\x53\x57\x41\x54\x48\x8D\x68\xA1"), "xxxxxxxxxxxx");
|
2022-04-18 03:35:08 +02:00
|
|
|
#endif
|
|
|
|
p_KeyValues_LoadPlaylist = g_mGameDll.FindPatternSIMD(reinterpret_cast<rsig_t>("\xE8\x00\x00\x00\x00\x80\x3D\x00\x00\x00\x00\x00\x74\x0C"), "x????xx?????xx").FollowNearCallSelf().GetPtr();
|
|
|
|
|
2022-05-28 02:05:54 +02:00
|
|
|
KeyValues_Init = p_KeyValues_Init.RCast<void* (*)(KeyValues*, const char*, int64_t, bool)>(); /*40 53 48 83 EC 20 48 8B 05 ?? ?? ?? 01 48 8B D9 4C 8B C2*/
|
|
|
|
KeyValues_FindKey = p_KeyValues_FindKey.RCast<void* (*)(KeyValues*, const char*, bool)>(); /*40 56 57 41 57 48 81 EC 30 01 00 00 45 0F B6 F8*/
|
|
|
|
KeyValues_LoadPlaylist = p_KeyValues_LoadPlaylist.RCast<bool (*)(const char*)>(); /*E8 ?? ?? ?? ?? 80 3D ?? ?? ?? ?? ?? 74 0C*/
|
|
|
|
KeyValues_GetCurrentPlaylist = p_KeyValues_GetCurrentPlaylist.RCast<const char* (*)(void)>(); /*48 8B 05 ?? ?? ?? ?? 48 85 C0 75 08 48 8D 05 ?? ?? ?? ?? C3 0F B7 50 2A*/
|
|
|
|
KeyValues_ReadKeyValuesFile = p_KeyValues_ReadKeyValuesFile.RCast<KeyValues* (*)(CFileSystem_Stdio*, const char*)>(); /*48 8B C4 55 53 57 41 54 48 8D 68 A1*/
|
2022-04-18 03:35:08 +02:00
|
|
|
}
|
|
|
|
virtual void GetVar(void) const
|
|
|
|
{
|
|
|
|
#if defined (GAMEDLL_S0) || defined (GAMEDLL_S1)
|
|
|
|
g_pPlaylistKeyValues = g_mGameDll.FindPatternSIMD(reinterpret_cast<rsig_t>(
|
|
|
|
"\x48\x8B\xC4\x53\x57\x41\x56\x48\x81\xEC\x20"),
|
|
|
|
"xxxxxxxxxxx").FindPatternSelf("48 8B 2D", CMemory::Direction::DOWN, 100).ResolveRelativeAddressSelf(0x3, 0x7).RCast<KeyValues**>();
|
|
|
|
#elif defined (GAMEDLL_S2) || defined (GAMEDLL_S3)
|
|
|
|
g_pPlaylistKeyValues = g_mGameDll.FindPatternSIMD(reinterpret_cast<rsig_t>(
|
|
|
|
"\x48\x89\x5C\x24\x08\x48\x89\x6C\x24\x10\x48\x89\x74\x24\x18\x57\x48\x83\xEC\x20\x48\x8B\xF9\xE8\xB4"),
|
|
|
|
"xxxxxxxxxxxxxxxxxxxxxxxxx").FindPatternSelf("48 8B 0D", CMemory::Direction::DOWN, 100).ResolveRelativeAddressSelf(0x3, 0x7).RCast<KeyValues**>();
|
|
|
|
#endif
|
|
|
|
}
|
2022-04-11 01:44:30 +02:00
|
|
|
virtual void GetCon(void) const { }
|
|
|
|
virtual void Attach(void) const { }
|
|
|
|
virtual void Detach(void) const { }
|
2021-12-25 22:36:38 +01:00
|
|
|
};
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
2022-05-13 14:53:25 +02:00
|
|
|
REGISTER(VKeyValues);
|