PaperMC/Spigot-Server-Patches/0616-MC-4-Fix-item-position-desync.patch
Shane Freeder e886d8118e
Updated Upstream ()
Upstream has released updates that appear to apply and compile correctly.
This update has not been tested by PaperMC and as with ANY update, please do your own testing
2021-02-06 00:00:18 +00:00

84 lines
4.2 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: BillyGalbreath <blake.galbreath@gmail.com>
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/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java
index 6a9f41eafcd48ff029f027eeebfc0dc956564d2c..673c40d952bae6ae9e92aac9742e58ffb6a8b1bb 100644
--- a/src/main/java/com/destroystokyo/paper/PaperConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java
@@ -469,4 +469,9 @@ public class PaperConfig {
private static void trackPluginScoreboards() {
trackPluginScoreboards = getBoolean("settings.track-plugin-scoreboards", false);
}
+
+ public static boolean fixEntityPositionDesync = true;
+ private static void fixEntityPositionDesync() {
+ fixEntityPositionDesync = getBoolean("settings.fix-entity-position-desync", fixEntityPositionDesync);
+ }
}
diff --git a/src/main/java/net/minecraft/server/EntityItem.java b/src/main/java/net/minecraft/server/EntityItem.java
index ba73d14437cfdf07ef0f1f6266131c113c2741fd..f41aaa7623c052b9f4044898d1bdee898c03057a 100644
--- a/src/main/java/net/minecraft/server/EntityItem.java
+++ b/src/main/java/net/minecraft/server/EntityItem.java
@@ -523,4 +523,16 @@ public class EntityItem extends Entity {
public Packet<?> P() {
return new PacketPlayOutSpawnEntity(this);
}
+
+ // Paper start - fix MC-4
+ public void setPositionRaw(double x, double y, double z) {
+ if (com.destroystokyo.paper.PaperConfig.fixEntityPositionDesync) {
+ // encode/decode from PacketPlayOutEntity
+ x = MathHelper.floorLong(x * 4096.0D) * (1 / 4096.0D);
+ y = MathHelper.floorLong(y * 4096.0D) * (1 / 4096.0D);
+ z = MathHelper.floorLong(z * 4096.0D) * (1 / 4096.0D);
+ }
+ super.setPositionRaw(x, y, z);
+ }
+ // Paper end - fix MC-4
}
diff --git a/src/main/java/net/minecraft/server/MathHelper.java b/src/main/java/net/minecraft/server/MathHelper.java
index 1731a1bca5ad02fd8cd8701f49c10cb74ee6f503..2e7721a650c5a351b3584665bd236f92ef577761 100644
--- a/src/main/java/net/minecraft/server/MathHelper.java
+++ b/src/main/java/net/minecraft/server/MathHelper.java
@@ -7,7 +7,7 @@ import java.util.function.IntPredicate;
public class MathHelper {
public static final float a = c(2.0F);
- private static final float[] b = (float[]) SystemUtils.a((Object) (new float[65536]), (afloat) -> {
+ private static final float[] b = (float[]) SystemUtils.a((new float[65536]), (afloat) -> { // Paper - decompile error
for (int i = 0; i < afloat.length; ++i) {
afloat[i] = (float) Math.sin((double) i * 3.141592653589793D * 2.0D / 65536.0D);
}
@@ -47,6 +47,7 @@ public class MathHelper {
return d0 < (double) i ? i - 1 : i;
}
+ public static long floorLong(double d0) { return d(d0); } // Paper - OBFHELPER
public static long d(double d0) {
long i = (long) d0;
diff --git a/src/main/java/net/minecraft/server/PacketPlayOutEntity.java b/src/main/java/net/minecraft/server/PacketPlayOutEntity.java
index e5da2b19c1177ba7f88f0aaad9d810bb313ce67b..8e48407fd405ac4c3eece7762b8155c5d0f00fa0 100644
--- a/src/main/java/net/minecraft/server/PacketPlayOutEntity.java
+++ b/src/main/java/net/minecraft/server/PacketPlayOutEntity.java
@@ -15,11 +15,11 @@ public class PacketPlayOutEntity implements Packet<PacketListenerPlayOut> {
protected boolean i;
public static long a(double d0) {
- return MathHelper.d(d0 * 4096.0D);
+ return MathHelper.d(d0 * 4096.0D); // Paper - check EntityItem#setPositionRaw on update
}
public static Vec3D a(long i, long j, long k) {
- return (new Vec3D((double) i, (double) j, (double) k)).a(2.44140625E-4D);
+ return (new Vec3D((double) i, (double) j, (double) k)).a(2.44140625E-4D); // Paper - check EntityItem#setPositionRaw on update
}
public PacketPlayOutEntity() {}