diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java index e1d611ed38..dffa97fbe7 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java @@ -1750,10 +1750,20 @@ public abstract class Entity { MinecraftServer minecraftserver = MinecraftServer.getServer(); // CraftBukkit start - move logic into new function "teleportToLocation" // int j = this.dimension; - Location enter = this.getBukkitEntity().getLocation(); - Location exit = minecraftserver.getPlayerList().calculateTarget(enter, minecraftserver.getWorldServer(i)); + WorldServer exitWorld = null; + if (this.dimension < CraftWorld.CUSTOM_DIMENSION_OFFSET) { // plugins must specify exit from custom Bukkit worlds + // only target existing worlds (compensate for allow-nether/allow-end as false) + for (WorldServer world : minecraftserver.worlds) { + if (world.dimension == i) { + exitWorld = world; + } + } + } - TravelAgent agent = (TravelAgent) ((CraftWorld) exit.getWorld()).getHandle().s(); + Location enter = this.getBukkitEntity().getLocation(); + Location exit = exitWorld != null ? minecraftserver.getPlayerList().calculateTarget(enter, minecraftserver.getWorldServer(i)) : null; + + TravelAgent agent = exit != null ? (TravelAgent) ((CraftWorld) exit.getWorld()).getHandle().s() : null; EntityPortalEvent event = new EntityPortalEvent(this.getBukkitEntity(), enter, exit, agent); event.getEntity().getServer().getPluginManager().callEvent(event); if (event.isCancelled() || event.getTo() == null || !this.isAlive()) { diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java index 2fb83cf6cc..f669a00b05 100644 --- a/src/main/java/net/minecraft/server/PlayerList.java +++ b/src/main/java/net/minecraft/server/PlayerList.java @@ -424,23 +424,35 @@ public abstract class PlayerList { // CraftBukkit start - Replaced the standard handling of portals with a more customised method. public void changeDimension(EntityPlayer entityplayer, int i, TeleportCause cause) { - WorldServer exitWorld = this.server.getWorldServer(i); - Location enter = entityplayer.getBukkitEntity().getLocation(); - Location exit = null; - if ((cause == TeleportCause.END_PORTAL) && (i == 0)) { - // THE_END -> NORMAL; use bed if available - exit = ((CraftPlayer) entityplayer.getBukkitEntity()).getBedSpawnLocation(); - } - if (exit == null) { - exit = this.calculateTarget(enter, exitWorld); + WorldServer exitWorld = null; + if (entityplayer.dimension < CraftWorld.CUSTOM_DIMENSION_OFFSET) { // plugins must specify exit from custom Bukkit worlds + // only target existing worlds (compensate for allow-nether/allow-end as false) + for (WorldServer world : this.server.worlds) { + if (world.dimension == i) { + exitWorld = world; + } + } } - TravelAgent agent = (TravelAgent) ((CraftWorld) exit.getWorld()).getHandle().s(); + Location enter = entityplayer.getBukkitEntity().getLocation(); + Location exit = null; + if (exitWorld != null) { + if ((cause == TeleportCause.END_PORTAL) && (i == 0)) { + // THE_END -> NORMAL; use bed if available + exit = ((CraftPlayer) entityplayer.getBukkitEntity()).getBedSpawnLocation(); + } + if (exit == null) { + exit = this.calculateTarget(enter, exitWorld); + } + } + + TravelAgent agent = exit != null ? (TravelAgent) ((CraftWorld) exit.getWorld()).getHandle().s() : null; PlayerPortalEvent event = new PlayerPortalEvent(entityplayer.getBukkitEntity(), enter, exit, agent, cause); Bukkit.getServer().getPluginManager().callEvent(event); if (event.isCancelled() || event.getTo() == null) { return; } + exit = event.useTravelAgent() ? event.getPortalTravelAgent().findOrCreate(exit) : event.getTo(); exitWorld = ((CraftWorld) exit.getWorld()).getHandle(); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java index eecededea3..e7c0760fd4 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -694,7 +694,7 @@ public final class CraftServer implements Server { converter.convert(name, new ConvertProgressUpdater(console)); } - int dimension = 10 + console.worlds.size(); + int dimension = CraftWorld.CUSTOM_DIMENSION_OFFSET + console.worlds.size(); boolean used = false; do { for (WorldServer server : console.worlds) { diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index cb200667c4..6e364b1a82 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -49,6 +49,8 @@ import org.bukkit.plugin.messaging.StandardMessenger; import org.bukkit.craftbukkit.util.LongHash; public class CraftWorld implements World { + public static final int CUSTOM_DIMENSION_OFFSET = 10; + private final WorldServer world; private Environment environment; private final CraftServer server = (CraftServer) Bukkit.getServer();