aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/unapplied/server/0402-Fix-Entity-Teleportation-and-cancel-velocity-if-tele.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/unapplied/server/0402-Fix-Entity-Teleportation-and-cancel-velocity-if-tele.patch')
-rw-r--r--patches/unapplied/server/0402-Fix-Entity-Teleportation-and-cancel-velocity-if-tele.patch98
1 files changed, 98 insertions, 0 deletions
diff --git a/patches/unapplied/server/0402-Fix-Entity-Teleportation-and-cancel-velocity-if-tele.patch b/patches/unapplied/server/0402-Fix-Entity-Teleportation-and-cancel-velocity-if-tele.patch
new file mode 100644
index 0000000000..4ced839378
--- /dev/null
+++ b/patches/unapplied/server/0402-Fix-Entity-Teleportation-and-cancel-velocity-if-tele.patch
@@ -0,0 +1,98 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Aikar <[email protected]>
+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
+index 00ce20359f6d73acf3f1016806e5f4f3b6d01bcd..1754e413dc1b7a18b3fc0b981eae11283b2106e5 100644
+--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+@@ -685,7 +685,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
+ return;
+ }
+
+- this.player.absMoveTo(this.awaitingPositionFromClient.x, this.awaitingPositionFromClient.y, this.awaitingPositionFromClient.z, this.player.getYRot(), this.player.getXRot());
++ this.player.moveTo(this.awaitingPositionFromClient.x, this.awaitingPositionFromClient.y, this.awaitingPositionFromClient.z, this.player.getYRot(), this.player.getXRot()); // Paper - Fix Entity Teleportation and cancel velocity if teleported
+ this.lastGoodX = this.awaitingPositionFromClient.x;
+ this.lastGoodY = this.awaitingPositionFromClient.y;
+ this.lastGoodZ = this.awaitingPositionFromClient.z;
+diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
+index 9833c1876a6fdce15326f10ff9a44ab3587eaf32..e56ee4ee930bb788fb7b0e254798308571802ab4 100644
+--- a/src/main/java/net/minecraft/world/entity/Entity.java
++++ b/src/main/java/net/minecraft/world/entity/Entity.java
+@@ -180,6 +180,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
+
+ // CraftBukkit start
+ private static final int CURRENT_LEVEL = 2;
++ public boolean preserveMotion = true; // Paper - Fix Entity Teleportation and cancel velocity if teleported; keep initial motion on first setPositionRotation
+ static boolean isLevelAtLeast(CompoundTag tag, int level) {
+ return tag.contains("Bukkit.updateLevel") && tag.getInt("Bukkit.updateLevel") >= level;
+ }
+@@ -1944,6 +1945,13 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
+ }
+
+ public void moveTo(double x, double y, double z, float yaw, float pitch) {
++ // Paper start - Fix Entity Teleportation and cancel velocity if teleported
++ if (!preserveMotion) {
++ this.deltaMovement = Vec3.ZERO;
++ } else {
++ this.preserveMotion = false;
++ }
++ // Paper end - Fix Entity Teleportation and cancel velocity if teleported
+ this.setPosRaw(x, y, z);
+ this.setYRot(yaw);
+ this.setXRot(pitch);
+diff --git a/src/main/java/net/minecraft/world/entity/boss/enderdragon/phases/DragonStrafePlayerPhase.java b/src/main/java/net/minecraft/world/entity/boss/enderdragon/phases/DragonStrafePlayerPhase.java
+index 2db75673e525708d04bda9f6c9af80e7f8d361e6..be2b5f56f6f29c82c4fa9df33287d0ddb589f383 100644
+--- a/src/main/java/net/minecraft/world/entity/boss/enderdragon/phases/DragonStrafePlayerPhase.java
++++ b/src/main/java/net/minecraft/world/entity/boss/enderdragon/phases/DragonStrafePlayerPhase.java
+@@ -79,6 +79,7 @@ public class DragonStrafePlayerPhase extends AbstractDragonPhaseInstance {
+ }
+
+ DragonFireball dragonFireball = new DragonFireball(world, this.dragon, vec34.normalize());
++ dragonFireball.preserveMotion = true; // Paper - Fix Entity Teleportation and cancel velocity if teleported
+ dragonFireball.moveTo(o, p, q, 0.0F, 0.0F);
+ if (new com.destroystokyo.paper.event.entity.EnderDragonShootFireballEvent((org.bukkit.entity.EnderDragon) dragon.getBukkitEntity(), (org.bukkit.entity.DragonFireball) dragonFireball.getBukkitEntity()).callEvent()) // Paper - EnderDragon Events
+ world.addFreshEntity(dragonFireball);
+diff --git a/src/main/java/net/minecraft/world/level/BaseSpawner.java b/src/main/java/net/minecraft/world/level/BaseSpawner.java
+index 56dbe701a93eb9f1309bec92e5d3b310860a4dc5..1b6ec72f59504d2f420d6d5dcbed4d3b9115e3d8 100644
+--- a/src/main/java/net/minecraft/world/level/BaseSpawner.java
++++ b/src/main/java/net/minecraft/world/level/BaseSpawner.java
+@@ -164,6 +164,7 @@ public abstract class BaseSpawner {
+ return;
+ }
+
++ entity.preserveMotion = true; // Paper - Fix Entity Teleportation and cancel velocity if teleported; preserve entity motion from tag
+ entity.moveTo(entity.getX(), entity.getY(), entity.getZ(), randomsource.nextFloat() * 360.0F, 0.0F);
+ if (entity instanceof Mob) {
+ Mob entityinsentient = (Mob) entity;
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
+index ec122fa4e443290ff973797740172e07f8e736ca..609c768ba4d22e346acbc9422ce41e3b887fadb1 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
+@@ -241,7 +241,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
+ }
+
+ // entity.setLocation() throws no event, and so cannot be cancelled
+- this.entity.absMoveTo(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
++ entity.moveTo(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); // Paper - use proper moveTo, as per vanilla teleporting
+ // SPIGOT-619: Force sync head rotation also
+ this.entity.setYHeadRot(location.getYaw());
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
+index 5beee554567d36f2a3b871cf6ec3ecb3d2353592..db15382f35464de43a2fe0a41aca070a8c834777 100644
+--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java
+@@ -603,6 +603,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {
+ }
+
+ ((AbstractHurtingProjectile) launch).projectileSource = this;
++ launch.preserveMotion = true; // Paper - Fix Entity Teleportation and cancel velocity if teleported
+ launch.moveTo(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
+ } else if (LlamaSpit.class.isAssignableFrom(projectile)) {
+ Location location = this.getEyeLocation();