2021-12-25 22:36:38 +01:00
|
|
|
#pragma once
|
2022-03-26 00:24:13 +01:00
|
|
|
#include "common/protocol.h"
|
2022-04-02 02:48:54 +02:00
|
|
|
#include "engine/net_chan.h"
|
2022-03-27 23:50:35 +02:00
|
|
|
#include "server/IVEngineServer.h"
|
2022-03-26 00:24:13 +01:00
|
|
|
|
2022-03-27 23:50:35 +02:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
// Forward declarations
|
|
|
|
//-----------------------------------------------------------------------------
|
2022-03-27 19:35:33 +02:00
|
|
|
class CBaseServer;
|
2022-03-27 23:50:35 +02:00
|
|
|
class CBaseClient;
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
extern CBaseClient* g_pClient;
|
2022-03-27 19:35:33 +02:00
|
|
|
|
2022-03-26 00:24:13 +01:00
|
|
|
class CBaseClient
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
CBaseClient* GetClient(int nIndex) const;
|
2022-03-28 14:22:27 +02:00
|
|
|
std::int32_t GetUserID(void) const;
|
|
|
|
std::int64_t GetOriginID(void) const;
|
2022-03-26 00:24:13 +01:00
|
|
|
SIGNONSTATE GetSignonState(void) const;
|
|
|
|
PERSISTENCE GetPersistenceState(void) const;
|
2022-04-02 02:48:54 +02:00
|
|
|
CNetChan* GetNetChan(void) const;
|
2022-03-28 14:22:27 +02:00
|
|
|
void SetUserID(std::int32_t nUserID);
|
|
|
|
void SetOriginID(std::int64_t nOriginID);
|
2022-03-26 00:24:13 +01:00
|
|
|
void SetSignonState(SIGNONSTATE nSignonState);
|
|
|
|
void SetPersistenceState(PERSISTENCE nPersistenceState);
|
2022-04-02 02:48:54 +02:00
|
|
|
void SetNetChan(CNetChan* pNetChan); // !TODO: HACK!
|
2022-03-26 00:24:13 +01:00
|
|
|
bool IsConnected(void) const;
|
|
|
|
bool IsSpawned(void) const;
|
|
|
|
bool IsActive(void) const;
|
|
|
|
bool IsPersistenceAvailable(void) const;
|
|
|
|
bool IsPersistenceReady(void) const;
|
|
|
|
bool IsFakeClient(void) const;
|
|
|
|
bool IsHumanPlayer(void) const;
|
|
|
|
static bool Connect(CBaseClient* pClient, const char* szName, void* pNetChannel, bool bFakePlayer, void* a5, char* szMessage, int nMessageSize);
|
2022-03-28 14:22:27 +02:00
|
|
|
static void Clear(CBaseClient* pBaseClient);
|
2022-03-26 00:24:13 +01:00
|
|
|
|
|
|
|
private:
|
2022-03-27 19:35:33 +02:00
|
|
|
// [ PIXIE ]: AMOS PLEASE VERIFY STRUCT INTEGRITY FOR EARLIER SEASONS. THERE WAS A PADDING AFTER ORIGINID BEFORE.
|
2022-04-02 02:48:54 +02:00
|
|
|
char pad_0000[16]; //0x0000
|
|
|
|
std::int32_t m_nUserID; //0x0010
|
|
|
|
char pad_0014[844]; //0x0014
|
|
|
|
void* m_ConVars; //0x0360 This is a KeyValue*!
|
|
|
|
char pad_0368[8]; //0x0368
|
|
|
|
CBaseServer* m_Server; //0x0370
|
|
|
|
char pad_0378[40]; //0x0378
|
|
|
|
CNetChan* m_NetChannel; //0x03A0
|
|
|
|
char pad_03A8[8]; //0x03A8
|
|
|
|
SIGNONSTATE m_nSignonState; //0x03B0
|
|
|
|
std::int32_t m_nDeltaTick; //0x03B4
|
|
|
|
std::int64_t m_nOriginID; //0x03B8
|
|
|
|
char pad_03C0[480]; //0x03C0
|
|
|
|
bool m_bFakePlayer; //0x05A0
|
|
|
|
bool m_bReceivedPacket; //0x05A1
|
|
|
|
bool m_bLowViolence; //0x05A2
|
|
|
|
bool m_bFullyAuthenticated; //0x05A3
|
|
|
|
char pad_05A4[24]; //0x05A4
|
2022-03-27 19:35:33 +02:00
|
|
|
PERSISTENCE m_nPersistenceState; //0x05BC
|
2022-04-02 02:48:54 +02:00
|
|
|
char pad_05C0[302676]; //0x05C0
|
2022-03-27 19:35:33 +02:00
|
|
|
std::int32_t m_LastMovementTick; //0x4A414
|
2022-04-02 02:48:54 +02:00
|
|
|
char pad_4A418[168]; //0x4A418
|
2022-03-26 00:24:13 +01:00
|
|
|
};
|
2022-03-28 14:22:27 +02:00
|
|
|
#if defined (GAMEDLL_S0) || defined (GAMEDLL_S1)
|
|
|
|
static_assert(sizeof(CBaseClient) == 0x4A440);
|
|
|
|
#else
|
|
|
|
static_assert(sizeof(CBaseClient) == 0x4A4C0);
|
|
|
|
#endif
|
|
|
|
|
2021-12-25 22:36:38 +01:00
|
|
|
|
|
|
|
namespace
|
|
|
|
{
|
|
|
|
/* ==== CBASECLIENT ===================================================================================================================================================== */
|
2022-03-26 00:24:13 +01:00
|
|
|
ADDRESS p_CBaseClient_Connect = g_mGameDll.FindPatternSIMD((std::uint8_t*)"\x40\x53\x41\x56\x41\x57\x48\x83\xEC\x20\x48\x8B\xD9\x48\x89\x74", "xxxxxxxxxxxxxxxx"); /*40 53 41 56 41 57 48 83 EC 20 48 8B D9 48 89 74*/
|
|
|
|
bool (*CBaseClient_Connect)(CBaseClient* pClient, const char* szName, void* pNetChannel, bool bFakePlayer, void* a5, char* szMessage, int nMessageSize) = (bool (*)(CBaseClient*, const char*, void*, bool, void*, char*, int))p_CBaseClient_Connect.GetPtr();
|
|
|
|
|
2021-12-25 22:36:38 +01:00
|
|
|
ADDRESS p_CBaseClient_Clear = g_mGameDll.FindPatternSIMD((std::uint8_t*)"\x40\x53\x41\x56\x41\x57\x48\x83\xEC\x20\x48\x8B\xD9\x48\x89\x74", "xxxxxxxxxxxxxxxx");
|
2022-03-28 14:22:27 +02:00
|
|
|
void (*CBaseClient_Clear)(CBaseClient* pClient) = (void (*)(CBaseClient*))p_CBaseClient_Clear.GetPtr(); /*40 53 41 56 41 57 48 83 EC 20 48 8B D9 48 89 74*/
|
2022-03-27 23:50:35 +02:00
|
|
|
|
|
|
|
static ADDRESS g_pClientBuffer = p_IVEngineServer__PersistenceAvailable.FindPatternSelf("48 8D 0D", ADDRESS::Direction::DOWN, 150).ResolveRelativeAddressSelf(0x3, 0x7);
|
|
|
|
|
|
|
|
// Notes for earlier seasons.
|
|
|
|
#if defined (GAMEDLL_S0) || defined (GAMEDLL_S1)
|
|
|
|
const std::uintptr_t g_dwCClientSize = 0x4A440;
|
|
|
|
const std::uintptr_t g_dwPersistenceVar = 0x5B4;
|
|
|
|
const std::uintptr_t g_dwCClientPadding = 0x49E88;
|
|
|
|
#endif
|
2021-12-25 22:36:38 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
void CBaseClient_Attach();
|
|
|
|
void CBaseClient_Detach();
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
class HBaseClient : public IDetour
|
|
|
|
{
|
|
|
|
virtual void debugp()
|
|
|
|
{
|
2022-03-27 23:50:35 +02:00
|
|
|
std::cout << "| VAR: g_pClient : 0x" << std::hex << std::uppercase << g_pClient << std::setw(0) << " |" << std::endl;
|
2022-03-26 00:24:13 +01:00
|
|
|
std::cout << "| FUN: CBaseClient::Connect : 0x" << std::hex << std::uppercase << p_CBaseClient_Connect.GetPtr() << std::setw(npad) << " |" << std::endl;
|
|
|
|
std::cout << "| FUN: CBaseClient::Clear : 0x" << std::hex << std::uppercase << p_CBaseClient_Clear.GetPtr() << std::setw(npad) << " |" << std::endl;
|
2021-12-25 22:36:38 +01:00
|
|
|
std::cout << "+----------------------------------------------------------------+" << std::endl;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
REGISTER(HBaseClient);
|