diff options
| -rw-r--r-- | src/engine/client/client.c | 2 | ||||
| -rw-r--r-- | src/engine/server/server.c | 13 | ||||
| -rw-r--r-- | src/game/client/game_client.cpp | 133 |
3 files changed, 70 insertions, 78 deletions
diff --git a/src/engine/client/client.c b/src/engine/client/client.c index c6a9252f..4d63e618 100644 --- a/src/engine/client/client.c +++ b/src/engine/client/client.c @@ -19,7 +19,7 @@ #include <mastersrv/mastersrv.h> -const int prediction_margin = 5; +const int prediction_margin = 60; /*(int)(1000/(SERVER_TICK_SPEED*1.2f));*/ /* Server Time diff --git a/src/engine/server/server.c b/src/engine/server/server.c index 0262c65f..8fa10d7b 100644 --- a/src/engine/server/server.c +++ b/src/engine/server/server.c @@ -236,13 +236,6 @@ int server_send_msg(int client_id) return 0; } - -static void server_do_tick() -{ - current_tick++; - mods_tick(); -} - static void server_do_snap() { int i, k; @@ -464,7 +457,7 @@ static void server_process_client_packet(NETPACKET *packet) input->timeleft = server_tick_start_time(tick)-time_get(); input->pred_tick = tick; - if(tick < server_tick()) + if(tick <= server_tick()) { /* TODO: how should we handle this */ dbg_msg("server", "input got in late for=%d cur=%d", tick, server_tick()); @@ -713,6 +706,8 @@ static int server_run() if(t > server_tick_start_time(current_tick+1)) { + current_tick++; + /* apply new input */ { int c, i; @@ -734,7 +729,7 @@ static int server_run() /* progress game */ { int64 start = time_get(); - server_do_tick(); + mods_tick(); simulationtime += time_get()-start; } diff --git a/src/game/client/game_client.cpp b/src/game/client/game_client.cpp index d31b1b3e..ef96b749 100644 --- a/src/game/client/game_client.cpp +++ b/src/game/client/game_client.cpp @@ -48,6 +48,7 @@ static bool emoticon_selector_active = false; static vec2 mouse_pos; static vec2 local_character_pos; static const obj_player_character *local_character = 0; +static const obj_player_character *local_prev_character = 0; static const obj_player_info *local_info = 0; static const obj_game *gameobj = 0; @@ -581,8 +582,6 @@ extern "C" void modc_shutdown() { } -static bool must_process_events = false; - static void process_events(int s) { int num = snap_num_items(s); @@ -718,8 +717,6 @@ static void process_events(int s) } } } - - must_process_events = false; } static player_core predicted_prev_player; @@ -728,79 +725,77 @@ static player_core predicted_player; extern "C" void modc_predict() { // repredict player + world_core world; + int local_cid = -1; + + // search for players + for(int i = 0; i < snap_num_items(SNAP_CURRENT); i++) { - world_core world; - int local_cid = -1; + SNAP_ITEM item; + const void *data = snap_get_item(SNAP_CURRENT, i, &item); + int client_id = item.id; - // search for players - for(int i = 0; i < snap_num_items(SNAP_CURRENT); i++) + if(item.type == OBJTYPE_PLAYER_CHARACTER) { - SNAP_ITEM item; - const void *data = snap_get_item(SNAP_CURRENT, i, &item); - int client_id = item.id; + const obj_player_character *character = (const obj_player_character *)data; + client_datas[client_id].predicted.world = &world; + world.players[client_id] = &client_datas[client_id].predicted; - if(item.type == OBJTYPE_PLAYER_CHARACTER) - { - const obj_player_character *character = (const obj_player_character *)data; - client_datas[client_id].predicted.world = &world; - world.players[client_id] = &client_datas[client_id].predicted; - - client_datas[client_id].predicted.read(character); - } - else if(item.type == OBJTYPE_PLAYER_INFO) - { - const obj_player_info *info = (const obj_player_info *)data; - if(info->local) - local_cid = client_id; - } + client_datas[client_id].predicted.read(character); } - - // predict - for(int tick = client_tick(); tick <= client_predtick(); tick++) + else if(item.type == OBJTYPE_PLAYER_INFO) { - // first calculate where everyone should move - for(int c = 0; c < MAX_CLIENTS; c++) - { - if(!world.players[c]) - continue; - - mem_zero(&world.players[c]->input, sizeof(world.players[c]->input)); - if(local_cid == c) - { - // apply player input - int *input = client_get_input(tick); - if(input) - world.players[c]->input = *((player_input*)input); - } + const obj_player_info *info = (const obj_player_info *)data; + if(info->local) + local_cid = client_id; + } + } - world.players[c]->tick(); - } + // predict + for(int tick = client_tick()+1; tick <= client_predtick(); tick++) + { + // first calculate where everyone should move + for(int c = 0; c < MAX_CLIENTS; c++) + { + if(!world.players[c]) + continue; - // move all players and quantize their data - for(int c = 0; c < MAX_CLIENTS; c++) + mem_zero(&world.players[c]->input, sizeof(world.players[c]->input)); + if(local_cid == c) { - if(!world.players[c]) - continue; - - world.players[c]->move(); - world.players[c]->quantize(); + // apply player input + int *input = client_get_input(tick); + if(input) + world.players[c]->input = *((player_input*)input); } + + world.players[c]->tick(); } - // get the data from the local player - if(local_cid != -1 && world.players[local_cid]) + // move all players and quantize their data + for(int c = 0; c < MAX_CLIENTS; c++) { - predicted_prev_player = predicted_player; - predicted_player = *world.players[local_cid]; + if(!world.players[c]) + continue; + + world.players[c]->move(); + world.players[c]->quantize(); + + // get the data from the local player + if(local_cid == c && world.players[local_cid]) + { + if(tick == client_predtick()) + predicted_player = *world.players[local_cid]; + else if(tick == client_predtick()-1) + predicted_prev_player = *world.players[local_cid]; + } } } } extern "C" void modc_newsnapshot() { - if(must_process_events) - process_events(SNAP_PREV); - must_process_events = true; + process_events(SNAP_CURRENT); if(config.stress) { @@ -816,6 +811,7 @@ extern "C" void modc_newsnapshot() // clear out the invalid pointers local_character = 0; + local_prev_character = 0; local_info = 0; gameobj = 0; @@ -843,10 +839,7 @@ extern "C" void modc_newsnapshot() const void *p = snap_find_item(SNAP_PREV, OBJTYPE_PLAYER_CHARACTER, item.id); if(p) - { - local_character_pos = mix(vec2(((obj_player_character *)p)->x, ((obj_player_character *)p)->y), - local_character_pos, client_intratick()); - } + local_prev_character = (obj_player_character *)p; } } } @@ -1247,7 +1240,7 @@ static void render_player( if(player.health < 0) // dont render dead players return; - if(info.local) + if(info.local && config.cl_predict) { // apply predicted results predicted_player.write(&player); @@ -1911,7 +1904,15 @@ void render_game() bool spectate = false; - local_character_pos = mix(predicted_prev_player.pos, predicted_player.pos, client_intrapredtick()); + if(config.cl_predict) + local_character_pos = mix(predicted_prev_player.pos, predicted_player.pos, client_intrapredtick()); + else if(local_character && local_prev_character) + { + local_character_pos = mix( + vec2(local_prev_character->x, local_prev_character->y), + vec2(local_character->x, local_character->y), client_intratick()); + } + if(local_info && local_info->team == -1) spectate = true; @@ -2082,10 +2083,6 @@ void render_game() snap_input(&input, sizeof(input)); } - // everything updated, do events - if(must_process_events) - process_events(SNAP_PREV); - // center at char but can be moved when mouse is far away float offx = 0, offy = 0; if (config.dynamic_camera) |