+ if (length >= 15 && !memcmp(string, "statusResponse\x0A", 15))
+ {
+ serverlist_info_t *info;
+ char *p;
+ int n;
+
+ string += 15;
+ // search the cache for this server and update it
+ n = NetConn_ClientParsePacket_ServerList_ProcessReply(addressstring2);
+ if (n < 0)
+ return true;
+
+ info = &serverlist_cache[n].info;
+ info->game[0] = 0;
+ info->mod[0] = 0;
+ info->map[0] = 0;
+ info->name[0] = 0;
+ info->qcstatus[0] = 0;
+ info->players[0] = 0;
+ info->protocol = -1;
+ info->numplayers = 0;
+ info->numbots = -1;
+ info->maxplayers = 0;
+ info->gameversion = 0;
+
+ p = strchr(string, '\n');
+ if(p)
+ {
+ *p = 0; // cut off the string there
+ ++p;
+ }
+ else
+ Con_Printf("statusResponse without players block?\n");
+
+ if ((s = SearchInfostring(string, "gamename" )) != NULL) strlcpy(info->game, s, sizeof (info->game));
+ if ((s = SearchInfostring(string, "modname" )) != NULL) strlcpy(info->mod , s, sizeof (info->mod ));
+ if ((s = SearchInfostring(string, "mapname" )) != NULL) strlcpy(info->map , s, sizeof (info->map ));
+ if ((s = SearchInfostring(string, "hostname" )) != NULL) strlcpy(info->name, s, sizeof (info->name));
+ if ((s = SearchInfostring(string, "protocol" )) != NULL) info->protocol = atoi(s);
+ if ((s = SearchInfostring(string, "clients" )) != NULL) info->numplayers = atoi(s);
+ if ((s = SearchInfostring(string, "bots" )) != NULL) info->numbots = atoi(s);
+ if ((s = SearchInfostring(string, "sv_maxclients")) != NULL) info->maxplayers = atoi(s);
+ if ((s = SearchInfostring(string, "gameversion" )) != NULL) info->gameversion = atoi(s);
+ if ((s = SearchInfostring(string, "qcstatus" )) != NULL) strlcpy(info->qcstatus, s, sizeof(info->qcstatus));
+ if (p != NULL) strlcpy(info->players, p, sizeof(info->players));
+ info->numhumans = info->numplayers - max(0, info->numbots);
+ info->freeslots = info->maxplayers - info->numplayers;
+
+ NetConn_ClientParsePacket_ServerList_UpdateCache(n);
+
+ return true;
+ }