SPIGOT-4900: Rearchitect multiworld support for better compat with new villager AI
By: md_5 <git@md-5.net>
This commit is contained in:
@@ -897,7 +897,7 @@ public final class CraftServer implements Server {
|
||||
boolean used = false;
|
||||
do {
|
||||
for (WorldServer server : console.getWorlds()) {
|
||||
used = server.dimension.getDimensionID() == dimension;
|
||||
used = server.getWorldProvider().getDimensionManager().getDimensionID() == dimension;
|
||||
if (used) {
|
||||
dimension++;
|
||||
break;
|
||||
@@ -923,7 +923,7 @@ public final class CraftServer implements Server {
|
||||
}
|
||||
|
||||
DimensionManager actualDimension = DimensionManager.a(creator.environment().getId());
|
||||
DimensionManager internalDimension = new DimensionManager(dimension, name, name, (w, manager) -> actualDimension.getWorldProvider(w), actualDimension.hasSkyLight());
|
||||
DimensionManager internalDimension = DimensionManager.a(name, new DimensionManager(dimension, name, name, (w, manager) -> actualDimension.g.apply(w, manager), actualDimension.hasSkyLight(), actualDimension));
|
||||
WorldServer internal = (WorldServer) new WorldServer(console, console.executorService, sdm, worlddata, internalDimension, console.getMethodProfiler(), getServer().worldLoadListenerFactory.create(11), creator.environment(), generator);
|
||||
|
||||
if (!(worlds.containsKey(name.toLowerCase(java.util.Locale.ENGLISH)))) {
|
||||
@@ -934,7 +934,7 @@ public final class CraftServer implements Server {
|
||||
|
||||
internal.worldData.setDifficulty(EnumDifficulty.EASY);
|
||||
internal.setSpawnFlags(true, true);
|
||||
console.worldServer.put(internal.dimension, internal);
|
||||
console.worldServer.put(internal.getWorldProvider().getDimensionManager(), internal);
|
||||
|
||||
pluginManager.callEvent(new WorldInitEvent(internal.getWorld()));
|
||||
|
||||
@@ -957,11 +957,11 @@ public final class CraftServer implements Server {
|
||||
|
||||
WorldServer handle = ((CraftWorld) world).getHandle();
|
||||
|
||||
if (!(console.worldServer.containsKey(handle.dimension))) {
|
||||
if (!(console.worldServer.containsKey(handle.getWorldProvider().getDimensionManager()))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (handle.dimension == DimensionManager.OVERWORLD) {
|
||||
if (handle.getWorldProvider().getDimensionManager() == DimensionManager.OVERWORLD) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -986,7 +986,7 @@ public final class CraftServer implements Server {
|
||||
}
|
||||
|
||||
worlds.remove(world.getName().toLowerCase(java.util.Locale.ENGLISH));
|
||||
console.worldServer.remove(handle.dimension);
|
||||
console.worldServer.remove(handle.getWorldProvider().getDimensionManager());
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -737,23 +737,6 @@ public class CraftWorld implements World {
|
||||
return environment;
|
||||
}
|
||||
|
||||
public void setEnvironment(Environment env) {
|
||||
if (environment != env) {
|
||||
environment = env;
|
||||
switch (env) {
|
||||
case NORMAL:
|
||||
world.worldProvider = new WorldProviderNormal(world, world.dimension);
|
||||
break;
|
||||
case NETHER:
|
||||
world.worldProvider = new WorldProviderHell(world, world.dimension);
|
||||
break;
|
||||
case THE_END:
|
||||
world.worldProvider = new WorldProviderTheEnd(world, world.dimension);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Block getBlockAt(Location location) {
|
||||
return getBlockAt(location.getBlockX(), location.getBlockY(), location.getBlockZ());
|
||||
@@ -1866,7 +1849,7 @@ public class CraftWorld implements World {
|
||||
double z = loc.getZ();
|
||||
|
||||
PacketPlayOutCustomSoundEffect packet = new PacketPlayOutCustomSoundEffect(new MinecraftKey(sound), SoundCategory.valueOf(category.name()), new Vec3D(x, y, z), volume, pitch);
|
||||
world.getMinecraftServer().getPlayerList().sendPacketNearby(null, x, y, z, volume > 1.0F ? 16.0F * volume : 16.0D, this.world.dimension, packet);
|
||||
world.getMinecraftServer().getPlayerList().sendPacketNearby(null, x, y, z, volume > 1.0F ? 16.0F * volume : 16.0D, this.world.getWorldProvider().getDimensionManager(), packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -465,7 +465,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity {
|
||||
|
||||
// Let the server handle cross world teleports
|
||||
if (!location.getWorld().equals(getWorld())) {
|
||||
entity.teleportTo(((CraftWorld) location.getWorld()).getHandle().dimension, new BlockPosition(location.getX(), location.getY(), location.getZ()));
|
||||
entity.teleportTo(((CraftWorld) location.getWorld()).getHandle().getWorldProvider().getDimensionManager(), new BlockPosition(location.getX(), location.getY(), location.getZ()));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -651,7 +651,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player {
|
||||
if (fromWorld == toWorld) {
|
||||
entity.playerConnection.teleport(to);
|
||||
} else {
|
||||
server.getHandle().moveToWorld(entity, toWorld.dimension, true, to, true);
|
||||
server.getHandle().moveToWorld(entity, toWorld.getWorldProvider().getDimensionManager(), true, to, true);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -198,7 +198,7 @@ public class CraftEventFactory {
|
||||
WorldServer worldServer = world.getHandle();
|
||||
int spawnSize = Bukkit.getServer().getSpawnRadius();
|
||||
|
||||
if (world.getHandle().dimension != DimensionManager.OVERWORLD) return true;
|
||||
if (world.getHandle().getWorldProvider().getDimensionManager() != DimensionManager.OVERWORLD) return true;
|
||||
if (spawnSize <= 0) return true;
|
||||
if (((CraftServer) Bukkit.getServer()).getHandle().getOPs().isEmpty()) return true;
|
||||
if (player.isOp()) return true;
|
||||
|
||||
@@ -69,7 +69,7 @@ public final class CraftMapView implements MapView {
|
||||
|
||||
@Override
|
||||
public void setWorld(World world) {
|
||||
worldMap.map = ((CraftWorld) world).getHandle().dimension;
|
||||
worldMap.map = ((CraftWorld) world).getHandle().getWorldProvider().getDimensionManager();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user