/* ================= ArenaServers_Event ================= */ static void ArenaServers_Event( void* ptr, int event ) { int id; id = ((menucommon_s*)ptr)->id; if( event != QM_ACTIVATED && id != ID_LIST ) { return; } switch( id ) { case ID_MASTER: g_arenaservers.master.curvalue = ArenaServers_SetType(g_arenaservers.master.curvalue); trap_Cvar_SetValue( "ui_browserMaster", g_arenaservers.master.curvalue); break; case ID_GAMETYPE: trap_Cvar_SetValue( "ui_browserGameType", g_arenaservers.gametype.curvalue ); g_gametype = g_arenaservers.gametype.curvalue; ArenaServers_UpdateMenu(); break; case ID_SORTKEY: trap_Cvar_SetValue( "ui_browserSortKey", g_arenaservers.sortkey.curvalue ); ArenaServers_Sort( g_arenaservers.sortkey.curvalue ); ArenaServers_UpdateMenu(); break; case ID_SHOW_FULL: trap_Cvar_SetValue( "ui_browserShowFull", g_arenaservers.showfull.curvalue ); g_fullservers = g_arenaservers.showfull.curvalue; ArenaServers_UpdateMenu(); break; case ID_SHOW_EMPTY: trap_Cvar_SetValue( "ui_browserShowEmpty", g_arenaservers.showempty.curvalue ); g_emptyservers = g_arenaservers.showempty.curvalue; ArenaServers_UpdateMenu(); break; case ID_SHOW_BOTS: trap_Cvar_SetValue( "ui_browserShowBots", g_arenaservers.showbots.curvalue ); g_showbots = g_arenaservers.showbots.curvalue; ArenaServers_UpdateMenu(); break; case ID_LIST: if( event == QM_GOTFOCUS ) { ArenaServers_UpdatePicture(); } break; case ID_SCROLL_UP: ScrollList_Key( &g_arenaservers.list, K_UPARROW ); break; case ID_SCROLL_DOWN: ScrollList_Key( &g_arenaservers.list, K_DOWNARROW ); break; case ID_BACK: ArenaServers_StopRefresh(); ArenaServers_SaveChanges(); UI_PopMenu(); break; case ID_REFRESH: ArenaServers_StartRefresh(); break; case ID_SPECIFY: UI_SpecifyServerMenu(); break; case ID_CREATE: UI_StartServerMenu( qtrue ); break; case ID_CONNECT: ArenaServers_Go(); break; case ID_REMOVE: ArenaServers_Remove(); ArenaServers_UpdateMenu(); break; } }
/* ================= 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(g_servertype)) { return; } } if (trap_LAN_GetServerCount(g_servertype) < 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(g_servertype); } // 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(g_servertype, 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_SetType ================= */ int ArenaServers_SetType( int type ) { if(type >= UIAS_GLOBAL1 && type <= UIAS_GLOBAL5) { char masterstr[2], cvarname[sizeof("sv_master1")]; while(type <= UIAS_GLOBAL5) { Com_sprintf(cvarname, sizeof(cvarname), "sv_master%d", type); trap_Cvar_VariableStringBuffer(cvarname, masterstr, sizeof(masterstr)); if(*masterstr) break; type++; } } g_servertype = type; switch( type ) { default: case UIAS_LOCAL: g_arenaservers.remove.generic.flags |= (QMF_INACTIVE|QMF_HIDDEN); g_arenaservers.serverlist = g_localserverlist; g_arenaservers.numservers = &g_numlocalservers; g_arenaservers.maxservers = MAX_LOCALSERVERS; break; case UIAS_GLOBAL1: case UIAS_GLOBAL2: case UIAS_GLOBAL3: case UIAS_GLOBAL4: case UIAS_GLOBAL5: g_arenaservers.remove.generic.flags |= (QMF_INACTIVE|QMF_HIDDEN); g_arenaservers.serverlist = g_globalserverlist[type-UIAS_GLOBAL1]; g_arenaservers.numservers = &g_numglobalservers[type-UIAS_GLOBAL1]; g_arenaservers.maxservers = MAX_GLOBALSERVERS; break; case UIAS_FAVORITES: g_arenaservers.remove.generic.flags &= ~(QMF_INACTIVE|QMF_HIDDEN); g_arenaservers.serverlist = g_favoriteserverlist; g_arenaservers.numservers = &g_numfavoriteservers; g_arenaservers.maxservers = MAX_FAVORITESERVERS; break; } if( !*g_arenaservers.numservers ) { ArenaServers_StartRefresh(); } else { // avoid slow operation, use existing results g_arenaservers.currentping = *g_arenaservers.numservers; g_arenaservers.numqueriedservers = *g_arenaservers.numservers; ArenaServers_UpdateMenu(); strcpy(g_arenaservers.status.string,"hit refresh to update"); } return type; }