about summary refs log tree commit diff
path: root/src/engine
diff options
context:
space:
mode:
authorMagnus Auvinen <magnus.auvinen@gmail.com>2009-01-24 12:16:02 +0000
committerMagnus Auvinen <magnus.auvinen@gmail.com>2009-01-24 12:16:02 +0000
commit9d51d47cea8f56dc5d33a6204bdacd67f0acd902 (patch)
tree80c1bf4aae727d200e5b2ad71ccca54f5c999679 /src/engine
parent1a1af65b96a9ab0c757a40acbbbd5347fec4663f (diff)
downloadzcatch-9d51d47cea8f56dc5d33a6204bdacd67f0acd902.tar.gz
zcatch-9d51d47cea8f56dc5d33a6204bdacd67f0acd902.zip
added tab completion to the console. works for local and remote
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/client/ec_client.c41
-rw-r--r--src/engine/e_console.c33
-rw-r--r--src/engine/e_console.h4
-rw-r--r--src/engine/e_engine.c4
-rw-r--r--src/engine/server/es_server.c38
5 files changed, 80 insertions, 40 deletions
diff --git a/src/engine/client/ec_client.c b/src/engine/client/ec_client.c
index bd0917ae..ad362972 100644
--- a/src/engine/client/ec_client.c
+++ b/src/engine/client/ec_client.c
@@ -1945,21 +1945,36 @@ static void con_stoprecord(void *result, void *user_data)
 	demorec_record_stop();
 }
 
-static void client_register_commands()
+static void con_serverdummy(void *result, void *user_data)
 {
-	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);
-	MACRO_REGISTER_COMMAND("screenshot", "", con_screenshot, 0x0);
-	MACRO_REGISTER_COMMAND("rcon", "r", con_rcon, 0x0);
-	MACRO_REGISTER_COMMAND("rcon_auth", "s", con_rcon_auth, 0x0);
-
-	MACRO_REGISTER_COMMAND("play", "r", con_play, 0x0);
-	MACRO_REGISTER_COMMAND("record", "s", con_record, 0);
-	MACRO_REGISTER_COMMAND("stoprecord", "", con_stoprecord, 0);
+	dbg_msg("client", "this command is not available on the client");
+}
 
-	MACRO_REGISTER_COMMAND("add_favorite", "s", con_addfavorite, 0x0);
+static void client_register_commands()
+{
+	MACRO_REGISTER_COMMAND("quit", "", CFGFLAG_CLIENT, con_quit, 0x0);
+	MACRO_REGISTER_COMMAND("connect", "s", CFGFLAG_CLIENT, con_connect, 0x0);
+	MACRO_REGISTER_COMMAND("disconnect", "", CFGFLAG_CLIENT, con_disconnect, 0x0);
+	MACRO_REGISTER_COMMAND("ping", "", CFGFLAG_CLIENT, con_ping, 0x0);
+	MACRO_REGISTER_COMMAND("screenshot", "", CFGFLAG_CLIENT, con_screenshot, 0x0);
+	MACRO_REGISTER_COMMAND("rcon", "r", CFGFLAG_CLIENT, con_rcon, 0x0);
+	MACRO_REGISTER_COMMAND("rcon_auth", "s", CFGFLAG_CLIENT, con_rcon_auth, 0x0);
+
+	MACRO_REGISTER_COMMAND("play", "r", CFGFLAG_CLIENT, con_play, 0x0);
+	MACRO_REGISTER_COMMAND("record", "s", CFGFLAG_CLIENT, con_record, 0);
+	MACRO_REGISTER_COMMAND("stoprecord", "", CFGFLAG_CLIENT, con_stoprecord, 0);
+
+	MACRO_REGISTER_COMMAND("add_favorite", "s", CFGFLAG_CLIENT, con_addfavorite, 0x0);
+	
+	/* register server dummy commands for tab completion */
+	MACRO_REGISTER_COMMAND("kick", "", CFGFLAG_SERVER, con_serverdummy, 0);
+	MACRO_REGISTER_COMMAND("ban", "", CFGFLAG_SERVER, con_serverdummy, 0);
+	MACRO_REGISTER_COMMAND("unban", "", CFGFLAG_SERVER, con_serverdummy, 0);
+	MACRO_REGISTER_COMMAND("bans", "", CFGFLAG_SERVER, con_serverdummy, 0);
+	MACRO_REGISTER_COMMAND("status", "", CFGFLAG_SERVER, con_serverdummy, 0);
+	MACRO_REGISTER_COMMAND("shutdown", "", CFGFLAG_SERVER, con_serverdummy, 0);
+	/*MACRO_REGISTER_COMMAND("record", "", CFGFLAG_SERVER, con_serverdummy, 0);
+	MACRO_REGISTER_COMMAND("stoprecord", "", CFGFLAG_SERVER, con_serverdummy, 0);*/
 }
 
 void client_save_line(const char *line)
