From 62f3108909df0a44c4dd6c664013d937ef64a76d Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Sat, 21 May 2022 18:56:56 +0200 Subject: [PATCH] Cleanup 'NET_DisconnectClient()' --- r5dev/engine/client/client.cpp | 39 +++++++++++++++++++++++++++------- r5dev/engine/client/client.h | 30 ++++++++++++++------------ r5dev/engine/net.cpp | 3 +-- r5dev/engine/net.h | 4 ++-- r5dev/engine/net_chan.cpp | 8 +++++++ r5dev/engine/net_chan.h | 24 +++++++++++++++++++++ 6 files changed, 82 insertions(+), 26 deletions(-) diff --git a/r5dev/engine/client/client.cpp b/r5dev/engine/client/client.cpp index 804a1198..dcda4318 100644 --- a/r5dev/engine/client/client.cpp +++ b/r5dev/engine/client/client.cpp @@ -169,13 +169,36 @@ bool CClient::IsHumanPlayer(void) const return true; } +//--------------------------------------------------------------------------------- +// Purpose: throw away any residual garbage in the channel +//--------------------------------------------------------------------------------- +void CClient::Clear(void) +{ + v_CClient_Clear(this); +} + //--------------------------------------------------------------------------------- // Purpose: throw away any residual garbage in the channel // Input : *pBaseClient - //--------------------------------------------------------------------------------- -void CClient::Clear(CClient* pBaseClient) +void CClient::VClear(CClient* pBaseClient) { - CBaseClient_Clear(pBaseClient); + v_CClient_Clear(pBaseClient); +} + +//--------------------------------------------------------------------------------- +// Purpose: connect new client +// Input : *szName - +// *pNetChannel - +// bFakePlayer - +// *a5 - +// *szMessage - +// nMessageSize - +// Output : true if connection was succesfull, false otherwise +//--------------------------------------------------------------------------------- +bool CClient::Connect(const char* szName, void* pNetChannel, bool bFakePlayer, void* a5, char* szMessage, int nMessageSize) +{ + return v_CClient_Connect(this, szName, pNetChannel, bFakePlayer, a5, szMessage, nMessageSize); } //--------------------------------------------------------------------------------- @@ -189,21 +212,21 @@ void CClient::Clear(CClient* pBaseClient) // nMessageSize - // Output : true if connection was succesfull, false otherwise //--------------------------------------------------------------------------------- -bool CClient::Connect(CClient* pClient, const char* szName, void* pNetChannel, bool bFakePlayer, void* a5, char* szMessage, int nMessageSize) +bool CClient::VConnect(CClient* pClient, const char* szName, void* pNetChannel, bool bFakePlayer, void* a5, char* szMessage, int nMessageSize) { - return CBaseClient_Connect(pClient, szName, pNetChannel, bFakePlayer, a5, szMessage, nMessageSize); + return v_CClient_Connect(pClient, szName, pNetChannel, bFakePlayer, a5, szMessage, nMessageSize); } /////////////////////////////////////////////////////////////////////////////////// void CBaseClient_Attach() { - DetourAttach((LPVOID*)&CBaseClient_Clear, &CClient::Clear); - DetourAttach((LPVOID*)&CBaseClient_Connect, &CClient::Connect); + DetourAttach((LPVOID*)&v_CClient_Clear, &CClient::VClear); + DetourAttach((LPVOID*)&v_CClient_Connect, &CClient::VConnect); } void CBaseClient_Detach() { - DetourDetach((LPVOID*)&CBaseClient_Clear, &CClient::Clear); - DetourDetach((LPVOID*)&CBaseClient_Connect, &CClient::Connect); + DetourDetach((LPVOID*)&v_CClient_Clear, &CClient::VClear); + DetourDetach((LPVOID*)&v_CClient_Connect, &CClient::VConnect); } /////////////////////////////////////////////////////////////////////////////// diff --git a/r5dev/engine/client/client.h b/r5dev/engine/client/client.h index df47a595..dbd88d52 100644 --- a/r5dev/engine/client/client.h +++ b/r5dev/engine/client/client.h @@ -25,7 +25,7 @@ public: void SetOriginID(int64_t nOriginID); void SetSignonState(SIGNONSTATE nSignonState); void SetPersistenceState(PERSISTENCE nPersistenceState); - void SetNetChan(CNetChan* pNetChan); // !TODO: HACK! + void SetNetChan(CNetChan* pNetChan); bool IsConnected(void) const; bool IsSpawned(void) const; bool IsActive(void) const; @@ -33,8 +33,10 @@ public: bool IsPersistenceReady(void) const; bool IsFakeClient(void) const; bool IsHumanPlayer(void) const; - static bool Connect(CClient* pClient, const char* szName, void* pNetChannel, bool bFakePlayer, void* a5, char* szMessage, int nMessageSize); - static void Clear(CClient* pBaseClient); + bool Connect(const char* szName, void* pNetChannel, bool bFakePlayer, void* a5, char* szMessage, int nMessageSize); + static bool VConnect(CClient* pClient, const char* szName, void* pNetChannel, bool bFakePlayer, void* a5, char* szMessage, int nMessageSize); + void Clear(void); + static void VClear(CClient* pBaseClient); private: int32_t m_nUserID; //0x0010 @@ -70,18 +72,18 @@ private: char pad_4A440[48]; //0x4A440 }; #if defined (GAMEDLL_S0) || defined (GAMEDLL_S1) -static_assert(sizeof(CBaseClient) == 0x4A440); +static_assert(sizeof(CClient) == 0x4A440); #else static_assert(sizeof(CClient) == 0x4A4C0); #endif /* ==== CBASECLIENT ===================================================================================================================================================== */ -inline CMemory p_CBaseClient_Connect; -inline auto CBaseClient_Connect = p_CBaseClient_Connect.RCast(); +inline CMemory p_CClient_Connect; +inline auto v_CClient_Connect = p_CClient_Connect.RCast(); -inline CMemory p_CBaseClient_Clear; -inline auto CBaseClient_Clear = p_CBaseClient_Clear.RCast(); +inline CMemory p_CClient_Clear; +inline auto v_CClient_Clear = p_CClient_Clear.RCast(); inline CMemory g_pClientBuffer; extern CClient* g_pClient; @@ -95,18 +97,18 @@ class VClient : public IDetour { virtual void GetAdr(void) const { - spdlog::debug("| FUN: CClient::Connect : {:#18x} |\n", p_CBaseClient_Connect.GetPtr()); - spdlog::debug("| FUN: CClient::Clear : {:#18x} |\n", p_CBaseClient_Clear.GetPtr()); + spdlog::debug("| FUN: CClient::Connect : {:#18x} |\n", p_CClient_Connect.GetPtr()); + spdlog::debug("| FUN: CClient::Clear : {:#18x} |\n", p_CClient_Clear.GetPtr()); spdlog::debug("| VAR: g_pClient : {:#18x} |\n", reinterpret_cast(g_pClient)); spdlog::debug("+----------------------------------------------------------------+\n"); } virtual void GetFun(void) const { - p_CBaseClient_Connect = g_mGameDll.FindPatternSIMD(reinterpret_cast("\x40\x53\x41\x56\x41\x57\x48\x83\xEC\x20\x48\x8B\xD9\x48\x89\x74"), "xxxxxxxxxxxxxxxx"); - p_CBaseClient_Clear = g_mGameDll.FindPatternSIMD(reinterpret_cast("\x40\x53\x41\x56\x41\x57\x48\x83\xEC\x20\x48\x8B\xD9\x48\x89\x74"), "xxxxxxxxxxxxxxxx"); + p_CClient_Connect = g_mGameDll.FindPatternSIMD(reinterpret_cast("\x40\x53\x41\x56\x41\x57\x48\x83\xEC\x20\x48\x8B\xD9\x48\x89\x74"), "xxxxxxxxxxxxxxxx"); + p_CClient_Clear = g_mGameDll.FindPatternSIMD(reinterpret_cast("\x40\x53\x41\x56\x41\x57\x48\x83\xEC\x20\x48\x8B\xD9\x48\x89\x74"), "xxxxxxxxxxxxxxxx"); - CBaseClient_Connect = p_CBaseClient_Connect.RCast(); /*40 53 41 56 41 57 48 83 EC 20 48 8B D9 48 89 74*/ - CBaseClient_Clear = p_CBaseClient_Clear.RCast(); /*40 53 41 56 41 57 48 83 EC 20 48 8B D9 48 89 74*/ + v_CClient_Connect = p_CClient_Connect.RCast(); /*40 53 41 56 41 57 48 83 EC 20 48 8B D9 48 89 74*/ + v_CClient_Clear = p_CClient_Clear.RCast(); /*40 53 41 56 41 57 48 83 EC 20 48 8B D9 48 89 74*/ } virtual void GetVar(void) const { diff --git a/r5dev/engine/net.cpp b/r5dev/engine/net.cpp index a7ea15b9..dc4564e7 100644 --- a/r5dev/engine/net.cpp +++ b/r5dev/engine/net.cpp @@ -162,8 +162,7 @@ void NET_DisconnectClient(CClient* pClient, int nIndex, const char* szReason, ui } v_NET_Shutdown(pClient->GetNetChan(), szReason, bBadRep, bRemoveNow); // Shutdown netchan. - pClient->SetNetChan(nullptr); // Null netchan. - CBaseClient_Clear(pClient); // Reset CClient instance for client. + pClient->Clear(); // Reset CClient instance for client. g_bIsPersistenceVarSet[nIndex] = false; // Reset Persistence var. #endif // !CLIENT_DLL } diff --git a/r5dev/engine/net.h b/r5dev/engine/net.h index 3a7716fb..2a0bdcba 100644 --- a/r5dev/engine/net.h +++ b/r5dev/engine/net.h @@ -42,7 +42,7 @@ extern string g_szNetKey; extern uintptr_t g_pNetKey; /////////////////////////////////////////////////////////////////////////////// -class VNetChan : public IDetour +class VNet : public IDetour { virtual void GetAdr(void) const { @@ -86,7 +86,7 @@ class VNetChan : public IDetour virtual void Detach(void) const { } }; /////////////////////////////////////////////////////////////////////////////// -REGISTER(VNetChan); +REGISTER(VNet); #endif // !NETCONSOLE const char* NET_ErrorString(int iCode); diff --git a/r5dev/engine/net_chan.cpp b/r5dev/engine/net_chan.cpp index 8dfc87de..d14b820f 100644 --- a/r5dev/engine/net_chan.cpp +++ b/r5dev/engine/net_chan.cpp @@ -190,3 +190,11 @@ bool CNetChan::IsOverflowed(void) const { return this->m_StreamReliable.IsOverflowed(); } + +//----------------------------------------------------------------------------- +// Purpose: clears the netchannel +//----------------------------------------------------------------------------- +void CNetChan::Clear(bool bStopProcessing) +{ + v_NetChan_Clear(this, bStopProcessing); +} diff --git a/r5dev/engine/net_chan.h b/r5dev/engine/net_chan.h index 6f4f54a9..9e937caf 100644 --- a/r5dev/engine/net_chan.h +++ b/r5dev/engine/net_chan.h @@ -99,6 +99,7 @@ public: int GetSocket(void) const; bool IsOverflowed(void) const; + void Clear(bool bStopProcessing); //----------------------------------------------------------------------------- private: bool m_bProcessingMessages; @@ -170,4 +171,27 @@ static_assert(sizeof(CNetChan) == 0x1AD0); static_assert(sizeof(CNetChan) == 0x1AC8); #endif +inline CMemory p_NetChan_Clear; +inline auto v_NetChan_Clear = p_NetChan_Clear.RCast(); +/////////////////////////////////////////////////////////////////////////////// +class VNetChannel : public IDetour +{ + virtual void GetAdr(void) const + { + spdlog::debug("| FUN: CNetChan::Clear : {:#18x} |\n", p_NetChan_Clear.GetPtr()); + spdlog::debug("+----------------------------------------------------------------+\n"); + } + virtual void GetFun(void) const + { + p_NetChan_Clear = g_mGameDll.FindPatternSIMD(reinterpret_cast("\x88\x54\x24\x10\x53\x55\x57"), "xxxxxxx"); + v_NetChan_Clear = p_NetChan_Clear.RCast(); /*88 54 24 10 53 55 57*/ + } + virtual void GetVar(void) const { } + virtual void GetCon(void) const { } + virtual void Attach(void) const { } + virtual void Detach(void) const { } +}; +/////////////////////////////////////////////////////////////////////////////// +REGISTER(VNetChannel); + #endif // NET_CHAN_H