From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Marvin Rieple <derrieple@gmail.com>
Date: Sun, 5 Dec 2021 16:42:07 +0100
Subject: [PATCH] Fix riding distance statistics

Fixes entity ride distance stats not being awarded correctly.
Based upon https://hub.spigotmc.org/stash/projects/SPIGOT/repos/craftbukkit/pull-requests/900

diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
index d85f5817f1aaebff3d93ee472d4580af72f7eae2..926d0a80cbb55184955ac6720948d2e86683cc57 100644
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@@ -609,7 +609,14 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser
                 Location curPos = this.getCraftPlayer().getLocation(); // Spigot
 
                 entity.absMoveTo(d3, d4, d5, f, f1);
-                this.player.absMoveTo(d3, d4, d5, this.player.getYRot(), this.player.getXRot()); // CraftBukkit
+                // Paper start - SPIGOT-4396: Synchronize player and vehicle
+                // Based upon https://hub.spigotmc.org/stash/projects/SPIGOT/repos/craftbukkit/pull-requests/900
+                Vec3 oldPlayerPosition = this.player.position();
+                entity.positionRider(this.player);
+                this.player.xo = oldPlayerPosition.x;
+                this.player.yo = oldPlayerPosition.y;
+                this.player.zo = oldPlayerPosition.z;
+                // Paper end
                 // Paper start - optimise out extra getCubes
                 boolean teleportBack = flag1; // violating this is always a fail
                 if (!teleportBack) {
@@ -621,10 +628,16 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser
                 }
                 if (teleportBack) { // Paper end - optimise out extra getCubes
                     entity.absMoveTo(d0, d1, d2, f, f1);
-                    this.player.absMoveTo(d0, d1, d2, this.player.getYRot(), this.player.getXRot()); // CraftBukkit
+                    // Paper start - SPIGOT-6475
+                    entity.positionRider(this.player);
+                    this.player.xo = oldPlayerPosition.x;
+                    this.player.yo = oldPlayerPosition.y;
+                    this.player.zo = oldPlayerPosition.z;
+                    // Paper end
                     this.connection.send(new ClientboundMoveVehiclePacket(entity));
                     return;
                 }
+                player.checkRidingStatistics(player.getX() - oldPlayerPosition.x, player.getY() - oldPlayerPosition.y, player.getZ() - oldPlayerPosition.z); // Paper - SPIGOT-6475: Update riding statistic
 
                 // CraftBukkit start - fire PlayerMoveEvent
                 Player player = this.getCraftPlayer();