Skip to content

Commit b840b43

Browse files
committed
add sv_maxusrcmdprocessticks_warning
1 parent 38cb2f7 commit b840b43

File tree

4 files changed

+49
-57
lines changed

4 files changed

+49
-57
lines changed

rehlds/dlls/player.h

+25
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,31 @@ class CBasePlayer : public CBaseMonster
322322

323323
float m_flNextChatTime;
324324

325+
float GetRemainingMovementTimeForUserCmdProcessing() const { return m_flMovementTimeForUserCmdProcessingRemaining; }
326+
float ConsumeMovementTimeForUserCmdProcessing( float flTimeNeeded )
327+
{
328+
if ( m_flMovementTimeForUserCmdProcessingRemaining <= 0.0f )
329+
return 0.0f;
330+
331+
const float DIST_EPSILON = 0.03125f;
332+
else if ( flTimeNeeded > m_flMovementTimeForUserCmdProcessingRemaining + FLT_EPSILON )
333+
{
334+
float flResult = m_flMovementTimeForUserCmdProcessingRemaining;
335+
m_flMovementTimeForUserCmdProcessingRemaining = 0.0f;
336+
return flResult;
337+
}
338+
else
339+
{
340+
m_flMovementTimeForUserCmdProcessingRemaining -= flTimeNeeded;
341+
if ( m_flMovementTimeForUserCmdProcessingRemaining < 0.0f )
342+
m_flMovementTimeForUserCmdProcessingRemaining = 0.0f;
343+
return flTimeNeeded;
344+
}
345+
}
346+
347+
private:
348+
// How much of a movement time buffer can we process from this user?
349+
float m_flMovementTimeForUserCmdProcessingRemaining;
325350
};
326351

327352
#define AUTOAIM_2DEGREES 0.0348994967025

rehlds/engine/server.h

+1
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,7 @@ extern cvar_t sv_rehlds_attachedentities_playeranimationspeed_fix;
378378
extern cvar_t sv_rehlds_local_gametime;
379379
extern cvar_t sv_rehlds_send_mapcycle;
380380
extern cvar_t sv_usercmd_custom_random_seed;
381+
extern cvar_t sv_maxusrcmdprocessticks_warning;
381382
#endif
382383
extern int sv_playermodel;
383384

