diff options
| author | Magnus Auvinen <magnus.auvinen@gmail.com> | 2008-03-29 17:20:21 +0000 |
|---|---|---|
| committer | Magnus Auvinen <magnus.auvinen@gmail.com> | 2008-03-29 17:20:21 +0000 |
| commit | 370cbbe79f8dbc8ef00dca28e27480c05789670f (patch) | |
| tree | f8adbab00c2a8e8e506f0f47beb753c47d592fb2 /src/engine/client | |
| parent | fcd9709c36ff014c270ef14f236e0141c8266695 (diff) | |
| download | zcatch-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.c | 21 | ||||
| -rw-r--r-- | src/engine/client/ec_srvbrowse.c | 26 |
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; } |