diff --git a/patches/server/Detail-more-information-in-watchdog-dumps.patch b/patches/server/Detail-more-information-in-watchdog-dumps.patch index 402be9fce0..4a7e13d149 100644 --- a/patches/server/Detail-more-information-in-watchdog-dumps.patch +++ b/patches/server/Detail-more-information-in-watchdog-dumps.patch @@ -194,8 +194,8 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 public void setDeltaMovement(double x, double y, double z) { @@ -0,0 +0,0 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { - public final void setPosRaw(double x, double y, double z, boolean forceBoundingBoxUpdate) { - // Paper end + } + // Paper end - fix MC-4 if (this.position.x != x || this.position.y != y || this.position.z != z) { + synchronized (this.posLock) { // Paper this.position = new Vec3(x, y, z); diff --git a/patches/server/Guard-against-invalid-entity-positions.patch b/patches/server/Guard-against-invalid-entity-positions.patch index 05084a5ca6..b4c9556cbb 100644 --- a/patches/server/Guard-against-invalid-entity-positions.patch +++ b/patches/server/Guard-against-invalid-entity-positions.patch @@ -41,5 +41,5 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000 + } + // Paper end - block invalid positions // Paper end - if (this.position.x != x || this.position.y != y || this.position.z != z) { - synchronized (this.posLock) { // Paper + // Paper start - fix MC-4 + if (this instanceof ItemEntity) { diff --git a/patches/server/MC-4-Fix-item-position-desync.patch b/patches/server/MC-4-Fix-item-position-desync.patch new file mode 100644 index 0000000000..356baf31c2 --- /dev/null +++ b/patches/server/MC-4-Fix-item-position-desync.patch @@ -0,0 +1,49 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: BillyGalbreath +Date: Tue, 8 Dec 2020 20:24:52 -0600 +Subject: [PATCH] MC-4: Fix item position desync + +This fixes item position desync (MC-4) by running the item coordinates +through the encode/decode methods of the packet that causes the precision +loss, which forces the server to lose the same precision as the client +keeping them in sync. + +diff --git a/src/main/java/net/minecraft/network/protocol/game/VecDeltaCodec.java b/src/main/java/net/minecraft/network/protocol/game/VecDeltaCodec.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/net/minecraft/network/protocol/game/VecDeltaCodec.java ++++ b/src/main/java/net/minecraft/network/protocol/game/VecDeltaCodec.java +@@ -0,0 +0,0 @@ public class VecDeltaCodec { + public Vec3 base = Vec3.ZERO; // Paper + + private static long encode(double value) { +- return Mth.lfloor(value * 4096.0D); ++ return Mth.lfloor(value * 4096.0D); // Paper - check ItemEntity#setPosRaw on update + } + + private static double decode(long value) { +- return (double)value / 4096.0D; ++ return (double)value / 4096.0D; // Paper - check ItemEntity#setPosRaw on update + } + + public Vec3 decode(long x, long y, long z) { +diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java +index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/net/minecraft/world/entity/Entity.java ++++ b/src/main/java/net/minecraft/world/entity/Entity.java +@@ -0,0 +0,0 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource { + } + public final void setPosRaw(double x, double y, double z, boolean forceBoundingBoxUpdate) { + // Paper end ++ // Paper start - fix MC-4 ++ if (this instanceof ItemEntity) { ++ if (io.papermc.paper.configuration.GlobalConfiguration.get().misc.fixEntityPositionDesync) { ++ // encode/decode from PacketPlayOutEntity ++ x = Mth.lfloor(x * 4096.0D) * (1 / 4096.0D); ++ y = Mth.lfloor(y * 4096.0D) * (1 / 4096.0D); ++ z = Mth.lfloor(z * 4096.0D) * (1 / 4096.0D); ++ } ++ } ++ // Paper end - fix MC-4 + if (this.position.x != x || this.position.y != y || this.position.z != z) { + this.position = new Vec3(x, y, z); + int i = Mth.floor(x);