about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--scripts/netobj.py17
-rw-r--r--src/game/client/gc_hooks.cpp2
-rw-r--r--src/game/g_protocol.def20
-rw-r--r--src/game/server/gs_server.cpp2
4 files changed, 21 insertions, 20 deletions
diff --git a/scripts/netobj.py b/scripts/netobj.py
index bd090b67..6d9a1412 100644
--- a/scripts/netobj.py
+++ b/scripts/netobj.py
@@ -16,6 +16,8 @@ class variable:
 		return []
 	def emit_unpack(self):
 		return ["msg.%s = msg_unpack_int();" % self.name]
+	def emit_unpack_check(self):
+		return []
 	def emit_pack(self):
 		return ["\t\tmsg_pack_int(%s);" % self.name]
 
@@ -28,14 +30,10 @@ class var_range(variable):
 		variable.__init__(self, args, name)
 		self.min = args[0]
 		self.max = args[1]
+	def emit_unpack_check(self):
+		return ["if(msg.%s < %s || msg.%s > %s) { msg_failed_on = \"%s\"; return 0; }" % (self.name, self.min, self.name, self.max, self.name)]
 	def emit_secure(self):
 		return [self.linedef(), "obj->%s = netobj_clamp_int(obj->%s, %s, %s);" % (self.name, self.name, self.min, self.max)]
-	
-class var_clientid(variable):
-	def __init__(self, args, name):
-		variable.__init__(self, args, name)
-	def emit_secure(self):
-		return [self.linedef(), "obj->%s = netobj_clamp_int(obj->%s, -1, MAX_CLIENTS);" % (self.name, self.name)]
 
 class var_string(variable):
 	def __init__(self, args, name):
@@ -168,6 +166,8 @@ class message:
 		lines = []
 		for m in self.members:
 			lines += m.emit_unpack()
+		for m in self.members:
+			lines += m.emit_unpack_check()
 		return lines
 
 	def emit_pack(self):
@@ -282,6 +282,7 @@ def emit_header_file(f, p):
 	print >>f, ""
 	print >>f, "void *netmsg_secure_unpack(int type);"
 	print >>f, "const char *netmsg_get_name(int type);"
+	print >>f, "const char *netmsg_failed_on();"
 	print >>f, ""
 
 	for obj in p.objects:
@@ -300,9 +301,10 @@ def emit_source_file(f, p, protofilename):
 	for l in p.source_raw:
 		print >>f, l
 
-	print >>f, ""
+	print >>f, "const char *msg_failed_on = \"\";"
 	print >>f, "static int num_corrections = 0;"
 	print >>f, "int netobj_num_corrections() { return num_corrections; }"
+	print >>f, "const char *netmsg_failed_on() { return msg_failed_on; }"
 	print >>f, ""
 	print >>f, "static int netobj_clamp_int(int v, int min, int max)"
 	print >>f, "{"
@@ -399,6 +401,7 @@ def emit_source_file(f, p, protofilename):
 		print >>f, "void *netmsg_secure_unpack(int type)"
 		print >>f, "{"
 		print >>f, "\tvoid *msg;"
+		print >>f, "\tmsg_failed_on = \"\";"
 		print >>f, "\tif(type < 0 || type >= NUM_NETMSGTYPES) return 0;"
 		print >>f, "\tmsg = secure_unpack_funcs[type]();"
 		print >>f, "\tif(msg_unpack_error()) return 0;"
diff --git a/src/game/client/gc_hooks.cpp b/src/game/client/gc_hooks.cpp
index 9c242ffc..0d2db63b 100644
--- a/src/game/client/gc_hooks.cpp
+++ b/src/game/client/gc_hooks.cpp
@@ -503,7 +503,7 @@ extern "C" void modc_message(int msgtype)
 	void *rawmsg = netmsg_secure_unpack(msgtype);
 	if(!rawmsg)
 	{
-		dbg_msg("client", "dropped weird message '%s' (%d)", netmsg_get_name(msgtype), msgtype);
+		dbg_msg("client", "dropped weird message '%s' (%d), failed on '%s'", netmsg_get_name(msgtype), msgtype, netmsg_failed_on());
 		return;
 	}
 		
diff --git a/src/game/g_protocol.def b/src/game/g_protocol.def
index 6e0a4806..4a7b79bc 100644
--- a/src/game/g_protocol.def
+++ b/src/game/g_protocol.def
@@ -85,7 +85,7 @@ end
 object flag
 	any x, y
 	range(0, 1) team
-	clientid carried_by
+	range(-1,MAX_CLIENTS-1) carried_by
 end
 
 object game
@@ -113,7 +113,7 @@ object player_core
 	any angle
 	range(0, 3) jumped
 
-	clientid hooked_player
+	range(-1,MAX_CLIENTS-1) hooked_player
 	range(0, 3) hook_state
 	range(0, max_int) hook_tick
 
@@ -143,7 +143,7 @@ end
 // information about the player that is always needed
 object player_info
 	range(0, 1) local
-	clientid cid
+	range(0,MAX_CLIENTS-1) cid
 	range(-1, 1) team
 	
 	any score
@@ -166,7 +166,7 @@ end
 
 event death
 	any x, y
-	clientid cid
+	range(0,MAX_CLIENTS-1) cid
 end
 
 event air_jump
@@ -199,12 +199,12 @@ end
 
 message sv_chat
 	range(0, 1) team
-	clientid cid
+	range(-1,MAX_CLIENTS-1) cid
 	string message
 end
 
 message sv_setinfo
-	clientid cid
+	range(0,MAX_CLIENTS-1) cid
 	string name
 	string skin
 	range(0,1) use_custom_color
@@ -213,8 +213,8 @@ message sv_setinfo
 end
 
 message sv_killmsg
-	clientid killer
-	clientid victim
+	range(-1,MAX_CLIENTS-1) killer
+	range(-1,MAX_CLIENTS-1) victim
 	range(-1,NUM_WEAPONS-1) weapon
 	any mode_special
 end
@@ -231,7 +231,6 @@ message sv_sound_global
 end
 
 message cl_startinfo
-	clientid who
 	string name
 	string skin
 	range(0,1) use_custom_color
@@ -240,7 +239,6 @@ message cl_startinfo
 end
 
 message cl_changeinfo
-	clientid who
 	string name
 	string skin
 	range(0,1) use_custom_color
@@ -253,7 +251,7 @@ message sv_weapon_pickup
 end
 
 message sv_emoticon
-	clientid cid
+	range(0,MAX_CLIENTS-1) cid
 	range(0,NUM_EMOTICONS-1) emoticon
 end
 
diff --git a/src/game/server/gs_server.cpp b/src/game/server/gs_server.cpp
index 356a2fba..21b2f61f 100644
--- a/src/game/server/gs_server.cpp
+++ b/src/game/server/gs_server.cpp
@@ -2186,7 +2186,7 @@ void mods_message(int msgtype, int client_id)
 	void *rawmsg = netmsg_secure_unpack(msgtype);
 	if(!rawmsg)
 	{
-		dbg_msg("server", "dropped weird message '%s' (%d)", netmsg_get_name(msgtype), msgtype);
+		dbg_msg("server", "dropped weird message '%s' (%d), failed on '%s'", netmsg_get_name(msgtype), msgtype, netmsg_failed_on());
 		return;
 	}