diff options
| author | Magnus Auvinen <magnus.auvinen@gmail.com> | 2007-07-14 13:09:42 +0000 |
|---|---|---|
| committer | Magnus Auvinen <magnus.auvinen@gmail.com> | 2007-07-14 13:09:42 +0000 |
| commit | 568b9f1f4a4f6cd269f026c10117d76329b44dd8 (patch) | |
| tree | fe18d2ceb622c3b4c1f631b6736102c89927a330 /src/engine | |
| parent | 7acef9eb864344b26cb78f22da369851cc31aa76 (diff) | |
| download | zcatch-568b9f1f4a4f6cd269f026c10117d76329b44dd8.tar.gz zcatch-568b9f1f4a4f6cd269f026c10117d76329b44dd8.zip | |
added chat, better damage indicators
Diffstat (limited to 'src/engine')
| -rw-r--r-- | src/engine/client/client.cpp | 242 | ||||
| -rw-r--r-- | src/engine/client/gfx.cpp | 2 | ||||
| -rw-r--r-- | src/engine/interface.h | 10 | ||||
| -rw-r--r-- | src/engine/msg.cpp | 19 | ||||
| -rw-r--r-- | src/engine/server/server.cpp | 90 |
5 files changed, 204 insertions, 159 deletions
diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp index 4fb869cd..04c25bba 100644 --- a/src/engine/client/client.cpp +++ b/src/engine/client/client.cpp @@ -194,7 +194,7 @@ public: { recived_snapshots = 0; - msg_pack_start(NETMSG_INFO, MSGFLAG_VITAL); + msg_pack_start_system(NETMSG_INFO, MSGFLAG_VITAL); msg_pack_string(config.player_name, 128); msg_pack_string(config.clan_name, 128); msg_pack_string(config.password, 128); @@ -205,7 +205,7 @@ public: void send_entergame() { - msg_pack_start(NETMSG_ENTERGAME, MSGFLAG_VITAL); + msg_pack_start_system(NETMSG_ENTERGAME, MSGFLAG_VITAL); msg_pack_end(); client_send_msg(); } @@ -226,7 +226,7 @@ public: void send_input() { - msg_pack_start(NETMSG_INPUT, 0); + msg_pack_start_system(NETMSG_INPUT, 0); msg_pack_int(input_data_size); for(int i = 0; i < input_data_size/4; i++) msg_pack_int(input_data[i]); @@ -462,135 +462,145 @@ public: void process_packet(NETPACKET *packet) { - int msg = msg_unpack_start(packet->data, packet->data_size); - if(msg == NETMSG_MAP) + int sys; + int msg = msg_unpack_start(packet->data, packet->data_size, &sys); + if(sys) { - const char *map = msg_unpack_string(); - dbg_msg("client/network", "connection accepted, map=%s", map); - set_state(STATE_LOADING); - - if(map_load(map)) - { - modc_entergame(); - send_entergame(); - dbg_msg("client/network", "loading done"); - // now we will wait for two snapshots - // to finish the connection - } - else - { - error("failure to load map"); - } - } - else if(msg == NETMSG_SNAP || msg == NETMSG_SNAPSMALL || msg == NETMSG_SNAPEMPTY) - { - //dbg_msg("client/network", "got snapshot"); - int game_tick = msg_unpack_int(); - int delta_tick = game_tick-msg_unpack_int(); - int num_parts = 1; - int part = 0; - int part_size = 0; - - if(msg == NETMSG_SNAP) + // system message + if(msg == NETMSG_MAP) { - num_parts = msg_unpack_int(); - part = msg_unpack_int(); + const char *map = msg_unpack_string(); + dbg_msg("client/network", "connection accepted, map=%s", map); + set_state(STATE_LOADING); + + if(map_load(map)) + { + modc_entergame(); + send_entergame(); + dbg_msg("client/network", "loading done"); + // now we will wait for two snapshots + // to finish the connection + } + else + { + error("failure to load map"); + } } - - if(msg != NETMSG_SNAPEMPTY) - part_size = msg_unpack_int(); - - if(snapshot_part == part) + else if(msg == NETMSG_SNAP || msg == NETMSG_SNAPSMALL || msg == NETMSG_SNAPEMPTY) { - // TODO: clean this up abit - const char *d = (const char *)msg_unpack_raw(part_size); - mem_copy((char*)snapshots[SNAP_INCOMMING] + part*MAX_SNAPSHOT_PACKSIZE, d, part_size); - snapshot_part++; - - if(snapshot_part == num_parts) + //dbg_msg("client/network", "got snapshot"); + int game_tick = msg_unpack_int(); + int delta_tick = game_tick-msg_unpack_int(); + int num_parts = 1; + int part = 0; + int part_size = 0; + + if(msg == NETMSG_SNAP) + { + num_parts = msg_unpack_int(); + part = msg_unpack_int(); + } + + if(msg != NETMSG_SNAPEMPTY) + part_size = msg_unpack_int(); + + if(snapshot_part == part) { - snapshot *tmp = snapshots[SNAP_PREV]; - snapshots[SNAP_PREV] = snapshots[SNAP_CURRENT]; - snapshots[SNAP_CURRENT] = tmp; - current_tick = game_tick; - - // decompress snapshot - void *deltadata = snapshot_empty_delta(); - int deltasize = sizeof(int)*3; - - unsigned char tmpbuffer[MAX_SNAPSHOT_SIZE]; - unsigned char tmpbuffer2[MAX_SNAPSHOT_SIZE]; - if(part_size) + // TODO: clean this up abit + const char *d = (const char *)msg_unpack_raw(part_size); + mem_copy((char*)snapshots[SNAP_INCOMMING] + part*MAX_SNAPSHOT_PACKSIZE, d, part_size); + snapshot_part++; + + if(snapshot_part == num_parts) { - //int snapsize = lzw_decompress(snapshots[SNAP_INCOMMING], snapshots[SNAP_CURRENT]); - int compsize = zerobit_decompress(snapshots[SNAP_INCOMMING], part_size, tmpbuffer); - //int compsize = lzw_decompress(snapshots[SNAP_INCOMMING],tmpbuffer); - int intsize = intpack_decompress(tmpbuffer, compsize, tmpbuffer2); - deltadata = tmpbuffer2; - deltasize = intsize; - } + snapshot *tmp = snapshots[SNAP_PREV]; + snapshots[SNAP_PREV] = snapshots[SNAP_CURRENT]; + snapshots[SNAP_CURRENT] = tmp; + current_tick = game_tick; + + // decompress snapshot + void *deltadata = snapshot_empty_delta(); + int deltasize = sizeof(int)*3; + + unsigned char tmpbuffer[MAX_SNAPSHOT_SIZE]; + unsigned char tmpbuffer2[MAX_SNAPSHOT_SIZE]; + if(part_size) + { + //int snapsize = lzw_decompress(snapshots[SNAP_INCOMMING], snapshots[SNAP_CURRENT]); + int compsize = zerobit_decompress(snapshots[SNAP_INCOMMING], part_size, tmpbuffer); + //int compsize = lzw_decompress(snapshots[SNAP_INCOMMING],tmpbuffer); + int intsize = intpack_decompress(tmpbuffer, compsize, tmpbuffer2); + deltadata = tmpbuffer2; + deltasize = intsize; + } - // find snapshot that we should use as delta - static snapshot emptysnap; - emptysnap.data_size = 0; - emptysnap.num_items = 0; - - snapshot *deltashot = &emptysnap; - int deltashot_size; + // find snapshot that we should use as delta + static snapshot emptysnap; + emptysnap.data_size = 0; + emptysnap.num_items = 0; + + snapshot *deltashot = &emptysnap; + int deltashot_size; - if(delta_tick >= 0) - { - void *delta_data; - deltashot_size = snapshots_new.get(delta_tick, &delta_data); - if(deltashot_size >= 0) + if(delta_tick >= 0) { - deltashot = (snapshot *)delta_data; + void *delta_data; + deltashot_size = snapshots_new.get(delta_tick, &delta_data); + if(deltashot_size >= 0) + { + deltashot = (snapshot *)delta_data; + } + else + { + // TODO: handle this + dbg_msg("client", "error, couldn't find the delta snapshot"); + } } - else + + int snapsize = snapshot_unpack_delta(deltashot, (snapshot*)snapshots[SNAP_CURRENT], deltadata, deltasize); + //snapshot *shot = (snapshot *)snapshots[SNAP_CURRENT]; + + // purge old snapshots + snapshots_new.purge_until(delta_tick); + snapshots_new.purge_until(game_tick-50); // TODO: change this to server tickrate + + // add new + snapshots_new.add(game_tick, snapsize, snapshots[SNAP_CURRENT]); + + // apply snapshot, cycle pointers + recived_snapshots++; + snapshot_start_time = time_get(); + + // we got two snapshots until we see us self as connected + if(recived_snapshots == 2) { - // TODO: handle this - dbg_msg("client", "error, couldn't find the delta snapshot"); + local_start_time = time_get(); + set_state(STATE_ONLINE); } + + if(recived_snapshots > 2) + modc_newsnapshot(); + + snapshot_part = 0; + + // ack snapshot + msg_pack_start_system(NETMSG_SNAPACK, 0); + msg_pack_int(game_tick); + msg_pack_end(); + client_send_msg(); } - - int snapsize = snapshot_unpack_delta(deltashot, (snapshot*)snapshots[SNAP_CURRENT], deltadata, deltasize); - //snapshot *shot = (snapshot *)snapshots[SNAP_CURRENT]; - - // purge old snapshots - snapshots_new.purge_until(delta_tick); - snapshots_new.purge_until(game_tick-50); // TODO: change this to server tickrate - - // add new - snapshots_new.add(game_tick, snapsize, snapshots[SNAP_CURRENT]); - - // apply snapshot, cycle pointers - recived_snapshots++; - snapshot_start_time = time_get(); - - // we got two snapshots until we see us self as connected - if(recived_snapshots == 2) - { - local_start_time = time_get(); - set_state(STATE_ONLINE); - } - - if(recived_snapshots > 2) - modc_newsnapshot(); - + } + else + { + dbg_msg("client", "snapshot reset!"); snapshot_part = 0; - - // ack snapshot - msg_pack_start(NETMSG_SNAPACK, 0); - msg_pack_int(game_tick); - msg_pack_end(); - client_send_msg(); } } - else - { - dbg_msg("client", "snapshot reset!"); - snapshot_part = 0; - } + } + else + { + // game message + modc_message(msg); } } diff --git a/src/engine/client/gfx.cpp b/src/engine/client/gfx.cpp index ba908c68..c30ad0f1 100644 --- a/src/engine/client/gfx.cpp +++ b/src/engine/client/gfx.cpp @@ -617,7 +617,7 @@ pretty_font *current_font = &default_font; void gfx_pretty_text(float x, float y, float size, const char *text) { const float spacing = 0.05f; - + gfx_texture_set(current_font->font_texture); gfx_quads_begin(); while (*text) diff --git a/src/engine/interface.h b/src/engine/interface.h index 27f73e17..a3bb2e15 100644 --- a/src/engine/interface.h +++ b/src/engine/interface.h @@ -705,6 +705,7 @@ enum MSGFLAG_VITAL=1, }; +void msg_pack_start_system(int msg, int flags); void msg_pack_start(int msg, int flags); void msg_pack_int(int i); void msg_pack_string(const char *p, int limit); @@ -722,20 +723,23 @@ struct msg_info const msg_info *msg_get_info(); // message unpacking -int msg_unpack_start(const void *data, int data_size); +int msg_unpack_start(const void *data, int data_size, int *system); int msg_unpack_int(); const char *msg_unpack_string(); const unsigned char *msg_unpack_raw(int size); // message sending -int server_send_msg(int client_id); +int server_send_msg(int client_id); // client_id == -1 == broadcast int client_send_msg(); int client_tick(); float client_intratick(); +void gfx_pretty_text(float x, float y, float size, const char *text); +float gfx_pretty_text_width(float size, const char *text); -int modc_message(); +void mods_message(int msg, int client_id); +void modc_message(int msg); #define MASTER_SERVER_ADDRESS "master.teewars.com" #define MASTER_SERVER_PORT 8300 diff --git a/src/engine/msg.cpp b/src/engine/msg.cpp index 024bab2c..fa2dab34 100644 --- a/src/engine/msg.cpp +++ b/src/engine/msg.cpp @@ -10,13 +10,22 @@ void msg_pack_int(int i) { packer.add_int(i); } void msg_pack_string(const char *p, int limit) { packer.add_string(p, limit); } void msg_pack_raw(const void *data, int size) { packer.add_raw((const unsigned char *)data, size); } +void msg_pack_start_system(int msg, int flags) +{ + packer.reset(); + pack_info.msg = (msg<<1)|1; + pack_info.flags = flags; + + msg_pack_int(pack_info.msg); +} + void msg_pack_start(int msg, int flags) { packer.reset(); - pack_info.msg = msg; + pack_info.msg = msg<<1; pack_info.flags = flags; - msg_pack_int(msg); + msg_pack_int(pack_info.msg); } void msg_pack_end() @@ -32,10 +41,12 @@ const msg_info *msg_get_info() // message unpacking static data_unpacker unpacker; -int msg_unpack_start(const void *data, int data_size) +int msg_unpack_start(const void *data, int data_size, int *system) { unpacker.reset((const unsigned char *)data, data_size); - return msg_unpack_int(); + int msg = msg_unpack_int(); + *system = msg&1; + return msg>>1; } int msg_unpack_int() { return unpacker.get_int(); } diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp index 5632689e..6fe84ade 100644 --- a/src/engine/server/server.cpp +++ b/src/engine/server/server.cpp @@ -107,8 +107,19 @@ int server_send_msg(int client_id) if(info->flags&MSGFLAG_VITAL) packet.flags = PACKETFLAG_VITAL; - - net.send(&packet); + + if(client_id == -1) + { + // broadcast + for(int i = 0; i < MAX_CLIENTS; i++) + if(clients[i].is_ingame()) + { + packet.client_id = i; + net.send(&packet); + } + } + else + net.send(&packet); return 0; } @@ -337,9 +348,9 @@ public: left -= chunk; if(numpackets == 1) - msg_pack_start(NETMSG_SNAPSMALL, 0); + msg_pack_start_system(NETMSG_SNAPSMALL, 0); else - msg_pack_start(NETMSG_SNAP, 0); + msg_pack_start_system(NETMSG_SNAP, 0); msg_pack_int(current_tick); msg_pack_int(current_tick-delta_tick); // compressed with msg_pack_int(chunk); @@ -352,7 +363,7 @@ public: } else { - msg_pack_start(NETMSG_SNAPEMPTY, 0); + msg_pack_start_system(NETMSG_SNAPEMPTY, 0); msg_pack_int(current_tick); msg_pack_int(current_tick-delta_tick); // compressed with msg_pack_end(); @@ -366,7 +377,7 @@ public: void send_map(int cid) { - msg_pack_start(NETMSG_MAP, MSGFLAG_VITAL); + msg_pack_start_system(NETMSG_MAP, MSGFLAG_VITAL); msg_pack_string(map_name, 0); msg_pack_end(); server_send_msg(cid); @@ -385,40 +396,49 @@ public: void process_client_packet(NETPACKET *packet) { int cid = packet->client_id; - int msg = msg_unpack_start(packet->data, packet->data_size); - if(msg == NETMSG_INFO) - { - strncpy(clients[cid].name, msg_unpack_string(), MAX_NAME_LENGTH); - strncpy(clients[cid].clan, msg_unpack_string(), MAX_CLANNAME_LENGTH); - const char *password = msg_unpack_string(); - const char *skin = msg_unpack_string(); - (void)password; // ignore these variables - (void)skin; - send_map(cid); - } - else if(msg == NETMSG_ENTERGAME) - { - dbg_msg("game", "player as entered the game. cid=%x", cid); - clients[cid].state = client::STATE_INGAME; - mods_client_enter(cid); - } - else if(msg == NETMSG_INPUT) - { - int input[MAX_INPUT_SIZE]; - int size = msg_unpack_int(); - for(int i = 0; i < size/4; i++) - input[i] = msg_unpack_int(); - mods_client_input(cid, input); - } - else if(msg == NETMSG_SNAPACK) + int sys; + int msg = msg_unpack_start(packet->data, packet->data_size, &sys); + if(sys) { - clients[cid].last_acked_snapshot = msg_unpack_int(); + // system message + if(msg == NETMSG_INFO) + { + strncpy(clients[cid].name, msg_unpack_string(), MAX_NAME_LENGTH); + strncpy(clients[cid].clan, msg_unpack_string(), MAX_CLANNAME_LENGTH); + const char *password = msg_unpack_string(); + const char *skin = msg_unpack_string(); + (void)password; // ignore these variables + (void)skin; + send_map(cid); + } + else if(msg == NETMSG_ENTERGAME) + { + dbg_msg("game", "player as entered the game. cid=%x", cid); + clients[cid].state = client::STATE_INGAME; + mods_client_enter(cid); + } + else if(msg == NETMSG_INPUT) + { + int input[MAX_INPUT_SIZE]; + int size = msg_unpack_int(); + for(int i = 0; i < size/4; i++) + input[i] = msg_unpack_int(); + mods_client_input(cid, input); + } + else if(msg == NETMSG_SNAPACK) + { + clients[cid].last_acked_snapshot = msg_unpack_int(); + } + else + { + dbg_msg("server", "strange message cid=%d msg=%d data_size=%d", cid, msg, packet->data_size); + } } else { - dbg_msg("server", "strange message cid=%d msg=%d data_size=%d", cid, msg, packet->data_size); + // game message + mods_message(msg, cid); } - } void process_packet(NETPACKET *packet) |