/* ================= ArenaServers_StartRefresh ================= */ static void ArenaServers_StartRefresh( void ) { int i; int gametype; char myargs[64], protocol[32]; memset( g_arenaservers.serverlist, 0, g_arenaservers.maxservers*sizeof(table_t) ); for (i=0; i<MAX_PINGREQUESTS; i++) { g_arenaservers.pinglist[i].adrstr[0] = '\0'; trap_LAN_ClearPing( i ); } g_arenaservers.refreshservers = qtrue; g_arenaservers.currentping = 0; g_arenaservers.nextpingtime = 0; *g_arenaservers.numservers = 0; g_arenaservers.numqueriedservers = 0; // allow max 5 seconds for responses g_arenaservers.refreshtime = uis.realtime + 5000; // place menu in zeroed state ArenaServers_UpdateMenu(); if( g_servertype == UIAS_LOCAL ) { trap_Cmd_ExecuteText( EXEC_APPEND, "localservers\n" ); return; } if( g_servertype >= UIAS_GLOBAL1 && g_servertype <= UIAS_GLOBAL5 ) { gametype = ArenaServers_GametypeForGames(g_arenaservers.gametype.curvalue); // add requested gametype to args for dpmaster protocol if (gametype != -1) { Com_sprintf( myargs, sizeof (myargs), " gametype=%s", bg_netGametypeNames[gametype] ); } else { myargs[0] = '\0'; } if (g_emptyservers) { strcat(myargs, " empty"); } if (g_fullservers) { strcat(myargs, " full"); } protocol[0] = '\0'; trap_Cvar_VariableStringBuffer( "debug_protocol", protocol, sizeof(protocol) ); if (strlen(protocol)) { trap_Cmd_ExecuteText( EXEC_APPEND, va( "globalservers %d %s%s\n", g_servertype - 1, protocol, myargs )); } else { trap_Cmd_ExecuteText( EXEC_APPEND, va( "globalservers %d %d%s\n", g_servertype - 1, (int)trap_Cvar_VariableValue( "protocol" ), myargs ) ); } } }
/* ================= ArenaServers_DoRefresh ================= */ static void ArenaServers_DoRefresh( void ) { int i; int j; int time; int maxPing; char adrstr[MAX_ADDRESSLENGTH]; char info[MAX_INFO_STRING]; if (uis.realtime < g_arenaservers.refreshtime) { if (g_servertype != UIAS_FAVORITES) { if (g_servertype == UIAS_LOCAL) { if (!trap_LAN_GetServerCount(AS_LOCAL)) { return; } } if (trap_LAN_GetServerCount(ArenaServers_SourceForLAN()) < 0) { // still waiting for response return; } } } if (uis.realtime < g_arenaservers.nextpingtime) { // wait for time trigger return; } // trigger at 10Hz intervals g_arenaservers.nextpingtime = uis.realtime + 10; // process ping results maxPing = ArenaServers_MaxPing(); for (i=0; i<MAX_PINGREQUESTS; i++) { trap_LAN_GetPing( i, adrstr, MAX_ADDRESSLENGTH, &time ); if (!adrstr[0]) { // ignore empty or pending pings continue; } // find ping result in our local list for (j=0; j<MAX_PINGREQUESTS; j++) if (!Q_stricmp( adrstr, g_arenaservers.pinglist[j].adrstr )) break; if (j < MAX_PINGREQUESTS) { // found it if (!time) { time = uis.realtime - g_arenaservers.pinglist[j].start; if (time < maxPing) { // still waiting continue; } } if (time > maxPing) { // stale it out info[0] = '\0'; time = maxPing; } else { trap_LAN_GetPingInfo( i, info, MAX_INFO_STRING ); } // insert ping results ArenaServers_Insert( adrstr, info, time ); // clear this query from internal list g_arenaservers.pinglist[j].adrstr[0] = '\0'; } // clear this query from external list trap_LAN_ClearPing( i ); } // get results of servers query // counts can increase as servers respond if (g_servertype == UIAS_FAVORITES) { g_arenaservers.numqueriedservers = g_arenaservers.numfavoriteaddresses; } else { g_arenaservers.numqueriedservers = trap_LAN_GetServerCount(ArenaServers_SourceForLAN()); } // if (g_arenaservers.numqueriedservers > g_arenaservers.maxservers) // g_arenaservers.numqueriedservers = g_arenaservers.maxservers; // send ping requests in reasonable bursts // iterate ping through all found servers for (i=0; i<MAX_PINGREQUESTS && g_arenaservers.currentping < g_arenaservers.numqueriedservers; i++) { if (trap_LAN_GetPingQueueCount() >= MAX_PINGREQUESTS) { // ping queue is full break; } // find empty slot for (j=0; j<MAX_PINGREQUESTS; j++) if (!g_arenaservers.pinglist[j].adrstr[0]) break; if (j >= MAX_PINGREQUESTS) // no empty slots available yet - wait for timeout break; // get an address to ping if (g_servertype == UIAS_FAVORITES) { strcpy( adrstr, g_arenaservers.favoriteaddresses[g_arenaservers.currentping] ); } else { trap_LAN_GetServerAddressString(ArenaServers_SourceForLAN(), g_arenaservers.currentping, adrstr, MAX_ADDRESSLENGTH ); } strcpy( g_arenaservers.pinglist[j].adrstr, adrstr ); g_arenaservers.pinglist[j].start = uis.realtime; trap_Cmd_ExecuteText( EXEC_NOW, va( "ping %s\n", adrstr ) ); // advance to next server g_arenaservers.currentping++; } if (!trap_LAN_GetPingQueueCount()) { // all pings completed ArenaServers_StopRefresh(); return; } // update the user interface with ping status ArenaServers_UpdateMenu(); }
/* ================= ArenaServers_StartRefresh ================= */ static void ArenaServers_StartRefresh( void ) { int i; char myargs[32], protocol[32]; memset( g_arenaservers.serverlist, 0, g_arenaservers.maxservers*sizeof(table_t) ); for (i=0; i<MAX_PINGREQUESTS; i++) { g_arenaservers.pinglist[i].adrstr[0] = '\0'; trap_LAN_ClearPing( i ); } g_arenaservers.refreshservers = qtrue; g_arenaservers.currentping = 0; g_arenaservers.nextpingtime = 0; *g_arenaservers.numservers = 0; g_arenaservers.numqueriedservers = 0; // allow max 5 seconds for responses g_arenaservers.refreshtime = uis.realtime + 5000; // place menu in zeroed state ArenaServers_UpdateMenu(); if( g_servertype == UIAS_LOCAL ) { trap_Cmd_ExecuteText( EXEC_APPEND, "localservers\n" ); return; } if( g_servertype >= UIAS_GLOBAL1 && g_servertype <= UIAS_GLOBAL5 ) { switch( g_arenaservers.gametype.curvalue ) { default: case GAMES_ALL: myargs[0] = 0; break; case GAMES_FFA: strcpy( myargs, " ffa" ); break; case GAMES_TEAMPLAY: strcpy( myargs, " team" ); break; case GAMES_TOURNEY: strcpy( myargs, " tourney" ); break; case GAMES_CTF: strcpy( myargs, " ctf" ); break; } if (g_emptyservers) { strcat(myargs, " empty"); } if (g_fullservers) { strcat(myargs, " full"); } protocol[0] = '\0'; trap_Cvar_VariableStringBuffer( "debug_protocol", protocol, sizeof(protocol) ); if (strlen(protocol)) { trap_Cmd_ExecuteText( EXEC_APPEND, va( "globalservers %d %s%s\n", g_servertype - 1, protocol, myargs )); } else { trap_Cmd_ExecuteText( EXEC_APPEND, va( "globalservers %d %d%s\n", g_servertype - 1, (int)trap_Cvar_VariableValue( "protocol" ), myargs ) ); } } }