From 43e5174a0157c04709f8132ab3711237d76d0954 Mon Sep 17 00:00:00 2001 From: Daniel Ennis Date: Thu, 3 Sep 2020 21:48:44 -0400 Subject: [PATCH] Fix Entity Teleportation and cancel velocity if teleported (#4210) --- ...ortation-and-cancel-velocity-if-tele.patch | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 Spigot-Server-Patches/0575-Fix-Entity-Teleportation-and-cancel-velocity-if-tele.patch diff --git a/Spigot-Server-Patches/0575-Fix-Entity-Teleportation-and-cancel-velocity-if-tele.patch b/Spigot-Server-Patches/0575-Fix-Entity-Teleportation-and-cancel-velocity-if-tele.patch new file mode 100644 index 0000000000..c2d6fa2748 --- /dev/null +++ b/Spigot-Server-Patches/0575-Fix-Entity-Teleportation-and-cancel-velocity-if-tele.patch @@ -0,0 +1,57 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Tue, 25 Aug 2020 20:45:36 -0400 +Subject: [PATCH] Fix Entity Teleportation and cancel velocity if teleported + +Uses correct setPositionRotation for Entity teleporting instead of setLocation +as this is how Vanilla teleports entities. + +Cancel any pending motion when teleported. + +diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java +index 45e7e30892d031df42ae72de28ba4bbe8e1a6cd5..1ee01486f880992c2694f1dd637e9828b1d40c2d 100644 +--- a/src/main/java/net/minecraft/server/Entity.java ++++ b/src/main/java/net/minecraft/server/Entity.java +@@ -1318,6 +1318,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke + } + + public void setPositionRotation(double d0, double d1, double d2, float f, float f1) { ++ this.mot = new Vec3D(0, 0, 0); // Paper - cancel entity velocity if teleported + this.g(d0, d1, d2); + this.yaw = f; + this.pitch = f1; +diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java +index e0c3eab9aef950d91920076990215d79d2b710c6..ba25a4b5baa2759a664dc80c259cd08baa3fbba3 100644 +--- a/src/main/java/net/minecraft/server/PlayerConnection.java ++++ b/src/main/java/net/minecraft/server/PlayerConnection.java +@@ -501,7 +501,7 @@ public class PlayerConnection implements PacketListenerPlayIn { + public void a(PacketPlayInTeleportAccept packetplayinteleportaccept) { + PlayerConnectionUtils.ensureMainThread(packetplayinteleportaccept, this, this.player.getWorldServer()); + if (packetplayinteleportaccept.b() == this.teleportAwait && this.teleportPos != null) { // CraftBukkit +- this.player.setLocation(this.teleportPos.x, this.teleportPos.y, this.teleportPos.z, this.player.yaw, this.player.pitch); ++ this.player.setPositionRotation(this.teleportPos.x, this.teleportPos.y, this.teleportPos.z, this.player.yaw, this.player.pitch); // Paper - use proper setPositionRotation for teleportation + this.o = this.teleportPos.x; + this.p = this.teleportPos.y; + this.q = this.teleportPos.z; +@@ -1302,7 +1302,7 @@ public class PlayerConnection implements PacketListenerPlayIn { + // CraftBukkit end + + this.A = this.e; +- this.player.setLocation(d0, d1, d2, f, f1); ++ this.player.setPositionRotation(d0, d1, d2, f, f1); // Paper - use proper setPositionRotation for teleportation + this.player.forceCheckHighPriority(); // Paper + this.player.playerConnection.sendPacket(new PacketPlayOutPosition(d0 - d3, d1 - d4, d2 - d5, f - f2, f1 - f3, set, this.teleportAwait)); + } +diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +index b1fdc5737d332c6210d57793468da1eda8f8b9d2..6ceb2d50c59b63a337364605f8a5280d905f2662 100644 +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +@@ -547,7 +547,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { + } + + // entity.setLocation() throws no event, and so cannot be cancelled +- entity.setLocation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); ++ entity.setPositionRotation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); // Paper - use proper setPosition, as per vanilla teleporting + // SPIGOT-619: Force sync head rotation also + entity.setHeadRotation(location.getYaw()); + ((net.minecraft.server.WorldServer) entity.world).chunkCheck(entity); // Spigot - register to new chunk