diff --git a/CraftBukkit-Patches/0022-Compensate-for-allow-nether-allow-end-as-false-BUKKI.patch b/CraftBukkit-Patches/0022-Compensate-for-allow-nether-allow-end-as-false-BUKKI.patch new file mode 100644 index 000000000..d10c56a83 --- /dev/null +++ b/CraftBukkit-Patches/0022-Compensate-for-allow-nether-allow-end-as-false-BUKKI.patch @@ -0,0 +1,104 @@ +From d40e8631364a7e9590fe14a906816350123d9e49 Mon Sep 17 00:00:00 2001 +From: EdGruberman +Date: Sun, 20 Jan 2013 23:13:04 -0700 +Subject: [PATCH] Compensate for allow-nether/allow-end as false; BUKKIT-3466 + +When either of those settings are false, the worlds are not loaded and +therefore will not be targeted for portal exits. Existing worlds are +iterated directly to avoid defaulting to the first world if a direct +dimension match is not found. + +Plugins must also specify exit from custom Bukkit worlds to comply with +original commit: https://github.com/Bukkit/CraftBukkit/commit/2dc2af0 + +This commit introduces a constant to clarify the dependency on the +CraftBukkit implementation of custom worlds having a dimension offset. +--- + src/main/java/net/minecraft/server/PlayerList.java | 34 ++++++++++++++++------ + .../java/org/bukkit/craftbukkit/CraftServer.java | 2 +- + .../java/org/bukkit/craftbukkit/CraftWorld.java | 2 ++ + 3 files changed, 28 insertions(+), 10 deletions(-) + +diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java +index ced8cf0..642a4d9 100644 +--- a/src/main/java/net/minecraft/server/PlayerList.java ++++ b/src/main/java/net/minecraft/server/PlayerList.java +@@ -424,24 +424,40 @@ 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); ++ 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; ++ } ++ } ++ } ++ + 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); ++ 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 = (TravelAgent) ((CraftWorld) exit.getWorld()).getHandle().s(); ++ 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(); ++ ++ if (event.useTravelAgent() && event.getPortalTravelAgent() != null) { ++ exit = event.getPortalTravelAgent().findOrCreate(exit); ++ } else { ++ exit = event.getTo(); ++ } + exitWorld = ((CraftWorld) exit.getWorld()).getHandle(); + + Vector velocity = entityplayer.getBukkitEntity().getVelocity(); +diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java +index 4a75fb1..6962e5c 100644 +--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java ++++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java +@@ -740,7 +740,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 4861609..21bd64a 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(); +-- +1.8.1-rc2 +