+ 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 (!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 < NETGRAPH_PACKETS;j++)
+ if (svs.clients[i].netconnection->incoming_unreliablesize[j] == NETGRAPH_LOSTPACKET)
+ packetloss++;
+ packetloss = packetloss * 100 / NETGRAPH_PACKETS;
+ 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));
+ }