Update CServer class

CClient array is part of the CPlayer class. The array has been added, filling up most of the 'unknown' gap. Vtable override functions have been added as the array is static, and therefore requires an implementation of the vtable, these are just stubs however, since the vtable pointer points to the implementation in the engine.
This commit is contained in:
Amos 2023-07-11 08:42:02 +02:00
parent 9a4ee75f2e
commit 126091d3bc
4 changed files with 45 additions and 10 deletions

View File

@ -102,6 +102,40 @@ public: // Hook statics:
static void* VSendSnapshot(CClient* pClient, CClientFrame* pFrame, int nTick, int nTickAck);
static bool VSendNetMsgEx(CClient* pClient, CNetMessage* pMsg, char bLocal, bool bForceReliable, bool bVoice);
private:
// Stub reimplementation to avoid the 'no overrider' compiler errors in the
// CServer class (contains a static array of MAX_PLAYERS of this class).
virtual void* ConnectionStart(INetChannelHandler* chan) { return nullptr; }
virtual void ConnectionClosing(const char* reason, int unk) {}
virtual void ConnectionCrashed(const char* reason) {}
virtual void PacketStart(int incoming_sequence, int outgoing_acknowledged) {}
virtual void PacketEnd(void) {};
virtual void FileRequested(const char* fileName, unsigned int transferID) {}
virtual void ChannelDisconnect(const char* fileName) {}
virtual void* ProcessStringCmd(void) { return nullptr; }
virtual void* ProcessScriptMessage(void) { return nullptr; }
virtual void* ProcessSetConVar(void) { return nullptr; }
virtual bool nullsub_0(void) { return false; }
virtual char ProcessSignonState(void* msg) { return false; } // NET_SignonState
virtual void* ProcessMove(void) { return nullptr; }
virtual void* ProcessVoiceData(void) { return nullptr; }
virtual void* ProcessDurangoVoiceData(void) { return nullptr; }
virtual bool nullsub_1(void) { return false; }
virtual void* ProcessLoadingProgress(void) { return nullptr; }
virtual void* ProcessPersistenceRequestSave(void) { return nullptr; }
virtual bool nullsub_2(void) { return false; }
virtual bool nullsub_3(void) { return false; }
virtual void* ProcessSetPlaylistVarOverride(void) { return nullptr; }
virtual void* ProcessClaimClientSidePickup(void) { return nullptr; }
virtual void* ProcessCmdKeyValues(void) { return nullptr; }
virtual void* ProcessClientTick(void) { return nullptr; }
virtual void* ProcessClientSayText(void) { return nullptr; }
virtual bool nullsub_4(void) { return false; }
virtual bool nullsub_5(void) { return false; }
virtual bool nullsub_6(void) { return false; }
virtual void* ProcessScriptMessageChecksum(void) { return nullptr; }
private:
uint32_t m_nUserID;
edict_t m_nHandle;

View File

@ -95,7 +95,7 @@ void CNetworkStringTableContainer::WriteUpdateMessage(CNetworkStringTableContain
#ifndef CLIENT_DLL
if (sv_stats->GetBool())
{
uint8_t nCPUPercentage = static_cast<uint8_t>(g_pServer[MAX_PLAYERS].GetCPUUsage() * 100.0f);
uint8_t nCPUPercentage = static_cast<uint8_t>(g_pServer->GetCPUUsage() * 100.0f);
SVC_ServerTick serverTick(g_pServer->GetTick(), *host_frametime_unbounded, *host_frametime_stddeviation, nCPUPercentage);
serverTick.m_nGroup = 0;

View File

@ -76,19 +76,20 @@ private:
char m_szHostInfo[128]; // see '[r5apex_ds.exe + 0x237740]' for more details. fmt: '[IPv6]:PORT:TIMEi64u'
char m_nGap0[520];
int m_nSpawnCount;
char m_nGap1[116];
int m_nMaxclients;
char gap_3C0[64];
CClient m_Clients[MAX_PLAYERS];
char gap_25263c0[48];
float m_fCPUPercent;
float m_fStartTime;
float m_fLastCPUCheckTime;
char m_nGap2[303108]; // TODO: Reverse the rest in this gap.
#if defined (GAMEDLL_S2) || defined (GAMEDLL_S3)
char m_nGap3[0x80];
#endif
bool m_bUnk252643C[128]; // Bools of MAX_PLAYERS?
};
#if defined (GAMEDLL_S0) || defined (GAMEDLL_S1)
static_assert(sizeof(CServer) == 0x4A440);
// !TODO: check if struct size is correct for S1!
static_assert(sizeof(CServer) == 0x25220C0);
#else
static_assert(sizeof(CServer) == 0x4A4C0);
static_assert(sizeof(CServer) == 0x25264C0);
#endif
extern CServer* g_pServer;

View File

@ -10,7 +10,7 @@
class IClientMessageHandler
{
public:
virtual void* Destructor(void) = 0;
virtual ~IClientMessageHandler(void) {};
virtual void* ProcessStringCmd(void) = 0;
virtual void* ProcessScriptMessage(void) = 0;
virtual void* ProcessSetConVar(void) = 0;
@ -38,7 +38,7 @@ public:
class INetChannelHandler
{
public:
virtual ~INetChannelHandler(void) = 0;
virtual ~INetChannelHandler(void) {};
virtual void*ConnectionStart(INetChannelHandler* chan) = 0;
virtual void ConnectionClosing(const char* reason, int unk) = 0;
virtual void ConnectionCrashed(const char* reason) = 0;