Usercmd
CUserCmd ("user command") is the networkable representation of the player's input, including keys pressed and viewangle. By default, updates are sent from client to server at a rate of 30 per second (cl_cmdrate) in the form of delta-compressed usercmds. Delta compression and and decompression are handled in WriteUsercmd
and ReadUsercmd
.
Production
Usercmds are created when the engine invokes IBaseClientDLL::CreateMove
(once per tick). The default implementation, CHLClient::CreateMove
, doesn't do much besides forwarding the call to CInput::CreateMove
. The usercmds created there are stored in a circular buffer (CInput::PerUserInput_t::m_pCommands
) until the engine invokes IBaseClientDLL::WriteUsercmdDeltaToBuffer
to compress and serialize them to the server.
During CInput::CreateMove
, the current client mode is also given a chance to manipulate the newly created usercmd via IClientMode::CreateMove
. The default implementation (ClientModeShared::CreateMove
) delegates to the local player via C_BasePlayer::CreateMove
, which in turn passes the usercmd to CBaseCombatWeapon::CreateMove
on the active weapon.
Consumption
The incoming usercmds are consumed on the server when the engine invokes IGameServerClients::ProcessUsercmds
. This method handles decompressing the delta usercmds, and then dispatches them to CBasePlayer::ProcessUsercmds
. The player caches each such batch of commands together in a CCommandContext
object to be processed later.
Once IServerGameDLL::GameFrame
is called, the player's PhysicsSimulate
method executes the cached usercmds via CBasePlayer::PlayerRunCommand
. From here, the active CPlayerMove-derived class executes (Pre/Post)Think for the player, as well as populating g_pMoveData and executing IGameMovement::ProcessMovement
for the player.