diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java index 4edecff60d..a786cc7cc2 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java @@ -910,7 +910,7 @@ public abstract class Entity { nbttagcompound.a("Air", (short) this.airTicks); nbttagcompound.a("OnGround", this.onGround); // CraftBukkit start - nbttagcompound.setString("World", this.world.worldData.name); + nbttagcompound.setLong("WorldUID", this.world.worldData.getWorldUID()); nbttagcompound.setLong("UUIDLeast", this.uniqueId.getLeastSignificantBits()); nbttagcompound.setLong("UUIDMost", this.uniqueId.getMostSignificantBits()); // CraftBukkit end @@ -982,17 +982,24 @@ public abstract class Entity { org.bukkit.Server server = Bukkit.getServer(); org.bukkit.World bworld = null; + // TODO: Remove World related checks, replaced with WorldUID. if (this instanceof EntityPlayer) { EntityPlayer entityPlayer = (EntityPlayer) this; String worldName = nbttagcompound.getString("World"); - if (worldName == "") { + if (nbttagcompound.hasKey("WorldUID")) { + bworld = server.getWorld(nbttagcompound.getLong("WorldUID")); + } else if ("".equals(worldName)) { bworld = ((org.bukkit.craftbukkit.CraftServer) server).getServer().getWorldServer(entityPlayer.dimension).getWorld(); } else { bworld = server.getWorld(worldName); } } else { - bworld = server.getWorld(nbttagcompound.getString("World")); + if (nbttagcompound.hasKey("WorldUID")) { + bworld = server.getWorld(nbttagcompound.getLong("WorldUID")); + } else { + bworld = server.getWorld(nbttagcompound.getString("World")); + } } this.spawnIn(bworld == null ? null : ((org.bukkit.craftbukkit.CraftWorld) bworld).getHandle()); diff --git a/src/main/java/net/minecraft/server/WorldData.java b/src/main/java/net/minecraft/server/WorldData.java index 3e8ef772b6..292cb56142 100644 --- a/src/main/java/net/minecraft/server/WorldData.java +++ b/src/main/java/net/minecraft/server/WorldData.java @@ -19,6 +19,7 @@ public class WorldData { private int m; private boolean n; private int o; + private long worldUID; // CraftBukkit public WorldData(NBTTagCompound nbttagcompound) { this.a = nbttagcompound.getLong("RandomSeed"); @@ -38,11 +39,20 @@ public class WorldData { this.h = nbttagcompound.k("Player"); this.i = this.h.e("Dimension"); } + // CraftBukkit start + if (nbttagcompound.hasKey("WorldUID")) { + this.worldUID = nbttagcompound.getLong("WorldUID"); + } else { + this.worldUID = (System.nanoTime() << 20) + this.a; + nbttagcompound.setLong("WorldUID", this.worldUID); + } + // CraftBukkit end } public WorldData(long i, String s) { this.a = i; this.name = s; + this.worldUID = (System.nanoTime() << 20) + this.a; // CraftBukkit } public WorldData(WorldData worlddata) { @@ -105,6 +115,7 @@ public class WorldData { if (nbttagcompound1 != null) { nbttagcompound.a("Player", nbttagcompound1); } + nbttagcompound.setLong("WorldUID", this.worldUID); // CraftBukkit } public long getSeed() { @@ -192,4 +203,10 @@ public class WorldData { public void setWeatherDuration(int i) { this.m = i; } + + // CraftBukkit start + public long getWorldUID() { + return this.worldUID; + } + // CraftBukkit end } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java index 3735635f39..915186e848 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -490,6 +490,16 @@ public final class CraftServer implements Server { return worlds.get(name.toLowerCase()); } + public World getWorld(long uid) { + for (String worldName : worlds.keySet()) { + org.bukkit.World world = worlds.get(worldName); + if (world.getUID() == uid) { + return world; + } + } + return null; + } + public void addWorld(World world) { worlds.put(world.getName().toLowerCase(), world); } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index b09e357e4c..fac24e3eec 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -395,10 +395,15 @@ public class CraftWorld implements World { return world.worldData.name; } + @Deprecated public long getId() { return world.worldData.getSeed(); } + public long getUID() { + return world.worldData.getWorldUID(); + } + @Override public String toString() { return "CraftWorld{name=" + getName() + '}';