]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - host_cmd.c
added ping and packet loss display to scoreboard, and pings/pingplreport commands...
[xonotic/darkplaces.git] / host_cmd.c
index 51528b199c1e457f5eea9e890d5232e1c7a58f54..8e6930d3975e2a7cd76b02733c65d0df60fd8118 100644 (file)
@@ -23,7 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 int current_skill;
 cvar_t sv_cheats = {0, "sv_cheats", "0", "enables cheat commands in any game, and cheat impulses in dpmod"};
-cvar_t rcon_password = {0, "rcon_password", "", "password to authenticate rcon commands"};
+cvar_t rcon_password = {CVAR_PRIVATE, "rcon_password", "", "password to authenticate rcon commands"};
 cvar_t rcon_address = {0, "rcon_address", "", "server address to send rcon commands to (when not connected to a server)"};
 cvar_t team = {CVAR_USERINFO | CVAR_SAVE, "team", "none", "QW team (4 character limit, example: blue)"};
 cvar_t skin = {CVAR_USERINFO | CVAR_SAVE, "skin", "", "QW player skin name (example: base)"};
@@ -285,6 +285,7 @@ void Host_Map_f (void)
        if (sv.active && cls.state == ca_disconnected)
                CL_EstablishConnection("local:1");
 
+#ifdef AUTODEMO_BROKEN
 // if cl_autodemo is set, automatically start recording a demo if one isn't being recorded already
        if (cl_autodemo.integer && !cls.demorecording)
        {
@@ -305,6 +306,7 @@ void Host_Map_f (void)
 
                cls.demorecording = true;
        }
