From 33b50738e63a3c79861bcfd88cb39377f85776c4 Mon Sep 17 00:00:00 2001 From: Magnus Auvinen Date: Tue, 23 Sep 2008 07:43:41 +0000 Subject: added dead reckoning to the characters --- src/game/server/entities/character.cpp | 59 +++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 18 deletions(-) (limited to 'src/game/server/entities/character.cpp') diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp index 463b6640..362eecf0 100644 --- a/src/game/server/entities/character.cpp +++ b/src/game/server/entities/character.cpp @@ -34,7 +34,8 @@ static INPUT_COUNT count_input(int prev, int cur) // player CHARACTER::CHARACTER() : ENTITY(NETOBJTYPE_CHARACTER) -{} +{ +} void CHARACTER::reset() { @@ -59,6 +60,10 @@ bool CHARACTER::spawn(PLAYER *player, vec2 pos, int team) core.world = &game.world.core; core.pos = pos; game.world.core.characters[player->client_id] = &core; + + reckoning_tick = 0; + mem_zero(&sendcore, sizeof(sendcore)); + mem_zero(&reckoningcore, sizeof(reckoningcore)); game.world.insert_entity(this); alive = true; @@ -578,7 +583,7 @@ void CHARACTER::tick() //core.pos = pos; //core.jumped = jumped; core.input = input; - core.tick(); + core.tick(true); // handle weapons handle_weapons(); @@ -592,6 +597,16 @@ void CHARACTER::tick() void CHARACTER::tick_defered() { + // advance the dummy + { + WORLD_CORE tempworld; + reckoningcore.world = &tempworld; + reckoningcore.tick(false); + reckoningcore.move(); + reckoningcore.quantize(); + } + + //lastsentcore; /*if(!dead) {*/ vec2 start_pos = core.pos; @@ -642,6 +657,23 @@ void CHARACTER::tick_defered() pos.x = input.target_x; pos.y = input.target_y; } + + // update the sendcore if needed + { + NETOBJ_CHARACTER predicted; + NETOBJ_CHARACTER current; + mem_zero(&predicted, sizeof(predicted)); + mem_zero(¤t, sizeof(current)); + reckoningcore.write(&predicted); + core.write(¤t); + + if(mem_comp(&predicted, ¤t, sizeof(NETOBJ_CHARACTER)) != 0) + { + reckoning_tick = server_tick(); + sendcore = core; + reckoningcore = core; + } + } } bool CHARACTER::increase_health(int amount) @@ -784,16 +816,12 @@ void CHARACTER::snap(int snaping_client) return; NETOBJ_CHARACTER *character = (NETOBJ_CHARACTER *)snap_new_item(NETOBJTYPE_CHARACTER, player->client_id, sizeof(NETOBJ_CHARACTER)); - - core.write(character); - - // this is to make sure that players that are just standing still - // isn't sent. this is because the physics keep bouncing between - // 0-128 when just standing. - // TODO: fix the physics so this isn't needed - if(snaping_client != player->client_id && abs(character->vy) < 256.0f) - character->vy = 0; - + + // write down the core + character->tick = reckoning_tick; + sendcore.write(character); + + // set emote if (emote_stop < server_tick()) { emote_type = EMOTE_NORMAL; @@ -809,12 +837,7 @@ void CHARACTER::snap(int snaping_client) character->weapon = active_weapon; character->attacktick = attack_tick; - 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->direction = input.direction; if(player->client_id == snaping_client) { -- cgit 1.4.1