From 8a8144d39ecf8d43839857ec8f7902d7b080af38 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sun, 7 Jul 2019 18:25:05 -0500 Subject: [PATCH] Teleport with vehicle/passenger --- .../craftbukkit/entity/CraftEntity.java | 20 +++++++++++++++++-- .../craftbukkit/entity/CraftPlayer.java | 4 +++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java index 15042943c9..9782c510aa 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -494,16 +494,32 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { Preconditions.checkArgument(location != null, "location"); location.checkFinite(); - if (entity.isVehicle() || entity.dead) { + if (entity.dead) { // Purpur return false; } + if (entity.getVehicle() != null) return entity.getVehicle().getBukkitEntity().teleport(location, cause); // Purpur + // If this entity is riding another entity, we must dismount before teleporting. entity.stopRiding(); // Let the server handle cross world teleports if (!location.getWorld().equals(getWorld())) { - entity.teleportTo(((CraftWorld) location.getWorld()).getHandle().getWorldProvider().getDimensionManager(), new BlockPosition(location.getX(), location.getY(), location.getZ())); + // Purpur start + net.minecraft.server.DimensionManager dimension = ((CraftWorld) location.getWorld()).getHandle().getWorldProvider().getDimensionManager(); + BlockPosition position = new BlockPosition(location.getX(), location.getY(), location.getZ()); + if(entity.isVehicle()) { + Entity passenger = entity.getPassengers().get(0); + entity.ejectPassengers(); + Entity newEntity = entity.teleportTo(dimension, position); + Entity newPassenger = passenger instanceof EntityPlayer ? server.getHandle().moveToWorld((EntityPlayer) passenger, dimension, true, location, true) : passenger.teleportTo(dimension, position); + if (newEntity != null && newPassenger != null) { + newPassenger.startRiding(newEntity); + } + } else { + entity.teleportTo(dimension, position); + } + // Purpur end return true; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index c94944dfe0..cd16edb418 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -752,10 +752,12 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return false; } - if (entity.isVehicle()) { + if (false && entity.isVehicle()) { // Purpur return false; } + if (entity.getVehicle() != null) return entity.getVehicle().getBukkitEntity().teleport(location, cause); // Purpur + // From = Players current Location Location from = this.getLocation(); // To = Players new Location if Teleport is Successful -- 2.20.1