From 2f44d66966e7756428619453679fc6ad139485b9 Mon Sep 17 00:00:00 2001
From: CraftBukkit/Spigot <noreply+git-craftbukkit@papermc.io>
Date: Sun, 7 Jul 2013 21:52:41 -0600
Subject: [PATCH] Allow teleportation of entities on vehicles. Fixes
 BUKKIT-4210

Up until Minecraft version 1.5 it was not possible to teleport entities
within vehicles. With the 1.5 update came the change in the Minecraft
teleportation logic to dismount before teleporting the entity, if
applicable.

This commit ammends the existing CraftBukkit logic for rejecting
teleportation for entities in vehicles to permit the action. Due to this
change, CraftBukkit is now in-line with Minecraft 1.5 teleportation logic.

By: bendude56 <bendude56@gmail.com>
---
 .../main/java/org/bukkit/craftbukkit/entity/CraftEntity.java | 5 ++++-
 .../main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java | 5 ++++-
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
index fe0f2006e5..b8a9a14888 100644
--- a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
+++ b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java
@@ -201,10 +201,13 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
     }
 
     public boolean teleport(Location location, TeleportCause cause) {
-        if (entity.vehicle != null || entity.passenger != null || entity.dead) {
+        if (entity.passenger != null || entity.dead) {
             return false;
         }
 
+        // If this entity is riding another entity, we must dismount before teleporting.
+        entity.mount(null);
+
         entity.world = ((CraftWorld) location.getWorld()).getHandle();
         entity.setLocation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
         // entity.setLocation() throws no event, and so cannot be cancelled
diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
index 9760f8f95d..bbf310b080 100644
--- a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
+++ b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java
@@ -458,7 +458,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
             return false;
         }
 
-        if (entity.vehicle != null || entity.passenger != null) {
+        if (entity.passenger != null) {
             return false;
         }
 
@@ -475,6 +475,9 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
             return false;
         }
 
+        // If this player is riding another entity, we must dismount before teleporting.
+        entity.mount(null);
+
         // Update the From Location
         from = event.getFrom();
         // Grab the new To Location dependent on whether the event was cancelled.