X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=cl_input.c;h=19441cc1533e9dc8b9f9d2812849591a8bc1f703;hp=3c8a514082b54c47c96be1f0ad30d020cf372b0a;hb=50804f7075a727286ca58efcf890861afe314ee8;hpb=5d00fdd2bc32e9635c51a22bace2e0a883f3561f diff --git a/cl_input.c b/cl_input.c index 3c8a5140..19441cc1 100644 --- a/cl_input.c +++ b/cl_input.c @@ -23,6 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // rights reserved. #include "quakedef.h" +#include "csprogs.h" /* =============================================================================== @@ -53,10 +54,11 @@ kbutton_t in_strafe, in_speed, in_jump, in_attack, in_use; 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) @@ -173,6 +175,23 @@ void IN_Button7Up(void) {KeyUp(&in_button7);} 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);} @@ -237,35 +256,37 @@ float CL_KeyState (kbutton_t *key) //========================================================================== -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"}; /* @@ -396,7 +417,7 @@ void CL_Move (void) 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) { @@ -409,18 +430,18 @@ void CL_Move (void) { // 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; @@ -429,7 +450,7 @@ void CL_Move (void) { // 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; } } @@ -473,8 +494,8 @@ void CL_UpdatePrydonCursor(void) 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 @@ -487,7 +508,7 @@ void CL_UpdatePrydonCursor(void) 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); } @@ -513,7 +534,7 @@ void CL_ClientMovement_Input(qboolean buttonjump, qboolean buttoncrouch) 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; @@ -527,10 +548,6 @@ void CL_ClientMovement_Input(qboolean buttonjump, qboolean buttoncrouch) 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; } @@ -564,6 +581,7 @@ void CL_ClientMovement_Replay(void) trace_t trace; trace_t trace2; trace_t trace3; + if (!cl.movement_replay) return; cl.movement_replay = false; @@ -587,7 +605,7 @@ void CL_ClientMovement_Replay(void) // 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; @@ -779,35 +797,59 @@ void CL_ClientMovement_Replay(void) 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; @@ -835,151 +877,158 @@ void CL_SendMove(void) 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(); } } @@ -990,57 +1039,73 @@ CL_InitInput */ 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); @@ -1058,5 +1123,7 @@ void CL_InitInput (void) Cvar_RegisterVariable(&in_pitch_min); Cvar_RegisterVariable(&in_pitch_max); Cvar_RegisterVariable(&m_filter); + + Cvar_RegisterVariable(&cl_netinputpacketspersecond); }