]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_input.c
494
[xonotic/darkplaces.git] / cl_input.c
index f7cd45df7bb00f7d2738d8958b3fdd28d6e6e2d2..900f1cea63a62bc392f375c4f4adaa7be99cbc98 100644 (file)
@@ -197,6 +197,57 @@ void IN_JumpUp (void) {KeyUp(&in_jump);}
 
 void IN_Impulse (void) {in_impulse=atoi(Cmd_Argv(1));}
 
+int in_bestweapon_info[][5] =
+{
+       {'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}
+};
+void IN_BestWeapon (void)
+{
+       int i, n;
+       const char *s;
+       if (Cmd_Argc() != 2)
+       {
+               Con_Printf("bestweapon requires 1 parameter\n");
+               return;
+       }
+       s = Cmd_Argv(1);
+       for (i = 0;s[i];i++)
+       {
+               // figure out which weapon this character refers to
+               for (n = 0;in_bestweapon_info[n][0] >= 0;n++)
+               {
+                       if (in_bestweapon_info[n][0] == s[i])
+                       {
+                               // 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]))
+                               {
+                                       // we found one of the weapons the player wanted
+                                       // send an impulse to switch to it
+                                       in_impulse = in_bestweapon_info[n][1];
+                                       return;
+                               }
+                               break;
+                       }
+               }
+               // if we couldn't identify the weapon we just ignore it and continue checking for other weapons
+       }
+       // if we couldn't find any of the weapons, there's nothing more we can do...
+}
+
 /*
 ===============
 CL_KeyState
@@ -993,6 +1044,7 @@ void CL_ClientMovement_Physics_Walk(cl_clientmovement_state_t *s)
        {
                if (s->waterjumptime <= 0)
                {
+                       vec_t f;
                        vec_t vel_straight;
                        vec_t vel_z;
                        vec3_t vel_perpend;
@@ -1014,7 +1066,7 @@ void CL_ClientMovement_Physics_Walk(cl_clientmovement_state_t *s)
                        VectorMA(s->velocity, -vel_straight, wishdir, vel_perpend);
                        vel_perpend[2] -= vel_z;
 
-                       vec_t f = wishspeed - vel_straight;
+                       f = wishspeed - vel_straight;
                        if(f > 0)
                                vel_straight += min(f, s->movevars_accelerate * s->q.frametime * wishspeed) * s->movevars_airaccel_qw;
                        if(wishspeed > 0)
@@ -1186,7 +1238,7 @@ CL_SendMove
 extern cvar_t cl_netinputpacketspersecond;
 void CL_SendMove(void)
 {
-       int i;
+       int i, j, packetloss;
        int bits;
        int impulse;
        sizebuf_t buf;
@@ -1218,11 +1270,13 @@ void CL_SendMove(void)
        }
        else
        {
-               if (realtime < lastsendtime + 1.0 / bound(10, cl_netinputpacketspersecond.value, 100))
+               double packettime = 1.0 / bound(10, cl_netinputpacketspersecond.value, 100);
+               // don't send too often or else network connections can get clogged by a high renderer framerate
+               if (realtime < lastsendtime + packettime)
                        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);
+               lastsendtime = max(lastsendtime + packettime, realtime);
        }
 #if MOVEAVERAGING
        // average the accumulated changes
@@ -1333,8 +1387,9 @@ void CL_SendMove(void)
                                checksumindex = buf.cursize;
                                MSG_WriteByte(&buf, 0);
                                // packet loss percentage
-                               // FIXME: netgraph stuff
-                               MSG_WriteByte(&buf, 0);
+                               for (j = 0, packetloss = 0;j < 100;j++)
+                                       packetloss += cls.netcon->packetlost[j];
+                               MSG_WriteByte(&buf, packetloss);
                                // write most recent 3 moves
                                i = (cls.netcon->qw.outgoing_sequence-2) & QW_UPDATE_MASK;
                                cmd = &cl.qw_moves[i];
@@ -1565,6 +1620,9 @@ void CL_InitInput (void)
        Cmd_AddCommand ("+button16", IN_Button16Down, "activate button16 (behavior depends on mod)");
        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)");
+
        Cvar_RegisterVariable(&cl_movement);
        Cvar_RegisterVariable(&cl_movement_latency);
        Cvar_RegisterVariable(&cl_movement_maxspeed);