about summary refs log tree commit diff
path: root/src/engine/client
diff options
context:
space:
mode:
authorMagnus Auvinen <magnus.auvinen@gmail.com>2008-03-29 17:20:21 +0000
committerMagnus Auvinen <magnus.auvinen@gmail.com>2008-03-29 17:20:21 +0000
commit370cbbe79f8dbc8ef00dca28e27480c05789670f (patch)
treef8adbab00c2a8e8e506f0f47beb753c47d592fb2 /src/engine/client
parentfcd9709c36ff014c270ef14f236e0141c8266695 (diff)
downloadzcatch-370cbbe79f8dbc8ef00dca28e27480c05789670f.tar.gz
zcatch-370cbbe79f8dbc8ef00dca28e27480c05789670f.zip
server browser improvements. much improved quick search. sorted the player list.
Diffstat (limited to 'src/engine/client')
-rw-r--r--src/engine/client/ec_client.c21
-rw-r--r--src/engine/client/ec_srvbrowse.c26
2 files changed, 42 insertions, 5 deletions
diff --git a/src/engine/client/ec_client.c b/src/engine/client/ec_client.c
index b12fa503..142c8b70 100644
--- a/src/engine/client/ec_client.c
+++ b/src/engine/client/ec_client.c
@@ -643,6 +643,18 @@ static const char *client_load_map_search(const char *mapname, int wanted_crc)
 	return error;
 }
 
+
+static int player_score_comp(const void *a, const void *b)
+{
+	SERVER_INFO_PLAYER *p0 = (SERVER_INFO_PLAYER *)a;
+	SERVER_INFO_PLAYER *p1 = (SERVER_INFO_PLAYER *)b;
+	if(p0->score == p1->score)
+		return 0;
+	if(p0->score < p1->score)
+		return 1;
+	return -1;
+}
+
 static void client_process_packet(NETPACKET *packet)
 {
 	if(packet->client_id == -1)
@@ -721,13 +733,16 @@ static void client_process_packet(NETPACKET *packet)
 				
 				for(i = 0; i < info.num_players; i++)
 				{
-					str_copy(info.player_names[i], unpacker_get_string(&up), sizeof(info.player_names[i]));
-					info.player_scores[i] = atol(unpacker_get_string(&up));
+					str_copy(info.players[i].name, unpacker_get_string(&up), sizeof(info.players[i].name));
+					info.players[i].score = atol(unpacker_get_string(&up));
 				}
 				
-				/* TODO: unpack players aswell */
 				if(!up.error)
+				{
+					/* sort players */
+					qsort(info.players, info.num_players, sizeof(*info.players), player_score_comp);
 					client_serverbrowse_set(&packet->address, 0, &info);
+				}
 			}
 		}
 	}
diff --git a/src/engine/client/ec_srvbrowse.c b/src/engine/client/ec_srvbrowse.c
index c4fe3080..fcab2fc8 100644
--- a/src/engine/client/ec_srvbrowse.c
+++ b/src/engine/client/ec_srvbrowse.c
@@ -128,7 +128,7 @@ static int client_serverbrowse_sort_compare_numplayers(const void *ai, const voi
 
 static void client_serverbrowse_filter()
 {
-	int i = 0;
+	int i = 0, p = 0;
 	num_sorted_servers = 0;
 
 	/* allocate the sorted list */	
@@ -159,7 +159,29 @@ static void client_serverbrowse_filter()
 			filtered = 1;
 		else if(config.b_filter_string[0] != 0)
 		{
-			if(strstr(serverlist[i]->info.name, config.b_filter_string) == 0)
+			int matchfound = 0;
+			
+			serverlist[i]->info.quicksearch_hit = 0;
+
+			/* match against server name */
+			if(str_find_nocase(serverlist[i]->info.name, config.b_filter_string))
+			{
+				matchfound = 1;
+				serverlist[i]->info.quicksearch_hit |= BROWSEQUICK_SERVERNAME;
+			}
+
+			/* match against players */				
+			for(p = 0; p < serverlist[i]->info.num_players; p++)
+			{
+				if(str_find_nocase(serverlist[i]->info.players[p].name, config.b_filter_string))
+				{
+					matchfound = 1;
+					serverlist[i]->info.quicksearch_hit |= BROWSEQUICK_PLAYERNAME;
+					break;
+				}
+			}
+			
+			if(!matchfound)
 				filtered = 1;
 		}