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 e3c9327de894..f5e40f2200cb 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 @@ -1317,7 +1317,19 @@ protected boolean teleport0(Location location, org.bukkit.event.player.PlayerTel return false; } - return super.teleport0(location, cause, flags); + Entity camera = this.getHandle().getCamera(); + this.getHandle().setCamera(null); + if (this.getHandle() != this.getHandle().getCamera()) { + // If the camera is not the player after setting, the stop spectating event was likely cancelled, so stop the teleport + return false; + } + + boolean teleported = super.teleport0(location, cause, flags); + if (!teleported) { + // If the teleport doesn't go through, restore the original camera + this.getHandle().setCamera(camera); + } + return teleported; } @Override