about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/engine/client/client.c68
-rw-r--r--src/engine/interface.h7
-rw-r--r--src/tools/fake_server.c7
3 files changed, 64 insertions, 18 deletions
diff --git a/src/engine/client/client.c b/src/engine/client/client.c
index 47175ca6..970eae60 100644
--- a/src/engine/client/client.c
+++ b/src/engine/client/client.c
@@ -387,6 +387,54 @@ static void client_serverbrowse_init()
 {
 }
 
+static int serverbrowse_sort = BROWSESORT_NONE;
+
+static int client_serverbrowse_sort_compare_name(const void *ai, const void *bi)
+{
+	SERVERENTRY **a = (SERVERENTRY **)ai;
+	SERVERENTRY **b = (SERVERENTRY **)bi;
+	return strcmp((*a)->info.name, (*b)->info.name);
+}
+
+static int client_serverbrowse_sort_compare_map(const void *ai, const void *bi)
+{
+	SERVERENTRY **a = (SERVERENTRY **)ai;
+	SERVERENTRY **b = (SERVERENTRY **)bi;
+	return strcmp((*a)->info.map, (*b)->info.map);
+}
+
+static int client_serverbrowse_sort_compare_ping(const void *ai, const void *bi)
+{
+	SERVERENTRY **a = (SERVERENTRY **)ai;
+	SERVERENTRY **b = (SERVERENTRY **)bi;
+	return (*a)->info.latency > (*b)->info.latency;
+}
+
+static int client_serverbrowse_sort_compare_numplayers(const void *ai, const void *bi)
+{
+	SERVERENTRY **a = (SERVERENTRY **)ai;
+	SERVERENTRY **b = (SERVERENTRY **)bi;
+	return (*a)->info.num_players > (*b)->info.num_players;
+}
+
+static void client_serverbrowse_sort()
+{
+	if(serverbrowse_sort == BROWSESORT_NAME)
+		qsort(serverlist, num_servers, sizeof(SERVERENTRY *), client_serverbrowse_sort_compare_name);
+	else if(serverbrowse_sort == BROWSESORT_PING)
+		qsort(serverlist, num_servers, sizeof(SERVERENTRY *), client_serverbrowse_sort_compare_ping);
+	else if(serverbrowse_sort == BROWSESORT_MAP)
+		qsort(serverlist, num_servers, sizeof(SERVERENTRY *), client_serverbrowse_sort_compare_map);
+	else if(serverbrowse_sort == BROWSESORT_NUMPLAYERS)
+		qsort(serverlist, num_servers, sizeof(SERVERENTRY *), client_serverbrowse_sort_compare_numplayers);
+}
+
+void client_serverbrowse_set_sort(int mode)
+{
+	serverbrowse_sort = mode;
+	client_serverbrowse_sort(); /* resort */
+}
+
 static void client_serverbrowse_set(NETADDR4 *addr, int request, SERVER_INFO *info)
 {
 	int hash = addr->ip[0];
@@ -399,6 +447,7 @@ static void client_serverbrowse_set(NETADDR4 *addr, int request, SERVER_INFO *in
 			entry->info = *info;
 			if(!request)
 				entry->info.latency = (time_get()-entry->request_time)*1000/time_freq();
+			client_serverbrowse_sort();
 			return;
 		}
 		entry = entry->next_ip;
@@ -443,6 +492,8 @@ static void client_serverbrowse_set(NETADDR4 *addr, int request, SERVER_INFO *in
 			first_req_server = entry;
 		last_req_server = entry;
 	}
+	
+	client_serverbrowse_sort();
 }
 
 void client_serverbrowse_refresh(int lan)
@@ -570,23 +621,6 @@ static void client_serverbrowse_update()
 		count++;
 		entry = entry->next_req;
 	}
-		
-	/*
-	// timeout old requests
-	while(info_request_begin < servers.num && info_request_begin < info_request_end)
-	{
-		if(now > servers.request_times[info_request_begin]+timeout)
-			info_request_begin++;
-		else
-			break;
-	}
-	
-	// send new requests
-	while(info_request_end < servers.num && info_request_end-info_request_begin < max_requests)
-	{
-		client_serverbrowse_request(info_request_end);
-		info_request_end++;
-	}*/
 }
 
 // ------ state handling -----
diff --git a/src/engine/interface.h b/src/engine/interface.h
index 118b858f..2a4e203a 100644
--- a/src/engine/interface.h
+++ b/src/engine/interface.h
@@ -26,6 +26,12 @@ enum
 	CLIENTSTATE_LOADING,
 	CLIENTSTATE_ONLINE,
 	CLIENTSTATE_QUITING,
+	
+	BROWSESORT_NONE = 0,
+	BROWSESORT_NAME,
+	BROWSESORT_PING,
+	BROWSESORT_MAP,
+	BROWSESORT_NUMPLAYERS,
 };
 
 typedef struct
@@ -793,6 +799,7 @@ void client_rcon(const char *cmd);
 void client_serverbrowse_refresh(int lan);
 SERVER_INFO *client_serverbrowse_get(int index);
 int client_serverbrowse_num();
+void client_serverbrowse_set_sort(int mode);
 
 /* undocumented graphics stuff */
 void gfx_pretty_text(float x, float y, float size, const char *text, int max_width);
diff --git a/src/tools/fake_server.c b/src/tools/fake_server.c
index 01ba57b0..b56607cf 100644
--- a/src/tools/fake_server.c
+++ b/src/tools/fake_server.c
@@ -182,6 +182,11 @@ int main(int argc, char **argv)
 			argc--; argv++;
 			player_scores[num_players] = atoi(*argv);
 		}
+		else if(strcmp(*argv, "-a") == 0)
+		{
+			argc--; argv++;
+			map = *argv;
+		}
 		else if(strcmp(*argv, "-x") == 0)
 		{
 			argc--; argv++;
@@ -192,7 +197,7 @@ int main(int argc, char **argv)
 			argc--; argv++;
 			game_type = atoi(*argv);
 		}
-		else if(strcmp(*argv, "-p") == 0)
+		else if(strcmp(*argv, "-g") == 0)
 		{
 			argc--; argv++;
 			progression = atoi(*argv);