From cbecca26367fe22fe49d4bb1195dd94c9bd9126d Mon Sep 17 00:00:00 2001
From: Spottedleaf <spottedleaf@spottedleaf.dev>
Date: Sun, 11 Oct 2020 18:48:05 -0400
Subject: [PATCH] Fix for large move vectors crashing server

Check movement distance also based on current position.
---
 ...r-large-move-vectors-crashing-server.patch | 66 +++++++++++++++++++
 1 file changed, 66 insertions(+)
 create mode 100644 Spigot-Server-Patches/0587-Fix-for-large-move-vectors-crashing-server.patch

diff --git a/Spigot-Server-Patches/0587-Fix-for-large-move-vectors-crashing-server.patch b/Spigot-Server-Patches/0587-Fix-for-large-move-vectors-crashing-server.patch
new file mode 100644
index 000000000..3cb143473
--- /dev/null
+++ b/Spigot-Server-Patches/0587-Fix-for-large-move-vectors-crashing-server.patch
@@ -0,0 +1,66 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Spottedleaf <spottedleaf@spottedleaf.dev>
+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/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java
+index 05b3a7478195037927cd1a902b603862d9747e61..4b0ff3e1acd91e0f28af9a900a4868c5a3b76caa 100644
+--- a/src/main/java/net/minecraft/server/PlayerConnection.java
++++ b/src/main/java/net/minecraft/server/PlayerConnection.java
+@@ -326,19 +326,24 @@ public class PlayerConnection implements PacketListenerPlayIn {
+ 
+             if (entity != this.player && entity.getRidingPassenger() == this.player && entity == this.r) {
+                 WorldServer worldserver = this.player.getWorldServer();
+-                double d0 = entity.locX();
+-                double d1 = entity.locY();
+-                double d2 = entity.locZ();
+-                double d3 = packetplayinvehiclemove.getX();
+-                double d4 = packetplayinvehiclemove.getY();
+-                double d5 = packetplayinvehiclemove.getZ();
++                double d0 = entity.locX();double fromX = d0; // Paper - OBFHELPER
++                double d1 = entity.locY();double fromY = d1; // Paper - OBFHELPER
++                double d2 = entity.locZ();double fromZ = d2; // Paper - OBFHELPER
++                double d3 = packetplayinvehiclemove.getX();double toX = d3; // Paper - OBFHELPER
++                double d4 = packetplayinvehiclemove.getY();double toY = d4; // Paper - OBFHELPER
++                double d5 = packetplayinvehiclemove.getZ();double toZ = d5; // Paper - OBFHELPER
+                 float f = packetplayinvehiclemove.getYaw();
+                 float f1 = packetplayinvehiclemove.getPitch();
+                 double d6 = d3 - this.s;
+                 double d7 = d4 - this.t;
+                 double d8 = d5 - this.u;
+                 double d9 = entity.getMot().g();
+-                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);
++                // Paper end - fix large move vectors killing the server
+ 
+ 
+                 // CraftBukkit start - handle custom speeds and skipped ticks
+@@ -997,7 +1002,7 @@ public class PlayerConnection implements PacketListenerPlayIn {
+                         double d2 = this.player.locZ();
+                         double d3 = this.player.locY();
+                         double d4 = packetplayinflying.a(this.player.locX());double toX = d4; // Paper - OBFHELPER
+-                        double d5 = packetplayinflying.b(this.player.locY());
++                        double d5 = packetplayinflying.b(this.player.locY());double toY = d5; // Paper - OBFHELPER
+                         double d6 = packetplayinflying.c(this.player.locZ());double toZ = d6; // Paper - OBFHELPER
+                         float f = packetplayinflying.a(this.player.yaw);
+                         float f1 = packetplayinflying.b(this.player.pitch);
+@@ -1005,7 +1010,12 @@ public class PlayerConnection implements PacketListenerPlayIn {
+                         double d8 = d5 - this.m;
+                         double d9 = d6 - this.n;
+                         double d10 = this.player.getMot().g();
+-                        double d11 = d7 * d7 + d8 * d8 + d9 * d9;
++                        // Paper start - fix large move vectors killing the server
++                        double currDeltaX = toX - prevX;
++                        double currDeltaY = toY - prevY;
++                        double currDeltaZ = toZ - prevZ;
++                        double d11 = Math.max(d7 * d7 + d8 * d8 + d9 * d9, (currDeltaX * currDeltaX + currDeltaY * currDeltaY + currDeltaZ * currDeltaZ) - 1);
++                        // Paper end - fix large move vectors killing the server
+ 
+                         if (this.player.isSleeping()) {
+                             if (d11 > 1.0D) {