diff options
| author | Magnus Auvinen <magnus.auvinen@gmail.com> | 2008-02-10 15:32:30 +0000 |
|---|---|---|
| committer | Magnus Auvinen <magnus.auvinen@gmail.com> | 2008-02-10 15:32:30 +0000 |
| commit | 294cbe18c17cd20f70f965e7f89a3250ef39b990 (patch) | |
| tree | db942402bd39bfb8336e2a2d134f96f2ad5b2ab1 /src/engine | |
| parent | acffe66ebe63f3ecc970db0feab33a6e85a7d1f4 (diff) | |
| download | zcatch-294cbe18c17cd20f70f965e7f89a3250ef39b990.tar.gz zcatch-294cbe18c17cd20f70f965e7f89a3250ef39b990.zip | |
done some more latency work. added the extra message for projectiles to reduce latency
Diffstat (limited to 'src/engine')
| -rw-r--r-- | src/engine/client/ec_client.c | 32 | ||||
| -rw-r--r-- | src/engine/e_if_mods.h | 16 | ||||
| -rw-r--r-- | src/engine/e_if_server.h | 1 | ||||
| -rw-r--r-- | src/engine/e_network.c | 5 | ||||
| -rw-r--r-- | src/engine/e_network.h | 1 | ||||
| -rw-r--r-- | src/engine/e_protocol.h | 2 | ||||
| -rw-r--r-- | src/engine/e_system.c | 22 | ||||
| -rw-r--r-- | src/engine/e_system.h | 1 | ||||
| -rw-r--r-- | src/engine/server/es_server.c | 19 |
9 files changed, 88 insertions, 11 deletions
diff --git a/src/engine/client/ec_client.c b/src/engine/client/ec_client.c index 627791bb..dfc16ec3 100644 --- a/src/engine/client/ec_client.c +++ b/src/engine/client/ec_client.c @@ -60,6 +60,9 @@ static int snapcrcerrors = 0; static int ack_game_tick = -1; static int current_recv_tick = 0; +/* pinging */ +static int64 ping_start_time = 0; + /* current time */ static int current_tick = 0; static float intratick = 0; @@ -687,6 +690,14 @@ static void client_process_packet(NETPACKET *packet) client_disconnect_with_reason(error); } } + else if(msg == NETMSG_PING) + { + msg_pack_start_system(NETMSG_PING_REPLY, 0); + msg_pack_end(); + client_send_msg(); + } + else if(msg == NETMSG_PING_REPLY) + dbg_msg("client/network", "latency %.2f", (time_get() - ping_start_time)*1000 / (float)time_freq()); else if(msg == NETMSG_SNAP || msg == NETMSG_SNAPSINGLE || msg == NETMSG_SNAPEMPTY) { /*dbg_msg("client/network", "got snapshot"); */ @@ -1209,28 +1220,37 @@ static void client_run() snd_shutdown(); } -static void connect_command(void *result, void *user_data) +static void con_connect(void *result, void *user_data) { const char *address; console_result_string(result, 1, &address); client_connect(address); } -static void disconnect_command(void *result, void *user_data) +static void con_disconnect(void *result, void *user_data) { client_disconnect(); } -static void quit_command(void *result, void *user_data) +static void con_quit(void *result, void *user_data) { client_quit(); } +static void con_ping(void *result, void *user_data) +{ + msg_pack_start_system(NETMSG_PING, 0); + msg_pack_end(); + client_send_msg(); + ping_start_time = time_get(); +} + static void client_register_commands() { - MACRO_REGISTER_COMMAND("quit", "", quit_command, 0x0); - MACRO_REGISTER_COMMAND("connect", "s", connect_command, 0x0); - MACRO_REGISTER_COMMAND("disconnect", "", disconnect_command, 0x0); + MACRO_REGISTER_COMMAND("quit", "", con_quit, 0x0); + MACRO_REGISTER_COMMAND("connect", "s", con_connect, 0x0); + MACRO_REGISTER_COMMAND("disconnect", "", con_disconnect, 0x0); + MACRO_REGISTER_COMMAND("ping", "", con_ping, 0x0); } int editor_main(int argc, char **argv); diff --git a/src/engine/e_if_mods.h b/src/engine/e_if_mods.h index eff909f3..08d0ec37 100644 --- a/src/engine/e_if_mods.h +++ b/src/engine/e_if_mods.h @@ -51,7 +51,7 @@ void mods_client_enter(int cid); void mods_client_drop(int cid); /* - Function: mods_client_input + Function: mods_client_direct_input Called when the server recives new input from a client. Arguments: @@ -59,7 +59,19 @@ void mods_client_drop(int cid); input - Pointer to the input data. size - Size of the data. (NOT IMPLEMENTED YET) */ -void mods_client_input(int cid, void *input); +void mods_client_direct_input(int cid, void *input); + +/* + Function: mods_client_predicted_input + Called when the server applys the predicted input on the client. + + Arguments: + cid - Client ID. Is 0 - MAX_CLIENTS. + input - Pointer to the input data. + size - Size of the data. (NOT IMPLEMENTED YET) +*/ +void mods_client_predicted_input(int cid, void *input); + /* Function: mods_tick diff --git a/src/engine/e_if_server.h b/src/engine/e_if_server.h index c9572b76..c9775d90 100644 --- a/src/engine/e_if_server.h +++ b/src/engine/e_if_server.h @@ -36,6 +36,7 @@ int server_getclientinfo(int client_id, CLIENT_INFO *info); const char *server_clientname(int client_id); /* grabs the latest input for the client. not withholding anything */ + /* Function: server_latestinput TODO diff --git a/src/engine/e_network.c b/src/engine/e_network.c index 689e45ab..3e242618 100644 --- a/src/engine/e_network.c +++ b/src/engine/e_network.c @@ -799,6 +799,11 @@ void netserver_stats(NETSERVER *s, NETSTATS *stats) } } +NETSOCKET netserver_socket(NETSERVER *s) +{ + return s->socket; +} + int netserver_client_addr(NETSERVER *s, int client_id, NETADDR4 *addr) { *addr = s->slots[client_id].conn.peeraddr; diff --git a/src/engine/e_network.h b/src/engine/e_network.h index 96a49692..29843849 100644 --- a/src/engine/e_network.h +++ b/src/engine/e_network.h @@ -46,6 +46,7 @@ int netserver_recv(NETSERVER *s, NETPACKET *packet); int netserver_send(NETSERVER *s, NETPACKET *packet); int netserver_close(NETSERVER *s); int netserver_update(NETSERVER *s); +NETSOCKET netserver_socket(NETSERVER *s); int netserver_drop(NETSERVER *s, int client_id, const char *reason); int netserver_client_addr(NETSERVER *s, int client_id, NETADDR4 *addr); int netserver_max_clients(NETSERVER *s); diff --git a/src/engine/e_protocol.h b/src/engine/e_protocol.h index 0e8a63f4..65d76350 100644 --- a/src/engine/e_protocol.h +++ b/src/engine/e_protocol.h @@ -46,6 +46,8 @@ enum NETMSG_CMD, /* sent by both */ + NETMSG_PING, + NETMSG_PING_REPLY, NETMSG_ERROR }; diff --git a/src/engine/e_system.c b/src/engine/e_system.c index 1472b3d6..ab7323f9 100644 --- a/src/engine/e_system.c +++ b/src/engine/e_system.c @@ -733,6 +733,28 @@ void swap_endian(void *data, unsigned elem_size, unsigned num) } } +int net_socket_read_wait(NETSOCKET sock, int time) +{ +#if defined(CONF_FAMILY_WINDOWS) + #error Not implemented +#else + struct timeval tv; + fd_set readfds; + + tv.tv_sec = 0; + tv.tv_usec = 1000*time; + + FD_ZERO(&readfds); + FD_SET(sock, &readfds); + + /* don't care about writefds and exceptfds */ + select(sock+1, &readfds, NULL, NULL, &tv); + if(FD_ISSET(sock, &readfds)) + return 1; + return 0; +#endif +} + #if defined(__cplusplus) } #endif diff --git a/src/engine/e_system.h b/src/engine/e_system.h index 69fa5c63..f271d71a 100644 --- a/src/engine/e_system.h +++ b/src/engine/e_system.h @@ -512,6 +512,7 @@ int fs_listdir(const char *dir, fs_listdir_callback cb, void *user); int fs_storage_path(const char *appname, char *path, int max); int fs_makedir(const char *path); int net_addr4_cmp(const NETADDR4 *a, const NETADDR4 *b); +int net_socket_read_wait(NETSOCKET sock, int time); void mem_debug_dump(); int mem_allocated(); diff --git a/src/engine/server/es_server.c b/src/engine/server/es_server.c index 8d805e42..9c2aac41 100644 --- a/src/engine/server/es_server.c +++ b/src/engine/server/es_server.c @@ -642,6 +642,9 @@ static void server_process_client_packet(NETPACKET *packet) clients[cid].current_input++; clients[cid].current_input %= 200; + + /* call the mod with the fresh input data */ + mods_client_direct_input(cid, clients[cid].latestinput.data); } else if(msg == NETMSG_CMD) { @@ -653,6 +656,12 @@ static void server_process_client_packet(NETPACKET *packet) console_execute(cmd); } } + else if(msg == NETMSG_PING) + { + msg_pack_start_system(NETMSG_PING_REPLY, 0); + msg_pack_end(); + server_send_msg(cid); + } else { dbg_msg("server", "strange message cid=%d msg=%d data_size=%d", cid, msg, packet->data_size); @@ -948,7 +957,7 @@ static int server_run() { if(clients[c].inputs[i].game_tick == server_tick()) { - mods_client_input(c, clients[c].inputs[i].data); + mods_client_predicted_input(c, clients[c].inputs[i].data); break; } } @@ -986,7 +995,7 @@ static int server_run() lastheartbeat = t+time_per_heartbeat; } } - + { static PERFORMACE_INFO scope = {"net", 0}; perf_start(&scope); @@ -1025,6 +1034,10 @@ static int server_run() config.sv_status = 0; } + /* wait for incomming data */ + net_socket_read_wait(netserver_socket(net), 5); + + /* if(config.dbg_hitch) { thread_sleep(config.dbg_hitch); @@ -1032,7 +1045,7 @@ static int server_run() } else thread_sleep(1); - + */ } } |