rehlds/engine/sv_main.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ cvar_t sv_rehlds_send_mapcycle = { "sv_rehlds_send_mapcycle", "0", 0, 0.0f, null
210210
cvar_t sv_rehlds_maxclients_from_single_ip = { "sv_rehlds_maxclients_from_single_ip", "5", 0, 5.0f, nullptr };
211211
cvar_t sv_use_entity_file = { "sv_use_entity_file", "0", 0, 0.0f, nullptr };
212212
cvar_t sv_usercmd_custom_random_seed = { "sv_usercmd_custom_random_seed", "0", 0, 0.0f, nullptr };
213+
cvar_t sv_maxusrcmdprocessticks_warning = { "sv_maxusrcmdprocessticks_warning", "0", 0, 0.0f, nullptr };
213214
#endif
214215

215216
delta_t *SV_LookupDelta(char *name)
@@ -8025,6 +8026,7 @@ void SV_Init(void)
80258026
Cvar_RegisterVariable(&sv_rollangle);
80268027
Cvar_RegisterVariable(&sv_use_entity_file);
80278028
Cvar_RegisterVariable(&sv_usercmd_custom_random_seed);
8029+
Cvar_RegisterVariable(&sv_maxusrcmdprocessticks_warning);
80288030
#endif
80298031

80308032
for (int i = 0; i < MAX_MODELS; i++)

rehlds/engine/sv_user.cpp

+21-57
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,27 @@ void SV_ForceFullClientsUpdate(void)
754754

755755
void SV_RunCmd(usercmd_t *ucmd, int random_seed)
756756
{
757+
const float playerFrameTime = (1.0f / sys_ticrate.value);
758+
const float flTimeAllowedForProcessing = host_client->ConsumeMovementTimeForUserCmdProcessing( playerFrameTime );
759+
bool isBot = host_client->fakeclient;
760+
if ( !isBot && ( flTimeAllowedForProcessing < playerFrameTime ) )
761+
{
762+
// Make sure that the activity in command is erased because player cheated or dropped too many packets
763+
double dblWarningFrequencyThrottle = sv_maxusrcmdprocessticks_warning.value;
764+
if ( dblWarningFrequencyThrottle >= 0.0 )
765+
{
766+
static double s_dblLastWarningTime = 0.0;
767+
double dblTimeNow = Sys_FloatTime();
768+
if ( !s_dblLastWarningTime || ( dblTimeNow - s_dblLastWarningTime >= dblWarningFrequencyThrottle ) )
769+
{
770+
s_dblLastWarningTime = dblTimeNow;
771+
Con_Printf( "sv_maxusrcmdprocessticks_warning at server tick %u: Ignored client %s usrcmd (%.6f < %.6f)!\n",
772+
m_system->GetTick(), host_client->name, flTimeAllowedForProcessing, playerFrameTime );
773+
}
774+
}
775+
return; // Don't process this command
776+
}
777+
757778
usercmd_t cmd = *ucmd;
758779
int i;
759780
edict_t *ent;
@@ -1042,63 +1063,6 @@ void SV_RunCmd(usercmd_t *ucmd, int random_seed)
10421063

10431064
if (!host_client->fakeclient)
10441065
SV_RestoreMove(host_client);
1045-
1046-
// If we have to restore the view angle then do so right now
1047-
1048-
// TODO: Implement: in `player.h` & `player.cpp`
1049-
/*
1050-
QAngle m_qangLockViewangles;
1051-
int m_iLockViewanglesTickNumber;
1052-
1053-
int GetLockViewanglesTickNumber() const { return m_iLockViewanglesTickNumber; }
1054-
QAngle GetLockViewanglesData() const { return m_qangLockViewangles; }
1055-
1056-
////////////
1057-
void CCSPlayer::NoteWeaponFired()
1058-
{
1059-
Assert( m_pCurrentCommand );
1060-
if( m_pCurrentCommand )
1061-
{
1062-
m_iLastWeaponFireUsercmd = m_pCurrentCommand->command_number;
1063-
}
1064-
1065-
// Remember the tickcount when the weapon was fired and lock viewangles here!
1066-
if ( m_iLockViewanglesTickNumber != gpGlobals->tickcount )
1067-
{
1068-
m_iLockViewanglesTickNumber = gpGlobals->tickcount;
1069-
m_qangLockViewangles = pl.v_angle;
1070-
}
1071-
}
1072-
*/
1073-
1074-
/**
1075-
Implement in CCSPlayer::FireBullet:
1076-
1077-
// Let the player remember the usercmd he fired a weapon on. Assists in making decisions about lag compensation.
1078-
if ( pPlayer )
1079-
pPlayer->NoteWeaponFired();
1080-
1081-
1082-
if ( bBulletHitPlayer && !bShotHitTeammate )
1083-
{ // Guarantee that the bullet that hit an enemy trumps the player viewangles
1084-
// that are locked in for the duration of the server simulation ticks
1085-
m_iLockViewanglesTickNumber = gpGlobals->tickcount;
1086-
m_qangLockViewangles = pl.v_angle;
1087-
}
1088-
*/
1089-
1090-
/*
1091-
Implement in SV_RunCmd():
1092-
1093-
// player->IsBot() == sv_player->fakeclient
1094-
// tickcount == m_System->GetTick()
1095-
1096-
if ( !player->IsBot() &&
1097-
( gpGlobals->tickcount - player->GetLockViewanglesTickNumber() < sv_maxusrcmdprocessticks_holdaim.value ) )
1098-
{
1099-
player->pl.v_angle = player->GetLockViewanglesData();
1100-
}
1101-
*/
11021066
}
11031067

11041068
int SV_ValidateClientCommand(char *pszCommand)

0 commit comments

Comments
 (0)