From ad3a9202b27e6256d63b9d8fd25a490bca781259 Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Tue, 22 Sep 2020 20:15:32 +0200 Subject: [PATCH] Support reloading, better error handling --- pom.xml | 2 +- .../customdimensions/CustomDimensions.java | 176 +++++++++--------- src/main/resources/plugin.yml | 2 +- 3 files changed, 95 insertions(+), 85 deletions(-) diff --git a/pom.xml b/pom.xml index 86eb3ba..35f2678 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.github.TBMCPlugins CustomDimensions - 1.2 + 1.3 diff --git a/src/main/java/buttondevteam/customdimensions/CustomDimensions.java b/src/main/java/buttondevteam/customdimensions/CustomDimensions.java index b7cdd19..2ef6faf 100644 --- a/src/main/java/buttondevteam/customdimensions/CustomDimensions.java +++ b/src/main/java/buttondevteam/customdimensions/CustomDimensions.java @@ -13,12 +13,12 @@ import org.bukkit.event.world.WorldLoadEvent; import org.bukkit.plugin.java.JavaPlugin; import java.io.File; +import java.io.IOException; import java.util.*; public class CustomDimensions extends JavaPlugin implements Listener { @Override public void onEnable() { - //Bukkit.getPluginManager().registerEvents(this, this); getLogger().info("Loading custom dimensions..."); try { load(); @@ -36,93 +36,103 @@ public class CustomDimensions extends JavaPlugin implements Listener { GeneratorSettings mainGenSettings = saveData.getGeneratorSettings(); RegistryMaterials dimensionRegistry = mainGenSettings.d(); - var dimIterator = dimensionRegistry.d().iterator(); - var mainWorld = Bukkit.getWorlds().get(0); var convertable = Convertable.a(Bukkit.getWorldContainer().toPath()); - while (dimIterator.hasNext()) { - Map.Entry, WorldDimension> dimEntry = dimIterator.next(); - ResourceKey dimKey = dimEntry.getKey(); - - if (dimKey != WorldDimension.OVERWORLD //The default dimensions are already loaded - && dimKey != WorldDimension.THE_NETHER - && dimKey != WorldDimension.THE_END) { - ResourceKey worldKey = ResourceKey.a(IRegistry.L, dimKey.a()); - DimensionManager dimensionmanager = dimEntry.getValue().b(); - ChunkGenerator chunkgenerator = dimEntry.getValue().c(); - var name = dimKey.a().getKey(); - getLogger().info("Loading " + name); - var session = convertable.new ConversionSession(name, dimKey) { //The original session isn't prepared for custom dimensions - @Override - public File a(ResourceKey resourcekey) { - return new File(this.folder.toFile(), "custom"); - } - }; - MinecraftServer.convertWorld(session); - - //Load world settings or create default values - RegistryReadOps registryreadops = RegistryReadOps.a(DynamicOpsNBT.a, console.dataPackResources.h(), console.customRegistry); - WorldDataServer worlddata = (WorldDataServer) session.a(registryreadops, console.datapackconfiguration); - if (worlddata == null) { - Properties properties = new Properties(); - properties.put("level-seed", Objects.toString(mainWorld.getSeed())); - properties.put("generate-structures", Objects.toString(true)); - properties.put("level-type", WorldType.NORMAL.getName()); - GeneratorSettings dimGenSettings = GeneratorSettings.a(console.getCustomRegistry(), properties); - WorldSettings worldSettings = new WorldSettings(name, - EnumGamemode.getById(Bukkit.getDefaultGameMode().getValue()), - false, //Hardcore - EnumDifficulty.EASY, false, new GameRules(), console.datapackconfiguration); - worlddata = new WorldDataServer(worldSettings, dimGenSettings, Lifecycle.stable()); - } - - worlddata.checkName(name); - worlddata.a(console.getServerModName(), console.getModded().isPresent()); - if (console.options.has("forceUpgrade")) { - net.minecraft.server.v1_16_R2.Main.convertWorld(session, DataConverterRegistry.a(), - console.options.has("eraseCache"), () -> true, - worlddata.getGeneratorSettings().d().d().stream() - .map((entry2) -> ResourceKey.a(IRegistry.K, entry2.getKey().a())) - .collect(ImmutableSet.toImmutableSet())); - } - - List spawners = ImmutableList.of(new MobSpawnerPhantom(), new MobSpawnerPatrol(), new MobSpawnerCat(), new VillageSiege(), new MobSpawnerTrader(worlddata)); - - ResourceKey dimManResKey = ResourceKey.a(IRegistry.K, dimKey.a()); - var dimRegistry = ((RegistryMaterials) console.customRegistry.a()); - { - var key = dimRegistry.getKey(dimensionmanager); - if (key != null) { //The loaded manager is the same - getLogger().warning("Dimension manager already loaded with key " + key + "! Skipping"); - continue; - } - } - //Replace existing dimension manager, correctly setting the ID up (which is -1 for default worlds...) - dimRegistry.a(OptionalInt.empty(), dimManResKey, dimensionmanager, Lifecycle.stable()); - - var worldloadlistener = console.worldLoadListenerFactory.create(11); - - WorldServer worldserver = new WorldServer(console, console.executorService, session, - worlddata, worldKey, dimensionmanager, worldloadlistener, chunkgenerator, - false, //isDebugWorld - BiomeManager.a(worlddata.getGeneratorSettings().getSeed()), //Biome seed - spawners, - true, //Update world time - org.bukkit.World.Environment.NORMAL, null); - - if (Bukkit.getWorld(name.toLowerCase(Locale.ENGLISH)) == null) { - getLogger().warning("Failed to load custom dimension " + name); - } else { - console.initWorld(worldserver, worlddata, worlddata, worlddata.getGeneratorSettings()); - worldserver.setSpawnFlags(true, true); - console.worldServer.put(worldserver.getDimensionKey(), worldserver); - Bukkit.getPluginManager().callEvent(new WorldInitEvent(worldserver.getWorld())); - console.loadSpawn(worldserver.getChunkProvider().playerChunkMap.worldLoadListener, worldserver); - Bukkit.getPluginManager().callEvent(new WorldLoadEvent(worldserver.getWorld())); - } + for (var dimEntry : dimensionRegistry.d()) { + try { + loadDimension(dimEntry.getKey(), dimEntry.getValue(), convertable, console, mainWorld); + } catch (Exception e) { + getLogger().warning("Failed to load dimension " + dimEntry.getKey()); + e.printStackTrace(); } } } + + private void loadDimension(ResourceKey dimKey, WorldDimension dimension, + Convertable convertable, DedicatedServer console, org.bukkit.World mainWorld) throws IOException { + if (dimKey == WorldDimension.OVERWORLD //The default dimensions are already loaded + || dimKey == WorldDimension.THE_NETHER + || dimKey == WorldDimension.THE_END) + return; + ResourceKey worldKey = ResourceKey.a(IRegistry.L, dimKey.a()); + DimensionManager dimensionmanager = dimension.b(); + ChunkGenerator chunkgenerator = dimension.c(); + var name = dimKey.a().getKey(); + if (Bukkit.getWorld(name) != null) { + getLogger().info(name + " already loaded"); + return; + } + getLogger().info("Loading " + name); + var session = convertable.new ConversionSession(name, dimKey) { //The original session isn't prepared for custom dimensions + @Override + public File a(ResourceKey resourcekey) { + return new File(this.folder.toFile(), "custom"); + } + }; + MinecraftServer.convertWorld(session); + + //Load world settings or create default values + RegistryReadOps registryreadops = RegistryReadOps.a(DynamicOpsNBT.a, console.dataPackResources.h(), console.customRegistry); + WorldDataServer worlddata = (WorldDataServer) session.a(registryreadops, console.datapackconfiguration); + if (worlddata == null) { + Properties properties = new Properties(); + properties.put("level-seed", Objects.toString(mainWorld.getSeed())); + properties.put("generate-structures", Objects.toString(true)); + properties.put("level-type", WorldType.NORMAL.getName()); + GeneratorSettings dimGenSettings = GeneratorSettings.a(console.getCustomRegistry(), properties); + WorldSettings worldSettings = new WorldSettings(name, + EnumGamemode.getById(Bukkit.getDefaultGameMode().getValue()), + false, //Hardcore + EnumDifficulty.EASY, false, new GameRules(), console.datapackconfiguration); + worlddata = new WorldDataServer(worldSettings, dimGenSettings, Lifecycle.stable()); + } + + worlddata.checkName(name); + worlddata.a(console.getServerModName(), console.getModded().isPresent()); + if (console.options.has("forceUpgrade")) { + net.minecraft.server.v1_16_R2.Main.convertWorld(session, DataConverterRegistry.a(), + console.options.has("eraseCache"), () -> true, + worlddata.getGeneratorSettings().d().d().stream() + .map((entry2) -> ResourceKey.a(IRegistry.K, entry2.getKey().a())) + .collect(ImmutableSet.toImmutableSet())); + } + + List spawners = ImmutableList.of(new MobSpawnerPhantom(), new MobSpawnerPatrol(), new MobSpawnerCat(), new VillageSiege(), new MobSpawnerTrader(worlddata)); + + ResourceKey dimManResKey = ResourceKey.a(IRegistry.K, dimKey.a()); + var dimRegistry = ((RegistryMaterials) console.customRegistry.a()); + { + var key = dimRegistry.getKey(dimensionmanager); + if (key != null) { //The loaded manager is the same + getLogger().warning("Dimension manager already loaded with key " + key + "! Skipping"); + session.close(); + return; + } + } + //Replace existing dimension manager, correctly setting the ID up (which is -1 for default worlds...) + dimRegistry.a(OptionalInt.empty(), dimManResKey, dimensionmanager, Lifecycle.stable()); + + var worldloadlistener = console.worldLoadListenerFactory.create(11); + + WorldServer worldserver = new WorldServer(console, console.executorService, session, + worlddata, worldKey, dimensionmanager, worldloadlistener, chunkgenerator, + false, //isDebugWorld + BiomeManager.a(worlddata.getGeneratorSettings().getSeed()), //Biome seed + spawners, + true, //Update world time + org.bukkit.World.Environment.NORMAL, null); + + if (Bukkit.getWorld(name.toLowerCase(Locale.ENGLISH)) == null) { + getLogger().warning("Failed to load custom dimension " + name); + } else { + console.initWorld(worldserver, worlddata, worlddata, worlddata.getGeneratorSettings()); + worldserver.setSpawnFlags(true, true); + console.worldServer.put(worldserver.getDimensionKey(), worldserver); + Bukkit.getPluginManager().callEvent(new WorldInitEvent(worldserver.getWorld())); + console.loadSpawn(worldserver.getChunkProvider().playerChunkMap.worldLoadListener, worldserver); + Bukkit.getPluginManager().callEvent(new WorldLoadEvent(worldserver.getWorld())); + } + } } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 9b78da6..9ea6e89 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ name: CustomDimensions main: buttondevteam.customdimensions.CustomDimensions -version: '1.2' +version: '1.3' api-version: '1.16' loadbefore: - Multiverse-Core \ No newline at end of file