- // check always succeeds for now ;)
- auto pack = Packet::Make<Packet::PlayerCorrection>(server.GetPacket());
- pack.WritePacketSeq(player_update_pack);
- pack.WritePlayer(Player());
- conn.Send(server.GetPacket(), server.GetSocket());
+ // player_update_state's position holds the client's most recent prediction
+ glm::vec3 diff = player_update_state.Diff(Player().GetState());
+ float dist_squared = dot(diff, diff);
+
+ // if client's prediction is off by more than 1cm, send
+ // our (authoritative) state back so it can fix it
+ constexpr float fix_thresh = 0.0001f;
+
+ if (dist_squared > fix_thresh) {
+ auto pack = Packet::Make<Packet::PlayerCorrection>(server.GetPacket());
+ pack.WritePacketSeq(player_update_pack);
+ pack.WritePlayer(Player());
+ conn.Send(server.GetPacket(), server.GetSocket());
+ }