// rights reserved.
#include "quakedef.h"
+#include "csprogs.h"
/*
===============================================================================
kbutton_t in_up, in_down;
// LordHavoc: added 6 new buttons
kbutton_t in_button3, in_button4, in_button5, in_button6, in_button7, in_button8;
+//even more
+kbutton_t in_button9, in_button10, in_button11, in_button12, in_button13, in_button14, in_button15, in_button16;
int in_impulse;
-extern cvar_t sys_ticrate;
void KeyDown (kbutton_t *b)
void IN_Button8Down(void) {KeyDown(&in_button8);}
void IN_Button8Up(void) {KeyUp(&in_button8);}
+void IN_Button9Down(void) {KeyDown(&in_button9);}
+void IN_Button9Up(void) {KeyUp(&in_button9);}
+void IN_Button10Down(void) {KeyDown(&in_button10);}
+void IN_Button10Up(void) {KeyUp(&in_button10);}
+void IN_Button11Down(void) {KeyDown(&in_button11);}
+void IN_Button11Up(void) {KeyUp(&in_button11);}
+void IN_Button12Down(void) {KeyDown(&in_button12);}
+void IN_Button12Up(void) {KeyUp(&in_button12);}
+void IN_Button13Down(void) {KeyDown(&in_button13);}
+void IN_Button13Up(void) {KeyUp(&in_button13);}
+void IN_Button14Down(void) {KeyDown(&in_button14);}
+void IN_Button14Up(void) {KeyUp(&in_button14);}
+void IN_Button15Down(void) {KeyDown(&in_button15);}
+void IN_Button15Up(void) {KeyUp(&in_button15);}
+void IN_Button16Down(void) {KeyDown(&in_button16);}
+void IN_Button16Up(void) {KeyUp(&in_button16);}
+
void IN_JumpDown (void) {KeyDown(&in_jump);}
void IN_JumpUp (void) {KeyUp(&in_jump);}
//==========================================================================
-cvar_t cl_upspeed = {CVAR_SAVE, "cl_upspeed","400"};
-cvar_t cl_forwardspeed = {CVAR_SAVE, "cl_forwardspeed","400"};
-cvar_t cl_backspeed = {CVAR_SAVE, "cl_backspeed","400"};
-cvar_t cl_sidespeed = {CVAR_SAVE, "cl_sidespeed","350"};
+cvar_t cl_upspeed = {CVAR_SAVE, "cl_upspeed","400","vertical movement speed (while swimming or flying)"};
+cvar_t cl_forwardspeed = {CVAR_SAVE, "cl_forwardspeed","400","forward movement speed"};
+cvar_t cl_backspeed = {CVAR_SAVE, "cl_backspeed","400","backward movement speed"};
+cvar_t cl_sidespeed = {CVAR_SAVE, "cl_sidespeed","350","strafe movement speed"};
+
+cvar_t cl_movespeedkey = {CVAR_SAVE, "cl_movespeedkey","2.0","how much +speed multiplies keyboard movement speed"};
-cvar_t cl_movespeedkey = {CVAR_SAVE, "cl_movespeedkey","2.0"};
+cvar_t cl_yawspeed = {CVAR_SAVE, "cl_yawspeed","140","keyboard yaw turning speed"};
+cvar_t cl_pitchspeed = {CVAR_SAVE, "cl_pitchspeed","150","keyboard pitch turning speed"};
-cvar_t cl_yawspeed = {CVAR_SAVE, "cl_yawspeed","140"};
-cvar_t cl_pitchspeed = {CVAR_SAVE, "cl_pitchspeed","150"};
+cvar_t cl_anglespeedkey = {CVAR_SAVE, "cl_anglespeedkey","1.5","how much +speed multiplies keyboard turning speed"};
-cvar_t cl_anglespeedkey = {CVAR_SAVE, "cl_anglespeedkey","1.5"};
+cvar_t cl_movement = {CVAR_SAVE, "cl_movement", "0", "enables clientside prediction of your player movement"};
+cvar_t cl_movement_latency = {0, "cl_movement_latency", "0", "compensates for this much latency (ping time) on quake servers which do not really support prediction, no effect on darkplaces7 protocol servers"};
+cvar_t cl_movement_maxspeed = {0, "cl_movement_maxspeed", "320", "how fast you can move (should match sv_maxspeed)"};
+cvar_t cl_movement_maxairspeed = {0, "cl_movement_maxairspeed", "30", "how fast you can move while in the air (should match sv_maxairspeed)"};
+cvar_t cl_movement_stopspeed = {0, "cl_movement_stopspeed", "100", "speed below which you will be slowed rapidly to a stop rather than sliding endlessly (should match sv_stopspeed)"};
+cvar_t cl_movement_friction = {0, "cl_movement_friction", "4", "how fast you slow down (should match sv_friction)"};
+cvar_t cl_movement_edgefriction = {0, "cl_movement_edgefriction", "2", "how much to slow down when you may be about to fall off a ledge (should match edgefriction)"};
+cvar_t cl_movement_stepheight = {0, "cl_movement_stepheight", "18", "how tall a step you can step in one instant (should match sv_stepheight)"};
+cvar_t cl_movement_accelerate = {0, "cl_movement_accelerate", "10", "how fast you accelerate (should match sv_accelerate)"};
+cvar_t cl_movement_jumpvelocity = {0, "cl_movement_jumpvelocity", "270", "how fast you move upward when you begin a jump (should match the quakec code)"};
+cvar_t cl_gravity = {0, "cl_gravity", "800", "how much gravity to apply in client physics (should match sv_gravity)"};
+cvar_t cl_slowmo = {0, "cl_slowmo", "1", "speed of game time (should match slowmo)"};
-cvar_t cl_movement = {CVAR_SAVE, "cl_movement", "0"};
-cvar_t cl_movement_latency = {0, "cl_movement_latency", "0"};
-cvar_t cl_movement_maxspeed = {0, "cl_movement_maxspeed", "320"};
-cvar_t cl_movement_maxairspeed = {0, "cl_movement_maxairspeed", "30"};
-cvar_t cl_movement_stopspeed = {0, "cl_movement_stopspeed", "100"};
-cvar_t cl_movement_friction = {0, "cl_movement_friction", "4"};
-cvar_t cl_movement_edgefriction = {0, "cl_movement_edgefriction", "2"};
-cvar_t cl_movement_stepheight = {0, "cl_movement_stepheight", "18"};
-cvar_t cl_movement_accelerate = {0, "cl_movement_accelerate", "10"};
-cvar_t cl_movement_jumpvelocity = {0, "cl_movement_jumpvelocity", "270"};
-cvar_t cl_gravity = {0, "cl_gravity", "800"};
-cvar_t cl_slowmo = {0, "cl_slowmo", "1"};
+cvar_t in_pitch_min = {0, "in_pitch_min", "-90", "how far downward you can aim (quake used -70"}; // quake used -70
+cvar_t in_pitch_max = {0, "in_pitch_max", "90", "how far upward you can aim (quake used 80"}; // quake used 80
-cvar_t in_pitch_min = {0, "in_pitch_min", "-90"}; // quake used -70
-cvar_t in_pitch_max = {0, "in_pitch_max", "90"}; // quake used 80
+cvar_t m_filter = {CVAR_SAVE, "m_filter","0", "smoothes mouse movement, less responsive but smoother aiming"};
-cvar_t m_filter = {CVAR_SAVE, "m_filter","0"};
+cvar_t cl_netinputpacketspersecond = {CVAR_SAVE, "cl_netinputpacketspersecond","50", "how many input packets to send to server each second"};
/*
old_mouse_y = my;
// if not in menu, apply mouse move to viewangles/movement
- if (in_client_mouse)
+ if (!cl.csqc_wantsmousemove && in_client_mouse)
{
if (cl_prydoncursor.integer)
{
{
// strafing mode, all looking is movement
V_StopPitchDrift();
- cl.cmd.sidemove += m_side.value * in_mouse_x * sensitivity.value * cl.viewzoom;
+ cl.cmd.sidemove += m_side.value * in_mouse_x * sensitivity.value;
if (noclip_anglehack)
- cl.cmd.upmove -= m_forward.value * in_mouse_y * sensitivity.value * cl.viewzoom;
+ cl.cmd.upmove -= m_forward.value * in_mouse_y * sensitivity.value;
else
- cl.cmd.forwardmove -= m_forward.value * in_mouse_y * sensitivity.value * cl.viewzoom;
+ cl.cmd.forwardmove -= m_forward.value * in_mouse_y * sensitivity.value;
}
else if ((in_mlook.state & 1) || freelook.integer)
{
// mouselook, lookstrafe causes turning to become strafing
V_StopPitchDrift();
if (lookstrafe.integer)
- cl.cmd.sidemove += m_side.value * in_mouse_x * sensitivity.value * cl.viewzoom;
+ cl.cmd.sidemove += m_side.value * in_mouse_x * sensitivity.value;
else
cl.viewangles[YAW] -= m_yaw.value * in_mouse_x * sensitivity.value * cl.viewzoom;
cl.viewangles[PITCH] += m_pitch.value * in_mouse_y * sensitivity.value * cl.viewzoom;
{
// non-mouselook, yaw turning and forward/back movement
cl.viewangles[YAW] -= m_yaw.value * in_mouse_x * sensitivity.value * cl.viewzoom;
- cl.cmd.forwardmove -= m_forward.value * in_mouse_y * sensitivity.value * cl.viewzoom;
+ cl.cmd.forwardmove -= m_forward.value * in_mouse_y * sensitivity.value;
}
}
cl.cmd.cursor_screen[1] = bound(-1, cl.cmd.cursor_screen[1], 1);
cl.cmd.cursor_screen[2] = 1;
- scale[0] = -tan(r_refdef.fov_x * M_PI / 360.0);
- scale[1] = -tan(r_refdef.fov_y * M_PI / 360.0);
+ scale[0] = -r_refdef.frustum_x;
+ scale[1] = -r_refdef.frustum_y;
scale[2] = 1;
// trace distance
VectorSet(temp, cl.cmd.cursor_screen[2] * scale[2], cl.cmd.cursor_screen[0] * scale[0], cl.cmd.cursor_screen[1] * scale[1]);
Matrix4x4_Transform(&r_refdef.viewentitymatrix, temp, cl.cmd.cursor_end);
// trace from view origin to the cursor
- cl.cmd.cursor_fraction = CL_SelectTraceLine(cl.cmd.cursor_start, cl.cmd.cursor_end, cl.cmd.cursor_impact, cl.cmd.cursor_normal, &cl.cmd.cursor_entitynumber, (chase_active.integer || cl.intermission) ? &cl_entities[cl.playerentity].render : NULL);
+ cl.cmd.cursor_fraction = CL_SelectTraceLine(cl.cmd.cursor_start, cl.cmd.cursor_end, cl.cmd.cursor_impact, cl.cmd.cursor_normal, &cl.cmd.cursor_entitynumber, (chase_active.integer || cl.intermission) ? &cl_entities[cl.playerentity].render : NULL, false);
// makes sparks where cursor is
//CL_SparkShower(cl.cmd.cursor_impact, cl.cmd.cursor_normal, 5, 0);
}
cl.movement_queue[cl.movement_numqueue++] = cl.movement_queue[i];
}
// add to input queue if there is room
- if (cl_movement.integer && cl.movement_numqueue < (int)(sizeof(cl.movement_queue)/sizeof(cl.movement_queue[0])) && cl.mtime[0] > cl.mtime[1])
+ if (cl.movement_numqueue < (int)(sizeof(cl.movement_queue)/sizeof(cl.movement_queue[0])) && cl.mtime[0] > cl.mtime[1])
{
// add to input queue
cl.movement_queue[cl.movement_numqueue].sequence = cl.movesequence;
cl.movement_queue[cl.movement_numqueue].crouch = buttoncrouch;
cl.movement_numqueue++;
}
- cl.movement = cl_movement.integer && cl.stats[STAT_HEALTH] > 0 && !cls.demoplayback && !cl.intermission;
- // clear queue if client movement is disabled
- if (!cl.movement)
- cl.movement_numqueue = 0;
cl.movement_replay = true;
}
trace_t trace;
trace_t trace2;
trace_t trace3;
+
if (!cl.movement_replay)
return;
cl.movement_replay = false;
// replay the input queue to predict current location
// note: this relies on the fact there's always one queue item at the end
- for (i = 0;i < cl.movement_numqueue;i++)
+ for (i = 0;cl.movement && i < cl.movement_numqueue;i++)
{
client_movementqueue_t *q = cl.movement_queue + bound(0, i, cl.movement_numqueue - 1);
frametime = q->frametime;
CL_SendMove
==============
*/
+extern cvar_t cl_netinputpacketspersecond;
void CL_SendMove(void)
{
int i;
int bits;
+ int impulse;
sizebuf_t buf;
- qbyte data[128];
+ unsigned char data[128];
+ static double lastsendtime = 0;
#define MOVEAVERAGING 0
#if MOVEAVERAGING
- static float forwardmove, sidemove, upmove, total; // accumulation
-#else
- float forwardmove, sidemove, upmove;
+ static float accumforwardmove = 0, accumsidemove = 0, accumupmove = 0, accumtotal = 0; // accumulation
#endif
+ float forwardmove, sidemove, upmove;
+
+ // if playing a demo, do nothing
+ if (!cls.netcon)
+ return;
#if MOVEAVERAGING
// accumulate changes between messages
- forwardmove += cl.cmd.forwardmove;
- sidemove += cl.cmd.sidemove;
- upmove += cl.cmd.upmove;
- total++;
+ accumforwardmove += cl.cmd.forwardmove;
+ accumsidemove += cl.cmd.sidemove;
+ accumupmove += cl.cmd.upmove;
+ accumtotal++;
#endif
- if (cls.signon != SIGNONS)
- return;
+
+ if (cl_movement.integer && cls.signon == SIGNONS)
+ {
+ if (!cl.movement_needupdate)
+ return;
+ cl.movement_needupdate = false;
+ cl.movement = cl.stats[STAT_HEALTH] > 0 && !cl.intermission;
+ }
+ else
+ {
+ cl.movement = false;
+ if (realtime < lastsendtime + 1.0 / bound(10, cl_netinputpacketspersecond.value, 100))
+ return;
+ // don't let it fall behind if CL_SendMove hasn't been called recently
+ // (such is the case when framerate is too low for instance)
+ lastsendtime = max(lastsendtime + 1.0 / bound(10, cl_netinputpacketspersecond.value, 100), realtime);
+ }
#if MOVEAVERAGING
// average the accumulated changes
- total = 1.0f / total;
- forwardmove *= total;
- sidemove *= total;
- upmove *= total;
- total = 0;
+ accumtotal = 1.0f / accumtotal;
+ forwardmove = accumforwardmove * accumtotal;
+ sidemove = accumsidemove * accumtotal;
+ upmove = accumupmove * accumtotal;
+ accumforwardmove = 0;
+ accumsidemove = 0;
+ accumupmove = 0;
+ accumtotal = 0;
#else
// use the latest values
forwardmove = cl.cmd.forwardmove;
if (in_use.state & 3) bits |= 256;in_use.state &= ~2;
if (key_dest != key_game || key_consoleactive) bits |= 512;
if (cl_prydoncursor.integer) bits |= 1024;
- // button bits 11-31 unused currently
+ if (in_button9.state & 3) bits |= 2048;in_button9.state &= ~2;
+ if (in_button10.state & 3) bits |= 4096;in_button10.state &= ~2;
+ if (in_button11.state & 3) bits |= 8192;in_button11.state &= ~2;
+ if (in_button12.state & 3) bits |= 16384;in_button12.state &= ~2;
+ if (in_button13.state & 3) bits |= 32768;in_button13.state &= ~2;
+ if (in_button14.state & 3) bits |= 65536;in_button14.state &= ~2;
+ if (in_button15.state & 3) bits |= 131072;in_button15.state &= ~2;
+ if (in_button16.state & 3) bits |= 262144;in_button16.state &= ~2;
+ // button bits 19-31 unused currently
// rotate/zoom view serverside if PRYDON_CLIENTCURSOR cursor is at edge of screen
if (cl.cmd.cursor_screen[0] <= -1) bits |= 8;
if (cl.cmd.cursor_screen[0] >= 1) bits |= 16;
if (cl.cmd.cursor_screen[1] <= -1) bits |= 32;
if (cl.cmd.cursor_screen[1] >= 1) bits |= 64;
- // always dump the first two messages, because they may contain leftover inputs from the last level
- if (++cl.movemessages >= 2)
+ impulse = in_impulse;
+ in_impulse = 0;
+
+ csqc_buttons = bits;
+
+ if (cls.signon == SIGNONS)
{
- // send the movement message
- // PROTOCOL_QUAKE clc_move = 16 bytes total
- // PROTOCOL_QUAKEDP clc_move = 16 bytes total
- // PROTOCOL_NEHAHRAMOVIE clc_move = 16 bytes total
- // PROTOCOL_DARKPLACES1 clc_move = 19 bytes total
- // PROTOCOL_DARKPLACES2 clc_move = 25 bytes total
- // PROTOCOL_DARKPLACES3 clc_move = 25 bytes total
- // PROTOCOL_DARKPLACES4 clc_move = 19 bytes total
- // PROTOCOL_DARKPLACES5 clc_move = 19 bytes total
- // PROTOCOL_DARKPLACES6 clc_move = 52 bytes total
- // PROTOCOL_DARKPLACES7 clc_move = 56 bytes total
- if (cl.protocol == PROTOCOL_QUAKE || cl.protocol == PROTOCOL_QUAKEDP || cl.protocol == PROTOCOL_NEHAHRAMOVIE)
- {
- // 5 bytes
- MSG_WriteByte (&buf, clc_move);
- MSG_WriteFloat (&buf, cl.mtime[0]); // so server can get ping times
- // 3 bytes
- for (i = 0;i < 3;i++)
- MSG_WriteAngle8i (&buf, cl.viewangles[i]);
- // 6 bytes
- MSG_WriteCoord16i (&buf, forwardmove);
- MSG_WriteCoord16i (&buf, sidemove);
- MSG_WriteCoord16i (&buf, upmove);
- // 2 bytes
- MSG_WriteByte (&buf, bits);
- MSG_WriteByte (&buf, in_impulse);
- }
- else if (cl.protocol == PROTOCOL_DARKPLACES2 || cl.protocol == PROTOCOL_DARKPLACES3)
+ // always dump the first two messages, because they may contain leftover inputs from the last level
+ if (++cl.movemessages >= 2)
{
- // 5 bytes
- MSG_WriteByte (&buf, clc_move);
- MSG_WriteFloat (&buf, cl.mtime[0]); // so server can get ping times
- // 12 bytes
- for (i = 0;i < 3;i++)
- MSG_WriteAngle32f (&buf, cl.viewangles[i]);
- // 6 bytes
- MSG_WriteCoord16i (&buf, forwardmove);
- MSG_WriteCoord16i (&buf, sidemove);
- MSG_WriteCoord16i (&buf, upmove);
- // 2 bytes
- MSG_WriteByte (&buf, bits);
- MSG_WriteByte (&buf, in_impulse);
- }
- else if (cl.protocol == PROTOCOL_DARKPLACES1 || cl.protocol == PROTOCOL_DARKPLACES4 || cl.protocol == PROTOCOL_DARKPLACES5)
- {
- // 5 bytes
- MSG_WriteByte (&buf, clc_move);
- MSG_WriteFloat (&buf, cl.mtime[0]); // so server can get ping times
- // 6 bytes
- for (i = 0;i < 3;i++)
- MSG_WriteAngle16i (&buf, cl.viewangles[i]);
- // 6 bytes
- MSG_WriteCoord16i (&buf, forwardmove);
- MSG_WriteCoord16i (&buf, sidemove);
- MSG_WriteCoord16i (&buf, upmove);
- // 2 bytes
- MSG_WriteByte (&buf, bits);
- MSG_WriteByte (&buf, in_impulse);
- }
- else
- {
- // 5 bytes
- MSG_WriteByte (&buf, clc_move);
- if (cl.protocol != PROTOCOL_DARKPLACES6)
+ // send the movement message
+ // PROTOCOL_QUAKE clc_move = 16 bytes total
+ // PROTOCOL_QUAKEDP clc_move = 16 bytes total
+ // PROTOCOL_NEHAHRAMOVIE clc_move = 16 bytes total
+ // PROTOCOL_DARKPLACES1 clc_move = 19 bytes total
+ // PROTOCOL_DARKPLACES2 clc_move = 25 bytes total
+ // PROTOCOL_DARKPLACES3 clc_move = 25 bytes total
+ // PROTOCOL_DARKPLACES4 clc_move = 19 bytes total
+ // PROTOCOL_DARKPLACES5 clc_move = 19 bytes total
+ // PROTOCOL_DARKPLACES6 clc_move = 52 bytes total
+ // PROTOCOL_DARKPLACES7 clc_move = 56 bytes total
+ if (cl.protocol == PROTOCOL_QUAKE || cl.protocol == PROTOCOL_QUAKEDP || cl.protocol == PROTOCOL_NEHAHRAMOVIE)
{
- if (cl_movement.integer)
+ // 5 bytes
+ MSG_WriteByte (&buf, clc_move);
+ MSG_WriteFloat (&buf, cl.mtime[0]); // so server can get ping times
+ // 3 bytes
+ for (i = 0;i < 3;i++)
+ MSG_WriteAngle8i (&buf, cl.viewangles[i]);
+ // 6 bytes
+ MSG_WriteCoord16i (&buf, forwardmove);
+ MSG_WriteCoord16i (&buf, sidemove);
+ MSG_WriteCoord16i (&buf, upmove);
+ // 2 bytes
+ MSG_WriteByte (&buf, bits);
+ MSG_WriteByte (&buf, impulse);
+ }
+ else if (cl.protocol == PROTOCOL_DARKPLACES2 || cl.protocol == PROTOCOL_DARKPLACES3)
+ {
+ // 5 bytes
+ MSG_WriteByte (&buf, clc_move);
+ MSG_WriteFloat (&buf, cl.mtime[0]); // so server can get ping times
+ // 12 bytes
+ for (i = 0;i < 3;i++)
+ MSG_WriteAngle32f (&buf, cl.viewangles[i]);
+ // 6 bytes
+ MSG_WriteCoord16i (&buf, forwardmove);
+ MSG_WriteCoord16i (&buf, sidemove);
+ MSG_WriteCoord16i (&buf, upmove);
+ // 2 bytes
+ MSG_WriteByte (&buf, bits);
+ MSG_WriteByte (&buf, impulse);
+ }
+ else if (cl.protocol == PROTOCOL_DARKPLACES1 || cl.protocol == PROTOCOL_DARKPLACES4 || cl.protocol == PROTOCOL_DARKPLACES5)
+ {
+ // 5 bytes
+ MSG_WriteByte (&buf, clc_move);
+ MSG_WriteFloat (&buf, cl.mtime[0]); // so server can get ping times
+ // 6 bytes
+ for (i = 0;i < 3;i++)
+ MSG_WriteAngle16i (&buf, cl.viewangles[i]);
+ // 6 bytes
+ MSG_WriteCoord16i (&buf, forwardmove);
+ MSG_WriteCoord16i (&buf, sidemove);
+ MSG_WriteCoord16i (&buf, upmove);
+ // 2 bytes
+ MSG_WriteByte (&buf, bits);
+ MSG_WriteByte (&buf, impulse);
+ }
+ else
+ {
+ // 5 bytes
+ MSG_WriteByte (&buf, clc_move);
+ if (cl.protocol != PROTOCOL_DARKPLACES6)
{
- cl.movesequence++;
- MSG_WriteLong (&buf, cl.movesequence);
+ if (cl_movement.integer)
+ {
+ cl.movesequence++;
+ MSG_WriteLong (&buf, cl.movesequence);
+ }
+ else
+ MSG_WriteLong (&buf, 0);
}
- else
- MSG_WriteLong (&buf, 0);
+ MSG_WriteFloat (&buf, cl.mtime[0]); // so server can get ping times
+ // 6 bytes
+ for (i = 0;i < 3;i++)
+ MSG_WriteAngle16i (&buf, cl.viewangles[i]);
+ // 6 bytes
+ MSG_WriteCoord16i (&buf, forwardmove);
+ MSG_WriteCoord16i (&buf, sidemove);
+ MSG_WriteCoord16i (&buf, upmove);
+ // 5 bytes
+ MSG_WriteLong (&buf, bits);
+ MSG_WriteByte (&buf, impulse);
+ // PRYDON_CLIENTCURSOR
+ // 30 bytes
+ MSG_WriteShort (&buf, cl.cmd.cursor_screen[0] * 32767.0f);
+ MSG_WriteShort (&buf, cl.cmd.cursor_screen[1] * 32767.0f);
+ MSG_WriteFloat (&buf, cl.cmd.cursor_start[0]);
+ MSG_WriteFloat (&buf, cl.cmd.cursor_start[1]);
+ MSG_WriteFloat (&buf, cl.cmd.cursor_start[2]);
+ MSG_WriteFloat (&buf, cl.cmd.cursor_impact[0]);
+ MSG_WriteFloat (&buf, cl.cmd.cursor_impact[1]);
+ MSG_WriteFloat (&buf, cl.cmd.cursor_impact[2]);
+ MSG_WriteShort (&buf, cl.cmd.cursor_entitynumber);
}
- MSG_WriteFloat (&buf, cl.mtime[0]); // so server can get ping times
- // 6 bytes
- for (i = 0;i < 3;i++)
- MSG_WriteAngle16i (&buf, cl.viewangles[i]);
- // 6 bytes
- MSG_WriteCoord16i (&buf, forwardmove);
- MSG_WriteCoord16i (&buf, sidemove);
- MSG_WriteCoord16i (&buf, upmove);
- // 5 bytes
- MSG_WriteLong (&buf, bits);
- MSG_WriteByte (&buf, in_impulse);
- // PRYDON_CLIENTCURSOR
- // 30 bytes
- MSG_WriteShort (&buf, cl.cmd.cursor_screen[0] * 32767.0f);
- MSG_WriteShort (&buf, cl.cmd.cursor_screen[1] * 32767.0f);
- MSG_WriteFloat (&buf, cl.cmd.cursor_start[0]);
- MSG_WriteFloat (&buf, cl.cmd.cursor_start[1]);
- MSG_WriteFloat (&buf, cl.cmd.cursor_start[2]);
- MSG_WriteFloat (&buf, cl.cmd.cursor_impact[0]);
- MSG_WriteFloat (&buf, cl.cmd.cursor_impact[1]);
- MSG_WriteFloat (&buf, cl.cmd.cursor_impact[2]);
- MSG_WriteShort (&buf, cl.cmd.cursor_entitynumber);
- }
- }
-#if MOVEAVERAGING
- forwardmove = sidemove = upmove = 0;
-#endif
- in_impulse = 0;
+ // FIXME: bits & 16 is +button5, Nexuiz specific
+ CL_ClientMovement_Input((bits & 2) != 0, (bits & 16) != 0);
+ }
- // ack the last few frame numbers
- // (redundent to improve handling of client->server packet loss)
- // for LATESTFRAMENUMS == 3 case this is 15 bytes
- for (i = 0;i < LATESTFRAMENUMS;i++)
- {
- if (cl.latestframenums[i] > 0)
+ // ack the last few frame numbers
+ // (redundent to improve handling of client->server packet loss)
+ // for LATESTFRAMENUMS == 3 case this is 15 bytes
+ for (i = 0;i < LATESTFRAMENUMS;i++)
{
- if (developer_networkentities.integer >= 1)
- Con_Printf("send clc_ackframe %i\n", cl.latestframenums[i]);
- MSG_WriteByte(&buf, clc_ackframe);
- MSG_WriteLong(&buf, cl.latestframenums[i]);
+ if (cl.latestframenums[i] > 0)
+ {
+ if (developer_networkentities.integer >= 1)
+ Con_Printf("send clc_ackframe %i\n", cl.latestframenums[i]);
+ MSG_WriteByte(&buf, clc_ackframe);
+ MSG_WriteLong(&buf, cl.latestframenums[i]);
+ }
}
- }
-
- // PROTOCOL_DARKPLACES6 = 67 bytes per packet
- // PROTOCOL_DARKPLACES7 = 71 bytes per packet
- // deliver the message
- if (cls.demoplayback)
- return;
- // nothing to send
- if (!buf.cursize)
- return;
+ // PROTOCOL_DARKPLACES6 = 67 bytes per packet
+ // PROTOCOL_DARKPLACES7 = 71 bytes per packet
+ }
- // FIXME: bits & 16 is +button5, Nexuiz specific
- CL_ClientMovement_Input((bits & 2) != 0, (bits & 16) != 0);
+ // send the reliable message (forwarded commands) if there is one
+ NetConn_SendUnreliableMessage(cls.netcon, &buf);
- if (NetConn_SendUnreliableMessage(cls.netcon, &buf) == -1)
+ if (cls.netcon->message.overflowed)
{
Con_Print("CL_SendMove: lost server connection\n");
CL_Disconnect();
- Host_ShutdownServer(false);
+ Host_ShutdownServer();
}
}
*/
void CL_InitInput (void)
{
- Cmd_AddCommand ("+moveup",IN_UpDown);
- Cmd_AddCommand ("-moveup",IN_UpUp);
- Cmd_AddCommand ("+movedown",IN_DownDown);
- Cmd_AddCommand ("-movedown",IN_DownUp);
- Cmd_AddCommand ("+left",IN_LeftDown);
- Cmd_AddCommand ("-left",IN_LeftUp);
- Cmd_AddCommand ("+right",IN_RightDown);
- Cmd_AddCommand ("-right",IN_RightUp);
- Cmd_AddCommand ("+forward",IN_ForwardDown);
- Cmd_AddCommand ("-forward",IN_ForwardUp);
- Cmd_AddCommand ("+back",IN_BackDown);
- Cmd_AddCommand ("-back",IN_BackUp);
- Cmd_AddCommand ("+lookup", IN_LookupDown);
- Cmd_AddCommand ("-lookup", IN_LookupUp);
- Cmd_AddCommand ("+lookdown", IN_LookdownDown);
- Cmd_AddCommand ("-lookdown", IN_LookdownUp);
- Cmd_AddCommand ("+strafe", IN_StrafeDown);
- Cmd_AddCommand ("-strafe", IN_StrafeUp);
- Cmd_AddCommand ("+moveleft", IN_MoveleftDown);
- Cmd_AddCommand ("-moveleft", IN_MoveleftUp);
- Cmd_AddCommand ("+moveright", IN_MoverightDown);
- Cmd_AddCommand ("-moveright", IN_MoverightUp);
- Cmd_AddCommand ("+speed", IN_SpeedDown);
- Cmd_AddCommand ("-speed", IN_SpeedUp);
- Cmd_AddCommand ("+attack", IN_AttackDown);
- Cmd_AddCommand ("-attack", IN_AttackUp);
- Cmd_AddCommand ("+jump", IN_JumpDown);
- Cmd_AddCommand ("-jump", IN_JumpUp);
- Cmd_AddCommand ("impulse", IN_Impulse);
- Cmd_AddCommand ("+klook", IN_KLookDown);
- Cmd_AddCommand ("-klook", IN_KLookUp);
- Cmd_AddCommand ("+mlook", IN_MLookDown);
- Cmd_AddCommand ("-mlook", IN_MLookUp);
+ Cmd_AddCommand ("+moveup",IN_UpDown, "swim upward");
+ Cmd_AddCommand ("-moveup",IN_UpUp, "stop swimming upward");
+ Cmd_AddCommand ("+movedown",IN_DownDown, "swim downward");
+ Cmd_AddCommand ("-movedown",IN_DownUp, "stop swimming downward");
+ Cmd_AddCommand ("+left",IN_LeftDown, "turn left");
+ Cmd_AddCommand ("-left",IN_LeftUp, "stop turning left");
+ Cmd_AddCommand ("+right",IN_RightDown, "turn right");
+ Cmd_AddCommand ("-right",IN_RightUp, "stop turning right");
+ Cmd_AddCommand ("+forward",IN_ForwardDown, "move forward");
+ Cmd_AddCommand ("-forward",IN_ForwardUp, "stop moving forward");
+ Cmd_AddCommand ("+back",IN_BackDown, "move backward");
+ Cmd_AddCommand ("-back",IN_BackUp, "stop moving backward");
+ Cmd_AddCommand ("+lookup", IN_LookupDown, "look upward");
+ Cmd_AddCommand ("-lookup", IN_LookupUp, "stop looking upward");
+ Cmd_AddCommand ("+lookdown", IN_LookdownDown, "look downward");
+ Cmd_AddCommand ("-lookdown", IN_LookdownUp, "stop looking downward");
+ Cmd_AddCommand ("+strafe", IN_StrafeDown, "activate strafing mode (move instead of turn)\n");
+ Cmd_AddCommand ("-strafe", IN_StrafeUp, "deactivate strafing mode");
+ Cmd_AddCommand ("+moveleft", IN_MoveleftDown, "strafe left");
+ Cmd_AddCommand ("-moveleft", IN_MoveleftUp, "stop strafing left");
+ Cmd_AddCommand ("+moveright", IN_MoverightDown, "strafe right");
+ Cmd_AddCommand ("-moveright", IN_MoverightUp, "stop strafing right");
+ Cmd_AddCommand ("+speed", IN_SpeedDown, "activate run mode (faster movement and turning)");
+ Cmd_AddCommand ("-speed", IN_SpeedUp, "deactivate run mode");
+ Cmd_AddCommand ("+attack", IN_AttackDown, "begin firing");
+ Cmd_AddCommand ("-attack", IN_AttackUp, "stop firing");
+ Cmd_AddCommand ("+jump", IN_JumpDown, "jump");
+ Cmd_AddCommand ("-jump", IN_JumpUp, "end jump (so you can jump again)");
+ Cmd_AddCommand ("impulse", IN_Impulse, "send an impulse number to server (select weapon, use item, etc)");
+ Cmd_AddCommand ("+klook", IN_KLookDown, "activate keyboard looking mode, do not recenter view");
+ Cmd_AddCommand ("-klook", IN_KLookUp, "deactivate keyboard looking mode");
+ Cmd_AddCommand ("+mlook", IN_MLookDown, "activate mouse looking mode, do not recenter view");
+ Cmd_AddCommand ("-mlook", IN_MLookUp, "deactivate mouse looking mode");
// LordHavoc: added use button
- Cmd_AddCommand ("+use", IN_UseDown);
- Cmd_AddCommand ("-use", IN_UseUp);
+ Cmd_AddCommand ("+use", IN_UseDown, "use something (may be used by some mods)");
+ Cmd_AddCommand ("-use", IN_UseUp, "stop using something");
// LordHavoc: added 6 new buttons
- Cmd_AddCommand ("+button3", IN_Button3Down);
- Cmd_AddCommand ("-button3", IN_Button3Up);
- Cmd_AddCommand ("+button4", IN_Button4Down);
- Cmd_AddCommand ("-button4", IN_Button4Up);
- Cmd_AddCommand ("+button5", IN_Button5Down);
- Cmd_AddCommand ("-button5", IN_Button5Up);
- Cmd_AddCommand ("+button6", IN_Button6Down);
- Cmd_AddCommand ("-button6", IN_Button6Up);
- Cmd_AddCommand ("+button7", IN_Button7Down);
- Cmd_AddCommand ("-button7", IN_Button7Up);
- Cmd_AddCommand ("+button8", IN_Button8Down);
- Cmd_AddCommand ("-button8", IN_Button8Up);
+ Cmd_AddCommand ("+button3", IN_Button3Down, "activate button3 (behavior depends on mod)");
+ Cmd_AddCommand ("-button3", IN_Button3Up, "deactivate button3");
+ Cmd_AddCommand ("+button4", IN_Button4Down, "activate button4 (behavior depends on mod)");
+ Cmd_AddCommand ("-button4", IN_Button4Up, "deactivate button3");
+ Cmd_AddCommand ("+button5", IN_Button5Down, "activate button4 (behavior depends on mod)");
+ Cmd_AddCommand ("-button5", IN_Button5Up, "deactivate button3");
+ Cmd_AddCommand ("+button6", IN_Button6Down, "activate button4 (behavior depends on mod)");
+ Cmd_AddCommand ("-button6", IN_Button6Up, "deactivate button3");
+ Cmd_AddCommand ("+button7", IN_Button7Down, "activate button4 (behavior depends on mod)");
+ Cmd_AddCommand ("-button7", IN_Button7Up, "deactivate button3");
+ Cmd_AddCommand ("+button8", IN_Button8Down, "activate button4 (behavior depends on mod)");
+ Cmd_AddCommand ("-button8", IN_Button8Up, "deactivate button3");
+ Cmd_AddCommand ("+button9", IN_Button9Down, "activate button4 (behavior depends on mod)");
+ Cmd_AddCommand ("-button9", IN_Button9Up, "deactivate button3");
+ Cmd_AddCommand ("+button10", IN_Button10Down, "activate button4 (behavior depends on mod)");
+ Cmd_AddCommand ("-button10", IN_Button10Up, "deactivate button3");
+ Cmd_AddCommand ("+button11", IN_Button11Down, "activate button4 (behavior depends on mod)");
+ Cmd_AddCommand ("-button11", IN_Button11Up, "deactivate button3");
+ Cmd_AddCommand ("+button12", IN_Button12Down, "activate button4 (behavior depends on mod)");
+ Cmd_AddCommand ("-button12", IN_Button12Up, "deactivate button3");
+ Cmd_AddCommand ("+button13", IN_Button13Down, "activate button4 (behavior depends on mod)");
+ Cmd_AddCommand ("-button13", IN_Button13Up, "deactivate button3");
+ Cmd_AddCommand ("+button14", IN_Button14Down, "activate button4 (behavior depends on mod)");
+ Cmd_AddCommand ("-button14", IN_Button14Up, "deactivate button3");
+ Cmd_AddCommand ("+button15", IN_Button15Down, "activate button4 (behavior depends on mod)");
+ Cmd_AddCommand ("-button15", IN_Button15Up, "deactivate button3");
+ Cmd_AddCommand ("+button16", IN_Button16Down, "activate button4 (behavior depends on mod)");
+ Cmd_AddCommand ("-button16", IN_Button16Up, "deactivate button3");
Cvar_RegisterVariable(&cl_movement);
Cvar_RegisterVariable(&cl_movement_latency);
Cvar_RegisterVariable(&in_pitch_min);
Cvar_RegisterVariable(&in_pitch_max);
Cvar_RegisterVariable(&m_filter);
+
+ Cvar_RegisterVariable(&cl_netinputpacketspersecond);
}