mirror of
https://github.com/Mauler125/r5sdk.git
synced 2025-02-09 19:15:03 +01:00
*::ProcessUserCmds rebuild
Rebuild of the 'CServerGameClients::ProcessUserCmds' and 'CPlayer::ProcessUserCmds' methods. The rebuild is pretty much identical to the original implementation, but with additional checks for the number of commands, and total commands in 'CServerGameClients::ProcessUserCmds'. In the future, additional clamps and checks between CPlayer and the recv'd UserCMD should be incorporated in these functions.
This commit is contained in:
parent
64453b0661
commit
32d28d4285
@ -8,6 +8,10 @@
|
|||||||
#define NUM_BACKUP_COMMAND_BITS 4 // Originally 3 bits.
|
#define NUM_BACKUP_COMMAND_BITS 4 // Originally 3 bits.
|
||||||
#define MAX_BACKUP_COMMANDS ((1 << NUM_BACKUP_COMMAND_BITS)-1) // 15 in R5; see 'CL_Move'.
|
#define MAX_BACKUP_COMMANDS ((1 << NUM_BACKUP_COMMAND_BITS)-1) // 15 in R5; see 'CL_Move'.
|
||||||
|
|
||||||
|
// Maximum amount of backup commands to process on the server.
|
||||||
|
#define MAX_BACKUP_COMMANDS_PROCESS (MAX_BACKUP_COMMANDS+1) * NUM_BACKUP_COMMAND_BITS
|
||||||
|
#define MAX_QUEUED_COMMANDS_PROCESS 0x1B0
|
||||||
|
|
||||||
enum class SIGNONSTATE : int
|
enum class SIGNONSTATE : int
|
||||||
{
|
{
|
||||||
SIGNONSTATE_NONE = 0, // no state yet; about to connect.
|
SIGNONSTATE_NONE = 0, // no state yet; about to connect.
|
||||||
|
@ -10,10 +10,13 @@
|
|||||||
#include "public/server_class.h"
|
#include "public/server_class.h"
|
||||||
#include "public/eiface.h"
|
#include "public/eiface.h"
|
||||||
#include "public/const.h"
|
#include "public/const.h"
|
||||||
|
#include "common/protocol.h"
|
||||||
#include "engine/server/sv_main.h"
|
#include "engine/server/sv_main.h"
|
||||||
#include "gameinterface.h"
|
#include "gameinterface.h"
|
||||||
#include "entitylist.h"
|
#include "entitylist.h"
|
||||||
#include "baseanimating.h"
|
#include "baseanimating.h"
|
||||||
|
#include "game/shared/usercmd.h"
|
||||||
|
#include "game/shared/util_shared.h"
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// This is called when a new game is started. (restart, map)
|
// This is called when a new game is started. (restart, map)
|
||||||
@ -114,6 +117,56 @@ void DrawServerHitboxes(bool bRunOverlays)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CServerGameClients::ProcessUserCmds(CServerGameClients* thisp, edict_t edict,
|
||||||
|
bf_read* buf, int numCmds, int totalCmds, int droppedPackets, bool ignore, bool paused)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
CUserCmd* from, * to;
|
||||||
|
|
||||||
|
// We track last three command in case we drop some
|
||||||
|
// packets but get them back.
|
||||||
|
CUserCmd cmds[MAX_BACKUP_COMMANDS_PROCESS];
|
||||||
|
CUserCmd cmdNull; // For delta compression
|
||||||
|
|
||||||
|
Assert(numCmds >= 0);
|
||||||
|
Assert((totalCmds - numCmds) >= 0);
|
||||||
|
|
||||||
|
CPlayer* pPlayer = UTIL_PlayerByIndex(edict);
|
||||||
|
|
||||||
|
// Too many commands?
|
||||||
|
if (totalCmds < 0 || totalCmds >= (MAX_BACKUP_COMMANDS_PROCESS - 1) ||
|
||||||
|
numCmds < 0 || numCmds > totalCmds)
|
||||||
|
{
|
||||||
|
//const char* name = "unknown";
|
||||||
|
//if (pPlayer)
|
||||||
|
//{
|
||||||
|
// name = pPlayer->GetPlayerName();
|
||||||
|
//}
|
||||||
|
|
||||||
|
//Warning(eDLL_T::SERVER, "%s: too many cmds %i sent for player %s\n", __FUNCTION__, totalCmds, name);
|
||||||
|
// !TODO: Drop the client from here.
|
||||||
|
|
||||||
|
buf->SetOverflowFlag();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
from = &cmdNull;
|
||||||
|
for (i = totalCmds - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
to = &cmds[i];
|
||||||
|
ReadUserCmd(buf, to, from);
|
||||||
|
from = to;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Client not fully connected or server has gone inactive or is paused, just ignore
|
||||||
|
if (ignore || !pPlayer)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pPlayer->ProcessUserCmds(cmds, numCmds, totalCmds, droppedPackets, paused);
|
||||||
|
}
|
||||||
|
|
||||||
void RunFrameServer(double flFrameTime, bool bRunOverlays, bool bUniformUpdate)
|
void RunFrameServer(double flFrameTime, bool bRunOverlays, bool bUniformUpdate)
|
||||||
{
|
{
|
||||||
DrawServerHitboxes(bRunOverlays);
|
DrawServerHitboxes(bRunOverlays);
|
||||||
@ -124,6 +177,7 @@ void VServerGameDLL::Attach() const
|
|||||||
{
|
{
|
||||||
#if defined(GAMEDLL_S3)
|
#if defined(GAMEDLL_S3)
|
||||||
DetourAttach((LPVOID*)&CServerGameDLL__OnReceivedSayTextMessage, &CServerGameDLL::OnReceivedSayTextMessage);
|
DetourAttach((LPVOID*)&CServerGameDLL__OnReceivedSayTextMessage, &CServerGameDLL::OnReceivedSayTextMessage);
|
||||||
|
DetourAttach(&v_CServerGameClients__ProcessUserCmds, CServerGameClients::ProcessUserCmds);
|
||||||
#endif
|
#endif
|
||||||
DetourAttach(&v_RunFrameServer, &RunFrameServer);
|
DetourAttach(&v_RunFrameServer, &RunFrameServer);
|
||||||
}
|
}
|
||||||
@ -132,6 +186,7 @@ void VServerGameDLL::Detach() const
|
|||||||
{
|
{
|
||||||
#if defined(GAMEDLL_S3)
|
#if defined(GAMEDLL_S3)
|
||||||
DetourDetach((LPVOID*)&CServerGameDLL__OnReceivedSayTextMessage, &CServerGameDLL::OnReceivedSayTextMessage);
|
DetourDetach((LPVOID*)&CServerGameDLL__OnReceivedSayTextMessage, &CServerGameDLL::OnReceivedSayTextMessage);
|
||||||
|
DetourDetach(&v_CServerGameClients__ProcessUserCmds, CServerGameClients::ProcessUserCmds);
|
||||||
#endif
|
#endif
|
||||||
DetourDetach(&v_RunFrameServer, &RunFrameServer);
|
DetourDetach(&v_RunFrameServer, &RunFrameServer);
|
||||||
}
|
}
|
||||||
|
@ -34,6 +34,10 @@ public:
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
class CServerGameClients : public IServerGameClients
|
class CServerGameClients : public IServerGameClients
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
static void ProcessUserCmds(CServerGameClients* thisp, edict_t edict, bf_read* buf,
|
||||||
|
int numCmds, int totalCmds, int droppedPackets, bool ignore, bool paused);
|
||||||
|
private:
|
||||||
};
|
};
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
@ -46,6 +50,10 @@ class CServerGameEnts : public IServerGameEnts
|
|||||||
inline CMemory p_CServerGameDLL__OnReceivedSayTextMessage;
|
inline CMemory p_CServerGameDLL__OnReceivedSayTextMessage;
|
||||||
inline auto CServerGameDLL__OnReceivedSayTextMessage = p_CServerGameDLL__OnReceivedSayTextMessage.RCast<void(__fastcall*)(void* thisptr, int senderId, const char* text, bool isTeamChat)>();
|
inline auto CServerGameDLL__OnReceivedSayTextMessage = p_CServerGameDLL__OnReceivedSayTextMessage.RCast<void(__fastcall*)(void* thisptr, int senderId, const char* text, bool isTeamChat)>();
|
||||||
|
|
||||||
|
inline CMemory p_CServerGameClients__ProcessUserCmds;
|
||||||
|
inline auto v_CServerGameClients__ProcessUserCmds = p_CServerGameClients__ProcessUserCmds.RCast<void(*)(CServerGameClients* thisp, edict_t edict, bf_read* buf,
|
||||||
|
int numCmds, int totalCmds, int droppedPackets, bool ignore, bool paused)>();
|
||||||
|
|
||||||
inline CMemory p_RunFrameServer;
|
inline CMemory p_RunFrameServer;
|
||||||
inline auto v_RunFrameServer = p_RunFrameServer.RCast<void(*)(double flFrameTime, bool bRunOverlays, bool bUniformUpdate)>();
|
inline auto v_RunFrameServer = p_RunFrameServer.RCast<void(*)(double flFrameTime, bool bRunOverlays, bool bUniformUpdate)>();
|
||||||
|
|
||||||
@ -61,6 +69,7 @@ class VServerGameDLL : public IDetour
|
|||||||
virtual void GetAdr(void) const
|
virtual void GetAdr(void) const
|
||||||
{
|
{
|
||||||
LogFunAdr("CServerGameDLL::OnReceivedSayTextMessage", p_CServerGameDLL__OnReceivedSayTextMessage.GetPtr());
|
LogFunAdr("CServerGameDLL::OnReceivedSayTextMessage", p_CServerGameDLL__OnReceivedSayTextMessage.GetPtr());
|
||||||
|
LogFunAdr("CServerGameClients::ProcessUserCmds", p_CServerGameClients__ProcessUserCmds.GetPtr());
|
||||||
LogFunAdr("RunFrameServer", p_RunFrameServer.GetPtr());
|
LogFunAdr("RunFrameServer", p_RunFrameServer.GetPtr());
|
||||||
LogVarAdr("g_pServerGameDLL", reinterpret_cast<uintptr_t>(g_pServerGameDLL));
|
LogVarAdr("g_pServerGameDLL", reinterpret_cast<uintptr_t>(g_pServerGameDLL));
|
||||||
LogVarAdr("g_pServerGameClients", reinterpret_cast<uintptr_t>(g_pServerGameClients));
|
LogVarAdr("g_pServerGameClients", reinterpret_cast<uintptr_t>(g_pServerGameClients));
|
||||||
@ -74,9 +83,11 @@ class VServerGameDLL : public IDetour
|
|||||||
#elif defined (GAMEDLL_S2) || defined (GAMEDLL_S3)
|
#elif defined (GAMEDLL_S2) || defined (GAMEDLL_S3)
|
||||||
p_CServerGameDLL__OnReceivedSayTextMessage = g_GameDll.FindPatternSIMD("85 D2 0F 8E ?? ?? ?? ?? 4C 8B DC");
|
p_CServerGameDLL__OnReceivedSayTextMessage = g_GameDll.FindPatternSIMD("85 D2 0F 8E ?? ?? ?? ?? 4C 8B DC");
|
||||||
#endif
|
#endif
|
||||||
CServerGameDLL__OnReceivedSayTextMessage = p_CServerGameDLL__OnReceivedSayTextMessage.RCast<void(__fastcall*)(void* thisptr, int senderId, const char* text, bool isTeamChat)>();
|
p_CServerGameClients__ProcessUserCmds = g_GameDll.FindPatternSIMD("48 89 5C 24 ?? 48 89 74 24 ?? 48 89 7C 24 ?? 55 41 55 41 57");
|
||||||
|
|
||||||
p_RunFrameServer = g_GameDll.FindPatternSIMD("48 89 5C 24 ?? 57 48 83 EC 30 0F 29 74 24 ?? 48 8D 0D ?? ?? ?? ??");
|
p_RunFrameServer = g_GameDll.FindPatternSIMD("48 89 5C 24 ?? 57 48 83 EC 30 0F 29 74 24 ?? 48 8D 0D ?? ?? ?? ??");
|
||||||
|
|
||||||
|
CServerGameDLL__OnReceivedSayTextMessage = p_CServerGameDLL__OnReceivedSayTextMessage.RCast<void(__fastcall*)(void*, int, const char*, bool)>();
|
||||||
|
v_CServerGameClients__ProcessUserCmds = p_CServerGameClients__ProcessUserCmds.RCast<void(*)(CServerGameClients*, edict_t, bf_read*, int, int, int, bool, bool)>();
|
||||||
v_RunFrameServer = p_RunFrameServer.RCast<void(*)(double, bool, bool)>();
|
v_RunFrameServer = p_RunFrameServer.RCast<void(*)(double, bool, bool)>();
|
||||||
}
|
}
|
||||||
virtual void GetVar(void) const
|
virtual void GetVar(void) const
|
||||||
|
@ -4,11 +4,12 @@
|
|||||||
//
|
//
|
||||||
//===========================================================================//
|
//===========================================================================//
|
||||||
#include "core/stdafx.h"
|
#include "core/stdafx.h"
|
||||||
#include "player.h"
|
#include "common/protocol.h"
|
||||||
#include "gameinterface.h"
|
|
||||||
#include "game/shared/shareddefs.h"
|
#include "game/shared/shareddefs.h"
|
||||||
#include "game/shared/usercmd.h"
|
#include "game/shared/usercmd.h"
|
||||||
#include "game/server/movehelper_server.h"
|
#include "game/server/movehelper_server.h"
|
||||||
|
#include "gameinterface.h"
|
||||||
|
#include "player.h"
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Purpose: executes a null command for this player
|
// Purpose: executes a null command for this player
|
||||||
@ -103,6 +104,52 @@ void CPlayer::SetTotalExtraClientCmdTimeAttempted(float flAttemptedTime)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// Purpose: processes user cmd's for this player
|
||||||
|
// Input : *cmds -
|
||||||
|
// numCmds -
|
||||||
|
// totalCmds -
|
||||||
|
// droppedPackets -
|
||||||
|
// paused -
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
void CPlayer::ProcessUserCmds(CUserCmd* cmds, int numCmds, int totalCmds,
|
||||||
|
int droppedPackets, bool paused)
|
||||||
|
{
|
||||||
|
if (totalCmds <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
CUserCmd* lastCmd = &m_Commands[MAX_QUEUED_COMMANDS_PROCESS];
|
||||||
|
|
||||||
|
for (int i = totalCmds - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
CUserCmd* cmd = &cmds[i];
|
||||||
|
const int commandNumber = cmd->command_number;
|
||||||
|
|
||||||
|
if (commandNumber > m_latestCommandQueued)
|
||||||
|
{
|
||||||
|
m_latestCommandQueued = commandNumber;
|
||||||
|
const int lastCommandNumber = lastCmd->command_number;
|
||||||
|
|
||||||
|
if (lastCommandNumber == MAX_QUEUED_COMMANDS_PROCESS)
|
||||||
|
return;
|
||||||
|
|
||||||
|
CUserCmd* queuedCmd = &m_Commands[lastCommandNumber];
|
||||||
|
queuedCmd->Copy(cmd);
|
||||||
|
|
||||||
|
if (++lastCmd->command_number > player_userCmdsQueueWarning->GetInt())
|
||||||
|
{
|
||||||
|
const float curTime = float(Plat_FloatTime());
|
||||||
|
|
||||||
|
if ((curTime - m_lastCommandCountWarnTime) > 0.5f)
|
||||||
|
m_lastCommandCountWarnTime = curTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lastCmd->tick_count += droppedPackets;
|
||||||
|
m_bGamePaused = paused;
|
||||||
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Purpose: runs user command for this player
|
// Purpose: runs user command for this player
|
||||||
// Input : *pUserCmd -
|
// Input : *pUserCmd -
|
||||||
|
@ -249,6 +249,8 @@ public:
|
|||||||
void SetLastUCmdSimulationRemainderTime(float flRemainderTime);
|
void SetLastUCmdSimulationRemainderTime(float flRemainderTime);
|
||||||
void SetTotalExtraClientCmdTimeAttempted(float flAttemptedTime);
|
void SetTotalExtraClientCmdTimeAttempted(float flAttemptedTime);
|
||||||
|
|
||||||
|
void ProcessUserCmds(CUserCmd* cmds, int numCmds, int totalCmds,
|
||||||
|
int droppedPackets, bool paused);
|
||||||
void PlayerRunCommand(CUserCmd* pUserCmd, IMoveHelper* pMover);
|
void PlayerRunCommand(CUserCmd* pUserCmd, IMoveHelper* pMover);
|
||||||
void SetLastUserCommand(CUserCmd* pUserCmd);
|
void SetLastUserCommand(CUserCmd* pUserCmd);
|
||||||
|
|
||||||
@ -376,7 +378,7 @@ private:
|
|||||||
float m_fNextSuicideTime;
|
float m_fNextSuicideTime;
|
||||||
int m_iSuicideCustomKillFlags;
|
int m_iSuicideCustomKillFlags;
|
||||||
int m_preNoClipPhysicsFlags;
|
int m_preNoClipPhysicsFlags;
|
||||||
char m_Commands[8];
|
CUserCmd* m_Commands;
|
||||||
void* m_pPhysicsController;
|
void* m_pPhysicsController;
|
||||||
void* m_pShadowStand;
|
void* m_pShadowStand;
|
||||||
void* m_pShadowCrouch;
|
void* m_pShadowCrouch;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user