diff options
| author | Magnus Auvinen <magnus.auvinen@gmail.com> | 2008-04-06 14:32:56 +0000 |
|---|---|---|
| committer | Magnus Auvinen <magnus.auvinen@gmail.com> | 2008-04-06 14:32:56 +0000 |
| commit | 6ecc2efaecdf70ed6a754bc089c7e0e4606df398 (patch) | |
| tree | de81f3402de0c924acf10c2f71e4dbc721444890 | |
| parent | d15bef7ede6b07dbbc2f6b6a3e23b1ed83e6b6ea (diff) | |
| download | zcatch-6ecc2efaecdf70ed6a754bc089c7e0e4606df398.tar.gz zcatch-6ecc2efaecdf70ed6a754bc089c7e0e4606df398.zip | |
more loads of changes for 0.5.0
| -rw-r--r-- | src/engine/client/ec_client.c | 10 | ||||
| -rw-r--r-- | src/engine/e_network.c | 127 | ||||
| -rw-r--r-- | src/engine/server/es_server.c | 18 | ||||
| -rw-r--r-- | src/game/client/gc_client.cpp | 2 | ||||
| -rw-r--r-- | src/game/client/gc_client.h | 2 | ||||
| -rw-r--r-- | src/game/client/gc_console.cpp | 4 | ||||
| -rw-r--r-- | src/game/client/gc_hooks.cpp | 18 | ||||
| -rw-r--r-- | src/game/g_game.cpp | 8 | ||||
| -rw-r--r-- | src/game/g_protocol.def | 6 | ||||
| -rw-r--r-- | src/game/server/gs_server.cpp | 5 |
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) |