#include "NetworkedInput.hpp"
#include "../app/init.hpp"
+#include "../geometry/distance.hpp"
#include "../io/WorldSave.hpp"
#include "../net/Packet.hpp"
#include "../world/Chunk.hpp"
: 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();
}
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) {
}
}
+ glm::vec3 restore_movement(GetMovement());
+
EntityState player_state = GetPlayer().GetEntity().GetState();
Entity replay(GetPlayer().GetEntity());
replay.SetState(corrected_state);
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;
const float disp_squared = dot(displacement, displacement);
if (disp_squared < 16.0f * numeric_limits<float>::epsilon()) {
+ SetMovement(restore_movement);
return;
}
player_state.block_pos += displacement;
}
GetPlayer().GetEntity().SetState(player_state);
+ SetMovement(restore_movement);
}
void NetworkedInput::StartPrimaryAction() {