Usercmd: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
No edit summary
Line 2: Line 2:


== Production ==
== Production ==
Usercmds are created when the engine invokes <code>IInput::CreateMove</code>, and are stored in a circular buffer (<code>CInput::PerUserInput_t::m_pCommands</code>) until the engine invokes <code>IBaseClientDLL::WriteUsercmdDeltaToBuffer</code> to compress and serialize them to the server.
Usercmds are created when the engine invokes <code>IBaseClientDLL::CreateMove</code> (once per tick). The default implementation, <code>CHLClient::CreateMove</code>, doesn't do much besides forwarding the call to <code>CInput::CreateMove</code>. The usercmds created there are stored in a circular buffer (<code>CInput::PerUserInput_t::m_pCommands</code>) until the engine invokes <code>IBaseClientDLL::WriteUsercmdDeltaToBuffer</code> to compress and serialize them to the server.


During <code>CInput::CreateMove</code>, the current client mode is also given a chance to manipulate the newly created usercmd via <code>IClientMode::CreateMove</code>. The default implementation (<code>ClientModeShared::CreateMove</code>) delegates to the local player via <code>C_BasePlayer::CreateMove</code>, which in turn passes the usercmd to <code>CBaseCombatWeapon::CreateMove</code> on the active weapon.
During <code>CInput::CreateMove</code>, the current client mode is also given a chance to manipulate the newly created usercmd via <code>IClientMode::CreateMove</code>. The default implementation (<code>ClientModeShared::CreateMove</code>) delegates to the local player via <code>C_BasePlayer::CreateMove</code>, which in turn passes the usercmd to <code>CBaseCombatWeapon::CreateMove</code> on the active weapon.

Revision as of 00:48, 8 October 2012

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.

See also