/* * @brief Accumulates all movement for the current packet frame in a command. This * may be called multiple times per packet frame. */ void Cl_UpdateCmd(void) { static uint32_t last_move; user_cmd_t c; if (cls.state != CL_ACTIVE) return; memset(&c, 0, sizeof(c)); // determine the interval for just this move c.msec = Clamp(cls.real_time - last_move, 1, 255); // get movement from input devices Cl_Move(&c); last_move = cls.real_time; // now update the pending command cl_cmd_t *cmd = &cl.cmds[cls.net_chan.outgoing_sequence & CMD_MASK]; cmd->cmd.msec += c.msec; cmd->cmd.buttons |= c.buttons; VectorCopy(c.angles, cmd->cmd.angles); cmd->cmd.forward += c.forward; cmd->cmd.right += c.right; cmd->cmd.up += c.up; // store timestamps for netgraph and prediction calculations cmd->time = cl.time; cmd->real_time = cls.real_time; }
/** * @brief Gather remaining movement (i.e. forward, back, etc.) so that it may be sent off. */ static void Cl_FinalizeMovementCommand(void) { cl_cmd_t *cmd = &cl.cmds[cls.net_chan.outgoing_sequence & CMD_MASK]; cl_cmd_t *prev = &cl.cmds[(cls.net_chan.outgoing_sequence - 1) & CMD_MASK]; const uint32_t msec = cl.unclamped_time - prev->timestamp; cmd->cmd.msec = Min(msec, 255u); Cl_Move(&cmd->cmd); cmd->time = cl.time; cmd->timestamp = cl.unclamped_time; }