about summary refs log tree commit diff
path: root/src/engine
diff options
context:
space:
mode:
authorMagnus Auvinen <magnus.auvinen@gmail.com>2008-02-10 15:32:30 +0000
committerMagnus Auvinen <magnus.auvinen@gmail.com>2008-02-10 15:32:30 +0000
commit294cbe18c17cd20f70f965e7f89a3250ef39b990 (patch)
treedb942402bd39bfb8336e2a2d134f96f2ad5b2ab1 /src/engine
parentacffe66ebe63f3ecc970db0feab33a6e85a7d1f4 (diff)
downloadzcatch-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.c32
-rw-r--r--src/engine/e_if_mods.h16
-rw-r--r--src/engine/e_if_server.h1
-rw-r--r--src/engine/e_network.c5
-rw-r--r--src/engine/e_network.h1
-rw-r--r--src/engine/e_protocol.h2
-rw-r--r--src/engine/e_system.c22
-rw-r--r--src/engine/e_system.h1
-rw-r--r--src/engine/server/es_server.c19
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);
-			
+			*/
 		}
 	}