]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_input.c
view models no longer receive stencil shadows (only basic light visibility culling...
[xonotic/darkplaces.git] / cl_input.c
index 56062c77906f7297f983e1d2928fc9551ddb0e5b..a1a7aad12a5ad0c665592544ac7a14be7a063ae3 100644 (file)
@@ -197,47 +197,55 @@ void IN_JumpUp (void) {KeyUp(&in_jump);}
 
 void IN_Impulse (void) {in_impulse=atoi(Cmd_Argv(1));}
 
-int in_bestweapon_info[][5] =
+struct
 {
-       {'1', 1, IT_AXE, STAT_SHELLS, 0},
-       {'2', 2, IT_SHOTGUN, STAT_SHELLS, 1},
-       {'3', 3, IT_SUPER_SHOTGUN, STAT_SHELLS, 1},
-       {'4', 4, IT_NAILGUN, STAT_NAILS, 1},
-       {'5', 5, IT_SUPER_NAILGUN, STAT_NAILS, 1},
-       {'6', 6, IT_GRENADE_LAUNCHER, STAT_ROCKETS, 1},
-       {'7', 7, IT_ROCKET_LAUNCHER, STAT_ROCKETS, 1},
-       {'8', 8, IT_LIGHTNING, STAT_CELLS, 1},
-       {'9', 9, 128, STAT_CELLS, 1}, // generic energy weapon for mods
-       {'p', 209, 128, STAT_CELLS, 1}, // dpmod plasma gun
-       {'w', 210, 8388608, STAT_CELLS, 1}, // dpmod plasma wave cannon
-       {'l', 225, HIT_LASER_CANNON, STAT_CELLS, 1}, // hipnotic laser cannon
-       {'h', 226, HIT_MJOLNIR, STAT_CELLS, 0}, // hipnotic mjolnir hammer
-       {-1, 0, 0, 0, 0}
+       const char *name;
+       int impulse;
+       int weaponbit;
+       int ammostat;
+       int ammomin;
+}
+in_bestweapon_info[] =
+{
+       {"1", 1, IT_AXE, STAT_SHELLS, 0},
+       {"2", 2, IT_SHOTGUN, STAT_SHELLS, 1},
+       {"3", 3, IT_SUPER_SHOTGUN, STAT_SHELLS, 1},
+       {"4", 4, IT_NAILGUN, STAT_NAILS, 1},
+       {"5", 5, IT_SUPER_NAILGUN, STAT_NAILS, 1},
+       {"6", 6, IT_GRENADE_LAUNCHER, STAT_ROCKETS, 1},
+       {"7", 7, IT_ROCKET_LAUNCHER, STAT_ROCKETS, 1},
+       {"8", 8, IT_LIGHTNING, STAT_CELLS, 1},
+       {"9", 9, 128, STAT_CELLS, 1}, // generic energy weapon for mods
+       {"p", 209, 128, STAT_CELLS, 1}, // dpmod plasma gun
+       {"w", 210, 8388608, STAT_CELLS, 1}, // dpmod plasma wave cannon
+       {"l", 225, HIT_LASER_CANNON, STAT_CELLS, 1}, // hipnotic laser cannon
+       {"h", 226, HIT_MJOLNIR, STAT_CELLS, 0}, // hipnotic mjolnir hammer
+       {NULL, 0, 0, 0, 0}
 };
 void IN_BestWeapon (void)
 {
        int i, n;
-       const char *s;
-       if (Cmd_Argc() != 2)
+       const char *t;
+       if (Cmd_Argc() < 2)
        {
-               Con_Printf("bestweapon requires 1 parameter\n");
+               Con_Printf("bestweapon requires 1 or more parameters\n");
                return;
        }
-       s = Cmd_Argv(1);
-       for (i = 0;s[i];i++)
+       for (i = 1;i < Cmd_Argc();i++)
        {
+               t = Cmd_Argv(i);
                // figure out which weapon this character refers to
-               for (n = 0;in_bestweapon_info[n][0] >= 0;n++)
+               for (n = 0;in_bestweapon_info[n].name;n++)
                {
-                       if (in_bestweapon_info[n][0] == s[i])
+                       if (!strcmp(in_bestweapon_info[n].name, t))
                        {
                                // we found out what weapon this character refers to
                                // check if the inventory contains the weapon and enough ammo
-                               if ((cl.stats[STAT_ITEMS] & in_bestweapon_info[n][2]) && (cl.stats[in_bestweapon_info[n][3]] >= in_bestweapon_info[n][4]))
+                               if ((cl.stats[STAT_ITEMS] & in_bestweapon_info[n].weaponbit) && (cl.stats[in_bestweapon_info[n].ammostat] >= in_bestweapon_info[n].ammomin))
                                {
                                        // we found one of the weapons the player wanted
                                        // send an impulse to switch to it
-                                       in_impulse = in_bestweapon_info[n][1];
+                                       in_impulse = in_bestweapon_info[n].impulse;
                                        return;
                                }
                                break;
@@ -320,6 +328,7 @@ cvar_t cl_pitchspeed = {CVAR_SAVE, "cl_pitchspeed","150","keyboard pitch turning
 cvar_t cl_anglespeedkey = {CVAR_SAVE, "cl_anglespeedkey","1.5","how much +speed multiplies keyboard turning speed"};
 
 cvar_t cl_movement = {CVAR_SAVE, "cl_movement", "0", "enables clientside prediction of your player movement"};
+cvar_t cl_movement_minping = {CVAR_SAVE, "cl_movement_minping", "50", "whether to use prediction when ping is lower than this value in milliseconds"};
 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)"};
@@ -342,7 +351,7 @@ cvar_t in_pitch_max = {0, "in_pitch_max", "90", "how far upward you can aim (qua
 cvar_t m_filter = {CVAR_SAVE, "m_filter","0", "smoothes mouse movement, less responsive but smoother aiming"};
 
 cvar_t cl_netinputpacketspersecond = {CVAR_SAVE, "cl_netinputpacketspersecond","50", "how many input packets to send to server each second"};
-cvar_t cl_netinputpacketlosstolerance = {CVAR_SAVE, "cl_netinputpacketlosstolerance", "4", "how many packets in a row can be lost without movement issues when using cl_movement (technically how many input messages to repeat in each packet that have not yet been acknowledged by the server)"};
+cvar_t cl_netinputpacketlosstolerance = {CVAR_SAVE, "cl_netinputpacketlosstolerance", "1", "how many packets in a row can be lost without movement issues when using cl_movement (technically how many input messages to repeat in each packet that have not yet been acknowledged by the server), only affects DP7 servers (Quake uses 0, QuakeWorld uses 2, and just for comparison Quake3 uses 1)"};
 
 cvar_t cl_nodelta = {0, "cl_nodelta", "0", "disables delta compression of non-player entities in QW network protocol"};
 
@@ -1086,6 +1095,7 @@ void CL_ClientMovement_PlayerMove(cl_clientmovement_state_t *s)
 void CL_ClientMovement_Replay(void)
 {
        int i;
+       double totalmovetime;
        cl_clientmovement_state_t s;
 
        // set up starting state for the series of moves
@@ -1136,7 +1146,10 @@ void CL_ClientMovement_Replay(void)
                s.movevars_airaccel_sideways_friction = cl_movement_airaccel_sideways_friction.value;
        }
 
-       cl.movement_predicted = cls.servermovesequence && (cl_movement.integer && !cls.demoplayback && cls.signon == SIGNONS && cl.stats[STAT_HEALTH] > 0 && !cl.intermission);
+       totalmovetime = 0;
+       for (i = 0;i < cl.movement_numqueue - 1;i++)
+               totalmovetime += cl.movement_queue[i].frametime;
+       cl.movement_predicted = totalmovetime * 1000.0 >= cl_movement_minping.value && cls.servermovesequence && (cl_movement.integer && !cls.demoplayback && cls.signon == SIGNONS && cl.stats[STAT_HEALTH] > 0 && !cl.intermission);
        if (cl.movement_predicted)
        {
                //Con_Printf("%f: ", cl.movecmd[0].time);
@@ -1404,7 +1417,7 @@ void CL_SendMove(void)
                                // configurable number of unacknowledged moves
                                maxusercmds = bound(1, cl_netinputpacketlosstolerance.integer + 1, CL_MAX_USERCMDS);
                                // when movement prediction is off, there's not much point in repeating old input as it will just be ignored
-                               if (!cl.movement_predicted)
+                               if (!cl.cmd.sequence)
                                        maxusercmds = 1;
                        }
 
@@ -1662,9 +1675,10 @@ void CL_InitInput (void)
        Cmd_AddCommand ("-button16", IN_Button16Up, "deactivate button16");
 
        // LordHavoc: added bestweapon command
-       Cmd_AddCommand ("bestweapon", IN_BestWeapon, "send an impulse number to server to select the first usable weapon out of several (example: 87654321)");
+       Cmd_AddCommand ("bestweapon", IN_BestWeapon, "send an impulse number to server to select the first usable weapon out of several (example: 8 7 6 5 4 3 2 1)");
 
        Cvar_RegisterVariable(&cl_movement);
+       Cvar_RegisterVariable(&cl_movement_minping);
        Cvar_RegisterVariable(&cl_movement_maxspeed);
        Cvar_RegisterVariable(&cl_movement_maxairspeed);
        Cvar_RegisterVariable(&cl_movement_stopspeed);