diff options
| author | Olle Rosenquist <phobos99@gmail.com> | 2007-07-22 11:53:15 +0000 |
|---|---|---|
| committer | Olle Rosenquist <phobos99@gmail.com> | 2007-07-22 11:53:15 +0000 |
| commit | 26dd1c20cee2bf814396cb941c6aea68e63d664f (patch) | |
| tree | 96b2ab24e5d5e59ba5b1108b6db090aa93e5c801 /src/engine | |
| parent | 2165a728c25d804128933408cd8753c333be9ed3 (diff) | |
| download | zcatch-26dd1c20cee2bf814396cb941c6aea68e63d664f.tar.gz zcatch-26dd1c20cee2bf814396cb941c6aea68e63d664f.zip | |
Updated stuff
Diffstat (limited to 'src/engine')
| -rw-r--r-- | src/engine/client/client.cpp | 920 | ||||
| -rw-r--r-- | src/engine/client/client.h | 48 | ||||
| -rw-r--r-- | src/engine/server/server.cpp | 2 |
3 files changed, 503 insertions, 467 deletions
diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp index 7fb9413e..0dcab9a6 100644 --- a/src/engine/client/client.cpp +++ b/src/engine/client/client.cpp @@ -18,9 +18,10 @@ #include <engine/versions.h> #include <engine/config.h> -#include <engine/network.h> +//#include <engine/network.h> #include <mastersrv/mastersrv.h> +#include "client.h" using namespace baselib; @@ -274,567 +275,555 @@ void client_connect(const char *server_address_str) // --- client --- // TODO: remove this class -class client +void client::send_info() { -public: - int info_request_begin; - int info_request_end; - - int snapshot_part; + recived_snapshots = 0; - int debug_font; // TODO: rfemove this line + 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); + msg_pack_string("myskin", 128); + msg_pack_end(); + client_send_msg(); +} - // data to hold three snapshots - // previous, +void client::send_entergame() +{ + msg_pack_start_system(NETMSG_ENTERGAME, MSGFLAG_VITAL); + msg_pack_end(); + client_send_msg(); +} - void send_info() - { - recived_snapshots = 0; - - 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); - msg_pack_string("myskin", 128); - msg_pack_end(); - client_send_msg(); - } +void client::send_error(const char *error) +{ + /* + pack(NETMSG_CLIENT_ERROR, "s", error); + */ + /* + packet p(NETMSG_CLIENT_ERROR); + p.write_str(error); + send_packet(&p); + //send_packet(&p); + //send_packet(&p); + */ +} + +void client::send_input() +{ + 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]); + msg_pack_end(); + client_send_msg(); +} - void send_entergame() - { - msg_pack_start_system(NETMSG_ENTERGAME, MSGFLAG_VITAL); - msg_pack_end(); - client_send_msg(); - } +void client::disconnect() +{ + send_error("disconnected"); + set_state(STATE_OFFLINE); + map_unload(); +} - void send_error(const char *error) - { - /* - pack(NETMSG_CLIENT_ERROR, "s", error); - */ - /* - packet p(NETMSG_CLIENT_ERROR); - p.write_str(error); - send_packet(&p); - //send_packet(&p); - //send_packet(&p); - */ - } - - void send_input() - { - 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]); - msg_pack_end(); - client_send_msg(); - } +bool client::load_data() +{ + debug_font = gfx_load_texture("data/debug_font.png"); + return true; +} + +void client::debug_render() +{ + gfx_blend_normal(); + gfx_texture_set(debug_font); + gfx_mapscreen(0,0,gfx_screenwidth(),gfx_screenheight()); - void disconnect() + static NETSTATS prev, current; + static int64 last_snap = 0; + if(time_get()-last_snap > time_freq()/10) { - send_error("disconnected"); - set_state(STATE_OFFLINE); - map_unload(); + last_snap = time_get(); + prev = current; + net.stats(¤t); } - bool load_data() - { - debug_font = gfx_load_texture("data/debug_font.png"); - return true; - } + char buffer[512]; + sprintf(buffer, "send: %8d recv: %8d", + (current.send_bytes-prev.send_bytes)*10, + (current.recv_bytes-prev.recv_bytes)*10); + gfx_quads_text(10, 10, 16, buffer); - void debug_render() +} + +void client::render() +{ + gfx_clear(0.0f,0.0f,0.0f); + + // this should be moved around abit + // TODO: clean this shit up! + if(get_state() == STATE_ONLINE) { - gfx_blend_normal(); - gfx_texture_set(debug_font); - gfx_mapscreen(0,0,gfx_screenwidth(),gfx_screenheight()); + modc_render(); - static NETSTATS prev, current; - static int64 last_snap = 0; - if(time_get()-last_snap > time_freq()/10) - { - last_snap = time_get(); - prev = current; - net.stats(¤t); - } - - char buffer[512]; - sprintf(buffer, "send: %8d recv: %8d", - (current.send_bytes-prev.send_bytes)*10, - (current.recv_bytes-prev.recv_bytes)*10); - gfx_quads_text(10, 10, 16, buffer); + // debug render stuff + debug_render(); } - - void render() + else if (get_state() != STATE_CONNECTING && get_state() != STATE_LOADING) { - gfx_clear(0.0f,0.0f,0.0f); + //netaddr4 server_address; + int status = modmenu_render(); + + if (status == -1) + set_state(STATE_QUIT); + } + else if (get_state() == STATE_CONNECTING || get_state() == STATE_LOADING) + { + static int64 start = time_get(); + static int tee_texture; + static int connecting_texture; + static bool inited = false; - // this should be moved around abit - // TODO: clean this shit up! - if(get_state() == STATE_ONLINE) + if (!inited) { - modc_render(); - - // debug render stuff - debug_render(); - - } - else if (get_state() != STATE_CONNECTING && get_state() != STATE_LOADING) - { - //netaddr4 server_address; - int status = modmenu_render(); - - if (status == -1) - set_state(STATE_QUIT); + tee_texture = gfx_load_texture("data/gui_tee.png"); + connecting_texture = gfx_load_texture("data/gui/connecting.png"); + + inited = true; } - else if (get_state() == STATE_CONNECTING || get_state() == STATE_LOADING) - { - static int64 start = time_get(); - static int tee_texture; - static int connecting_texture; - static bool inited = false; - - if (!inited) - { - tee_texture = gfx_load_texture("data/gui_tee.png"); - connecting_texture = gfx_load_texture("data/gui/connecting.png"); - - inited = true; - } - gfx_mapscreen(0,0,400.0f,300.0f); + gfx_mapscreen(0,0,400.0f,300.0f); - float t = (time_get() - start) / (double)time_freq(); + float t = (time_get() - start) / (double)time_freq(); - float speed = 2*sin(t); + float speed = 2*sin(t); - speed = 1.0f; + speed = 1.0f; - float x = 208 + sin(t*speed) * 32; - float w = sin(t*speed + 3.149) * 64; + float x = 208 + sin(t*speed) * 32; + float w = sin(t*speed + 3.149) * 64; - ui_do_image(tee_texture, x, 95, w, 64); - ui_do_image(connecting_texture, 88, 150, 256, 64); - } + ui_do_image(tee_texture, x, 95, w, 64); + ui_do_image(connecting_texture, 88, 150, 256, 64); } +} + +void client::run(const char *direct_connect_server) +{ + local_start_time = time_get(); + snapshot_part = 0; + info_request_begin = 0; + info_request_end = 0; - void run(const char *direct_connect_server) - { - local_start_time = time_get(); - snapshot_part = 0; - info_request_begin = 0; - info_request_end = 0; - - client_serverbrowse_init(); - - // init graphics and sound - if(!gfx_init()) - return; + client_serverbrowse_init(); + + // init graphics and sound + if(!gfx_init()) + return; - snd_init(); // sound is allowed to fail - - // load data - if(!load_data()) - return; + snd_init(); // sound is allowed to fail + + // load data + if(!load_data()) + return; - // init snapshotting - snap_init(); + // init snapshotting + snap_init(); + + // init the mod + modc_init(); + + // init menu + modmenu_init(); + + // open socket + net.open(0, 0); + + // + net_host_lookup(config.masterserver, MASTERSERVER_PORT, &master_server); + + // connect to the server if wanted + if(direct_connect_server) + client_connect(direct_connect_server); - // init the mod - modc_init(); + //int64 inputs_per_second = 50; + //int64 time_per_input = time_freq()/inputs_per_second; + int64 game_starttime = time_get(); + int64 last_input = game_starttime; + + int64 reporttime = time_get(); + int64 reportinterval = time_freq()*1; + int frames = 0; + + input::set_mouse_mode(input::mode_relative); + + while (1) + { + frames++; + int64 frame_start_time = time_get(); - // init menu - modmenu_init(); + // send input + if(get_state() == STATE_ONLINE) + { + if(input_is_changed || time_get() > last_input+time_freq()) + { + send_input(); + input_is_changed = 0; + last_input = time_get(); + } + } - // open socket - net.open(0, 0); + // update input + inp_update(); // - net_host_lookup(config.masterserver, MASTERSERVER_PORT, &master_server); + if(input::pressed(input::f1)) + input::set_mouse_mode(input::mode_absolute); + if(input::pressed(input::f2)) + input::set_mouse_mode(input::mode_relative); - // connect to the server if wanted - if(direct_connect_server) - client_connect(direct_connect_server); + // panic button + if(input::pressed(input::lctrl) && input::pressed('Q')) + break; - //int64 inputs_per_second = 50; - //int64 time_per_input = time_freq()/inputs_per_second; - int64 game_starttime = time_get(); - int64 last_input = game_starttime; + // pump the network + pump_network(); - int64 reporttime = time_get(); - int64 reportinterval = time_freq()*1; - int frames = 0; + // update the server browser + serverbrowse_update(); - input::set_mouse_mode(input::mode_relative); + // render + render(); - while (1) - { - frames++; - int64 frame_start_time = time_get(); - - // send input - if(get_state() == STATE_ONLINE) - { - if(input_is_changed || time_get() > last_input+time_freq()) - { - send_input(); - input_is_changed = 0; - last_input = time_get(); - } - } - - // update input - inp_update(); - - // - if(input::pressed(input::f1)) - input::set_mouse_mode(input::mode_absolute); - if(input::pressed(input::f2)) - input::set_mouse_mode(input::mode_relative); - - // panic button - if(input::pressed(input::lctrl) && input::pressed('Q')) - break; - - // pump the network - pump_network(); - - // update the server browser - serverbrowse_update(); - - // render - render(); - - // swap the buffers - gfx_swap(); - - // check conditions - if(get_state() == STATE_BROKEN || get_state() == STATE_QUIT) - break; - - // be nice - //thread_sleep(1); - - if(reporttime < time_get()) - { - dbg_msg("client/report", "fps=%.02f netstate=%d", - frames/(float)(reportinterval/time_freq()), net.state()); - frames = 0; - reporttime += reportinterval; - } - - if (input::pressed(input::esc)) - if (get_state() == STATE_CONNECTING || get_state() == STATE_ONLINE) - disconnect(); + // swap the buffers + gfx_swap(); + + // check conditions + if(get_state() == STATE_BROKEN || get_state() == STATE_QUIT) + break; - // update frametime - frametime = (time_get()-frame_start_time)/(float)time_freq(); + // be nice + thread_sleep(1); + + if(reporttime < time_get()) + { + dbg_msg("client/report", "fps=%.02f netstate=%d", + frames/(float)(reportinterval/time_freq()), net.state()); + frames = 0; + reporttime += reportinterval; } - modc_shutdown(); - disconnect(); + /*if (input::pressed(input::esc)) + if (get_state() == STATE_CONNECTING || get_state() == STATE_ONLINE) + disconnect();*/ - modmenu_shutdown(); - - gfx_shutdown(); - snd_shutdown(); + // update frametime + frametime = (time_get()-frame_start_time)/(float)time_freq(); } - void error(const char *msg) - { - dbg_msg("game", "error: %s", msg); - send_error(msg); - set_state(STATE_BROKEN); - } + modc_shutdown(); + disconnect(); + + modmenu_shutdown(); + + gfx_shutdown(); + snd_shutdown(); +} + +void client::error(const char *msg) +{ + dbg_msg("game", "error: %s", msg); + send_error(msg); + set_state(STATE_BROKEN); +} + +void client::serverbrowse_request(int id) +{ + dbg_msg("client", "requesting server info from %d.%d.%d.%d:%d", + servers.addresses[id].ip[0], servers.addresses[id].ip[1], servers.addresses[id].ip[2], + servers.addresses[id].ip[3], servers.addresses[id].port); + NETPACKET packet; + packet.client_id = -1; + packet.address = servers.addresses[id]; + packet.flags = PACKETFLAG_CONNLESS; + packet.data_size = sizeof(SERVERBROWSE_GETINFO); + packet.data = SERVERBROWSE_GETINFO; + net.send(&packet); + servers.request_times[id] = time_get(); +} + +void client::serverbrowse_update() +{ + int64 timeout = time_freq(); + int64 now = time_get(); + int max_requests = 10; - void serverbrowse_request(int id) + // timeout old requests + while(info_request_begin < servers.num && info_request_begin < info_request_end) { - dbg_msg("client", "requesting server info from %d.%d.%d.%d:%d", - servers.addresses[id].ip[0], servers.addresses[id].ip[1], servers.addresses[id].ip[2], - servers.addresses[id].ip[3], servers.addresses[id].port); - NETPACKET packet; - packet.client_id = -1; - packet.address = servers.addresses[id]; - packet.flags = PACKETFLAG_CONNLESS; - packet.data_size = sizeof(SERVERBROWSE_GETINFO); - packet.data = SERVERBROWSE_GETINFO; - net.send(&packet); - servers.request_times[id] = time_get(); + if(now > servers.request_times[info_request_begin]+timeout) + info_request_begin++; + else + break; } - void serverbrowse_update() + // send new requests + while(info_request_end < servers.num && info_request_end-info_request_begin < max_requests) { - int64 timeout = time_freq(); - int64 now = time_get(); - int max_requests = 10; - - // timeout old requests - while(info_request_begin < servers.num && info_request_begin < info_request_end) - { - if(now > servers.request_times[info_request_begin]+timeout) - info_request_begin++; - else - break; - } - - // send new requests - while(info_request_end < servers.num && info_request_end-info_request_begin < max_requests) - { - serverbrowse_request(info_request_end); - info_request_end++; - } + serverbrowse_request(info_request_end); + info_request_end++; } +} - void process_packet(NETPACKET *packet) +void client::process_packet(NETPACKET *packet) +{ + if(packet->client_id == -1) { - if(packet->client_id == -1) + // connectionlesss + if(packet->data_size >= (int)sizeof(SERVERBROWSE_LIST) && + memcmp(packet->data, SERVERBROWSE_LIST, sizeof(SERVERBROWSE_LIST)) == 0) { - // connectionlesss - if(packet->data_size >= (int)sizeof(SERVERBROWSE_LIST) && - memcmp(packet->data, SERVERBROWSE_LIST, sizeof(SERVERBROWSE_LIST)) == 0) - { - // server listing - int size = packet->data_size-sizeof(SERVERBROWSE_LIST); - mem_copy(servers.addresses, (char*)packet->data+sizeof(SERVERBROWSE_LIST), size); - servers.num = size/sizeof(NETADDR4); + // server listing + int size = packet->data_size-sizeof(SERVERBROWSE_LIST); + mem_copy(servers.addresses, (char*)packet->data+sizeof(SERVERBROWSE_LIST), size); + servers.num = size/sizeof(NETADDR4); - info_request_begin = 0; - info_request_end = 0; + info_request_begin = 0; + info_request_end = 0; - for(int i = 0; i < servers.num; i++) + for(int i = 0; i < servers.num; i++) + { + servers.infos[i].num_players = 0; + servers.infos[i].max_players = 0; + servers.infos[i].latency = 999; + sprintf(servers.infos[i].address, "%d.%d.%d.%d:%d", + servers.addresses[i].ip[0], servers.addresses[i].ip[1], servers.addresses[i].ip[2], + servers.addresses[i].ip[3], servers.addresses[i].port); + sprintf(servers.infos[i].name, "%d.%d.%d.%d:%d", + servers.addresses[i].ip[0], servers.addresses[i].ip[1], servers.addresses[i].ip[2], + servers.addresses[i].ip[3], servers.addresses[i].port); + } + } + + if(packet->data_size >= (int)sizeof(SERVERBROWSE_INFO) && + memcmp(packet->data, SERVERBROWSE_INFO, sizeof(SERVERBROWSE_INFO)) == 0) + { + // we got ze info + data_unpacker unpacker; + unpacker.reset((unsigned char*)packet->data+sizeof(SERVERBROWSE_INFO), packet->data_size-sizeof(SERVERBROWSE_INFO)); + + if(serverlist_lan) + { + if(servers.num != MAX_SERVERS) { - servers.infos[i].num_players = 0; - servers.infos[i].max_players = 0; - servers.infos[i].latency = 999; + int i = servers.num; + strncpy(servers.infos[i].name, unpacker.get_string(), 128); + strncpy(servers.infos[i].map, unpacker.get_string(), 128); + servers.infos[i].max_players = unpacker.get_int(); + servers.infos[i].num_players = unpacker.get_int(); + servers.infos[i].latency = 0; + sprintf(servers.infos[i].address, "%d.%d.%d.%d:%d", - servers.addresses[i].ip[0], servers.addresses[i].ip[1], servers.addresses[i].ip[2], - servers.addresses[i].ip[3], servers.addresses[i].port); - sprintf(servers.infos[i].name, "%d.%d.%d.%d:%d", - servers.addresses[i].ip[0], servers.addresses[i].ip[1], servers.addresses[i].ip[2], - servers.addresses[i].ip[3], servers.addresses[i].port); + packet->address.ip[0], packet->address.ip[1], packet->address.ip[2], + packet->address.ip[3], packet->address.port); + + dbg_msg("client", "got server info"); + servers.num++; + } } - - if(packet->data_size >= (int)sizeof(SERVERBROWSE_INFO) && - memcmp(packet->data, SERVERBROWSE_INFO, sizeof(SERVERBROWSE_INFO)) == 0) + else { - // we got ze info - data_unpacker unpacker; - unpacker.reset((unsigned char*)packet->data+sizeof(SERVERBROWSE_INFO), packet->data_size-sizeof(SERVERBROWSE_INFO)); - - if(serverlist_lan) + for(int i = 0; i < servers.num; i++) { - if(servers.num != MAX_SERVERS) + if(net_addr4_cmp(&servers.addresses[i], &packet->address) == 0) { - int i = servers.num; strncpy(servers.infos[i].name, unpacker.get_string(), 128); strncpy(servers.infos[i].map, unpacker.get_string(), 128); servers.infos[i].max_players = unpacker.get_int(); servers.infos[i].num_players = unpacker.get_int(); - servers.infos[i].latency = 0; - - sprintf(servers.infos[i].address, "%d.%d.%d.%d:%d", - packet->address.ip[0], packet->address.ip[1], packet->address.ip[2], - packet->address.ip[3], packet->address.port); - + servers.infos[i].latency = ((time_get() - servers.request_times[i])*1000)/time_freq(); dbg_msg("client", "got server info"); - servers.num++; - + break; } } + } + } + } + else + { + + int sys; + int msg = msg_unpack_start(packet->data, packet->data_size, &sys); + if(sys) + { + // system message + if(msg == NETMSG_MAP) + { + 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 { - for(int i = 0; i < servers.num; i++) - { - if(net_addr4_cmp(&servers.addresses[i], &packet->address) == 0) - { - strncpy(servers.infos[i].name, unpacker.get_string(), 128); - strncpy(servers.infos[i].map, unpacker.get_string(), 128); - servers.infos[i].max_players = unpacker.get_int(); - servers.infos[i].num_players = unpacker.get_int(); - servers.infos[i].latency = ((time_get() - servers.request_times[i])*1000)/time_freq(); - dbg_msg("client", "got server info"); - break; - } - } + error("failure to load map"); } } - } - else - { - - int sys; - int msg = msg_unpack_start(packet->data, packet->data_size, &sys); - if(sys) + else if(msg == NETMSG_SNAP || msg == NETMSG_SNAPSMALL || msg == NETMSG_SNAPEMPTY) { - // system message - if(msg == NETMSG_MAP) + //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) { - 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"); - } + num_parts = msg_unpack_int(); + part = msg_unpack_int(); } - else if(msg == NETMSG_SNAP || msg == NETMSG_SNAPSMALL || msg == NETMSG_SNAPEMPTY) + + if(msg != NETMSG_SNAPEMPTY) + part_size = msg_unpack_int(); + + if(snapshot_part == part) { - //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) + // 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) { - // 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) + 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) { - 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 compsize = zerobit_decompress(snapshots[SNAP_INCOMMING], part_size, tmpbuffer); - int intsize = intpack_decompress(tmpbuffer, compsize, tmpbuffer2); - deltadata = tmpbuffer2; - deltasize = intsize; - } + int compsize = zerobit_decompress(snapshots[SNAP_INCOMMING], part_size, 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) + if(delta_tick >= 0) + { + void *delta_data; + deltashot_size = snapshots_new.get(delta_tick, 0, &delta_data); + if(deltashot_size >= 0) { - void *delta_data; - deltashot_size = snapshots_new.get(delta_tick, 0, &delta_data); - if(deltashot_size >= 0) - { - deltashot = (snapshot *)delta_data; - } - else - { - // TODO: handle this - dbg_msg("client", "error, couldn't find the delta snapshot"); - } + deltashot = (snapshot *)delta_data; } - - 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, time_get(), 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) + else { - local_start_time = time_get(); - set_state(STATE_ONLINE); + // TODO: handle this + dbg_msg("client", "error, couldn't find the delta snapshot"); } - - 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(); } - } - else - { - dbg_msg("client", "snapshot reset!"); + + 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, time_get(), 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(); + snapshot_part = 0; + + // ack snapshot + msg_pack_start_system(NETMSG_SNAPACK, 0); + msg_pack_int(game_tick); + msg_pack_end(); + client_send_msg(); } } - } - else - { - // game message - modc_message(msg); + else + { + dbg_msg("client", "snapshot reset!"); + snapshot_part = 0; + } } } - } - - void pump_network() - { - net.update(); - - // check for errors - if(get_state() != STATE_OFFLINE && net.state() == NETSTATE_OFFLINE) + else { - // TODO: add message to the user there - set_state(STATE_OFFLINE); + // game message + modc_message(msg); } + } +} - // - if(get_state() == STATE_CONNECTING && net.state() == NETSTATE_ONLINE) - { - // we switched to online - dbg_msg("client", "connected, sending info"); - set_state(STATE_LOADING); - send_info(); - } - - // process packets - NETPACKET packet; - while(net.recv(&packet)) - process_packet(&packet); - } -}; +void client::pump_network() +{ + net.update(); + + // check for errors + if(get_state() != STATE_OFFLINE && net.state() == NETSTATE_OFFLINE) + { + // TODO: add message to the user there + set_state(STATE_OFFLINE); + } + + // + if(get_state() == STATE_CONNECTING && net.state() == NETSTATE_ONLINE) + { + // we switched to online + dbg_msg("client", "connected, sending info"); + set_state(STATE_LOADING); + send_info(); + } + + // process packets + NETPACKET packet; + while(net.recv(&packet)) + process_packet(&packet); +} int editor_main(int argc, char **argv); +client main_client; + int main(int argc, char **argv) { dbg_msg("client", "starting..."); @@ -880,8 +869,7 @@ int main(int argc, char **argv) else { // start the client - client c; - c.run(direct_connect_server); + main_client.run(direct_connect_server); } return 0; } diff --git a/src/engine/client/client.h b/src/engine/client/client.h new file mode 100644 index 00000000..db9d142d --- /dev/null +++ b/src/engine/client/client.h @@ -0,0 +1,48 @@ +#ifndef __CLIENT_H +#define __CLIENT_H + +#include <engine/network.h> +// --- client --- +// TODO: remove this class +class client +{ +public: + int info_request_begin; + int info_request_end; + + int snapshot_part; + + int debug_font; // TODO: rfemove this line + + // data to hold three snapshots + // previous, + + void send_info(); + + void send_entergame(); + + void send_error(const char *error); + + void send_input(); + + void disconnect(); + + bool load_data(); + + void debug_render(); + + void render(); + + void run(const char *direct_connect_server); + + void error(const char *msg); + + void serverbrowse_request(int id); + + void serverbrowse_update(); + void process_packet(NETPACKET *packet); + + void pump_network(); +}; + +#endif \ No newline at end of file diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp index 71fb9b94..77a32962 100644 --- a/src/engine/server/server.cpp +++ b/src/engine/server/server.cpp @@ -249,7 +249,7 @@ public: reporttime += time_freq()*reportinterval; } totaltime += time_get()-t; - thread_sleep(1); + //thread_sleep(1); } mods_shutdown(); |