about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/engine/interface.h3
-rw-r--r--src/engine/server/server.c27
-rw-r--r--src/game/server/srv_common.cpp30
3 files changed, 54 insertions, 6 deletions
diff --git a/src/engine/interface.h b/src/engine/interface.h
index 9dd0446f..80d72abd 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 08c4ad3c..f26a51c5 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 bd5d0964..f76e1e51 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)