diff --git a/src/engine/e_console.c b/src/engine/e_console.c
index 1c68c2e7..0218bad0 100644
--- a/src/engine/e_console.c
+++ b/src/engine/e_console.c
@@ -292,6 +292,19 @@ void console_execute_line_stroked(int stroke, const char *str)
 	}
 }
 
+void console_possible_commands(const char *str, int flagmask, void (*callback)(const char *cmd, void *user), void *user)
+{
+	COMMAND *cmd;
+	for (cmd = first_command; cmd; cmd = cmd->next)
+	{
+		if(cmd->flags&flagmask)
+		{
+			if(str_find_nocase(cmd->name, str))
+				callback(cmd->name, user);
+		}
+	}	
+}
+
 void console_execute_line(const char *str)
 {
 	console_execute_line_stroked(1, str);
@@ -319,18 +332,18 @@ static void console_execute_file_real(const char *filename)
 		dbg_msg("console", "failed to open '%s'", filename);
 }
 
-struct exec_file
+struct EXECFILE
 {
 	const char *filename;
-	struct exec_file *next;
+	struct EXECFILE *next;
 };
 
 void console_execute_file(const char *filename)
 {
-	static struct exec_file *first = 0;
-	struct exec_file this;
-	struct exec_file *cur;
-	struct exec_file *prev;
+	static struct EXECFILE *first = 0;
+	struct EXECFILE this;
+	struct EXECFILE *cur;
+	struct EXECFILE *prev;
 
 	/* make sure that this isn't being executed already */	
 	for(cur = first; cur; cur = cur->next)
@@ -404,11 +417,11 @@ static void str_variable_command(void *result, void *user_data)
 
 void console_init()
 {
-	MACRO_REGISTER_COMMAND("echo", "r", con_echo, 0x0);
-	MACRO_REGISTER_COMMAND("exec", "r", con_exec, 0x0);
+	MACRO_REGISTER_COMMAND("echo", "r", CFGFLAG_SERVER|CFGFLAG_CLIENT, con_echo, 0x0);
+	MACRO_REGISTER_COMMAND("exec", "r", CFGFLAG_SERVER|CFGFLAG_CLIENT, con_exec, 0x0);
 
-	#define MACRO_CONFIG_INT(name,def,min,max,flags,desc) { static INT_VARIABLE_DATA data = { &config_get_ ## name, &config_set_ ## name }; MACRO_REGISTER_COMMAND(#name, "?i", int_variable_command, &data) }
-	#define MACRO_CONFIG_STR(name,len,def,flags,desc) { static STR_VARIABLE_DATA data = { &config_get_ ## name, &config_set_ ## name }; MACRO_REGISTER_COMMAND(#name, "?r", str_variable_command, &data) }
+	#define MACRO_CONFIG_INT(name,def,min,max,flags,desc) { static INT_VARIABLE_DATA data = { &config_get_ ## name, &config_set_ ## name }; MACRO_REGISTER_COMMAND(#name, "?i", flags, int_variable_command, &data) }
+	#define MACRO_CONFIG_STR(name,len,def,flags,desc) { static STR_VARIABLE_DATA data = { &config_get_ ## name, &config_set_ ## name }; MACRO_REGISTER_COMMAND(#name, "?r", flags, str_variable_command, &data) }
 
 	#include "e_config_variables.h" 
 
diff --git a/src/engine/e_console.h b/src/engine/e_console.h
index 75325d7e..d5632da0 100644
--- a/src/engine/e_console.h
+++ b/src/engine/e_console.h
@@ -11,6 +11,7 @@ typedef struct COMMAND_t
 {
 	const char *name;
 	const char *params;
+	int flags;
 	CONSOLE_CALLBACK callback;
 	void *user_data;
 	struct COMMAND_t *next;
@@ -21,6 +22,7 @@ void console_register(COMMAND *cmd);
 void console_execute_line(const char *str);
 void console_execute_line_stroked(int stroke, const char *str);
 void console_execute_file(const char *filename);
+void console_possible_commands(const char *str, int flagmask, void (*callback)(const char *cmd, void *user), void *user);
 void console_print(const char *str);
 void console_register_print_callback(void (*callback)(const char *, void *user_data), void *user_data);
 
@@ -33,7 +35,7 @@ int console_arg_int(void *result, int index);
 float console_arg_float(void *result, int index);
 int console_arg_num(void *result);
 
-#define MACRO_REGISTER_COMMAND(name, params, func, ptr) { static COMMAND cmd = { name, params, func, ptr, 0x0 }; console_register(&cmd); }
+#define MACRO_REGISTER_COMMAND(name, params, flags, func, ptr) { static COMMAND cmd = { name, params, flags, func, ptr, 0x0 }; console_register(&cmd); }
 
 #ifdef __cplusplus
 }
diff --git a/src/engine/e_engine.c b/src/engine/e_engine.c
index a8943087..2cc045a7 100644
--- a/src/engine/e_engine.c
+++ b/src/engine/e_engine.c
@@ -83,8 +83,8 @@ void engine_init(const char *appname)
 	
 	jobs_initpool(&hostlookuppool, 1);
 
-	MACRO_REGISTER_COMMAND("dbg_dumpmem", "", con_dbg_dumpmem, 0x0);
-	MACRO_REGISTER_COMMAND("dbg_lognetwork", "", con_dbg_lognetwork, 0x0);
+	MACRO_REGISTER_COMMAND("dbg_dumpmem", "", CFGFLAG_SERVER|CFGFLAG_CLIENT, con_dbg_dumpmem, 0x0);
+	MACRO_REGISTER_COMMAND("dbg_lognetwork", "", CFGFLAG_SERVER|CFGFLAG_CLIENT, con_dbg_lognetwork, 0x0);
 	
 	/* reset the config */
 	config_reset();
diff --git a/src/engine/server/es_server.c b/src/engine/server/es_server.c
index 12d97f37..2eac05eb 100644
--- a/src/engine/server/es_server.c
+++ b/src/engine/server/es_server.c
@@ -94,6 +94,7 @@ typedef struct
 	int snap_rate;
 	
 	int last_acked_snapshot;
+	int last_input_tick;
 	SNAPSTORAGE snapshots;
 	
 	CLIENT_INPUT latestinput;
@@ -535,8 +536,10 @@ static void reset_client(int cid)
 
 	snapstorage_purge_all(&clients[cid].snapshots);
 	clients[cid].last_acked_snapshot = -1;
+	clients[cid].last_input_tick = -1;
 	clients[cid].snap_rate = SRVCLIENT_SNAPRATE_INIT;
 	clients[cid].score = 0;
+
 }
 
 static int new_client_callback(int cid, void *user)
@@ -710,11 +713,18 @@ static void server_process_client_packet(NETCHUNK *packet)
 				clients[cid].latency = (int)(((time_get()-tagtime)*1000)/time_freq());
 
 			/* add message to report the input timing */
-			msg_pack_start_system(NETMSG_INPUTTIMING, 0);
-			msg_pack_int(tick);
-			msg_pack_int(((server_tick_start_time(tick)-time_get())*1000) / time_freq());
-			msg_pack_end();
-			server_send_msg(cid);
+			/* skip packets that are old */
+			if(tick > clients[cid].last_input_tick)
+			{
+				int time_left = ((server_tick_start_time(tick)-time_get())*1000) / time_freq();
+				msg_pack_start_system(NETMSG_INPUTTIMING, 0);
+				msg_pack_int(tick);
+				msg_pack_int(time_left);
+				msg_pack_end();
+				server_send_msg(cid);
+			}
+
+			clients[cid].last_input_tick = tick;
 
 			input = &clients[cid].inputs[clients[cid].current_input];
 			
@@ -1278,15 +1288,15 @@ static void con_stoprecord(void *result, void *user_data)
 
 static void server_register_commands()
 {
-	MACRO_REGISTER_COMMAND("kick", "i", con_kick, 0);
-	MACRO_REGISTER_COMMAND("ban", "s?i", con_ban, 0);
-	MACRO_REGISTER_COMMAND("unban", "s", con_unban, 0);
-	MACRO_REGISTER_COMMAND("bans", "", con_bans, 0);
-	MACRO_REGISTER_COMMAND("status", "", con_status, 0);
-	MACRO_REGISTER_COMMAND("shutdown", "", con_shutdown, 0);
-
-	MACRO_REGISTER_COMMAND("record", "s", con_record, 0);
-	MACRO_REGISTER_COMMAND("stoprecord", "", con_stoprecord, 0);
+	MACRO_REGISTER_COMMAND("kick", "i", CFGFLAG_SERVER, con_kick, 0);
+	MACRO_REGISTER_COMMAND("ban", "s?i", CFGFLAG_SERVER, con_ban, 0);
+	MACRO_REGISTER_COMMAND("unban", "s", CFGFLAG_SERVER, con_unban, 0);
+	MACRO_REGISTER_COMMAND("bans", "", CFGFLAG_SERVER, con_bans, 0);
+	MACRO_REGISTER_COMMAND("status", "", CFGFLAG_SERVER, con_status, 0);
+	MACRO_REGISTER_COMMAND("shutdown", "", CFGFLAG_SERVER, con_shutdown, 0);
+
+	MACRO_REGISTER_COMMAND("record", "s", CFGFLAG_SERVER, con_record, 0);
+	MACRO_REGISTER_COMMAND("stoprecord", "", CFGFLAG_SERVER, con_stoprecord, 0);
 }
 
 int main(int argc, char **argv)