Ejemplo n.º 1
0
/*
 * @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;
}
Ejemplo n.º 2
0
/**
 * @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;
}