r5sdk/r5dev/engine/baseclient.cpp
Kawe Mazidjatari e32cc6ae6a Code overhaul
Moved every pattern to IDetour interface. This allows for debugging patterns scans more easily, and create threads during pattern searching (Operation is now fired in APIENTRY).

Also cleaned up some unused code/extraneous comments.
Slightly increased performance by purging duplicate patterns.
Made variable search less dependent from other results (except if pattern-to-scan results is within the same header)
2022-04-18 03:35:08 +02:00

211 lines
7.8 KiB
C++

//===============================================================================//
//
// Purpose:
//
// $NoKeywords: $
//
//===============================================================================//
// baseclient.cpp: implementation of the CBaseClient class.
//
///////////////////////////////////////////////////////////////////////////////////
#include "core/stdafx.h"
#include "engine/baseclient.h"
#include "engine/baseserver.h"
//---------------------------------------------------------------------------------
// Purpose: gets the client from buffer by index
//---------------------------------------------------------------------------------
CBaseClient* CBaseClient::GetClient(int nIndex) const
{
return (CBaseClient*)(std::uintptr_t)(g_pClientBuffer.GetPtr() + (nIndex * sizeof(CBaseClient)));
}
//---------------------------------------------------------------------------------
// Purpose: gets the userID of this client
//---------------------------------------------------------------------------------
std::int32_t CBaseClient::GetUserID(void) const
{
return m_nUserID;
}
//---------------------------------------------------------------------------------
// Purpose: gets the userID of this client
//---------------------------------------------------------------------------------
std::int64_t CBaseClient::GetOriginID(void) const
{
return m_nOriginID;
}
//---------------------------------------------------------------------------------
// Purpose: gets the signon state of this client
//---------------------------------------------------------------------------------
SIGNONSTATE CBaseClient::GetSignonState(void) const
{
return m_nSignonState;
}
//---------------------------------------------------------------------------------
// Purpose: gets the persistence state of this client
//---------------------------------------------------------------------------------
PERSISTENCE CBaseClient::GetPersistenceState(void) const
{
return m_nPersistenceState;
}
//---------------------------------------------------------------------------------
// Purpose: gets the net channel of this client
//---------------------------------------------------------------------------------
CNetChan* CBaseClient::GetNetChan(void) const
{
return m_NetChannel;
}
//---------------------------------------------------------------------------------
// Purpose: sets the userID of this client
//---------------------------------------------------------------------------------
void CBaseClient::SetUserID(std::int32_t nUserID)
{
m_nUserID = nUserID;
}
//---------------------------------------------------------------------------------
// Purpose: sets the originID of this client
//---------------------------------------------------------------------------------
void CBaseClient::SetOriginID(std::int64_t nOriginID)
{
m_nOriginID = nOriginID;
}
//---------------------------------------------------------------------------------
// Purpose: sets the signon state of this client
//---------------------------------------------------------------------------------
void CBaseClient::SetSignonState(SIGNONSTATE nSignonState)
{
m_nSignonState = nSignonState;
}
//---------------------------------------------------------------------------------
// Purpose: sets the persistence state of this client
//---------------------------------------------------------------------------------
void CBaseClient::SetPersistenceState(PERSISTENCE nPersistenceState)
{
m_nPersistenceState = nPersistenceState;
}
//---------------------------------------------------------------------------------
// Purpose: sets the net channel of this client
// !TODO : Remove this and rebuild INetChannel
//---------------------------------------------------------------------------------
void CBaseClient::SetNetChan(CNetChan* pNetChan)
{
m_NetChannel = pNetChan;
}
//---------------------------------------------------------------------------------
// Purpose: checks if client is connected to server
// Output : true if connected, false otherwise
//---------------------------------------------------------------------------------
bool CBaseClient::IsConnected(void) const
{
return m_nSignonState >= SIGNONSTATE::SIGNONSTATE_CONNECTED;
}
//---------------------------------------------------------------------------------
// Purpose: checks if client is spawned to server
// Output : true if connected, false otherwise
//---------------------------------------------------------------------------------
bool CBaseClient::IsSpawned(void) const
{
return m_nSignonState >= SIGNONSTATE::SIGNONSTATE_NEW;
}
//---------------------------------------------------------------------------------
// Purpose: checks if client is active to server
// Output : true if connected, false otherwise
//---------------------------------------------------------------------------------
bool CBaseClient::IsActive(void) const
{
return m_nSignonState == SIGNONSTATE::SIGNONSTATE_FULL;
}
//---------------------------------------------------------------------------------
// Purpose: checks if client's persistence data is available
// Output : true if available, false otherwise
//---------------------------------------------------------------------------------
bool CBaseClient::IsPersistenceAvailable(void) const
{
return m_nPersistenceState >= PERSISTENCE::PERSISTENCE_AVAILABLE;
}
//---------------------------------------------------------------------------------
// Purpose: checks if client's persistence data is ready
// Output : true if ready, false otherwise
//---------------------------------------------------------------------------------
bool CBaseClient::IsPersistenceReady(void) const
{
return m_nPersistenceState == PERSISTENCE::PERSISTENCE_READY;
}
//---------------------------------------------------------------------------------
// Purpose: checks if client is a fake client
// Output : true if connected, false otherwise
//---------------------------------------------------------------------------------
bool CBaseClient::IsFakeClient(void) const
{
return m_bFakePlayer;
}
//---------------------------------------------------------------------------------
// Purpose: checks if this client is an actual human player
// Output : true if human, false otherwise
//---------------------------------------------------------------------------------
bool CBaseClient::IsHumanPlayer(void) const
{
if (!IsConnected())
return false;
if (IsFakeClient())
return false;
return true;
}
//---------------------------------------------------------------------------------
// Purpose: throw away any residual garbage in the channel
// Input : *pBaseClient -
//---------------------------------------------------------------------------------
void CBaseClient::Clear(CBaseClient* pBaseClient)
{
CBaseClient_Clear(pBaseClient);
}
//---------------------------------------------------------------------------------
// Purpose: connect new client
// Input : *pClient -
// *szName -
// *pNetChannel -
// bFakePlayer -
// *a5 -
// *szMessage -
// nMessageSize -
// Output : true if connection was succesfull, false otherwise
//---------------------------------------------------------------------------------
bool CBaseClient::Connect(CBaseClient* pClient, const char* szName, void* pNetChannel, bool bFakePlayer, void* a5, char* szMessage, int nMessageSize)
{
return CBaseClient_Connect(pClient, szName, pNetChannel, bFakePlayer, a5, szMessage, nMessageSize);
}
///////////////////////////////////////////////////////////////////////////////////
void CBaseClient_Attach()
{
DetourAttach((LPVOID*)&CBaseClient_Clear, &CBaseClient::Clear);
DetourAttach((LPVOID*)&CBaseClient_Connect, &CBaseClient::Connect);
}
void CBaseClient_Detach()
{
DetourDetach((LPVOID*)&CBaseClient_Clear, &CBaseClient::Clear);
DetourDetach((LPVOID*)&CBaseClient_Connect, &CBaseClient::Connect);
}
///////////////////////////////////////////////////////////////////////////////
CBaseClient* g_pClient = nullptr;