aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0421-Fix-for-large-move-vectors-crashing-server.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0421-Fix-for-large-move-vectors-crashing-server.patch')
-rw-r--r--patches/server/0421-Fix-for-large-move-vectors-crashing-server.patch86
1 files changed, 86 insertions, 0 deletions
diff --git a/patches/server/0421-Fix-for-large-move-vectors-crashing-server.patch b/patches/server/0421-Fix-for-large-move-vectors-crashing-server.patch
new file mode 100644
index 0000000000..4215392549
--- /dev/null
+++ b/patches/server/0421-Fix-for-large-move-vectors-crashing-server.patch
@@ -0,0 +1,86 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Spottedleaf <[email protected]>
+Date: Sun, 17 May 2020 23:47:33 -0700
+Subject: [PATCH] Fix for large move vectors crashing server
+
+Check movement distance also based on current position.
+
+diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+index ee552bc754010c0f64ae67848c1ed6038e7e3746..509cad3fe33a35ee22db173d84f7d8d35df4910c 100644
+--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+@@ -492,9 +492,9 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+ float prevYaw = this.player.getYRot();
+ float prevPitch = this.player.getXRot();
+ // CraftBukkit end
+- double d0 = entity.getX();
+- double d1 = entity.getY();
+- double d2 = entity.getZ();
++ double d0 = entity.getX();final double fromX = d0; // Paper - OBFHELPER
++ double d1 = entity.getY();final double fromY = d1; // Paper - OBFHELPER
++ double d2 = entity.getZ();final double fromZ = d2; // Paper - OBFHELPER
+ double d3 = ServerGamePacketListenerImpl.clampHorizontal(packet.getX()); final double toX = d3; // Paper - OBFHELPER
+ double d4 = ServerGamePacketListenerImpl.clampVertical(packet.getY()); final double toY = d4; // Paper - OBFHELPER
+ double d5 = ServerGamePacketListenerImpl.clampHorizontal(packet.getZ()); final double toZ = d5; // Paper - OBFHELPER
+@@ -504,7 +504,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+ double d7 = d4 - this.vehicleFirstGoodY;
+ double d8 = d5 - this.vehicleFirstGoodZ;
+ double d9 = entity.getDeltaMovement().lengthSqr();
+- double d10 = d6 * d6 + d7 * d7 + d8 * d8;
++ // Paper start - fix large move vectors killing the server
++ double currDeltaX = toX - fromX;
++ double currDeltaY = toY - fromY;
++ double currDeltaZ = toZ - fromZ;
++ double d10 = Math.max(d6 * d6 + d7 * d7 + d8 * d8, (currDeltaX * currDeltaX + currDeltaY * currDeltaY + currDeltaZ * currDeltaZ) - 1);
++ double otherFieldX = d3 - this.vehicleLastGoodX;
++ double otherFieldY = d4 - this.vehicleLastGoodY - 1.0E-6D;
++ double otherFieldZ = d5 - this.vehicleLastGoodZ;
++ d10 = Math.max(d10, (otherFieldX * otherFieldX + otherFieldY * otherFieldY + otherFieldZ * otherFieldZ) - 1);
++ // Paper end - fix large move vectors killing the server
+
+ // CraftBukkit start - handle custom speeds and skipped ticks
+ this.allowedPlayerTicks += (System.currentTimeMillis() / 50) - this.lastTick;
+@@ -550,9 +559,9 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+
+ boolean flag = worldserver.noCollision(entity, entity.getBoundingBox().deflate(0.0625D));
+
+- d6 = d3 - this.vehicleLastGoodX;
+- d7 = d4 - this.vehicleLastGoodY - 1.0E-6D;
+- d8 = d5 - this.vehicleLastGoodZ;
++ d6 = d3 - this.vehicleLastGoodX; // Paper - diff on change, used for checking large move vectors above
++ d7 = d4 - this.vehicleLastGoodY - 1.0E-6D; // Paper - diff on change, used for checking large move vectors above
++ d8 = d5 - this.vehicleLastGoodZ; // Paper - diff on change, used for checking large move vectors above
+ boolean flag1 = entity.verticalCollisionBelow;
+
+ if (entity instanceof LivingEntity) {
+@@ -1254,7 +1263,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+ double d7 = d1 - this.firstGoodY;
+ double d8 = d2 - this.firstGoodZ;
+ double d9 = this.player.getDeltaMovement().lengthSqr();
+- double d10 = d6 * d6 + d7 * d7 + d8 * d8;
++ // Paper start - fix large move vectors killing the server
++ double currDeltaX = toX - prevX;
++ double currDeltaY = toY - prevY;
++ double currDeltaZ = toZ - prevZ;
++ double d10 = Math.max(d6 * d6 + d7 * d7 + d8 * d8, (currDeltaX * currDeltaX + currDeltaY * currDeltaY + currDeltaZ * currDeltaZ) - 1);
++ double otherFieldX = d0 - this.lastGoodX;
++ double otherFieldY = d1 - this.lastGoodY;
++ double otherFieldZ = d2 - this.lastGoodZ;
++ d10 = Math.max(d10, (otherFieldX * otherFieldX + otherFieldY * otherFieldY + otherFieldZ * otherFieldZ) - 1);
++ // Paper end - fix large move vectors killing the server
+
+ if (this.player.isSleeping()) {
+ if (d10 > 1.0D) {
+@@ -1310,9 +1328,9 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+
+ AABB axisalignedbb = this.player.getBoundingBox();
+
+- d6 = d0 - this.lastGoodX;
+- d7 = d1 - this.lastGoodY;
+- d8 = d2 - this.lastGoodZ;
++ d6 = d0 - this.lastGoodX; // Paper - diff on change, used for checking large move vectors above
++ d7 = d1 - this.lastGoodY; // Paper - diff on change, used for checking large move vectors above
++ d8 = d2 - this.lastGoodZ; // Paper - diff on change, used for checking large move vectors above
+ boolean flag1 = d7 > 0.0D;
+
+ if (this.player.onGround() && !packet.isOnGround() && flag1) {