+#endif
 }
 
 /*
@@ -629,7 +631,7 @@ void Host_Loadgame_f (void)
        }
 
        // version
-       COM_ParseToken(&t, false);
+       COM_ParseTokenConsole(&t);
        version = atoi(com_token);
        if (version != SAVEGAME_VERSION)
        {
@@ -645,21 +647,21 @@ void Host_Loadgame_f (void)
 
        for (i = 0;i < NUM_SPAWN_PARMS;i++)
        {
-               COM_ParseToken(&t, false);
+               COM_ParseTokenConsole(&t);
                spawn_parms[i] = atof(com_token);
        }
        // skill
-       COM_ParseToken(&t, false);
+       COM_ParseTokenConsole(&t);
 // this silliness is so we can load 1.06 save files, which have float skill values
        current_skill = (int)(atof(com_token) + 0.5);
        Cvar_SetValue ("skill", (float)current_skill);
 
        // mapname
-       COM_ParseToken(&t, false);
+       COM_ParseTokenConsole(&t);
        strcpy (mapname, com_token);
 
        // time
-       COM_ParseToken(&t, false);
+       COM_ParseTokenConsole(&t);
        time = atof(com_token);
 
        allowcheats = sv_cheats.integer != 0;
@@ -680,7 +682,7 @@ void Host_Loadgame_f (void)
        {
                // light style
                oldt = t;
-               COM_ParseToken(&t, false);
+               COM_ParseTokenConsole(&t);
                // if this is a 64 lightstyle savegame produced by Quake, stop now
                // we have to check this because darkplaces saves 256 lightstyle savegames
                if (com_token[0] == '{')
@@ -698,7 +700,7 @@ void Host_Loadgame_f (void)
        for(;;)
        {
                oldt = t;
-               COM_ParseToken(&t, false);
+               COM_ParseTokenConsole(&t);
                if (com_token[0] == '{')
                {
                        t = oldt;
@@ -713,10 +715,10 @@ void Host_Loadgame_f (void)
        for (;;)
        {
                start = t;
-               while (COM_ParseToken(&t, false))
+               while (COM_ParseTokenConsole(&t))
                        if (!strcmp(com_token, "}"))
                                break;
-               if (!COM_ParseToken(&start, false))
+               if (!COM_ParseTokenConsole(&start))
                {
                        // end of file
                        break;
@@ -1580,7 +1582,7 @@ void Host_Kick_f (void)
                if (Cmd_Argc() > 2)
                {
                        message = Cmd_Args();
-                       COM_ParseToken(&message, false);
+                       COM_ParseTokenConsole(&message);
                        if (byNumber)
                        {
                                message++;                                                      // skip the #
@@ -1990,7 +1992,7 @@ void Host_SendCvar_f (void)
 
        if(Cmd_Argc() != 2)
                return;
-       if(!(c = Cvar_FindVar(Cmd_Argv(1))))
+       if(!(c = Cvar_FindVar(Cmd_Argv(1))) || (c->flags & CVAR_PRIVATE))
                return;
        if (cls.state != ca_dedicated)
                Cmd_ForwardStringToServer(va("sentcvar %s %s\n", c->name, c->string));
@@ -2322,6 +2324,71 @@ void Host_Packet_f (void) // credit: taken from QuakeWorld
                NetConn_Write(mysocket, send, out - send, &address);
 }
 
+/*
+====================
+Host_Pings_f
+
+Send back ping and packet loss update for all current players to this player
+====================
+*/
+void Host_Pings_f (void)
+{
+       int             i, j, ping, packetloss;
+       char temp[128];
+
+       if (cmd_source == src_command)
+       {
+               Cmd_ForwardToServer ();
+               return;
+       }
+       if (!host_client->netconnection)
+               return;
+
+       if (sv.protocol != PROTOCOL_QUAKEWORLD)
+       {
+               MSG_WriteByte(&host_client->netconnection->message, svc_stufftext);
+               MSG_WriteUnterminatedString(&host_client->netconnection->message, "pingplreport");
+       }
+       for (i = 0;i < svs.maxclients;i++)
+       {
+               packetloss = 0;
+               if (svs.clients[i].netconnection)
+                       for (j = 0;j < 100;j++)
+                               packetloss += svs.clients[i].netconnection->packetlost[j];
+               ping = (int)floor(svs.clients[i].ping*1000+0.5);
+               ping = bound(0, ping, 9999);
+               if (sv.protocol == PROTOCOL_QUAKEWORLD)
+               {
+                       // send qw_svc_updateping and qw_svc_updatepl messages
+                       MSG_WriteByte(&host_client->netconnection->message, qw_svc_updateping);
+                       MSG_WriteShort(&host_client->netconnection->message, ping);
+                       MSG_WriteByte(&host_client->netconnection->message, qw_svc_updatepl);
+                       MSG_WriteByte(&host_client->netconnection->message, packetloss);
+               }
+               else
+               {
+                       // write the string into the packet as multiple unterminated strings to avoid needing a local buffer
+                       dpsnprintf(temp, sizeof(temp), " %d %d", ping, packetloss);
+                       MSG_WriteUnterminatedString(&host_client->netconnection->message, temp);
+               }
+       }
+       if (sv.protocol != PROTOCOL_QUAKEWORLD)
+               MSG_WriteString(&host_client->netconnection->message, "\n");
+}
+
+void Host_PingPLReport_f(void)
+{
+       int i;
+       int l = Cmd_Argc();
+       if (l > cl.maxclients)
+               l = cl.maxclients;
+       for (i = 0;i < l;i++)
+       {
+               cl.scores[i].qw_ping = atoi(Cmd_Argv(1+i*2));
+               cl.scores[i].qw_packetloss = atoi(Cmd_Argv(1+i*2+1));
+       }
+}
+
 //=============================================================================
 
 /*
@@ -2413,6 +2480,9 @@ void Host_InitCommands (void)
        Cmd_AddCommand ("topcolor", Host_TopColor_f, "QW command to set top color without changing bottom color");
        Cmd_AddCommand ("bottomcolor", Host_BottomColor_f, "QW command to set bottom color without changing top color");
 
+       Cmd_AddCommand ("pings", Host_Pings_f, "command sent by clients to request updated ping and packetloss of players on scoreboard (originally from QW, but also used on NQ servers)");
+       Cmd_AddCommand ("pingplreport", Host_PingPLReport_f, "command sent by server containing client ping and packet loss values for scoreboard, triggered by pings command from client (not used by QW servers)");
+
        Cvar_RegisterVariable (&team);
        Cvar_RegisterVariable (&skin);
        Cvar_RegisterVariable (&noaim);