about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/engine/client/ec_client.c10
-rw-r--r--src/engine/e_network.c127
-rw-r--r--src/engine/server/es_server.c18
-rw-r--r--src/game/client/gc_client.cpp2
-rw-r--r--src/game/client/gc_client.h2
-rw-r--r--src/game/client/gc_console.cpp4
-rw-r--r--src/game/client/gc_hooks.cpp18
-rw-r--r--src/game/g_game.cpp8
-rw-r--r--src/game/g_protocol.def6
-rw-r--r--src/game/server/gs_server.cpp5
10 files changed, 83 insertions, 117 deletions
diff --git a/src/engine/client/ec_client.c b/src/engine/client/ec_client.c
index 6faf0f25..6d3a400b 100644
--- a/src/engine/client/ec_client.c
+++ b/src/engine/client/ec_client.c
@@ -965,7 +965,6 @@ static void client_process_packet(NETCHUNK *packet)
 						int purgetick;
 						void *deltadata;
 						int deltasize;
-						/*unsigned char tmpbuffer[MAX_SNAPSHOT_SIZE];*/
 						unsigned char tmpbuffer2[MAX_SNAPSHOT_SIZE];
 						unsigned char tmpbuffer3[MAX_SNAPSHOT_SIZE];
 						int snapsize;
