about summary refs log tree commit diff
path: root/src/engine
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/client/ec_client.c24
-rw-r--r--src/engine/client/ec_srvbrowse.c10
-rw-r--r--src/engine/e_if_client.h3
-rw-r--r--src/engine/server/es_server.c23
4 files changed, 53 insertions, 7 deletions
diff --git a/src/engine/client/ec_client.c b/src/engine/client/ec_client.c
index 3a9390fc..e6d26e37 100644
--- a/src/engine/client/ec_client.c
+++ b/src/engine/client/ec_client.c
@@ -87,6 +87,7 @@ static int mapdownload_totalsize = -1;
 
 /* */
 static SERVER_INFO current_server_info = {0};
+static int64 current_server_info_requesttime = -1; /* >= 0 should request, == -1 got info */
 
 /* current time */
 static int current_tick = 0;
@@ -510,6 +511,7 @@ void client_connect(const char *server_address_str)
 	dbg_msg("client", "connecting to '%s'", server_address_str);
 
 	mem_zero(&current_server_info, sizeof(current_server_info));
+	current_server_info_requesttime = 0;
 	str_copy(buf, server_address_str, sizeof(buf));
 
 	for(k = 0; buf[k]; k++)
@@ -573,6 +575,12 @@ void client_disconnect()
 	client_disconnect_with_reason(0);
 }
 
+
+void client_serverinfo(SERVER_INFO *serverinfo)
+{
+	mem_copy(serverinfo, &current_server_info, sizeof(current_server_info));
+}
+
 static int client_load_data()
 {
 	debug_font = gfx_load_texture("debug_font.png", IMG_AUTO, TEXLOAD_NORESAMPLE);
@@ -838,6 +846,13 @@ static void client_process_packet(NETCHUNK *packet)
 				{
 					/* sort players */
 					qsort(info.players, info.num_players, sizeof(*info.players), player_score_comp);
+					
+					if(net_addr_comp(&server_address, &packet->address) == 0)
+					{
+						mem_copy(&current_server_info, &info, sizeof(current_server_info));
+						current_server_info_requesttime = -1;
+					}
+					
 					if(packet_type == 2)
 						client_serverbrowse_set(&packet->address, BROWSESET_TOKEN, token, &info);
 					else
@@ -1402,6 +1417,15 @@ static void client_update()
 			if(current_predtick > current_tick && current_predtick < current_tick+50)
 				modc_predict();
 		}
+		
+		/* fetch server info if we don't have it */
+		if(client_state() >= CLIENTSTATE_LOADING &&
+			current_server_info_requesttime >= 0 &&
+			time_get() > current_server_info_requesttime)
+		{
+			client_serverbrowse_request(&server_address);
+			current_server_info_requesttime = time_get()+time_freq()*2;
+		}
 	}
 
 	/* STRESS TEST: join the server again */
diff --git a/src/engine/client/ec_srvbrowse.c b/src/engine/client/ec_srvbrowse.c
index 9d2ed195..f1dc9701 100644
--- a/src/engine/client/ec_srvbrowse.c
+++ b/src/engine/client/ec_srvbrowse.c
@@ -512,7 +512,7 @@ void client_serverbrowse_refresh(int type)
 	}
 }
 
-static void client_serverbrowse_request(NETADDR *addr, SERVERENTRY *entry)
+static void client_serverbrowse_request_impl(NETADDR *addr, SERVERENTRY *entry)
 {
 	/*unsigned char buffer[sizeof(SERVERBROWSE_GETINFO)+1];*/
 	NETCHUNK p;
@@ -543,6 +543,12 @@ static void client_serverbrowse_request(NETADDR *addr, SERVERENTRY *entry)
 		entry->request_time = time_get();
 }
 
+void client_serverbrowse_request(NETADDR *addr)
+{
+	client_serverbrowse_request_impl(addr, 0);
+}
+
+
 void client_serverbrowse_update()
 {
 	int64 timeout = time_freq();
@@ -611,7 +617,7 @@ void client_serverbrowse_update()
 			break;
 			
 		if(entry->request_time == 0)
-			client_serverbrowse_request(&entry->addr, entry);
+			client_serverbrowse_request_impl(&entry->addr, entry);
 		
 		count++;
 		entry = entry->next_req;
diff --git a/src/engine/e_if_client.h b/src/engine/e_if_client.h
index 7aef86e9..d1a5941e 100644
--- a/src/engine/e_if_client.h
+++ b/src/engine/e_if_client.h
@@ -561,5 +561,6 @@ void client_demoplayer_setpos(float percent);
 void client_demoplayer_setpause(int paused);
 void client_demoplayer_setspeed(float speed);
 const char *client_user_directory();
-
+void client_serverinfo(SERVER_INFO *serverinfo);
+void client_serverbrowse_request(NETADDR *addr);
 #endif
diff --git a/src/engine/server/es_server.c b/src/engine/server/es_server.c
index 5ff58dbe..2ef676a3 100644
--- a/src/engine/server/es_server.c
+++ b/src/engine/server/es_server.c
@@ -852,11 +852,19 @@ static void server_send_serverinfo(NETADDR *addr, int token)
 	}
 	
 	packer_reset(&p);
-	packer_add_raw(&p, SERVERBROWSE_INFO, sizeof(SERVERBROWSE_INFO));
 
-	/* token */
-	str_format(buf, sizeof(buf), "%d", token);
-	packer_add_string(&p, buf, 6);
+	if(token >= 0)
+	{
+		/* new token based format */
+		packer_add_raw(&p, SERVERBROWSE_INFO, sizeof(SERVERBROWSE_INFO));
+		str_format(buf, sizeof(buf), "%d", token);
+		packer_add_string(&p, buf, 6);
+	}
+	else
+	{
+		/* old format */
+		packer_add_raw(&p, SERVERBROWSE_OLD_INFO, sizeof(SERVERBROWSE_OLD_INFO));
+	}
 	
 	packer_add_string(&p, mods_version(), 32);
 	packer_add_string(&p, config.sv_name, 64);
@@ -921,6 +929,13 @@ static void server_pump_network()
 				{
 					server_send_serverinfo(&packet.address, ((unsigned char *)packet.data)[sizeof(SERVERBROWSE_GETINFO)]);
 				}
+				
+				
+				if(packet.data_size == sizeof(SERVERBROWSE_OLD_GETINFO) &&
+					memcmp(packet.data, SERVERBROWSE_OLD_GETINFO, sizeof(SERVERBROWSE_OLD_GETINFO)) == 0)
+				{
+					server_send_serverinfo(&packet.address, -1);
+				}
 			}
 		}
 		else