]> git.localhorst.tv Git - blank.git/blobdiff - src/client/net.cpp
send updates less frequently on bad connections
[blank.git] / src / client / net.cpp
index b1076ba56c41a98d97cb882168dcecff5118aab3..18f593ac5831d218f0019723c511ff977a7e2ffe 100644 (file)
@@ -321,11 +321,17 @@ NetworkedInput::NetworkedInput(World &world, Player &player, Client &client)
 : PlayerController(world, player)
 , client(client)
 , player_hist()
+, old_movement(0.0f)
+, old_actions(0)
 , actions(0) {
 
 }
 
-void NetworkedInput::Update(int dt) {
+bool NetworkedInput::UpdateImportant() const noexcept {
+       return old_actions != actions || !iszero(old_movement - GetMovement());
+}
+
+void NetworkedInput::Update(Entity &, float dt) {
        Invalidate();
        UpdatePlayer();
 }
@@ -342,15 +348,17 @@ void NetworkedInput::PushPlayerUpdate(int dt) {
                InventorySlot()
        );
        if (player_hist.size() < 16) {
-               player_hist.emplace_back(state, GetPlayer().GetEntity().TargetVelocity(), dt * 0.001f, packet);
+               player_hist.emplace_back(state, GetMovement(), dt * 0.001f, packet);
        } else {
                auto entry = player_hist.begin();
                entry->state = state;
-               entry->tgt_vel = GetPlayer().GetEntity().TargetVelocity();
+               entry->movement = GetMovement();
                entry->delta_t = dt * 0.001f;
                entry->packet = packet;
                player_hist.splice(player_hist.end(), player_hist, entry);
        }
+       old_movement = GetMovement();
+       old_actions = actions;
 }
 
 void NetworkedInput::MergePlayerCorrection(uint16_t seq, const EntityState &corrected_state) {
@@ -376,6 +384,8 @@ void NetworkedInput::MergePlayerCorrection(uint16_t seq, const EntityState &corr
                }
        }
 
+       glm::vec3 restore_movement(GetMovement());
+
        EntityState player_state = GetPlayer().GetEntity().GetState();
        Entity replay(GetPlayer().GetEntity());
        replay.SetState(corrected_state);
@@ -389,7 +399,7 @@ void NetworkedInput::MergePlayerCorrection(uint16_t seq, const EntityState &corr
        vector<WorldCollision> col;
        while (entry != end) {
                replay.Velocity(entry->state.velocity);
-               replay.TargetVelocity(entry->tgt_vel);
+               SetMovement(entry->movement);
                GetWorld().Update(replay, entry->delta_t);
                entry->state.chunk_pos = replay.GetState().chunk_pos;
                entry->state.block_pos = replay.GetState().block_pos;
@@ -400,6 +410,7 @@ void NetworkedInput::MergePlayerCorrection(uint16_t seq, const EntityState &corr
        const float disp_squared = dot(displacement, displacement);
 
        if (disp_squared < 16.0f * numeric_limits<float>::epsilon()) {
+               SetMovement(restore_movement);
                return;
        }
 
@@ -419,6 +430,7 @@ void NetworkedInput::MergePlayerCorrection(uint16_t seq, const EntityState &corr
                player_state.block_pos += displacement;
        }
        GetPlayer().GetEntity().SetState(player_state);
+       SetMovement(restore_movement);
 }
 
 void NetworkedInput::StartPrimaryAction() {