@@ -1004,14 +1003,7 @@ static void client_process_packet(NETCHUNK *packet)
 
 						if(complete_size)
 						{	
-							int intsize;
-							/*
-							int compsize = zerobit_decompress(snapshot_incomming_data, complete_size, tmpbuffer);
-							
-							if(compsize < 0)  failure during decompression, bail 
-								return;*/
-								
-							intsize = intpack_decompress(snapshot_incomming_data, complete_size, tmpbuffer2);
+							int intsize = intpack_decompress(snapshot_incomming_data, complete_size, tmpbuffer2);
 
 							if(intsize < 0) /* failure during decompression, bail */
 								return;
diff --git a/src/engine/e_network.c b/src/engine/e_network.c
index d4e41a08..9ebeba61 100644
--- a/src/engine/e_network.c
+++ b/src/engine/e_network.c
@@ -10,25 +10,15 @@
 /*
 
 CURRENT:
-	packet header: 4 bytes
-		unsigned char flags;
-		unsigned char ack[2];
-		unsigned char num_chunks;
-		
-	chunk header: 3-5 bytes
-		unsigned char flags;
-		unsigned char size[2];
-		(unsigned char seq[2]);
-
-FINAL:
-
 	packet header: 3 bytes
-		unsigned char flags_ack[2]; // 6bit flags, 10bit ack
-		unsigned char num_chunks;
-		
+		unsigned char flags_ack; // 6bit flags, 2bit ack
+		unsigned char ack; // 8 bit ack
+		unsigned char num_chunks; // 8 bit chunks
+
 	chunk header: 2-3 bytes
-		unsigned char flags_seq_ack[2]; // 2bit flag, 4bit seq, 10bit size
-		(unsigned char seq;) // if vital flag is set
+		unsigned char flags_size; // 2bit flags, 6 bit size
+		unsigned char size_seq; // 4bit size, 4bit seq
+		(unsigned char seq;) // 8bit seq, if vital flag is set
 		
 */
 
@@ -40,9 +30,10 @@ enum
 	NET_MAX_PAYLOAD = NET_MAX_CHUNKSIZE+16,
 	NET_MAX_PACKETSIZE = NET_MAX_PAYLOAD+16,
 	NET_MAX_CHUNKHEADERSIZE = 5,
-	NET_PACKETHEADERSIZE = 4,
+	NET_PACKETHEADERSIZE = 3,
 	NET_MAX_CLIENTS = 16,
-	NET_MAX_SEQUENCE = 1<<16,
+	NET_MAX_SEQUENCE = 1<<10,
+	NET_SEQUENCE_MASK = NET_MAX_SEQUENCE-1,
 
 	NET_CONNSTATE_OFFLINE=0,
 	NET_CONNSTATE_CONNECT=1,
@@ -229,10 +220,9 @@ static HUFFSTATE huffmanstate;
 static void send_packet(NETSOCKET socket, NETADDR4 *addr, NETPACKETCONSTRUCT *packet)
 {
 	unsigned char buffer[NET_MAX_PACKETSIZE];
-	buffer[0] = packet->flags;
-	buffer[1] = (packet->ack>>8)&0xff;
-	buffer[2] = packet->ack&0xff;
-	buffer[3] = packet->num_chunks;
+	buffer[0] = ((packet->flags<<4)&0xf0)|((packet->ack>>8)&0xf);
+	buffer[1] = packet->ack&0xff;
+	buffer[2] = packet->num_chunks;
 	if(datalog)
 	{
 		io_write(datalog, &packet->data_size, sizeof(packet->data_size));
@@ -241,46 +231,69 @@ static void send_packet(NETSOCKET socket, NETADDR4 *addr, NETPACKETCONSTRUCT *pa
 	
 	if(1)
 	{
-		int compressed_size = huffman_compress(&huffmanstate, packet->chunk_data, packet->data_size, &buffer[4], NET_MAX_PACKETSIZE-4);
-		net_udp4_send(socket, addr, buffer, 4+(compressed_size+7)/8);
+		int compressed_size = (huffman_compress(&huffmanstate, packet->chunk_data, packet->data_size, &buffer[4], NET_MAX_PACKETSIZE-4)+7)/8;
+		net_udp4_send(socket, addr, buffer, NET_PACKETHEADERSIZE+compressed_size);
 	}
 	else
 	{
 		mem_copy(&buffer[4], packet->chunk_data, packet->data_size);
-		net_udp4_send(socket, addr, buffer, 4+packet->data_size);
+		net_udp4_send(socket, addr, buffer, NET_PACKETHEADERSIZE+packet->data_size);
 	}
 }
 
-static unsigned char *unpack_chunk_header(unsigned char *data, NETCHUNKHEADER *header)
+/* TODO: rename this function */
+static int unpack_packet(unsigned char *buffer, int size, NETPACKETCONSTRUCT *packet)
 {
-	int i = 0;
-	header->flags = data[i++];
-	header->size = data[i++]<<8;
-	header->size |= data[i++];
-	header->sequence = -1;
-	if(header->flags&NET_CHUNKFLAG_VITAL)
+	/* check the size */
+	if(size < NET_PACKETHEADERSIZE || size > NET_MAX_PACKETSIZE)
+		return -1;
+	
+	/* read the packet */
+	packet->flags = buffer[0]>>4;
+	packet->ack = ((buffer[0]&0xf)<<8) | buffer[1];
+	packet->num_chunks = buffer[2];
+	packet->data_size = size - NET_PACKETHEADERSIZE;
+	
+	if(1)
 	{
-		header->sequence = data[i++]<<8;
-		header->sequence |= data[i++];
+		huffman_decompress(&huffmanstate, &buffer[4], packet->data_size, packet->chunk_data, sizeof(packet->chunk_data));
 	}
-	return &data[i];
+	else
+		mem_copy(packet->chunk_data, &buffer[4], packet->data_size);
+	
+	/* return success */
+	return 0;
 }
 
+
 /* TODO: change the arguments of this function */
 static unsigned char *pack_chunk_header(unsigned char *data, int flags, int size, int sequence)
 {
-	int i = 0;
-	data[i++] = flags;
-	data[i++] = (size>>8)&0xff;
-	data[i++] = size&0xff;
+	data[0] = ((flags&3)<<6)|((size>>4)&0x3f);
+	data[1] = (size&0xf);
 	if(flags&NET_CHUNKFLAG_VITAL)
 	{
-		data[i++] = (sequence>>8)&0xff;
-		data[i++] = sequence&0xff;
+		data[1] |= (sequence>>2)&0xf0;
+		data[2] = sequence&0xff;
+		return data + 3;
 	}
-	return &data[i];
+	return data + 2;
 }
 
+static unsigned char *unpack_chunk_header(unsigned char *data, NETCHUNKHEADER *header)
+{
+	header->flags = (data[0]>>6)&3;
+	header->size = ((data[0]&0x3f)<<4) | (data[1]&0xf);
+	header->sequence = -1;
+	if(header->flags&NET_CHUNKFLAG_VITAL)
+	{
+		header->sequence = ((data[1]&0xf0)<<2) | data[2];
+		return data + 3;
+	}
+	return data + 2;
+}
+
+
 static void conn_reset_stats(NETCONNECTION *conn)
 {
 	mem_zero(&conn->stats, sizeof(conn->stats));
@@ -623,10 +636,8 @@ static int conn_update(NETCONNECTION *conn)
 		if(time_get()-conn->last_send_time > time_freq()/2) /* flush connection after 250ms if needed */
 		{
 			int num_flushed_chunks = conn_flush(conn);
-			if(num_flushed_chunks)
-			{
+			if(num_flushed_chunks && config.debug)
 				dbg_msg("connection", "flushed connection due to timeout. %d chunks.", num_flushed_chunks);
-			}
 		}
 			
 		if(time_get()-conn->last_send_time > time_freq())
@@ -715,28 +726,6 @@ int netserver_update(NETSERVER *s)
 	return 0;
 }
 
-/* TODO: rename this function */
-static int unpack_packet(unsigned char *buffer, int size, NETPACKETCONSTRUCT *packet)
-{
-	/* check the size */
-	if(size < NET_PACKETHEADERSIZE || size > NET_MAX_PACKETSIZE)
-		return -1;
-	
-	/* read the packet */
-	packet->flags = buffer[0];
-	packet->ack = (buffer[1]<<8) | buffer[2];
-	packet->num_chunks = buffer[3];
-	packet->data_size = size - NET_PACKETHEADERSIZE;
-	
-	if(1)
-		huffman_decompress(&huffmanstate, &buffer[4], packet->data_size, packet->chunk_data, sizeof(packet->chunk_data));
-	else
-		mem_copy(packet->chunk_data, &buffer[4], packet->data_size);
-	
-	/* return success */
-	return 0;
-}
-
 static void recvinfo_clear(NETRECVINFO *info)
 {
 	info->valid = 0;
@@ -749,8 +738,6 @@ static void recvinfo_start(NETRECVINFO *info, NETADDR4 *addr, NETCONNECTION *con
 	info->client_id = cid;
 	info->current_chunk = 0;
 	info->valid = 1;
-	if(info->data.num_chunks > 1)
-		dbg_msg("connection", "%d chunks", info->data.num_chunks);
 }
 
 /* TODO: rename this function */
diff --git a/src/engine/server/es_server.c b/src/engine/server/es_server.c
index ca8ab25b..0d2200c3 100644
--- a/src/engine/server/es_server.c
+++ b/src/engine/server/es_server.c
@@ -443,8 +443,6 @@ static void server_do_snap()
 			if(deltasize)
 			{
 				/* compress it */
-				/*unsigned char intdata[MAX_SNAPSHOT_SIZE];
-				int intsize;*/
 				int snapshot_size;
 				const int max_size = MAX_SNAPSHOT_PACKSIZE;
 				int numpackets;
@@ -453,21 +451,7 @@ static void server_do_snap()
 				{				
 					static PERFORMACE_INFO scope = {"compress", 0};
 					perf_start(&scope);
-					
-					{
-						static PERFORMACE_INFO scope = {"int", 0};
-						perf_start(&scope);
-						snapshot_size = intpack_compress(deltadata, deltasize, compdata);
-						perf_end();
-					}
-					
-					/*
-					{
-						static PERFORMACE_INFO scope = {"zero", 0};
-						perf_start(&scope);
-						snapshot_size = zerobit_compress(intdata, intsize, compdata);
-						perf_end();
-					}*/
+					snapshot_size = intpack_compress(deltadata, deltasize, compdata);
 					perf_end();
 				}
 				
diff --git a/src/game/client/gc_client.cpp b/src/game/client/gc_client.cpp
index 005e9026..2aeb28b9 100644
--- a/src/game/client/gc_client.cpp
+++ b/src/game/client/gc_client.cpp
@@ -29,6 +29,8 @@ int64 debug_firedelay = 0;
 
 NETOBJ_PLAYER_INPUT input_data = {0};
 int input_target_lock = 0;
+int input_direction_left = 0;
+int input_direction_right = 0;
 
 int chat_mode = CHATMODE_NONE;
 bool menu_active = false;
diff --git a/src/game/client/gc_client.h b/src/game/client/gc_client.h
index 2ab558f3..15df5dc2 100644
--- a/src/game/client/gc_client.h
+++ b/src/game/client/gc_client.h
@@ -51,6 +51,8 @@ extern player_core predicted_player;
 
 // input
 extern NETOBJ_PLAYER_INPUT input_data;
+extern int input_direction_left;
+extern int input_direction_right;
 
 // debug
 extern int64 debug_firedelay;
diff --git a/src/game/client/gc_console.cpp b/src/game/client/gc_console.cpp
index 935aac91..76bf7218 100644
--- a/src/game/client/gc_console.cpp
+++ b/src/game/client/gc_console.cpp
@@ -424,8 +424,8 @@ void client_console_init()
 	MACRO_REGISTER_COMMAND("emote", "i", con_emote, 0);
 
 	// game commands
-	MACRO_REGISTER_COMMAND("+left", "", con_key_input_state, &input_data.left);
-	MACRO_REGISTER_COMMAND("+right", "", con_key_input_state, &input_data.right);
+	MACRO_REGISTER_COMMAND("+left", "", con_key_input_state, &input_direction_left);
+	MACRO_REGISTER_COMMAND("+right", "", con_key_input_state, &input_direction_right);
 	MACRO_REGISTER_COMMAND("+jump", "", con_key_input_state, &input_data.jump);
 	MACRO_REGISTER_COMMAND("+hook", "", con_key_input_state, &input_data.hook);
 	MACRO_REGISTER_COMMAND("+fire", "", con_key_input_counter, &input_data.fire);
diff --git a/src/game/client/gc_hooks.cpp b/src/game/client/gc_hooks.cpp
index 81090ca4..36e166d4 100644
--- a/src/game/client/gc_hooks.cpp
+++ b/src/game/client/gc_hooks.cpp
@@ -375,8 +375,7 @@ extern "C" int modc_snap_input(int *data)
 	// we freeze the input if chat or menu is activated
 	if(menu_active || chat_mode != CHATMODE_NONE || console_active())
 	{
-		last_data.left = 0;
-		last_data.right = 0;
+		last_data.direction = 0;
 		last_data.hook = 0;
 		last_data.jump = 0;
 		
@@ -390,7 +389,13 @@ extern "C" int modc_snap_input(int *data)
 	input_data.target_y = (int)mouse_pos.y;
 	if(!input_data.target_x && !input_data.target_y)
 		input_data.target_y = 1;
-	
+		
+	// set direction
+	input_data.direction = 0;
+	if(input_direction_left && !input_direction_right)
+		input_data.direction = -1;
+	if(!input_direction_left && input_direction_right)
+		input_data.direction = 1;
 
 	// stress testing
 	if(config.dbg_stress)
@@ -398,8 +403,7 @@ extern "C" int modc_snap_input(int *data)
 		float t = client_localtime();
 		mem_zero(&input_data, sizeof(input_data));
 
-		input_data.left = ((int)t/2)&1;
-		input_data.right = ((int)t/2+1)&1;
+		input_data.direction = ((int)t/2)&1;
 		input_data.jump = ((int)t);
 		input_data.fire = ((int)(t*10));
 		input_data.hook = ((int)(t*2))&1;
@@ -410,9 +414,7 @@ extern "C" int modc_snap_input(int *data)
 
 	// check if we need to send input
 	bool send = false;
-	if(input_data.left != last_data.left) send = true;
-	else if(input_data.left != last_data.left) send = true;
-	else if(input_data.right != last_data.right) send = true;
+	if(input_data.direction != last_data.direction) send = true;
 	else if(input_data.jump != last_data.jump) send = true;
 	else if(input_data.fire != last_data.fire) send = true;
 	else if(input_data.hook != last_data.hook) send = true;
diff --git a/src/game/g_game.cpp b/src/game/g_game.cpp
index 747b832a..71ddc1a2 100644
--- a/src/game/g_game.cpp
+++ b/src/game/g_game.cpp
@@ -199,12 +199,12 @@ void player_core::tick()
 	float friction = grounded ? world->tuning.ground_friction : world->tuning.air_friction;
 	
 	// handle movement
-	if(input.left)
+	if(input.direction < 0)
 		vel.x = saturated_add(-max_speed, max_speed, vel.x, -accel);
-	if(input.right)
+	if(input.direction > 0)
 		vel.x = saturated_add(-max_speed, max_speed, vel.x, accel);
 		
-	if(!input.left && !input.right)
+	if(input.direction == 0)
 		vel.x *= friction;
 	
 	// handle jumping
@@ -339,7 +339,7 @@ void player_core::tick()
 			
 			// the hook will boost it's power if the player wants to move
 			// in that direction. otherwise it will dampen everything abit
-			if((hookvel.x < 0 && input.left) || (hookvel.x > 0 && input.right)) 
+			if((hookvel.x < 0 && input.direction < 0) || (hookvel.x > 0 && input.direction > 0)) 
 				hookvel.x *= 0.95f;
 			else
 				hookvel.x *= 0.75f;
diff --git a/src/game/g_protocol.def b/src/game/g_protocol.def
index 363795f2..590dc603 100644
--- a/src/game/g_protocol.def
+++ b/src/game/g_protocol.def
@@ -40,11 +40,8 @@ raw_header
 	
 end
 
-
-
 object player_input
-	any left
-	any right
+	any direction
 
 	any target_x
 	any target_y
@@ -52,7 +49,6 @@ object player_input
 	any jump
 	any fire
 	any hook
-	any blink
 
 	any player_state
 
diff --git a/src/game/server/gs_server.cpp b/src/game/server/gs_server.cpp
index 78ad3f9f..5550f1a6 100644
--- a/src/game/server/gs_server.cpp
+++ b/src/game/server/gs_server.cpp
@@ -1653,11 +1653,12 @@ void player::snap(int snaping_client)
 		character->weapon = active_weapon;
 		character->attacktick = attack_tick;
 
-		character->wanted_direction = 0;
+		character->wanted_direction = input.direction;
+		/*
 		if(input.left && !input.right)
 			character->wanted_direction = -1;
 		else if(!input.left && input.right)
-			character->wanted_direction = 1;
+			character->wanted_direction = 1;*/
 
 
 		if(client_id == snaping_client)