Add @EddGruberman's patch to fix nether portals when the nether is disabled.

This commit is contained in:
md_5 2013-01-22 09:58:57 +11:00
parent 43dc376b03
commit 205b31cfa2
1 changed files with 104 additions and 0 deletions

View File

@ -0,0 +1,104 @@
From d40e8631364a7e9590fe14a906816350123d9e49 Mon Sep 17 00:00:00 2001
From: EdGruberman <ed@rjump.com>
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