X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=host_cmd.c;h=e04f1a258fe21c614d1175edb176ebca21932cd8;hb=cdd93e8c5f467a92d2104f87d1dac61dcd53de15;hp=66c08cbc27080dfeb82fc1edd42a0f78208681b9;hpb=567adb42f1f2e706033d94041d6eef9c57487f57;p=xonotic%2Fdarkplaces.git diff --git a/host_cmd.c b/host_cmd.c index 66c08cbc..e04f1a25 100644 --- a/host_cmd.c +++ b/host_cmd.c @@ -22,6 +22,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "sv_demo.h" #include "image.h" +#include "utf8lib.h" + // for secure rcon authentication #include "hmac.h" #include "mdfour.h" @@ -142,7 +144,7 @@ void Host_Status_f (void) for (j = 0;j < NETGRAPH_PACKETS;j++) if (client->netconnection->incoming_netgraph[j].unreliablebytes == NETGRAPH_LOSTPACKET) packetloss++; - packetloss = packetloss * 100 / NETGRAPH_PACKETS; + packetloss = (packetloss * 100 + NETGRAPH_PACKETS - 1) / NETGRAPH_PACKETS; ping = bound(0, (int)floor(client->ping*1000+0.5), 9999); } @@ -829,6 +831,9 @@ void Host_Loadgame_f (void) } } + // unlink all entities + World_UnlinkAll(&sv.world); + // load the edicts out of the savegame file end = t; for (;;) @@ -1027,7 +1032,7 @@ void Host_Name_f (void) host_client->name[1] = '0' + STRING_COLOR_DEFAULT; } - COM_StringLengthNoColors(host_client->name, 0, &valid_colors); + u8_COM_StringLengthNoColors(host_client->name, 0, &valid_colors); if(!valid_colors) // NOTE: this also proves the string is not empty, as "" is a valid colored string { size_t l; @@ -2381,7 +2386,7 @@ void Host_PQRcon_f (void) MSG_WriteByte (&net_message, CCREQ_RCON); SZ_Write(&net_message, (void*)rcon_password.string, n); MSG_WriteString (&net_message, Cmd_Args()); - *((int *)net_message.data) = BigLong(NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK)); + StoreBigLong(net_message.data, NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK)); NetConn_Write(mysocket, net_message.data, net_message.cursize, &to); SZ_Clear (&net_message); } @@ -2712,7 +2717,7 @@ Send back ping and packet loss update for all current players to this player */ void Host_Pings_f (void) { - int i, j, ping, packetloss; + int i, j, ping, packetloss, movementloss; char temp[128]; if (!host_client->netconnection) @@ -2726,11 +2731,18 @@ void Host_Pings_f (void) for (i = 0;i < svs.maxclients;i++) { packetloss = 0; + movementloss = 0; if (svs.clients[i].netconnection) + { for (j = 0;j < NETGRAPH_PACKETS;j++) if (svs.clients[i].netconnection->incoming_netgraph[j].unreliablebytes == NETGRAPH_LOSTPACKET) packetloss++; - packetloss = packetloss * 100 / NETGRAPH_PACKETS; + for (j = 0;j < NETGRAPH_PACKETS;j++) + if (svs.clients[i].movement_count[j] < 0) + movementloss++; + } + packetloss = (packetloss * 100 + NETGRAPH_PACKETS - 1) / NETGRAPH_PACKETS; + movementloss = (movementloss * 100 + NETGRAPH_PACKETS - 1) / NETGRAPH_PACKETS; ping = (int)floor(svs.clients[i].ping*1000+0.5); ping = bound(0, ping, 9999); if (sv.protocol == PROTOCOL_QUAKEWORLD) @@ -2744,7 +2756,10 @@ void Host_Pings_f (void) 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); + if(movementloss) + dpsnprintf(temp, sizeof(temp), " %d %d,%d", ping, packetloss, movementloss); + else + dpsnprintf(temp, sizeof(temp), " %d %d", ping, packetloss); MSG_WriteUnterminatedString(&host_client->netconnection->message, temp); } } @@ -2754,6 +2769,7 @@ void Host_Pings_f (void) void Host_PingPLReport_f(void) { + char *errbyte; int i; int l = Cmd_Argc(); if (l > cl.maxclients) @@ -2761,7 +2777,11 @@ void Host_PingPLReport_f(void) 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)); + cl.scores[i].qw_packetloss = strtol(Cmd_Argv(1+i*2+1), &errbyte, 0); + if(errbyte && *errbyte == ',') + cl.scores[i].qw_movementloss = atoi(errbyte + 1); + else + cl.scores[i].qw_movementloss = 0; } }