SPIGOT-4900: Rearchitect multiworld support for better compat with new villager AI

By: md_5 <git@md-5.net>
This commit is contained in:
CraftBukkit/Spigot
2019-05-12 11:15:48 +10:00
parent 8b207fdf78
commit b407bebd8d
22 changed files with 208 additions and 227 deletions

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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