@@ -7,13 +7,13 @@ import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.Iterators;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.MapMaker;
|
||||
import com.google.gson.JsonElement;
|
||||
import com.google.gson.JsonParser;
|
||||
import com.mojang.authlib.GameProfile;
|
||||
import com.mojang.brigadier.StringReader;
|
||||
import com.mojang.brigadier.exceptions.CommandSyntaxException;
|
||||
import com.mojang.brigadier.tree.CommandNode;
|
||||
import com.mojang.brigadier.tree.LiteralCommandNode;
|
||||
import com.mojang.serialization.DynamicOps;
|
||||
import com.mojang.serialization.Lifecycle;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.buffer.ByteBufOutputStream;
|
||||
import io.netty.buffer.Unpooled;
|
||||
@@ -36,6 +36,9 @@ import java.util.LinkedHashMap;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Properties;
|
||||
import java.util.Random;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.function.Consumer;
|
||||
@@ -45,21 +48,30 @@ import javax.imageio.ImageIO;
|
||||
import jline.console.ConsoleReader;
|
||||
import net.minecraft.server.Advancement;
|
||||
import net.minecraft.server.ArgumentEntity;
|
||||
import net.minecraft.server.BiomeManager;
|
||||
import net.minecraft.server.Block;
|
||||
import net.minecraft.server.BlockPosition;
|
||||
import net.minecraft.server.BossBattleCustom;
|
||||
import net.minecraft.server.CommandDispatcher;
|
||||
import net.minecraft.server.CommandListenerWrapper;
|
||||
import net.minecraft.server.CommandReload;
|
||||
import net.minecraft.server.Convertable;
|
||||
import net.minecraft.server.DataConverterRegistry;
|
||||
import net.minecraft.server.DedicatedPlayerList;
|
||||
import net.minecraft.server.DedicatedServer;
|
||||
import net.minecraft.server.DedicatedServerProperties;
|
||||
import net.minecraft.server.DedicatedServerSettings;
|
||||
import net.minecraft.server.DimensionManager;
|
||||
import net.minecraft.server.DynamicOpsNBT;
|
||||
import net.minecraft.server.Enchantments;
|
||||
import net.minecraft.server.EntityPlayer;
|
||||
import net.minecraft.server.EnumDifficulty;
|
||||
import net.minecraft.server.EnumGamemode;
|
||||
import net.minecraft.server.GameRules;
|
||||
import net.minecraft.server.GeneratorSettings;
|
||||
import net.minecraft.server.IRecipe;
|
||||
import net.minecraft.server.IRegistry;
|
||||
import net.minecraft.server.IRegistryCustom;
|
||||
import net.minecraft.server.Item;
|
||||
import net.minecraft.server.ItemWorldMap;
|
||||
import net.minecraft.server.Items;
|
||||
@@ -67,18 +79,30 @@ import net.minecraft.server.JsonListEntry;
|
||||
import net.minecraft.server.LootTableRegistry;
|
||||
import net.minecraft.server.MapIcon;
|
||||
import net.minecraft.server.MinecraftKey;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.server.MobEffects;
|
||||
import net.minecraft.server.MobSpawner;
|
||||
import net.minecraft.server.MobSpawnerCat;
|
||||
import net.minecraft.server.MobSpawnerPatrol;
|
||||
import net.minecraft.server.MobSpawnerPhantom;
|
||||
import net.minecraft.server.MobSpawnerTrader;
|
||||
import net.minecraft.server.NBTBase;
|
||||
import net.minecraft.server.PlayerList;
|
||||
import net.minecraft.server.RegistryMaterials;
|
||||
import net.minecraft.server.RegistryReadOps;
|
||||
import net.minecraft.server.ResourceKey;
|
||||
import net.minecraft.server.SaveData;
|
||||
import net.minecraft.server.ServerCommand;
|
||||
import net.minecraft.server.TagsServer;
|
||||
import net.minecraft.server.TicketType;
|
||||
import net.minecraft.server.Vec3D;
|
||||
import net.minecraft.server.WorldData;
|
||||
import net.minecraft.server.VillageSiege;
|
||||
import net.minecraft.server.WorldDataServer;
|
||||
import net.minecraft.server.WorldDimension;
|
||||
import net.minecraft.server.WorldMap;
|
||||
import net.minecraft.server.WorldNBTStorage;
|
||||
import net.minecraft.server.WorldServer;
|
||||
import net.minecraft.server.WorldSettings;
|
||||
import net.minecraft.server.WorldType;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.BanList;
|
||||
import org.bukkit.Bukkit;
|
||||
@@ -404,7 +428,7 @@ public final class CraftServer implements Server {
|
||||
|
||||
private void syncCommands() {
|
||||
// Clear existing commands
|
||||
CommandDispatcher dispatcher = console.commandDispatcher = new CommandDispatcher();
|
||||
CommandDispatcher dispatcher = console.dataPackResources.commandDispatcher = new CommandDispatcher();
|
||||
|
||||
// Register all commands, vanilla ones will be using the old dispatcher references
|
||||
for (Map.Entry<String, Command> entry : commandMap.getKnownCommands().entrySet()) {
|
||||
@@ -510,7 +534,7 @@ public final class CraftServer implements Server {
|
||||
|
||||
@Override
|
||||
public Player getPlayer(UUID id) {
|
||||
EntityPlayer player = playerList.a(id);
|
||||
EntityPlayer player = playerList.getPlayer(id);
|
||||
|
||||
if (player != null) {
|
||||
return player.getBukkitEntity();
|
||||
@@ -577,12 +601,12 @@ public final class CraftServer implements Server {
|
||||
|
||||
@Override
|
||||
public String getWorldType() {
|
||||
return this.getProperties().levelType.name();
|
||||
return this.getProperties().properties.getProperty("level-type");
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getGenerateStructures() {
|
||||
return this.getServer().getGenerateStructures();
|
||||
return this.getProperties().generatorSettings.shouldGenerateMapFeatures();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -721,7 +745,6 @@ public final class CraftServer implements Server {
|
||||
console.propertyManager = new DedicatedServerSettings(console.options);
|
||||
DedicatedServerProperties config = console.propertyManager.getProperties();
|
||||
|
||||
console.setSpawnAnimals(config.spawnAnimals);
|
||||
console.setPVP(config.pvp);
|
||||
console.setAllowFlight(config.allowFlight);
|
||||
console.setMotd(config.motd);
|
||||
@@ -748,7 +771,7 @@ public final class CraftServer implements Server {
|
||||
}
|
||||
|
||||
for (WorldServer world : console.getWorlds()) {
|
||||
world.worldData.setDifficulty(config.difficulty);
|
||||
world.worldDataServer.setDifficulty(config.difficulty);
|
||||
world.setSpawnFlags(config.spawnMonsters, config.spawnAnimals);
|
||||
if (this.getTicksPerAnimalSpawns() < 0) {
|
||||
world.ticksPerAnimalSpawns = 400;
|
||||
@@ -814,7 +837,7 @@ public final class CraftServer implements Server {
|
||||
|
||||
@Override
|
||||
public void reloadData() {
|
||||
console.reload();
|
||||
CommandReload.reload(console);
|
||||
}
|
||||
|
||||
private void loadIcon() {
|
||||
@@ -906,8 +929,6 @@ public final class CraftServer implements Server {
|
||||
ChunkGenerator generator = creator.generator();
|
||||
File folder = new File(getWorldContainer(), name);
|
||||
World world = getWorld(name);
|
||||
WorldType type = WorldType.getType(creator.type().getName());
|
||||
boolean generateStructures = creator.generateStructures();
|
||||
|
||||
if (world != null) {
|
||||
return world;
|
||||
@@ -921,50 +942,88 @@ public final class CraftServer implements Server {
|
||||
generator = getGenerator(name);
|
||||
}
|
||||
|
||||
console.convertWorld(name);
|
||||
ResourceKey<WorldDimension> actualDimension;
|
||||
switch (creator.environment()) {
|
||||
case NORMAL:
|
||||
actualDimension = WorldDimension.OVERWORLD;
|
||||
break;
|
||||
case NETHER:
|
||||
actualDimension = WorldDimension.THE_NETHER;
|
||||
break;
|
||||
case THE_END:
|
||||
actualDimension = WorldDimension.THE_END;
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException("Illegal dimension");
|
||||
}
|
||||
|
||||
Convertable.ConversionSession worldSession;
|
||||
try {
|
||||
worldSession = Convertable.a(getWorldContainer().toPath()).c(name, actualDimension);
|
||||
} catch (IOException ex) {
|
||||
throw new RuntimeException(ex);
|
||||
}
|
||||
MinecraftServer.convertWorld(worldSession); // Run conversion now
|
||||
|
||||
int dimension = CraftWorld.CUSTOM_DIMENSION_OFFSET + console.worldServer.size();
|
||||
boolean used = false;
|
||||
do {
|
||||
for (WorldServer server : console.getWorlds()) {
|
||||
used = server.getWorldProvider().getDimensionManager().getDimensionID() == dimension;
|
||||
if (used) {
|
||||
dimension++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while (used);
|
||||
boolean hardcore = creator.hardcore();
|
||||
|
||||
WorldNBTStorage sdm = new WorldNBTStorage(getWorldContainer(), name, getServer(), getHandle().getServer().dataConverterManager);
|
||||
WorldData worlddata = sdm.getWorldData();
|
||||
IRegistryCustom.Dimension iregistrycustom_dimension = IRegistryCustom.b();
|
||||
|
||||
RegistryReadOps<NBTBase> registryreadops = RegistryReadOps.a((DynamicOps) DynamicOpsNBT.a, console.dataPackResources.h(), (IRegistryCustom) iregistrycustom_dimension);
|
||||
WorldDataServer worlddata = (WorldDataServer) worldSession.a((DynamicOps) registryreadops, console.datapackconfiguration);
|
||||
|
||||
WorldSettings worldSettings;
|
||||
// See MinecraftServer.a(String, String, long, WorldType, JsonElement)
|
||||
if (worlddata == null) {
|
||||
worldSettings = new WorldSettings(creator.seed(), EnumGamemode.getById(getDefaultGameMode().getValue()), generateStructures, hardcore, type);
|
||||
JsonElement parsedSettings = new JsonParser().parse(creator.generatorSettings());
|
||||
if (parsedSettings.isJsonObject()) {
|
||||
worldSettings.setGeneratorSettings(parsedSettings.getAsJsonObject());
|
||||
}
|
||||
worlddata = new WorldData(worldSettings, name);
|
||||
} else {
|
||||
worlddata.setName(name);
|
||||
worldSettings = new WorldSettings(worlddata);
|
||||
Properties properties = new Properties();
|
||||
properties.put("generator-settings", Objects.toString(creator.generatorSettings()));
|
||||
properties.put("level-seed", Objects.toString(creator.seed()));
|
||||
properties.put("generate-structures", Objects.toString(creator.generateStructures()));
|
||||
properties.put("level-type", Objects.toString(creator.type().getName()));
|
||||
|
||||
GeneratorSettings generatorsettings = GeneratorSettings.a(properties);
|
||||
worldSettings = new WorldSettings(name, EnumGamemode.getById(getDefaultGameMode().getValue()), hardcore, EnumDifficulty.EASY, false, new GameRules(), console.datapackconfiguration);
|
||||
worlddata = new WorldDataServer(worldSettings, generatorsettings, Lifecycle.stable());
|
||||
}
|
||||
worlddata.a(console.getServerModName(), console.getModded().isPresent());
|
||||
|
||||
if (console.options.has("forceUpgrade")) {
|
||||
net.minecraft.server.Main.convertWorld(worldSession, DataConverterRegistry.a(), console.options.has("eraseCache"), () -> {
|
||||
return true;
|
||||
}, worlddata.getGeneratorSettings().g());
|
||||
}
|
||||
|
||||
DimensionManager actualDimension = DimensionManager.a(creator.environment().getId());
|
||||
DimensionManager internalDimension = DimensionManager.register(name.toLowerCase(java.util.Locale.ENGLISH), new DimensionManager(dimension, actualDimension.getSuffix(), actualDimension.folder, (w, manager) -> actualDimension.providerFactory.apply(w, manager), actualDimension.hasSkyLight(), actualDimension.getGenLayerZoomer(), actualDimension));
|
||||
WorldServer internal = (WorldServer) new WorldServer(console, console.executorService, sdm, worlddata, internalDimension, console.getMethodProfiler(), getServer().worldLoadListenerFactory.create(11), creator.environment(), generator);
|
||||
long j = BiomeManager.a(creator.seed());
|
||||
List<MobSpawner> list = ImmutableList.of(new MobSpawnerPhantom(), new MobSpawnerPatrol(), new MobSpawnerCat(), new VillageSiege(), new MobSpawnerTrader(worlddata));
|
||||
RegistryMaterials<WorldDimension> registrymaterials = worlddata.getGeneratorSettings().e();
|
||||
WorldDimension worlddimension = (WorldDimension) registrymaterials.a(actualDimension);
|
||||
DimensionManager dimensionmanager;
|
||||
net.minecraft.server.ChunkGenerator chunkgenerator;
|
||||
|
||||
if (worlddimension == null) {
|
||||
dimensionmanager = DimensionManager.a();
|
||||
chunkgenerator = GeneratorSettings.a((new Random()).nextLong());
|
||||
} else {
|
||||
dimensionmanager = worlddimension.b();
|
||||
chunkgenerator = worlddimension.c();
|
||||
}
|
||||
|
||||
ResourceKey<DimensionManager> typeKey = (ResourceKey) console.f.a().c(dimensionmanager).orElseThrow(() -> {
|
||||
return new IllegalStateException("Unregistered dimension type: " + dimensionmanager);
|
||||
});
|
||||
ResourceKey<net.minecraft.server.World> worldKey = ResourceKey.a(IRegistry.ae, new MinecraftKey(name.toLowerCase(java.util.Locale.ENGLISH)));
|
||||
|
||||
WorldServer internal = (WorldServer) new WorldServer(console, console.executorService, worldSession, worlddata, worldKey, typeKey, dimensionmanager, getServer().worldLoadListenerFactory.create(11),
|
||||
chunkgenerator, worlddata.getGeneratorSettings().isDebugWorld(), j, creator.environment() == Environment.NORMAL ? list : ImmutableList.of(), creator.environment() == Environment.NORMAL, creator.environment(), generator);
|
||||
|
||||
if (!(worlds.containsKey(name.toLowerCase(java.util.Locale.ENGLISH)))) {
|
||||
return null;
|
||||
}
|
||||
|
||||
console.initWorld(internal, worlddata, worldSettings);
|
||||
console.initWorld(internal, worlddata, worlddata, worlddata.getGeneratorSettings());
|
||||
|
||||
internal.worldData.setDifficulty(EnumDifficulty.EASY);
|
||||
internal.setSpawnFlags(true, true);
|
||||
console.worldServer.put(internal.getWorldProvider().getDimensionManager(), internal);
|
||||
console.worldServer.put(internal.getDimensionKey(), internal);
|
||||
|
||||
pluginManager.callEvent(new WorldInitEvent(internal.getWorld()));
|
||||
|
||||
@@ -987,11 +1046,11 @@ public final class CraftServer implements Server {
|
||||
|
||||
WorldServer handle = ((CraftWorld) world).getHandle();
|
||||
|
||||
if (!(console.worldServer.containsKey(handle.getWorldProvider().getDimensionManager()))) {
|
||||
if (!(console.worldServer.containsKey(handle.getDimensionKey()))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (handle.getWorldProvider().getDimensionManager() == DimensionManager.OVERWORLD) {
|
||||
if (handle.getDimensionKey() == net.minecraft.server.World.OVERWORLD) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1017,7 +1076,7 @@ public final class CraftServer implements Server {
|
||||
}
|
||||
|
||||
worlds.remove(world.getName().toLowerCase(java.util.Locale.ENGLISH));
|
||||
console.worldServer.remove(handle.getWorldProvider().getDimensionManager());
|
||||
console.worldServer.remove(handle.getDimensionKey());
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1138,7 +1197,7 @@ public final class CraftServer implements Server {
|
||||
|
||||
@Override
|
||||
public void resetRecipes() {
|
||||
console.reload(); // Not ideal but hard to reload a subset of a resource pack
|
||||
reloadData(); // Not ideal but hard to reload a subset of a resource pack
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1256,7 +1315,7 @@ public final class CraftServer implements Server {
|
||||
@Override
|
||||
@Deprecated
|
||||
public CraftMapView getMap(int id) {
|
||||
WorldMap worldmap = console.getWorldServer(DimensionManager.OVERWORLD).a("map_" + id);
|
||||
WorldMap worldmap = console.getWorldServer(net.minecraft.server.World.OVERWORLD).a("map_" + id);
|
||||
if (worldmap == null) {
|
||||
return null;
|
||||
}
|
||||
@@ -1453,7 +1512,7 @@ public final class CraftServer implements Server {
|
||||
|
||||
@Override
|
||||
public GameMode getDefaultGameMode() {
|
||||
return GameMode.getByValue(console.getWorldServer(DimensionManager.OVERWORLD).getWorldData().getGameType().getId());
|
||||
return GameMode.getByValue(console.getWorldServer(net.minecraft.server.World.OVERWORLD).worldDataServer.getGameType().getId());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1461,7 +1520,7 @@ public final class CraftServer implements Server {
|
||||
Validate.notNull(mode, "Mode cannot be null");
|
||||
|
||||
for (World world : getWorlds()) {
|
||||
((CraftWorld) world).getHandle().worldData.setGameType(EnumGamemode.getById(mode.getValue()));
|
||||
((CraftWorld) world).getHandle().worldDataServer.setGameType(EnumGamemode.getById(mode.getValue()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1484,20 +1543,12 @@ public final class CraftServer implements Server {
|
||||
|
||||
@Override
|
||||
public File getWorldContainer() {
|
||||
if (this.getServer().universe != null) {
|
||||
return this.getServer().universe;
|
||||
}
|
||||
|
||||
if (container == null) {
|
||||
container = new File(configuration.getString("settings.world-container", "."));
|
||||
}
|
||||
|
||||
return container;
|
||||
return this.getServer().convertable.a(net.minecraft.server.World.OVERWORLD).getParentFile();
|
||||
}
|
||||
|
||||
@Override
|
||||
public OfflinePlayer[] getOfflinePlayers() {
|
||||
WorldNBTStorage storage = (WorldNBTStorage) console.getWorldServer(DimensionManager.OVERWORLD).getDataManager();
|
||||
WorldNBTStorage storage = console.worldNBTStorage;
|
||||
String[] files = storage.getPlayerDir().list(new DatFileFilter());
|
||||
Set<OfflinePlayer> players = new HashSet<OfflinePlayer>();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user