- // set buttons and impulse
- cl.cmd.buttons = bits;
- cl.cmd.impulse = in_impulse;
-
- // clear button 'click' states
- in_attack.state &= ~2;
- in_jump.state &= ~2;
- in_button3.state &= ~2;
- in_button4.state &= ~2;
- in_button5.state &= ~2;
- in_button6.state &= ~2;
- in_button7.state &= ~2;
- in_button8.state &= ~2;
- in_use.state &= ~2;
- in_button9.state &= ~2;
- in_button10.state &= ~2;
- in_button11.state &= ~2;
- in_button12.state &= ~2;
- in_button13.state &= ~2;
- in_button14.state &= ~2;
- in_button15.state &= ~2;
- in_button16.state &= ~2;
-
- // clear impulse
- in_impulse = 0;
-
- // movement is set by input code (forwardmove/sidemove/upmove)
-
- // set viewangles
- VectorCopy(cl.viewangles, cl.cmd.viewangles);
-
- msecdelta = (int)(floor(cl.cmd.time * 1000) - floor(cl.movecmd[0].time * 1000));
- cl.cmd.msec = (unsigned char)bound(0, msecdelta, 255);
- // ridiculous value rejection (matches qw)
- if (cl.cmd.msec > 250)
- cl.cmd.msec = 100;
-
- cl.cmd.predicted = cl_movement.integer;
-
- // always dump the first two messages, because they may contain leftover inputs from the last level
- if (cl.cmd.sequence <= 2)
- cl.cmd.forwardmove = cl.cmd.sidemove = cl.cmd.upmove = cl.cmd.impulse = cl.cmd.buttons = 0;
-
- // update the cl.movecmd array which holds the most recent moves
- for (i = CL_MAX_USERCMDS - 1;i >= 1;i--)
- cl.movecmd[i] = cl.movecmd[i-1];
- cl.movecmd[0] = cl.cmd;
-
- if (cls.protocol == PROTOCOL_QUAKEWORLD)
- {
- int checksumindex;
-
- CL_ClientMovement_Input((cl.movecmd[0].buttons & 2) != 0, false);
-
- MSG_WriteByte(&buf, qw_clc_move);
- // save the position for a checksum byte
- checksumindex = buf.cursize;
- MSG_WriteByte(&buf, 0);
- // packet loss percentage
- for (j = 0, packetloss = 0;j < NETGRAPH_PACKETS;j++)
- if (cls.netcon->incoming_unreliablesize[j] == NETGRAPH_LOSTPACKET)
- packetloss++;
- packetloss = packetloss * 100 / NETGRAPH_PACKETS;
- MSG_WriteByte(&buf, packetloss);
- // write most recent 3 moves
- QW_MSG_WriteDeltaUsercmd(&buf, &nullcmd, &cl.movecmd[2]);
- QW_MSG_WriteDeltaUsercmd(&buf, &cl.movecmd[2], &cl.movecmd[1]);
- QW_MSG_WriteDeltaUsercmd(&buf, &cl.movecmd[1], &cl.movecmd[0]);
- // calculate the checksum
- buf.data[checksumindex] = COM_BlockSequenceCRCByteQW(buf.data + checksumindex + 1, buf.cursize - checksumindex - 1, cls.netcon->outgoing_unreliable_sequence);
- // if delta compression history overflows, request no delta
- if (cls.netcon->outgoing_unreliable_sequence - cl.qw_validsequence >= QW_UPDATE_BACKUP-1)
- cl.qw_validsequence = 0;
- // request delta compression if appropriate
- if (cl.qw_validsequence && !cl_nodelta.integer && cls.state == ca_connected && !cls.demorecording)
- {
- cl.qw_deltasequence[cls.netcon->outgoing_unreliable_sequence & QW_UPDATE_MASK] = cl.qw_validsequence;
- MSG_WriteByte(&buf, qw_clc_delta);
- MSG_WriteByte(&buf, cl.qw_validsequence & 255);
- }
- else
- cl.qw_deltasequence[cls.netcon->outgoing_unreliable_sequence & QW_UPDATE_MASK] = -1;
- }
- else if (cls.signon == SIGNONS)