2021-12-25 22:36:38 +01:00
|
|
|
#pragma once
|
2023-01-29 15:12:27 +01:00
|
|
|
#include "tier1/NetAdr.h"
|
2022-05-15 00:29:25 +02:00
|
|
|
#include "tier1/mempool.h"
|
|
|
|
#include "common/protocol.h"
|
2022-08-09 17:18:07 +02:00
|
|
|
#include "public/inetmsghandler.h"
|
2022-08-15 14:47:42 +02:00
|
|
|
#include "public/isnapshotmgr.h"
|
2022-05-15 00:29:25 +02:00
|
|
|
#include "engine/net_chan.h"
|
2022-01-04 11:53:54 +01:00
|
|
|
#include "engine/debugoverlay.h"
|
2022-05-15 00:29:25 +02:00
|
|
|
#include "engine/clockdriftmgr.h"
|
|
|
|
#include "engine/framesnapshot.h"
|
|
|
|
#include "engine/packed_entity.h"
|
2023-06-22 00:33:00 +02:00
|
|
|
#include "datablock_receiver.h"
|
2021-12-25 22:36:38 +01:00
|
|
|
|
2023-10-15 10:40:46 +02:00
|
|
|
struct connectparams_t
|
|
|
|
{
|
|
|
|
const char* netAdr;
|
|
|
|
const char* netKey;
|
|
|
|
int unkReconnect;
|
|
|
|
int unk;
|
|
|
|
bool challengeRequest;
|
|
|
|
bool asSpectator_MAYBE;
|
|
|
|
};
|
|
|
|
|
2022-08-15 14:47:42 +02:00
|
|
|
class CClientSnapshotManager : public IClientSnapshotManager
|
2022-05-15 00:29:25 +02:00
|
|
|
{
|
2022-08-15 14:47:42 +02:00
|
|
|
public:
|
|
|
|
virtual ~CClientSnapshotManager(void){};
|
|
|
|
|
2022-05-15 00:29:25 +02:00
|
|
|
void* m_Frames;
|
|
|
|
CUtlMemoryPool m_ClientFramePool;
|
|
|
|
};
|
2023-04-02 10:48:44 +02:00
|
|
|
|
2022-01-04 11:53:54 +01:00
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
2022-05-20 11:52:19 +02:00
|
|
|
class CClientState : CS_INetChannelHandler, IConnectionlessPacketHandler, IServerMessageHandler, CClientSnapshotManager
|
2022-01-04 11:53:54 +01:00
|
|
|
{
|
2023-06-22 00:33:00 +02:00
|
|
|
friend class ClientDataBlockReceiver;
|
2023-02-18 00:31:57 +01:00
|
|
|
public: // Hook statics.
|
2023-06-18 17:10:57 +02:00
|
|
|
static void VConnectionClosing(CClientState* thisptr, const char* szReason);
|
2023-11-25 17:41:08 +01:00
|
|
|
static bool _ProcessStringCmd(CClientState* thisptr, NET_StringCmd* msg);
|
2023-02-18 00:31:57 +01:00
|
|
|
static bool VProcessServerTick(CClientState* thisptr, SVC_ServerTick* msg);
|
2023-10-15 10:40:46 +02:00
|
|
|
static void VConnect(CClientState* thisptr, connectparams_t* connectParams);
|
2023-02-18 00:31:57 +01:00
|
|
|
|
2022-01-04 11:53:54 +01:00
|
|
|
public:
|
2022-10-29 00:01:10 +02:00
|
|
|
bool IsPaused() const;
|
2022-11-10 11:47:02 +01:00
|
|
|
bool IsActive(void) const;
|
|
|
|
bool IsConnected(void) const;
|
|
|
|
bool IsConnecting(void) const;
|
|
|
|
|
2022-10-29 00:01:10 +02:00
|
|
|
float GetClientTime() const;
|
2022-07-03 11:03:25 +02:00
|
|
|
|
|
|
|
int GetTick() const;
|
|
|
|
|
|
|
|
int GetServerTickCount() const; // Get the server tick count.
|
|
|
|
void SetServerTickCount(int tick);
|
|
|
|
|
2022-01-04 11:53:54 +01:00
|
|
|
int GetClientTickCount() const; // Get the client tick count.
|
2022-07-03 11:03:25 +02:00
|
|
|
void SetClientTickCount(int tick);
|
2022-05-15 00:29:25 +02:00
|
|
|
|
2023-06-03 18:06:35 +02:00
|
|
|
float GetFrameTime(void) const;
|
|
|
|
|
2023-10-22 17:00:56 +02:00
|
|
|
bool Authenticate(connectparams_t* connectParams, char* const reasonBuf, const size_t reasonBufLen) const;
|
2023-10-15 10:40:46 +02:00
|
|
|
|
2023-11-25 17:41:08 +01:00
|
|
|
protected:
|
|
|
|
FORCEINLINE CClientState* GetShiftedBasePointer(void)
|
|
|
|
{
|
|
|
|
char* const pShifted = reinterpret_cast<char*>(this) - 0x10; // Shifted due to compiler optimizations.
|
|
|
|
return reinterpret_cast<CClientState*>(pShifted);
|
|
|
|
}
|
|
|
|
|
|
|
|
public:
|
2022-05-15 00:29:25 +02:00
|
|
|
int m_Socket;
|
|
|
|
int _padding_maybe;
|
|
|
|
CNetChan* m_NetChannel;
|
|
|
|
double m_flConnectTime;
|
|
|
|
_DWORD m_nRetryNumber;
|
|
|
|
_DWORD m_nChallengeRetryLimit;
|
|
|
|
_BYTE encrypted_connection_MAYBE;
|
|
|
|
_BYTE gap79[3];
|
2023-01-29 15:12:27 +01:00
|
|
|
netadr_t addr;
|
2022-05-15 00:29:25 +02:00
|
|
|
bool m_bUnk_used_during_auth;
|
|
|
|
char m_bSendChallengeRequest;
|
|
|
|
_BYTE m_bDoNetParamsReconnect_MAYBE;
|
|
|
|
_BYTE field_97;
|
|
|
|
SIGNONSTATE m_nSignonState;
|
|
|
|
_BYTE gap9C[4];
|
|
|
|
double m_flNextCmdTime;
|
|
|
|
int m_nServerCount;
|
2023-01-20 16:01:00 +01:00
|
|
|
int m_nInSequenceNr;
|
2022-08-18 11:35:32 +02:00
|
|
|
float m_flClockDriftFrameTime;
|
2022-05-15 00:29:25 +02:00
|
|
|
CClockDriftMgr m_ClockDriftMgr;
|
|
|
|
_BYTE field_148;
|
|
|
|
_BYTE field_149;
|
|
|
|
int m_nDeltaTick;
|
|
|
|
int m_nStringTableAckTick;
|
|
|
|
int m_nProcesseedDeltaTick;
|
|
|
|
int m_nProcessedStringTableAckTick;
|
|
|
|
bool m_bPendingTicksAvailable;
|
2023-04-02 10:48:44 +02:00
|
|
|
_BYTE field_15D;
|
|
|
|
_BYTE field_15E;
|
|
|
|
_BYTE field_15F;
|
|
|
|
_BYTE m_bPaused;
|
2022-05-15 00:29:25 +02:00
|
|
|
char field_161;
|
|
|
|
char field_162;
|
|
|
|
_DWORD dword164;
|
|
|
|
int m_nViewEntity_MAYBE_ClientSlot_Plus_One;
|
|
|
|
int m_nPlayerSlot;
|
|
|
|
char m_szLevelFileName[64];
|
|
|
|
char m_szLevelBaseName[64];
|
2023-08-27 00:20:35 +02:00
|
|
|
char m_szLastLevelBaseName[64];
|
|
|
|
char m_szSkyBoxBaseName[64];
|
|
|
|
char m_szServerAddresString[128];
|
2022-05-15 00:29:25 +02:00
|
|
|
int m_bInMpLobbyMenu;
|
|
|
|
int m_nTeam;
|
|
|
|
_DWORD m_nMaxClients;
|
2023-04-02 10:48:44 +02:00
|
|
|
_DWORD field_2FC;
|
|
|
|
_DWORD reconnect_unk;
|
2022-08-15 14:47:42 +02:00
|
|
|
float m_flTickTime;
|
|
|
|
float m_flOldTickTime;
|
2022-05-15 00:29:25 +02:00
|
|
|
_BYTE m_bSignonChallengeReceived;
|
|
|
|
_DWORD challenge;
|
2023-01-29 15:12:27 +01:00
|
|
|
netadr_t challengeAddr;
|
2023-08-21 20:43:36 +02:00
|
|
|
bool m_bUseLocalSendTableFile;
|
2022-05-15 00:29:25 +02:00
|
|
|
_QWORD m_pServerClasses;
|
|
|
|
int m_nServerClasses;
|
|
|
|
int m_nServerClassBits;
|
|
|
|
__int64 m_StringTableContainer;
|
|
|
|
char m_PersistenceData[98304];
|
|
|
|
_BYTE m_bPersistenceBaselineRecvd;
|
2023-04-02 10:48:44 +02:00
|
|
|
int m_nPersistenceBaselineEntries;
|
|
|
|
int field_18350;
|
2022-08-15 14:47:42 +02:00
|
|
|
bool m_bRestrictServerCommands;
|
|
|
|
bool m_bRestrictClientCommands;
|
2022-05-15 00:29:25 +02:00
|
|
|
char buffer_0x400[1024];
|
2023-08-26 01:25:07 +02:00
|
|
|
ClientDataBlockReceiver m_DataBlockReceiver;
|
2022-05-15 00:29:25 +02:00
|
|
|
char client_requested_disconnect;
|
|
|
|
char error_message[512];
|
|
|
|
_BYTE gap18CA1[3];
|
|
|
|
_DWORD last_usercmd_time_from_server_maybe;
|
2023-06-03 18:06:35 +02:00
|
|
|
CFrameSnapshot* m_PrevFrameSnapshot;
|
2022-05-15 00:29:25 +02:00
|
|
|
_QWORD qword18CB0;
|
2023-06-03 18:06:35 +02:00
|
|
|
CFrameSnapshot* m_CurrFrameSnapshot;
|
2022-05-15 00:29:25 +02:00
|
|
|
_BYTE gap18CC0[8];
|
2022-08-18 02:15:23 +02:00
|
|
|
char m_bClockCorrectionEnabled;
|
2022-05-15 00:29:25 +02:00
|
|
|
char m_b_unknown;
|
|
|
|
bool m_bLocalPredictionInitialized_MAYBE;
|
2022-08-18 11:35:32 +02:00
|
|
|
int m_nServerTick;
|
2022-05-15 00:29:25 +02:00
|
|
|
int dword18CD0;
|
|
|
|
int field_18CD4;
|
2022-08-18 11:35:32 +02:00
|
|
|
float m_flFrameTime;
|
2023-06-03 21:20:23 +02:00
|
|
|
int m_nOutgoingCommandNr;
|
2022-05-15 00:29:25 +02:00
|
|
|
int current_movement_sequence_number;
|
|
|
|
char gap18CE4[4];
|
|
|
|
__int64 qword18CE8;
|
|
|
|
int field_18CF0;
|
|
|
|
int hit_prespawn;
|
|
|
|
int field_18CF8;
|
|
|
|
int dword18CFC;
|
|
|
|
float m_flClockDriftUnknown_rounded;
|
|
|
|
char something_with_prediction;
|
|
|
|
char field_18D05;
|
|
|
|
char gap18D06[2];
|
|
|
|
int dword18D08;
|
|
|
|
char gap18D0C[13];
|
|
|
|
char do_local_prediction_update;
|
|
|
|
char gap18D1A[2];
|
|
|
|
int dword18D1C;
|
|
|
|
__int64 qword18D20;
|
|
|
|
int dword18D28;
|
|
|
|
int dword18D2C;
|
2023-08-26 01:25:07 +02:00
|
|
|
Vector3D field_18D30;
|
2022-05-15 00:29:25 +02:00
|
|
|
int dword18D3C;
|
|
|
|
int dword18D40;
|
|
|
|
char gap18D44[4];
|
|
|
|
__int64 qword18D48;
|
|
|
|
__int64 qword18D50;
|
|
|
|
__int64 qword18D58;
|
|
|
|
int dword18D60;
|
|
|
|
char gap18D64[4];
|
|
|
|
__int64 qword18D68;
|
|
|
|
char buffer_47128[47128];
|
|
|
|
char entitlements_bitfield[16];
|
|
|
|
__int64 maybe_some_ll_stuff;
|
|
|
|
__int64 qword245A8;
|
|
|
|
__int64 qword245B0;
|
|
|
|
__int64 qword245B8;
|
|
|
|
__int64 qword245C0;
|
|
|
|
__int64 qword245C8;
|
|
|
|
__int64 qword245D0;
|
|
|
|
__int64 qword245D8;
|
|
|
|
__int64 qword245E0;
|
|
|
|
__int64 qword245E8;
|
|
|
|
__int64 qword245F0;
|
|
|
|
int dword245F8;
|
|
|
|
char gap245FC[1024];
|
2023-08-26 01:25:07 +02:00
|
|
|
int dword249EC;
|
2022-05-15 00:29:25 +02:00
|
|
|
__int64 m_pModelPrecacheTable;
|
|
|
|
__int64 qword24A10;
|
|
|
|
__int64 m_pInstanceBaselineTable;
|
|
|
|
__int64 m_pLightStyleTable;
|
|
|
|
__int64 m_pUserInfoTable;
|
|
|
|
__int64 m_pServerStartupTable;
|
|
|
|
PackedEntity m_pEntityBaselines_maybe[4096];
|
|
|
|
char byte34A38;
|
|
|
|
char field_34A39[7];
|
2022-01-04 11:53:54 +01:00
|
|
|
};
|
2023-08-26 01:25:07 +02:00
|
|
|
static_assert(sizeof(CClientState) == 0x34A20);
|
2023-04-02 10:48:44 +02:00
|
|
|
|
2022-05-20 20:14:39 +02:00
|
|
|
#ifndef DEDICATED
|
|
|
|
extern CClientState* g_pClientState;
|
2022-08-18 02:15:23 +02:00
|
|
|
extern CClientState** g_pClientState_Shifted; // Shifted by 0x10 forward!
|
2022-05-20 20:14:39 +02:00
|
|
|
#endif // DEDICATED
|
2021-12-25 22:36:38 +01:00
|
|
|
|
2022-04-09 06:05:47 +02:00
|
|
|
/* ==== CCLIENTSTATE ==================================================================================================================================================== */
|
2023-07-02 23:01:29 +02:00
|
|
|
inline void(*CClientState__RunFrame)(CClientState* thisptr);
|
2023-10-15 10:40:46 +02:00
|
|
|
inline void(*CClientState__Connect)(CClientState* thisptr, connectparams_t* connectParams);
|
2023-07-02 23:01:29 +02:00
|
|
|
inline void(*CClientState__Disconnect)(CClientState* thisptr, bool bSendTrackingContext);
|
|
|
|
inline void(*CClientState__ConnectionClosing)(CClientState* thisptr, const char* szReason);
|
2023-11-25 17:41:08 +01:00
|
|
|
inline bool(*CClientState__ProcessStringCmd)(CClientState* thisptr, NET_StringCmd* msg);
|
2023-07-02 23:01:29 +02:00
|
|
|
inline bool(*CClientState__ProcessServerTick)(CClientState* thisptr, SVC_ServerTick* msg);
|
2023-02-18 00:31:57 +01:00
|
|
|
|
2021-12-25 22:36:38 +01:00
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
2022-05-20 11:52:19 +02:00
|
|
|
class VClientState : 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
|
|
|
{
|
2024-01-02 15:21:36 +01:00
|
|
|
LogFunAdr("CClientState::RunFrame", CClientState__RunFrame);
|
|
|
|
LogFunAdr("CClientState::Connect", CClientState__Connect);
|
|
|
|
LogFunAdr("CClientState::Disconnect", CClientState__Disconnect);
|
|
|
|
LogFunAdr("CClientState::ConnectionClosing", CClientState__ConnectionClosing);
|
|
|
|
LogFunAdr("CClientState::ProcessStringCmd", CClientState__ProcessStringCmd);
|
|
|
|
LogFunAdr("CClientState::ProcessServerTick", CClientState__ProcessServerTick);
|
|
|
|
LogVarAdr("g_ClientState", g_pClientState);
|
|
|
|
LogVarAdr("g_ClientState_Shifted", g_pClientState_Shifted);
|
2021-12-25 22:36:38 +01:00
|
|
|
}
|
2022-05-20 10:16:21 +02:00
|
|
|
virtual void GetFun(void) const
|
|
|
|
{
|
2024-01-02 15:21:36 +01:00
|
|
|
g_GameDll.FindPatternSIMD("40 53 48 81 EC ?? ?? ?? ?? 83 B9 ?? ?? ?? ?? ?? 48 8B D9 7D 0B").GetPtr(CClientState__RunFrame);
|
|
|
|
g_GameDll.FindPatternSIMD("48 89 5C 24 ?? 48 89 74 24 ?? 48 89 7C 24 ?? 41 56 48 81 EC ?? ?? ?? ?? 48 8B 32").GetPtr(CClientState__Connect);
|
|
|
|
g_GameDll.FindPatternSIMD("40 56 57 41 54 41 55 41 57 48 83 EC 30 44 0F B6 FA").GetPtr(CClientState__Disconnect);
|
|
|
|
g_GameDll.FindPatternSIMD("40 53 48 83 EC 20 83 B9 ?? ?? ?? ?? ?? 48 8B DA 0F 8E ?? ?? ?? ??").GetPtr(CClientState__ConnectionClosing);
|
|
|
|
g_GameDll.FindPatternSIMD("40 53 48 81 EC ?? ?? ?? ?? 80 B9 ?? ?? ?? ?? ?? 48 8B DA").GetPtr(CClientState__ProcessStringCmd);
|
|
|
|
g_GameDll.FindPatternSIMD("40 57 48 83 EC 20 83 B9 ?? ?? ?? ?? ?? 48 8B F9 7C 66").GetPtr(CClientState__ProcessServerTick);
|
2022-05-20 10:16:21 +02:00
|
|
|
}
|
2022-04-18 03:35:08 +02:00
|
|
|
virtual void GetVar(void) const
|
|
|
|
{
|
2022-12-01 22:44:55 +01:00
|
|
|
g_pClientState = g_GameDll.FindPatternSIMD("0F 84 ?? ?? ?? ?? 48 8D 0D ?? ?? ?? ?? 48 83 C4 28").FindPatternSelf("48 8D").ResolveRelativeAddressSelf(0x3, 0x7).RCast<CClientState*>(); /*0F 84 ? ? ? ? 48 8D 0D ? ? ? ? 48 83 C4 28*/
|
2023-01-31 20:54:58 +01:00
|
|
|
g_pClientState_Shifted = reinterpret_cast<CClientState**>(reinterpret_cast<int64_t*>(g_pClientState)+1); // Shift by 8 bytes.
|
2022-05-07 17:52:41 +02:00
|
|
|
}
|
2022-05-20 20:14:39 +02:00
|
|
|
virtual void GetCon(void) const { }
|
2023-11-26 13:21:20 +01:00
|
|
|
virtual void Detour(const bool bAttach) const;
|
2021-12-25 22:36:38 +01:00
|
|
|
};
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|