mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-21 05:55:08 +01:00
98 lines
6.9 KiB
Diff
98 lines
6.9 KiB
Diff
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
|
|
index eab19d5ac362c4779e91fad0ede3e4c26f29ab01..0d7dae5fa79cd302d73d1be51d8bf908a816c4ca 100644
|
|
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
@@ -680,7 +680,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 3860265a50b62fbd36c9e1b32680c3b62d5342a6..e93f8a9eefc082d66d0e1804c98d0df7db914cd8 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;
|
|
}
|
|
@@ -1967,6 +1968,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 0aa3fd9dce0cf90b1f74551c864e9ebf326eb1f3..e979681142bd08aeb00a98b79789a8f41b2a37af 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();
|