diff --git a/src/engine/interface.h b/src/engine/interface.h index 9dd0446f9..80d72abda 100644 --- a/src/engine/interface.h +++ b/src/engine/interface.h @@ -761,7 +761,8 @@ const char *mods_net_version(); int server_getclientinfo(int client_id, CLIENT_INFO *info); const char *server_clientname(int client_id); void server_setclientname(int client_id, const char *name); -void server_setprogression(int v); + +void server_setbrowseinfo(int game_type, int progression); int server_tick(); int server_tickspeed(); diff --git a/src/engine/server/server.c b/src/engine/server/server.c index 08c4ad3cd..f26a51c5f 100644 --- a/src/engine/server/server.c +++ b/src/engine/server/server.c @@ -25,6 +25,9 @@ static SNAPBUILD builder; static int64 game_start_time; static int current_tick = 0; +static int browseinfo_gametype = -1; +static int browseinfo_progression = -1; + static int64 lastheartbeat; static NETADDR4 master_server; @@ -176,6 +179,12 @@ void server_setclientname(int client_id, const char *name) strncpy(clients[client_id].name, name, MAX_NAME_LENGTH); } +void server_setbrowseinfo(int game_type, int progression) +{ + browseinfo_gametype = game_type; + browseinfo_progression = progression; +} + int server_tick() { return current_tick; @@ -534,9 +543,21 @@ static void server_send_serverinfo(NETADDR4 *addr) packer_add_string(&p, mods_net_version(), 32); packer_add_string(&p, config.sv_name, 64); packer_add_string(&p, config.sv_map, 32); - packer_add_string(&p, "0", 2); /* gametype */ - packer_add_string(&p, "0", 2); /* flags */ - packer_add_string(&p, "0", 4); /* progression */ + + /* gametype */ + sprintf(buf, "%d", browseinfo_gametype); + packer_add_string(&p, buf, 2); + + /* flags */ + i = 0; + if(strlen(config.password)) + i |= 1; + sprintf(buf, "%d", i); + packer_add_string(&p, buf, 2); + + /* progression */ + sprintf(buf, "%d", browseinfo_progression); + packer_add_string(&p, buf, 4); sprintf(buf, "%d", c); packer_add_string(&p, buf, 3); /* num players */ sprintf(buf, "%d", netserver_max_clients(net)); packer_add_string(&p, buf, 3); /* max players */ diff --git a/src/game/server/srv_common.cpp b/src/game/server/srv_common.cpp index bd5d09642..f76e1e516 100644 --- a/src/game/server/srv_common.cpp +++ b/src/game/server/srv_common.cpp @@ -110,8 +110,6 @@ void gameobject::post_reset() players[i].respawn(); } } - - void gameobject::on_player_info_change(class player *p) { @@ -165,6 +163,34 @@ void gameobject::tick() startround(); } } + + + // update browse info + int prog = -1; + if(config.timelimit > 0) + prog = max(prog, (server_tick()-round_start_tick) * 100 / (config.timelimit*server_tickspeed()*60)); + + if(config.scorelimit) + { + if(is_teamplay) + { + prog = max(prog, (teamscore[0]*100)/config.scorelimit); + prog = max(prog, (teamscore[1]*100)/config.scorelimit); + } + else + { + for(int i = 0; i < MAX_CLIENTS; i++) + { + if(players[i].client_id != -1) + prog = max(prog, (players[i].score*100)/config.scorelimit); + } + } + } + + if(warmup) + prog = -1; + + server_setbrowseinfo(gametype, prog); } void gameobject::snap(int snapping_client)