summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEdGruberman <ed@rjump.com>2013-01-22 18:36:03 -0700
committerfeildmaster <admin@feildmaster.com>2013-01-23 20:11:01 -0600
commit9df87d339971b55cd8bf0bbfea2fdc031bd0bd4c (patch)
tree75e97c733c3555f9fb3b4ab873b3b5ac571d9ae7 /src
parent488e45b4ff8cb0f2811d78887fd6aa2ee0b3ebfb (diff)
downloadcraftbukkit-9df87d339971b55cd8bf0bbfea2fdc031bd0bd4c.tar
craftbukkit-9df87d339971b55cd8bf0bbfea2fdc031bd0bd4c.tar.gz
craftbukkit-9df87d339971b55cd8bf0bbfea2fdc031bd0bd4c.tar.lz
craftbukkit-9df87d339971b55cd8bf0bbfea2fdc031bd0bd4c.tar.xz
craftbukkit-9df87d339971b55cd8bf0bbfea2fdc031bd0bd4c.zip
Compensate for allow-nether/allow-end as false; Fixes 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.
Diffstat (limited to 'src')
-rw-r--r--src/main/java/net/minecraft/server/Entity.java14
-rw-r--r--src/main/java/net/minecraft/server/PlayerList.java28
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftServer.java2
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftWorld.java2
4 files changed, 35 insertions, 11 deletions
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
index e1d611ed..dffa97fb 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;
+ 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;
+ }
+ }
+ }
+
Location enter = this.getBukkitEntity().getLocation();
- Location exit = minecraftserver.getPlayerList().calculateTarget(enter, minecraftserver.getWorldServer(i));
+ Location exit = exitWorld != null ? minecraftserver.getPlayerList().calculateTarget(enter, minecraftserver.getWorldServer(i)) : null;
- TravelAgent agent = (TravelAgent) ((CraftWorld) exit.getWorld()).getHandle().s();
+ 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 2fb83cf6..f669a00b 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);
+ 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();
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 eecedede..e7c0760f 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 cb200667..6e364b1a 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();