From ea10fa4a7958eb904b4c8f9bfd9f33f0a89013c6 Mon Sep 17 00:00:00 2001 From: Owen <23108066+Owen1212055@users.noreply.github.com> Date: Wed, 25 Jun 2025 15:51:26 -0400 Subject: [PATCH] Don't mutate the position of Items for MC-4 Fix (#12702) --- .../protocol/game/VecDeltaCodec.java.patch | 13 +------------ .../net/minecraft/world/entity/Entity.java.patch | 12 +----------- .../world/entity/item/ItemEntity.java.patch | 15 +++++++++++++++ .../paper/configuration/GlobalConfiguration.java | 2 +- .../configuration/RemovedConfigurations.java | 1 + 5 files changed, 19 insertions(+), 24 deletions(-) diff --git a/paper-server/patches/sources/net/minecraft/network/protocol/game/VecDeltaCodec.java.patch b/paper-server/patches/sources/net/minecraft/network/protocol/game/VecDeltaCodec.java.patch index 2f0544231c..fff6b8efc4 100644 --- a/paper-server/patches/sources/net/minecraft/network/protocol/game/VecDeltaCodec.java.patch +++ b/paper-server/patches/sources/net/minecraft/network/protocol/game/VecDeltaCodec.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/network/protocol/game/VecDeltaCodec.java +++ b/net/minecraft/network/protocol/game/VecDeltaCodec.java -@@ -5,16 +_,16 @@ +@@ -5,7 +_,7 @@ public class VecDeltaCodec { private static final double TRUNCATION_STEPS = 4096.0; @@ -9,14 +9,3 @@ @VisibleForTesting static long encode(double value) { -- return Math.round(value * 4096.0); -+ return Math.round(value * 4096.0); // Paper - Fix MC-4; diff on change - } - - @VisibleForTesting - static double decode(long value) { -- return value / 4096.0; -+ return value / 4096.0; // Paper - Fix MC-4; diff on change - } - - public Vec3 decode(long x, long y, long z) { diff --git a/paper-server/patches/sources/net/minecraft/world/entity/Entity.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/Entity.java.patch index a5c67c10ec..6bf39741d4 100644 --- a/paper-server/patches/sources/net/minecraft/world/entity/Entity.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/entity/Entity.java.patch @@ -1786,7 +1786,7 @@ } public void addDeltaMovement(Vec3 addend) { -@@ -3661,9 +_,45 @@ +@@ -3661,9 +_,35 @@ return this.getZ((2.0 * this.random.nextDouble() - 1.0) * scale); } @@ -1815,16 +1815,6 @@ + return; + } + // Paper end - Block invalid positions and bounding box -+ // Paper start - Fix MC-4 -+ if (this instanceof ItemEntity) { -+ if (io.papermc.paper.configuration.GlobalConfiguration.get().misc.fixEntityPositionDesync) { -+ // encode/decode from VecDeltaCodec todo computation changed? -+ x = Mth.lfloor(x * 4096.0) * (1 / 4096.0); -+ y = Mth.lfloor(y * 4096.0) * (1 / 4096.0); -+ z = Mth.lfloor(z * 4096.0) * (1 / 4096.0); -+ } -+ } -+ // Paper end - Fix MC-4 if (this.position.x != x || this.position.y != y || this.position.z != z) { + synchronized (this.posLock) { // Paper - detailed watchdog information this.position = new Vec3(x, y, z); diff --git a/paper-server/patches/sources/net/minecraft/world/entity/item/ItemEntity.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/item/ItemEntity.java.patch index f3eb513394..f48b45fe50 100644 --- a/paper-server/patches/sources/net/minecraft/world/entity/item/ItemEntity.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/entity/item/ItemEntity.java.patch @@ -24,6 +24,21 @@ } public ItemEntity(Level level, double posX, double posY, double posZ, ItemStack itemStack, double deltaX, double deltaY, double deltaZ) { +@@ -79,6 +_,14 @@ + this.bobOffs = other.bobOffs; + } + ++ // Paper start - Require item entities to send their location precisely (Fixes MC-4) ++ { ++ if (io.papermc.paper.configuration.GlobalConfiguration.get().misc.sendFullPosForItemEntities) { ++ this.setRequiresPrecisePosition(true); ++ } ++ } ++ // Paper end - Require item entities to send their location precisely (Fixes MC-4) ++ + @Override + public boolean dampensVibrations() { + return this.getItem().is(ItemTags.DAMPENS_VIBRATIONS); @@ -116,7 +_,7 @@ @Override public void tick() { diff --git a/paper-server/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java b/paper-server/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java index c2b53adb5f..17247f1774 100644 --- a/paper-server/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java +++ b/paper-server/src/main/java/io/papermc/paper/configuration/GlobalConfiguration.java @@ -343,7 +343,7 @@ public class GlobalConfiguration extends ConfigurationPart { } } public int maxJoinsPerTick = 5; - public boolean fixEntityPositionDesync = true; + public boolean sendFullPosForItemEntities = false; public boolean loadPermissionsYmlBeforePlugins = true; @Constraints.Min(4) public int regionFileCacheSize = 256; diff --git a/paper-server/src/main/java/io/papermc/paper/configuration/RemovedConfigurations.java b/paper-server/src/main/java/io/papermc/paper/configuration/RemovedConfigurations.java index 7e4b27a6ef..2ea4219543 100644 --- a/paper-server/src/main/java/io/papermc/paper/configuration/RemovedConfigurations.java +++ b/paper-server/src/main/java/io/papermc/paper/configuration/RemovedConfigurations.java @@ -82,6 +82,7 @@ interface RemovedConfigurations { path("unsupported-settings", "allow-grindstone-overstacking"), path("unsupported-settings", "allow-tripwire-disarming-exploits"), path("commands", "fix-target-selector-tag-completion"), + path("misc", "fix-entity-position-desync") }; }