2021-06-11 12:02:28 +00:00
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Aikar <aikar@aikar.co>
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/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
2022-06-17 07:00:17 +00:00
index 05c18c233c8400c2031f9d7b3e5ce230dd89a25f..df8e091e72901518ef21903bd3890988ea4a5645 100644
2021-06-11 12:02:28 +00:00
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
2022-06-09 11:55:33 +00:00
@@ -721,7 +721,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser
2022-06-08 06:06:17 +00:00
return;
}
2021-06-14 14:41:34 +00:00
- this.player.absMoveTo(this.awaitingPositionFromClient.x, this.awaitingPositionFromClient.y, this.awaitingPositionFromClient.z, this.player.getYRot(), this.player.getXRot());
2022-06-08 06:06:17 +00:00
+ this.player.moveTo(this.awaitingPositionFromClient.x, this.awaitingPositionFromClient.y, this.awaitingPositionFromClient.z, this.player.getYRot(), this.player.getXRot()); // Paper - use proper moveTo for teleportation
2021-06-11 12:02:28 +00:00
this.lastGoodX = this.awaitingPositionFromClient.x;
this.lastGoodY = this.awaitingPositionFromClient.y;
this.lastGoodZ = this.awaitingPositionFromClient.z;
2022-06-09 11:55:33 +00:00
@@ -1603,7 +1603,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser
2021-11-25 09:19:05 +00:00
// CraftBukkit end
this.awaitingTeleportTime = this.tickCount;
- this.player.absMoveTo(d0, d1, d2, f, f1);
2022-06-08 06:06:17 +00:00
+ this.player.moveTo(d0, d1, d2, f, f1); // Paper - use proper moveTo for teleportation
2021-11-25 09:19:05 +00:00
this.player.connection.send(new ClientboundPlayerPositionPacket(d0 - d3, d1 - d4, d2 - d5, f - f2, f1 - f3, set, this.awaitingTeleport, flag));
}
2021-06-11 12:02:28 +00:00
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
2022-07-04 14:38:06 +00:00
index c1bf81770f9d00f4e3ba5844260812bb4f6026ca..0618606ab87bf0745b667e3b59328bf78de503cf 100644
2021-06-11 12:02:28 +00:00
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
2022-07-04 14:38:06 +00:00
@@ -158,6 +158,7 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
2021-06-11 12:02:28 +00:00
// CraftBukkit start
private static final int CURRENT_LEVEL = 2;
+ public boolean preserveMotion = true; // Paper - keep initial motion on first setPositionRotation
static boolean isLevelAtLeast(CompoundTag tag, int level) {
return tag.contains("Bukkit.updateLevel") && tag.getInt("Bukkit.updateLevel") >= level;
}
2022-07-04 14:38:06 +00:00
@@ -1656,6 +1657,13 @@ public abstract class Entity implements Nameable, EntityAccess, CommandSource {
2021-06-11 12:02:28 +00:00
}
public void moveTo(double x, double y, double z, float yaw, float pitch) {
+ // Paper - cancel entity velocity if teleported
+ if (!preserveMotion) {
+ this.deltaMovement = Vec3.ZERO;
+ } else {
+ this.preserveMotion = false;
+ }
+ // Paper end
2021-06-14 14:41:34 +00:00
this.setPosRaw(x, y, z);
this.setYRot(yaw);
this.setXRot(pitch);
2021-06-11 12:02:28 +00:00
diff --git a/src/main/java/net/minecraft/world/level/BaseSpawner.java b/src/main/java/net/minecraft/world/level/BaseSpawner.java
2022-06-09 08:51:45 +00:00
index e3d8814cbad30da795632afddf8ebc87eff72106..ee619590aa49323059947fbaee9e88d61df99789 100644
2021-06-11 12:02:28 +00:00
--- a/src/main/java/net/minecraft/world/level/BaseSpawner.java
+++ b/src/main/java/net/minecraft/world/level/BaseSpawner.java
2022-06-08 06:06:17 +00:00
@@ -163,6 +163,7 @@ public abstract class BaseSpawner {
2021-06-14 14:41:34 +00:00
return;
}
2021-06-11 12:02:28 +00:00
2021-06-14 14:41:34 +00:00
+ entity.preserveMotion = true; // Paper - preserve entity motion from tag
2022-06-08 06:06:17 +00:00
entity.moveTo(entity.getX(), entity.getY(), entity.getZ(), randomsource.nextFloat() * 360.0F, 0.0F);
2021-06-14 14:41:34 +00:00
if (entity instanceof Mob) {
Mob entityinsentient = (Mob) entity;
2021-06-11 12:02:28 +00:00
diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
2022-07-04 14:38:06 +00:00
index c0a2cffadb762240ef8fcdec1bd1e49edd3b5c61..148cd01c88600042c557f21558acace8bfdfa1cf 100644
2021-06-11 12:02:28 +00:00
--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
2022-06-08 06:06:17 +00:00
@@ -590,7 +590,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
2021-06-11 12:02:28 +00:00
}
// entity.setLocation() throws no event, and so cannot be cancelled
2021-06-14 14:41:34 +00:00
- this.entity.absMoveTo(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
2022-06-08 06:06:17 +00:00
+ entity.moveTo(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); // Paper - use proper moveTo, as per vanilla teleporting
2021-06-11 12:02:28 +00:00
// SPIGOT-619: Force sync head rotation also
2021-06-14 14:41:34 +00:00
this.entity.setYHeadRot(location.getYaw());