2021-06-11 14:02:28 +02:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
2022-09-26 10:02:51 +02:00
|
|
|
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
|
2021-06-11 14:02:28 +02:00
|
|
|
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
|
2024-02-05 12:31:51 +01:00
|
|
|
index e87ffaed1be9e849ea98bde8622a0a0a4645c435..43e94e1dcf3e4c6c45cba2c7d75ac938938514b2 100644
|
2021-06-11 14:02:28 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
2024-02-01 10:15:57 +01:00
|
|
|
@@ -472,9 +472,9 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
2023-12-28 21:47:57 +01:00
|
|
|
float prevYaw = this.player.getYRot();
|
|
|
|
float prevPitch = this.player.getXRot();
|
|
|
|
// CraftBukkit end
|
2021-06-11 14:02:28 +02:00
|
|
|
- double d0 = entity.getX();
|
|
|
|
- double d1 = entity.getY();
|
|
|
|
- double d2 = entity.getZ();
|
2021-06-14 18:58:00 +02:00
|
|
|
+ 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
|
2022-03-14 20:28:02 +01:00
|
|
|
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
|
2024-02-01 10:15:57 +01:00
|
|
|
@@ -484,7 +484,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
2021-06-11 14:02:28 +02:00
|
|
|
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);
|
2021-08-26 04:16:27 +02:00
|
|
|
+ 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
|
2021-06-11 14:02:28 +02:00
|
|
|
|
|
|
|
// CraftBukkit start - handle custom speeds and skipped ticks
|
2021-08-26 04:16:27 +02:00
|
|
|
this.allowedPlayerTicks += (System.currentTimeMillis() / 50) - this.lastTick;
|
2024-02-01 10:15:57 +01:00
|
|
|
@@ -530,9 +539,9 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
2021-08-26 04:16:27 +02:00
|
|
|
|
|
|
|
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
|
2022-03-01 06:43:03 +01:00
|
|
|
boolean flag1 = entity.verticalCollisionBelow;
|
2021-08-26 04:16:27 +02:00
|
|
|
|
2023-06-08 01:44:11 +02:00
|
|
|
if (entity instanceof LivingEntity) {
|
2024-02-05 12:31:51 +01:00
|
|
|
@@ -1272,7 +1281,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
2023-06-08 01:44:11 +02:00
|
|
|
double d7 = d1 - this.firstGoodY;
|
|
|
|
double d8 = d2 - this.firstGoodZ;
|
|
|
|
double d9 = this.player.getDeltaMovement().lengthSqr();
|
|
|
|
- double d10 = d6 * d6 + d7 * d7 + d8 * d8;
|
2021-06-11 14:02:28 +02:00
|
|
|
+ // Paper start - fix large move vectors killing the server
|
|
|
|
+ double currDeltaX = toX - prevX;
|
|
|
|
+ double currDeltaY = toY - prevY;
|
|
|
|
+ double currDeltaZ = toZ - prevZ;
|
2023-06-12 20:26:43 +02:00
|
|
|
+ double d10 = Math.max(d6 * d6 + d7 * d7 + d8 * d8, (currDeltaX * currDeltaX + currDeltaY * currDeltaY + currDeltaZ * currDeltaZ) - 1);
|
2021-08-26 04:16:27 +02:00
|
|
|
+ double otherFieldX = d0 - this.lastGoodX;
|
|
|
|
+ double otherFieldY = d1 - this.lastGoodY;
|
|
|
|
+ double otherFieldZ = d2 - this.lastGoodZ;
|
2023-06-08 01:44:11 +02:00
|
|
|
+ d10 = Math.max(d10, (otherFieldX * otherFieldX + otherFieldY * otherFieldY + otherFieldZ * otherFieldZ) - 1);
|
2021-06-11 14:02:28 +02:00
|
|
|
+ // Paper end - fix large move vectors killing the server
|
|
|
|
|
|
|
|
if (this.player.isSleeping()) {
|
2023-06-08 01:44:11 +02:00
|
|
|
if (d10 > 1.0D) {
|
2024-02-05 12:31:51 +01:00
|
|
|
@@ -1326,9 +1344,9 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
2021-08-26 04:16:27 +02:00
|
|
|
|
|
|
|
AABB axisalignedbb = this.player.getBoundingBox();
|
|
|
|
|
2023-06-08 01:44:11 +02:00
|
|
|
- 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 flag = d7 > 0.0D;
|
2021-08-26 04:16:27 +02:00
|
|
|
|
2023-06-08 01:44:11 +02:00
|
|
|
if (this.player.onGround() && !packet.isOnGround() && flag) {
|