diff options
Diffstat (limited to 'src/engine')
| -rw-r--r-- | src/engine/client/ec_client.c | 24 | ||||
| -rw-r--r-- | src/engine/client/ec_srvbrowse.c | 10 | ||||
| -rw-r--r-- | src/engine/e_if_client.h | 3 | ||||
| -rw-r--r-- | src/engine/server/es_server.c | 23 |
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(¤t_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, ¤t_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(¤t_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 |