From 036dc289d55ca0ed83cca0744c4afe92e8127ddb Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Sun, 6 Sep 2020 03:19:01 -0400 Subject: [PATCH] Iris doesnt need worlds anymore --- pom.xml | 19 + src/main/java/com/volmit/iris/Iris.java | 34 +- .../com/volmit/iris/IrisBoardManager.java | 5 +- .../java/com/volmit/iris/IrisContext.java | 13 +- .../java/com/volmit/iris/ProjectManager.java | 23 +- .../volmit/iris/command/CommandIrisCTC.java | 5 +- .../iris/command/CommandIrisCreate.java | 26 +- .../iris/command/CommandIrisMetrics.java | 9 +- .../iris/command/CommandIrisStudioClose.java | 6 +- .../iris/command/CommandIrisStudioGoto.java | 7 +- .../command/CommandIrisStudioHotload.java | 8 +- .../volmit/iris/command/CommandIrisWhat.java | 28 +- .../iris/gen/ContextualChunkGenerator.java | 157 +- .../iris/gen/DimensionChunkGenerator.java | 44 +- .../volmit/iris/gen/IrisChunkGenerator.java | 99 +- .../iris/gen/ParallaxChunkGenerator.java | 29 +- .../iris/gen/ParallelChunkGenerator.java | 26 +- .../iris/gen/PostBlockChunkGenerator.java | 18 +- .../iris/gen/TerrainChunkGenerator.java | 33 +- .../iris/gen/atomics/AtomicRegionData.java | 9 +- .../iris/gen/atomics/AtomicWorldData.java | 9 +- .../volmit/iris/gen/layer/GenLayerUpdate.java | 4 +- .../com/volmit/iris/gen/nms/NMSCreator.java | 48 + .../volmit/iris/gen/nms/NMSCreator141.java | 134 ++ .../volmit/iris/gen/nms/NMSCreator151.java | 134 ++ .../volmit/iris/gen/nms/NMSCreator161.java | 208 +++ .../volmit/iris/gen/nms/NMSCreator162.java | 209 +++ .../iris/gen/provisions/ProvisionBukkit.java | 93 ++ .../gen/scaffold/BukkitTerrainProvider.java | 66 - .../iris/gen/scaffold/HeightedFakeWorld.java | 1305 +++++++++++++++++ .../iris/gen/scaffold/IrisBiomeStorage.java | 2 +- .../gen/scaffold/IrisGenConfiguration.java | 24 + .../iris/gen/scaffold/IrisTerrainChunk.java | 63 +- .../volmit/iris/gen/scaffold/IrisWorlds.java | 23 + .../volmit/iris/gen/scaffold/Provisioned.java | 6 + .../iris/gen/scaffold/TerrainChunk.java | 14 +- .../iris/gen/scaffold/TerrainProvider.java | 20 +- .../iris/gen/scaffold/TerrainTarget.java | 74 +- .../volmit/iris/link/MultiverseCoreLink.java | 11 + .../com/volmit/iris/object/IrisDimension.java | 4 + .../volmit/iris/object/IrisEntitySpawn.java | 4 +- 41 files changed, 2640 insertions(+), 413 deletions(-) create mode 100644 src/main/java/com/volmit/iris/gen/nms/NMSCreator.java create mode 100644 src/main/java/com/volmit/iris/gen/nms/NMSCreator141.java create mode 100644 src/main/java/com/volmit/iris/gen/nms/NMSCreator151.java create mode 100644 src/main/java/com/volmit/iris/gen/nms/NMSCreator161.java create mode 100644 src/main/java/com/volmit/iris/gen/nms/NMSCreator162.java create mode 100644 src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java delete mode 100644 src/main/java/com/volmit/iris/gen/scaffold/BukkitTerrainProvider.java create mode 100644 src/main/java/com/volmit/iris/gen/scaffold/HeightedFakeWorld.java create mode 100644 src/main/java/com/volmit/iris/gen/scaffold/IrisGenConfiguration.java create mode 100644 src/main/java/com/volmit/iris/gen/scaffold/IrisWorlds.java create mode 100644 src/main/java/com/volmit/iris/gen/scaffold/Provisioned.java diff --git a/pom.xml b/pom.xml index 1b3282972..d2e755221 100644 --- a/pom.xml +++ b/pom.xml @@ -161,12 +161,31 @@ 1.16.1-R0.1-SNAPSHOT provided + org.bukkit.craftbukkit cb-1.16.2 1.16.2 provided + + org.bukkit.craftbukkit + cb-1.16.1 + 1.16.1 + provided + + + org.bukkit.craftbukkit + cb-1.15.1 + 1.15.1 + provided + + + org.bukkit.craftbukkit + cb-1.14.4 + 1.14.4 + provided + org.bstats diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index 4c3f9bc74..a32a03f77 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -4,15 +4,14 @@ import java.io.BufferedInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; -import java.lang.reflect.InvocationTargetException; import java.net.URL; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; import org.bukkit.World; +import org.bukkit.World.Environment; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; -import org.bukkit.craftbukkit.v1_16_R2.CraftServer; import org.bukkit.event.HandlerList; import org.bukkit.generator.ChunkGenerator; import org.bukkit.plugin.Plugin; @@ -27,6 +26,9 @@ import com.volmit.iris.gen.post.PostPotholeFiller; import com.volmit.iris.gen.post.PostSlabber; import com.volmit.iris.gen.post.PostWallPatcher; import com.volmit.iris.gen.post.PostWaterlogger; +import com.volmit.iris.gen.provisions.ProvisionBukkit; +import com.volmit.iris.gen.scaffold.IrisGenConfiguration; +import com.volmit.iris.gen.scaffold.TerrainTarget; import com.volmit.iris.link.MultiverseCoreLink; import com.volmit.iris.util.C; import com.volmit.iris.util.Form; @@ -37,7 +39,6 @@ import com.volmit.iris.util.IrisPostBlockFilter; import com.volmit.iris.util.J; import com.volmit.iris.util.KList; import com.volmit.iris.util.MortarPlugin; -import com.volmit.iris.util.NMSVersion; import com.volmit.iris.util.Permission; public class Iris extends MortarPlugin @@ -86,6 +87,16 @@ public class Iris extends MortarPlugin return "UNKNOWN NMS VERSION"; } + public ProvisionBukkit createProvisionBukkit(IrisGenConfiguration config) + { + return new ProvisionBukkit(createIrisProvider(config)); + } + + public IrisChunkGenerator createIrisProvider(IrisGenConfiguration config) + { + return new IrisChunkGenerator(config); + } + private static boolean doesSupport3DBiomes() { int v = Integer.valueOf(Bukkit.getBukkitVersion().split("\\Q-\\E")[0].split("\\Q.\\E")[1]); @@ -160,9 +171,9 @@ public class Iris extends MortarPlugin for(World i : Bukkit.getWorlds()) { - if(i.getGenerator() instanceof IrisChunkGenerator) + if(i.getGenerator() instanceof ProvisionBukkit) { - ((IrisChunkGenerator) i.getGenerator()).close(); + ((IrisChunkGenerator) ((ProvisionBukkit) i.getGenerator()).getProvider()).close(); } } @@ -208,7 +219,18 @@ public class Iris extends MortarPlugin @Override public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) { - return new IrisChunkGenerator(IrisSettings.get().threads); + //@builder + return createProvisionBukkit(IrisGenConfiguration.builder() + .threads(IrisSettings.get().threads) + .target(TerrainTarget + .builder() + .environment(Environment.NORMAL) + .folder(new File(worldName)) + .name(worldName) + .seed(worldName.hashCode()) + .build() + ).build()); + //@done } public static void msg(String string) diff --git a/src/main/java/com/volmit/iris/IrisBoardManager.java b/src/main/java/com/volmit/iris/IrisBoardManager.java index 6a33cfe5a..b562cb4b4 100644 --- a/src/main/java/com/volmit/iris/IrisBoardManager.java +++ b/src/main/java/com/volmit/iris/IrisBoardManager.java @@ -9,6 +9,7 @@ import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerChangedWorldEvent; import com.volmit.iris.gen.IrisChunkGenerator; +import com.volmit.iris.gen.provisions.ProvisionBukkit; import com.volmit.iris.noise.CNG; import com.volmit.iris.object.IrisBiome; import com.volmit.iris.util.BoardManager; @@ -54,7 +55,7 @@ public class IrisBoardManager implements BoardProvider, Listener @DontObfuscate private boolean isIrisWorld(World w) { - return (w.getGenerator() instanceof IrisChunkGenerator) && ((IrisChunkGenerator) w.getGenerator()).isDev(); + return (w.getGenerator() instanceof ProvisionBukkit) && ((IrisChunkGenerator) ((ProvisionBukkit) w.getGenerator()).getProvider()).isDev(); } public void updatePlayer(Player p) @@ -88,7 +89,7 @@ public class IrisBoardManager implements BoardProvider, Listener return v; } - IrisChunkGenerator g = (IrisChunkGenerator) player.getWorld().getGenerator(); + IrisChunkGenerator g = (IrisChunkGenerator) ((ProvisionBukkit) player.getWorld().getGenerator()).getProvider(); if(cl.flip()) { diff --git a/src/main/java/com/volmit/iris/IrisContext.java b/src/main/java/com/volmit/iris/IrisContext.java index a913b427a..719450a68 100644 --- a/src/main/java/com/volmit/iris/IrisContext.java +++ b/src/main/java/com/volmit/iris/IrisContext.java @@ -1,7 +1,6 @@ package com.volmit.iris; -import org.bukkit.World; - +import com.volmit.iris.gen.scaffold.TerrainTarget; import com.volmit.iris.object.IrisBiome; import com.volmit.iris.object.IrisDimension; import com.volmit.iris.object.IrisRegion; @@ -9,17 +8,19 @@ import com.volmit.iris.util.KMap; public interface IrisContext { - static KMap contexts = new KMap<>(); + static KMap contexts = new KMap<>(); public static void pushContext(IrisContext context) { - contexts.put(context.getWorld(), context); + contexts.put(context.getTarget(), context); } - public static IrisContext of(World world) + public static IrisContext of(TerrainTarget world) { return contexts.get(world); } + + public TerrainTarget getTarget(); public IrisBiome getBiome(int x, int z); @@ -31,7 +32,5 @@ public interface IrisContext public int getHeight(int x, int z); - public World getWorld(); - public void onHotloaded(); } diff --git a/src/main/java/com/volmit/iris/ProjectManager.java b/src/main/java/com/volmit/iris/ProjectManager.java index db47f5d51..fa03857d5 100644 --- a/src/main/java/com/volmit/iris/ProjectManager.java +++ b/src/main/java/com/volmit/iris/ProjectManager.java @@ -27,7 +27,11 @@ import org.zeroturnaround.zip.commons.FileUtils; import com.google.gson.Gson; import com.google.gson.JsonSyntaxException; import com.volmit.iris.gen.IrisChunkGenerator; +import com.volmit.iris.gen.nms.NMSCreator; import com.volmit.iris.gen.post.Post; +import com.volmit.iris.gen.provisions.ProvisionBukkit; +import com.volmit.iris.gen.scaffold.IrisGenConfiguration; +import com.volmit.iris.gen.scaffold.TerrainTarget; import com.volmit.iris.object.DecorationPart; import com.volmit.iris.object.Envelope; import com.volmit.iris.object.InterpolationMethod; @@ -316,7 +320,11 @@ public class ProjectManager Iris.globaldata.dump(); sender.sendMessage("Loading " + dimm + "..."); - IrisChunkGenerator gx = new IrisChunkGenerator(dimm, IrisSettings.get().threads); + String wfp = "iris/" + UUID.randomUUID(); + ProvisionBukkit gen = Iris.instance.createProvisionBukkit(IrisGenConfiguration.builder().threads(IrisSettings.get().threads).dimension(dimm).target(TerrainTarget.builder().environment(d.getEnvironment()).folder(new File(wfp)).name(wfp).seed(1337).build()).build()); + //@done + + IrisChunkGenerator gx = (IrisChunkGenerator) gen.getProvider(); currentProject = gx; gx.setDev(true); sender.sendMessage("Generating with " + IrisSettings.get().threads + " threads per chunk"); @@ -365,13 +373,14 @@ public class ProjectManager }); //@builder - World world = Bukkit.createWorld(new WorldCreator("iris/" + UUID.randomUUID()) + World world = NMSCreator.createWorld(new WorldCreator(wfp) .seed(1337) - .generator(gx) + .generator(gen) .generateStructures(d.isVanillaStructures()) .type(WorldType.NORMAL) - .environment(d.getEnvironment())); + .environment(d.getEnvironment()), false); //@done + gx.getTarget().setRealWorld(world); Iris.linkMultiverseCore.removeFromConfig(world); done.set(true); @@ -400,9 +409,9 @@ public class ProjectManager if(isProjectOpen()) { currentProject.close(); - File folder = currentProject.getWorld().getWorldFolder(); - Iris.linkMultiverseCore.removeFromConfig(currentProject.getWorld()); - Bukkit.unloadWorld(currentProject.getWorld(), false); + File folder = currentProject.getTarget().getFolder(); + Iris.linkMultiverseCore.removeFromConfig(currentProject.getTarget().getName()); + Bukkit.unloadWorld(currentProject.getTarget().getName(), false); currentProject = null; Iris.globaldata.dump(); Iris.globaldata.preferFolder(null); diff --git a/src/main/java/com/volmit/iris/command/CommandIrisCTC.java b/src/main/java/com/volmit/iris/command/CommandIrisCTC.java index 7c90f2578..c9ba80d3e 100644 --- a/src/main/java/com/volmit/iris/command/CommandIrisCTC.java +++ b/src/main/java/com/volmit/iris/command/CommandIrisCTC.java @@ -5,6 +5,7 @@ import org.bukkit.entity.Player; import com.volmit.iris.Iris; import com.volmit.iris.gen.IrisChunkGenerator; +import com.volmit.iris.gen.provisions.ProvisionBukkit; import com.volmit.iris.util.MortarCommand; import com.volmit.iris.util.MortarSender; @@ -26,13 +27,13 @@ public class CommandIrisCTC extends MortarCommand Player p = sender.player(); World world = p.getWorld(); - if(!(world.getGenerator() instanceof IrisChunkGenerator)) + if(!(world.getGenerator() instanceof ProvisionBukkit)) { sender.sendMessage("You must be in an iris world."); return true; } - IrisChunkGenerator g = (IrisChunkGenerator) world.getGenerator(); + IrisChunkGenerator g = (IrisChunkGenerator) ((ProvisionBukkit) world.getGenerator()).getProvider(); int m = Math.min(Math.max(Integer.valueOf(args[0]), 2), 256); g.changeThreadCount(m); sender.sendMessage("Thread count changed to " + m); diff --git a/src/main/java/com/volmit/iris/command/CommandIrisCreate.java b/src/main/java/com/volmit/iris/command/CommandIrisCreate.java index 735f29502..7dc936fec 100644 --- a/src/main/java/com/volmit/iris/command/CommandIrisCreate.java +++ b/src/main/java/com/volmit/iris/command/CommandIrisCreate.java @@ -14,6 +14,10 @@ import com.volmit.iris.Iris; import com.volmit.iris.IrisDataManager; import com.volmit.iris.IrisSettings; import com.volmit.iris.gen.IrisChunkGenerator; +import com.volmit.iris.gen.nms.NMSCreator; +import com.volmit.iris.gen.provisions.ProvisionBukkit; +import com.volmit.iris.gen.scaffold.IrisGenConfiguration; +import com.volmit.iris.gen.scaffold.TerrainTarget; import com.volmit.iris.object.IrisDimension; import com.volmit.iris.util.Form; import com.volmit.iris.util.IO; @@ -138,7 +142,20 @@ public class CommandIrisCreate extends MortarCommand } sender.sendMessage(worldName + " type installed. Generating Spawn Area..."); - IrisChunkGenerator gen = new IrisChunkGenerator("", 16); + //@builder + ProvisionBukkit gen = Iris.instance.createProvisionBukkit( + IrisGenConfiguration.builder() + .threads(IrisSettings.get().threads) + .dimension(dim.getLoadKey()) + .target(TerrainTarget + .builder() + .environment(dim.getEnvironment()) + .folder(folder) + .name(worldName) + .seed(seed) + .build() + ).build()); + //@done sender.sendMessage("Generating with " + IrisSettings.get().threads + " threads per chunk"); O done = new O(); @@ -151,7 +168,7 @@ public class CommandIrisCreate extends MortarCommand while(!done.get()) { boolean derp = false; - double v = (double) gen.getGenerated() / (double) req; + double v = (double) ((IrisChunkGenerator) gen.getProvider()).getGenerated() / (double) req; if(last > v || v > 1) { @@ -169,7 +186,10 @@ public class CommandIrisCreate extends MortarCommand } }); - World world = Bukkit.createWorld(new WorldCreator(worldName).seed(seed).generator(gen).type(WorldType.NORMAL).environment(dim.getEnvironment())); + WorldCreator wc = new WorldCreator(worldName).seed(seed).generator(gen).type(WorldType.NORMAL).environment(dim.getEnvironment()); + + World world = NMSCreator.createWorld(wc, false); + done.set(true); sender.sendMessage(worldName + " Spawn Area generated."); diff --git a/src/main/java/com/volmit/iris/command/CommandIrisMetrics.java b/src/main/java/com/volmit/iris/command/CommandIrisMetrics.java index 2321475b6..5523df365 100644 --- a/src/main/java/com/volmit/iris/command/CommandIrisMetrics.java +++ b/src/main/java/com/volmit/iris/command/CommandIrisMetrics.java @@ -6,6 +6,7 @@ import org.bukkit.entity.Player; import com.volmit.iris.Iris; import com.volmit.iris.IrisMetrics; import com.volmit.iris.gen.IrisChunkGenerator; +import com.volmit.iris.gen.provisions.ProvisionBukkit; import com.volmit.iris.util.C; import com.volmit.iris.util.Form; import com.volmit.iris.util.MortarCommand; @@ -28,7 +29,13 @@ public class CommandIrisMetrics extends MortarCommand { Player p = sender.player(); World world = p.getWorld(); - IrisChunkGenerator g = (IrisChunkGenerator) world.getGenerator(); + if(!(world.getGenerator() instanceof ProvisionBukkit)) + { + sender.sendMessage("You must be in an iris world."); + return true; + } + + IrisChunkGenerator g = (IrisChunkGenerator) ((ProvisionBukkit) world.getGenerator()).getProvider(); IrisMetrics m = g.getMetrics(); sender.sendMessage("Thread Count: " + C.BOLD + "" + C.WHITE + g.getThreads()); sender.sendMessage("Total : " + C.BOLD + "" + C.WHITE + Form.duration(m.getTotal().getAverage(), 2)); diff --git a/src/main/java/com/volmit/iris/command/CommandIrisStudioClose.java b/src/main/java/com/volmit/iris/command/CommandIrisStudioClose.java index 6659287f1..b3d09ef20 100644 --- a/src/main/java/com/volmit/iris/command/CommandIrisStudioClose.java +++ b/src/main/java/com/volmit/iris/command/CommandIrisStudioClose.java @@ -40,7 +40,7 @@ public class CommandIrisStudioClose extends MortarCommand for(World i : Bukkit.getWorlds()) { - if(i.getWorldFolder().getAbsolutePath().equals(Iris.proj.getCurrentProject().getWorld().getWorldFolder().getAbsolutePath())) + if(i.getWorldFolder().getAbsolutePath().equals(Iris.proj.getCurrentProject().getTarget().getFolder().getAbsolutePath())) { continue; } @@ -51,7 +51,7 @@ public class CommandIrisStudioClose extends MortarCommand if(f == null) { - for(Player i : Iris.proj.getCurrentProject().getWorld().getPlayers()) + for(Player i : Iris.proj.getCurrentProject().getTarget().getPlayers()) { i.kickPlayer("Project Closing, No other world to put you in. Rejoin Please!"); } @@ -59,7 +59,7 @@ public class CommandIrisStudioClose extends MortarCommand else { - for(Player i : Iris.proj.getCurrentProject().getWorld().getPlayers()) + for(Player i : Iris.proj.getCurrentProject().getTarget().getPlayers()) { i.teleport(f.getSpawnLocation()); } diff --git a/src/main/java/com/volmit/iris/command/CommandIrisStudioGoto.java b/src/main/java/com/volmit/iris/command/CommandIrisStudioGoto.java index 3779a5151..ac715a40b 100644 --- a/src/main/java/com/volmit/iris/command/CommandIrisStudioGoto.java +++ b/src/main/java/com/volmit/iris/command/CommandIrisStudioGoto.java @@ -7,6 +7,7 @@ import org.bukkit.entity.Player; import com.volmit.iris.Iris; import com.volmit.iris.IrisSettings; import com.volmit.iris.gen.IrisChunkGenerator; +import com.volmit.iris.gen.provisions.ProvisionBukkit; import com.volmit.iris.object.IrisBiome; import com.volmit.iris.util.MortarCommand; import com.volmit.iris.util.MortarSender; @@ -30,7 +31,7 @@ public class CommandIrisStudioGoto extends MortarCommand sender.sendMessage("To use Iris Studio, please enable studio in Iris/settings.json"); return true; } - + if(args.length < 1) { sender.sendMessage("/iris world goto " + getArgsUsage()); @@ -42,13 +43,13 @@ public class CommandIrisStudioGoto extends MortarCommand Player p = sender.player(); World world = p.getWorld(); - if(!(world.getGenerator() instanceof IrisChunkGenerator)) + if(!(world.getGenerator() instanceof ProvisionBukkit)) { sender.sendMessage("You must be in an iris world."); return true; } - IrisChunkGenerator g = (IrisChunkGenerator) world.getGenerator(); + IrisChunkGenerator g = (IrisChunkGenerator) ((ProvisionBukkit) world.getGenerator()).getProvider(); int tries = 10000; boolean cave = false; IrisBiome biome2 = null; diff --git a/src/main/java/com/volmit/iris/command/CommandIrisStudioHotload.java b/src/main/java/com/volmit/iris/command/CommandIrisStudioHotload.java index cbf9996fd..3cca4f74f 100644 --- a/src/main/java/com/volmit/iris/command/CommandIrisStudioHotload.java +++ b/src/main/java/com/volmit/iris/command/CommandIrisStudioHotload.java @@ -6,6 +6,7 @@ import org.bukkit.entity.Player; import com.volmit.iris.Iris; import com.volmit.iris.IrisSettings; import com.volmit.iris.gen.IrisChunkGenerator; +import com.volmit.iris.gen.provisions.ProvisionBukkit; import com.volmit.iris.util.MortarCommand; import com.volmit.iris.util.MortarSender; @@ -27,19 +28,18 @@ public class CommandIrisStudioHotload extends MortarCommand sender.sendMessage("To use Iris Studio, please enable studio in Iris/settings.json"); return true; } - + if(sender.isPlayer()) { Player p = sender.player(); World world = p.getWorld(); - - if(!(world.getGenerator() instanceof IrisChunkGenerator)) + if(!(world.getGenerator() instanceof ProvisionBukkit)) { sender.sendMessage("You must be in an iris world."); return true; } - IrisChunkGenerator g = (IrisChunkGenerator) world.getGenerator(); + IrisChunkGenerator g = (IrisChunkGenerator) ((ProvisionBukkit) world.getGenerator()).getProvider(); g.onHotload(); sender.sendMessage("Hotloaded!"); return true; diff --git a/src/main/java/com/volmit/iris/command/CommandIrisWhat.java b/src/main/java/com/volmit/iris/command/CommandIrisWhat.java index 83674224a..b84313769 100644 --- a/src/main/java/com/volmit/iris/command/CommandIrisWhat.java +++ b/src/main/java/com/volmit/iris/command/CommandIrisWhat.java @@ -1,14 +1,7 @@ package com.volmit.iris.command; -import org.bukkit.World; -import org.bukkit.entity.Player; - import com.volmit.iris.Iris; -import com.volmit.iris.IrisMetrics; -import com.volmit.iris.gen.IrisChunkGenerator; -import com.volmit.iris.util.C; import com.volmit.iris.util.Command; -import com.volmit.iris.util.Form; import com.volmit.iris.util.MortarCommand; import com.volmit.iris.util.MortarSender; @@ -32,26 +25,7 @@ public class CommandIrisWhat extends MortarCommand @Override public boolean handle(MortarSender sender, String[] args) { - if(sender.isPlayer()) - { - Player p = (Player) sender; - World world = p.getWorld(); - IrisChunkGenerator g = (IrisChunkGenerator) world.getGenerator(); - IrisMetrics m = g.getMetrics(); - sender.sendMessage("Thread Count: " + C.BOLD + "" + C.WHITE + g.getThreads()); - sender.sendMessage("Total : " + C.BOLD + "" + C.WHITE + Form.duration(m.getTotal().getAverage(), 2)); - sender.sendMessage(" Terrain : " + C.BOLD + "" + C.WHITE + Form.duration(m.getTerrain().getAverage(), 2)); - sender.sendMessage(" Parallax: " + C.BOLD + "" + C.WHITE + Form.duration(m.getParallax().getAverage(), 2)); - sender.sendMessage(" Post : " + C.BOLD + "" + C.WHITE + Form.duration(m.getPost().getAverage(), 2)); - - return true; - } - - else - { - sender.sendMessage("Players only."); - } - + printHelp(sender); return true; } diff --git a/src/main/java/com/volmit/iris/gen/ContextualChunkGenerator.java b/src/main/java/com/volmit/iris/gen/ContextualChunkGenerator.java index ffc6dc5ba..fb55797f9 100644 --- a/src/main/java/com/volmit/iris/gen/ContextualChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/ContextualChunkGenerator.java @@ -1,13 +1,10 @@ package com.volmit.iris.gen; -import java.util.List; import java.util.Random; import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -23,8 +20,6 @@ import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.world.ChunkLoadEvent; import org.bukkit.event.world.ChunkUnloadEvent; import org.bukkit.event.world.WorldUnloadEvent; -import org.bukkit.generator.BlockPopulator; -import org.bukkit.generator.ChunkGenerator; import com.volmit.iris.Iris; import com.volmit.iris.IrisContext; @@ -32,6 +27,9 @@ import com.volmit.iris.IrisDataManager; import com.volmit.iris.IrisMetrics; import com.volmit.iris.gen.atomics.AtomicCache; import com.volmit.iris.gen.atomics.AtomicMulticache; +import com.volmit.iris.gen.scaffold.TerrainChunk; +import com.volmit.iris.gen.scaffold.TerrainProvider; +import com.volmit.iris.gen.scaffold.TerrainTarget; import com.volmit.iris.noise.CNG; import com.volmit.iris.object.IrisBiome; import com.volmit.iris.object.IrisDimension; @@ -53,7 +51,7 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) -public abstract class ContextualChunkGenerator extends ChunkGenerator implements Listener +public abstract class ContextualChunkGenerator implements TerrainProvider, Listener { private KList noLoot; private BlockPosition allowLoot; @@ -69,16 +67,17 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements private ChronoLatch pushLatch; private AtomicCache dimCache; private IrisMetrics metrics; - private World world; private int generated; private int ticks; private long hlast; private boolean fastPregen = false; private boolean pregenDone; private volatile boolean hotloadable = false; + private final TerrainTarget target; - public ContextualChunkGenerator() + public ContextualChunkGenerator(TerrainTarget target) { + this.target = target; pushLatch = new ChronoLatch(3000); tickLatch = new ChronoLatch(650); perSecond = new ChronoLatch(1000); @@ -97,9 +96,9 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements noLoot = new KList<>(1285); } - protected abstract void onGenerate(RNG masterRandom, int x, int z, ChunkData data, BiomeGrid grid); + protected abstract void onGenerate(RNG masterRandom, int x, int z, TerrainChunk chunk); - protected abstract void onInit(World world, RNG masterRandom); + protected abstract void onInit(RNG masterRandom); protected abstract void onTick(int ticks); @@ -150,21 +149,20 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements return isDev() ? Iris.globaldata : data; } - private void init(World world, RNG rng) + private void init(RNG rng) { if(initialized) { return; } - this.world = world; - setData(new IrisDataManager(getWorld().getWorldFolder())); - setMasterRandom(new RNG(world.getSeed())); + setData(new IrisDataManager(getTarget().getFolder())); + setMasterRandom(new RNG(getTarget().getSeed())); setMetrics(new IrisMetrics(128)); setInitialized(true); setTask(Bukkit.getScheduler().scheduleSyncRepeatingTask(Iris.instance, this::tick, 0, 0)); Bukkit.getServer().getPluginManager().registerEvents(this, Iris.instance); - onInit(world, masterRandom); + onInit(masterRandom); setHotloadable(true); } @@ -185,7 +183,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements setGenerated(0); } - checkHotload(); + doCheckHotload(); if(getNoLoot().size() > 1024) { @@ -217,7 +215,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements @EventHandler(priority = EventPriority.MONITOR) public void on(BlockBreakEvent e) { - if(!e.getBlock().getWorld().equals(getWorld())) + if(!getTarget().isWorld(e.getBlock().getWorld())) { return; } @@ -238,7 +236,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements @EventHandler(priority = EventPriority.MONITOR) public void on(BlockPlaceEvent e) { - if(!e.getBlock().getWorld().equals(getWorld())) + if(!getTarget().isWorld(e.getBlock().getWorld())) { return; } @@ -249,7 +247,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements @EventHandler(priority = EventPriority.MONITOR) public void on(BlockDropItemEvent e) { - if(!e.getBlock().getWorld().equals(getWorld())) + if(!getTarget().isWorld(e.getBlock().getWorld())) { return; } @@ -269,13 +267,13 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements @EventHandler(priority = EventPriority.MONITOR) public void on(PlayerTeleportEvent e) { - if(e.getFrom().getWorld().equals(world) && !e.getTo().getWorld().equals(world)) + if(getTarget().isWorld(e.getFrom().getWorld()) && !getTarget().isWorld(e.getTo().getWorld())) { tick(); onPlayerLeft(e.getPlayer()); } - if(!e.getFrom().getWorld().equals(world) && e.getTo().getWorld().equals(world)) + if(!getTarget().isWorld(e.getFrom().getWorld()) && getTarget().isWorld(e.getTo().getWorld())) { tick(); onPlayerJoin(e.getPlayer()); @@ -285,7 +283,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements @EventHandler(priority = EventPriority.MONITOR) public void on(PlayerQuitEvent e) { - if(e.getPlayer().getWorld().equals(world)) + if(getTarget().isWorld(e.getPlayer().getWorld())) { tick(); onPlayerLeft(e.getPlayer()); @@ -295,7 +293,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements @EventHandler(priority = EventPriority.MONITOR) public void on(PlayerJoinEvent e) { - if(e.getPlayer().getWorld().equals(world)) + if(getTarget().isWorld(e.getPlayer().getWorld())) { tick(); onPlayerJoin(e.getPlayer()); @@ -305,7 +303,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements @EventHandler(priority = EventPriority.MONITOR) public void on(ChunkLoadEvent e) { - if(e.getWorld().equals(world)) + if(getTarget().isWorld(e.getWorld())) { tick(); onChunkLoaded(e.getChunk()); @@ -315,7 +313,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements @EventHandler(priority = EventPriority.MONITOR) public void on(ChunkUnloadEvent e) { - if(e.getWorld().equals(world)) + if(getTarget().isWorld(e.getWorld())) { tick(); onChunkUnloaded(e.getChunk()); @@ -325,7 +323,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements @EventHandler(priority = EventPriority.MONITOR) public void on(WorldUnloadEvent e) { - if(world != null && e.getWorld().equals(world)) + if(getTarget().isWorld(e.getWorld())) { close(); } @@ -345,16 +343,8 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements onClose(); } - @Override - public boolean canSpawn(World world, int x, int z) + protected void generateFailure(Random no, int x, int z, TerrainChunk chunk) { - return super.canSpawn(world, x, z); - } - - protected ChunkData generateChunkDataFailure(World world, Random no, int x, int z, BiomeGrid biomeGrid) - { - ChunkData c = Bukkit.createChunkData(world); - for(int i = 0; i < 16; i++) { for(int j = 0; j < 16; j++) @@ -363,46 +353,19 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements if(j == i || j + i == 16) { - c.setBlock(i, h, j, B.getBlockData("RED_TERRACOTTA")); + chunk.setBlock(i, h, j, B.getBlockData("RED_TERRACOTTA")); } else { - c.setBlock(i, h, j, B.getBlockData("BLACK_TERRACOTTA")); + chunk.setBlock(i, h, j, B.getBlockData("BLACK_TERRACOTTA")); } } } - - return c; - } - - protected ChunkData generateChunkFastPregen(World world, Random no, int x, int z, BiomeGrid biomeGrid) - { - ChunkData c = Bukkit.createChunkData(world); - - for(int i = 0; i < 16; i++) - { - for(int j = 0; j < 16; j++) - { - int h = 0; - - if(j == i || j + i == 16) - { - c.setBlock(i, h, j, B.getBlockData("BLUE_TERRACOTTA")); - } - - else - { - c.setBlock(i, h, j, B.getBlockData("WHITE_TERRACOTTA")); - } - } - } - - return c; } @Override - public ChunkData generateChunkData(World world, Random no, int x, int z, BiomeGrid biomeGrid) + public void generate(Random no, int x, int z, TerrainChunk terrain) { setHotloadable(false); if(!isDev()) @@ -413,32 +376,21 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements if(failing) { - return generateChunkDataFailure(world, no, x, z, biomeGrid); + generateFailure(no, x, z, terrain); + return; } try { - RNG random = new RNG(world.getSeed()); - init(world, random.nextParallelRNG(0)); - - ChunkData c = Bukkit.createChunkData(world); - - if(!pregenDone && fastPregen) - { - c = generateChunkFastPregen(world, no, x, z, biomeGrid); - } - - else - { - onGenerate(random, x, z, c, biomeGrid); - } - + RNG random = new RNG(getTarget().getSeed()); + init(random.nextParallelRNG(0)); + onGenerate(random, x, z, terrain); generated++; long hits = CNG.hits; CNG.hits = 0; Iris.instance.hit(hits); setHotloadable(true); - return c; + return; } catch(Throwable e) @@ -447,36 +399,23 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements } setHotloadable(true); - return generateChunkDataFailure(world, no, x, z, biomeGrid); + generateFailure(no, x, z, terrain); } - public void checkHotload() - { - if(M.ms() - getHlast() < 1000) - { - return; - } - - if(getWorld() != null) - { - checkHotload(getWorld()); - } - } - - private void checkHotload(World world) + private void doCheckHotload() { if(!isHotloadable()) { return; } + if(M.ms() - getHlast() < 1000) + { + return; + } + if(getPushLatch().flip()) { - if(getWorld() == null) - { - setWorld(world); - } - Iris.hotloader.check((IrisContext) this); if(this instanceof IrisContext) @@ -511,7 +450,7 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements Iris.error("ERROR! Failed to generate chunk! Iris has entered a failed state!"); Iris.error("---------------------------------------------------------------------------------------------------------"); - for(Player i : world.getPlayers()) + for(Player i : getTarget().getPlayers()) { Iris.instance.imsg(i, C.DARK_RED + "Iris Generator has crashed!"); Iris.instance.imsg(i, C.RED + "- Check the console for the error."); @@ -523,18 +462,6 @@ public abstract class ContextualChunkGenerator extends ChunkGenerator implements onFailure(e); } - @Override - public List getDefaultPopulators(World world) - { - return super.getDefaultPopulators(world); - } - - @Override - public Location getFixedSpawnLocation(World world, Random random) - { - return super.getFixedSpawnLocation(world, random); - } - @Override public boolean isParallelCapable() { diff --git a/src/main/java/com/volmit/iris/gen/DimensionChunkGenerator.java b/src/main/java/com/volmit/iris/gen/DimensionChunkGenerator.java index e3e4f71ad..364dc4719 100644 --- a/src/main/java/com/volmit/iris/gen/DimensionChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/DimensionChunkGenerator.java @@ -3,11 +3,11 @@ package com.volmit.iris.gen; import java.io.File; import org.bukkit.Material; -import org.bukkit.World; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; import com.volmit.iris.Iris; +import com.volmit.iris.gen.scaffold.TerrainTarget; import com.volmit.iris.object.InferredType; import com.volmit.iris.object.IrisBiome; import com.volmit.iris.object.IrisDimension; @@ -28,27 +28,14 @@ public abstract class DimensionChunkGenerator extends ContextualChunkGenerator protected static final BlockData BEDROCK = Material.BEDROCK.createBlockData(); protected static final BlockData WATER = Material.WATER.createBlockData(); - public DimensionChunkGenerator(String dimensionName) + public DimensionChunkGenerator(TerrainTarget t, String dimensionName) { - super(); + super(t); setDimensionName(dimensionName); - } - public void onPlayerLeft(Player p) - { - - } - - public void onTick(int m) - { - - } - - public void onInit(World world, RNG masterRandom) - { if(getDimensionName().isEmpty()) { - File folder = new File(world.getWorldFolder(), "iris/dimensions"); + File folder = new File(getTarget().getFolder(), "iris/dimensions"); if(!folder.exists()) { @@ -71,9 +58,32 @@ public abstract class DimensionChunkGenerator extends ContextualChunkGenerator fail(new RuntimeException("Missing dimension folder/file in " + folder.getAbsolutePath())); } + try + { + getData().preferFolder(getDimension().getLoadFile().getParentFile().getParentFile().getName()); + } + + catch(Throwable e) + { + + } + } + + public void onPlayerLeft(Player p) + { + + } + + public void onTick(int m) + { getData().preferFolder(getDimension().getLoadFile().getParentFile().getParentFile().getName()); } + public void onInit(RNG masterRandom) + { + + } + public IrisDimension getDimension() { IrisDimension d = loadDimension(getDimensionName()); diff --git a/src/main/java/com/volmit/iris/gen/IrisChunkGenerator.java b/src/main/java/com/volmit/iris/gen/IrisChunkGenerator.java index 80605f76e..71393a425 100644 --- a/src/main/java/com/volmit/iris/gen/IrisChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/IrisChunkGenerator.java @@ -7,7 +7,6 @@ import java.util.Random; import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; import org.bukkit.event.block.BlockDropItemEvent; @@ -18,6 +17,9 @@ import com.volmit.iris.Iris; import com.volmit.iris.IrisContext; import com.volmit.iris.IrisSettings; import com.volmit.iris.gen.atomics.AtomicRegionData; +import com.volmit.iris.gen.scaffold.IrisGenConfiguration; +import com.volmit.iris.gen.scaffold.TerrainChunk; +import com.volmit.iris.gen.scaffold.TerrainTarget; import com.volmit.iris.gui.Renderer; import com.volmit.iris.noise.CNG; import com.volmit.iris.object.IrisBiome; @@ -43,19 +45,24 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC private IrisRegion hr = null; private boolean spawnable = false; - public IrisChunkGenerator(String dimensionName, int threads) + public IrisChunkGenerator(IrisGenConfiguration config) { - super(dimensionName, threads); + super(config.getTarget(), config.getDimension(), config.getThreads()); } - public IrisChunkGenerator(String dimensionName) + public IrisChunkGenerator(TerrainTarget t, String dimensionName, int threads) { - super(dimensionName, 16); + super(t, dimensionName, threads); } - public IrisChunkGenerator(int tc) + public IrisChunkGenerator(TerrainTarget t, String dimensionName) { - super("", tc); + super(t, dimensionName, 16); + } + + public IrisChunkGenerator(TerrainTarget t, int tc) + { + super(t, "", tc); } public void hotload() @@ -73,26 +80,25 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC } @Override - public ChunkData generateChunkData(World world, Random no, int x, int z, BiomeGrid biomeGrid) + public void generate(Random no, int x, int z, TerrainChunk terrain) { PrecisionStopwatch s = PrecisionStopwatch.start(); - ChunkData c = super.generateChunkData(world, no, x, z, biomeGrid); + super.generate(no, x, z, terrain); s.end(); getMetrics().getTotal().put(s.getMilliseconds()); - return c; } @Override - protected void onGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid) + protected void onGenerate(RNG random, int x, int z, TerrainChunk terrain) { - super.onGenerate(random, x, z, data, grid); + super.onGenerate(random, x, z, terrain); } - public void onInit(World world, RNG rng) + public void onInit(RNG rng) { try { - super.onInit(world, rng); + super.onInit(rng); } catch(Throwable e) @@ -124,7 +130,7 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC { spawnable = true; super.onTick(ticks); - for(Player i : getWorld().getPlayers()) + for(Player i : getTarget().getPlayers()) { Location l = i.getLocation(); IrisRegion r = sampleRegion(l.getBlockX(), l.getBlockZ()); @@ -160,7 +166,7 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC } setSliverCache(null); - Iris.info("Closing Iris Dimension " + getWorld().getName()); + Iris.info("Closing Iris Dimension " + getTarget().getName()); } @Override @@ -231,35 +237,6 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC return bytes / 2; } - @Override - public boolean shouldGenerateCaves() - { - return false; - } - - @Override - public boolean shouldGenerateDecorations() - { - return false; - } - - @Override - public boolean shouldGenerateMobs() - { - return true; - } - - @Override - public boolean shouldGenerateStructures() - { - if(!isInitialized()) - { - return false; - } - - return getDimension().isVanillaStructures(); - } - public Renderer createRenderer() { return (x, z) -> render(x, z); @@ -514,4 +491,36 @@ public class IrisChunkGenerator extends PostBlockChunkGenerator implements IrisC return false; } + + @Override + public boolean canSpawn(int x, int z) + { + return true; + } + + @Override + public boolean shouldGenerateCaves() + { + return getDimension().isVanillaCaves(); + } + + @Override + public boolean shouldGenerateVanillaStructures() + { + return getDimension().isVanillaStructures(); + } + + @Override + public boolean shouldGenerateMobs() + { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean shouldGenerateDecorations() + { + // TODO Auto-generated method stub + return false; + } } diff --git a/src/main/java/com/volmit/iris/gen/ParallaxChunkGenerator.java b/src/main/java/com/volmit/iris/gen/ParallaxChunkGenerator.java index 4d387ba9f..b5cb5b5c6 100644 --- a/src/main/java/com/volmit/iris/gen/ParallaxChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/ParallaxChunkGenerator.java @@ -3,7 +3,6 @@ package com.volmit.iris.gen; import java.io.IOException; import java.util.List; -import org.bukkit.World; import org.bukkit.block.data.BlockData; import org.bukkit.generator.BlockPopulator; @@ -13,6 +12,8 @@ import com.volmit.iris.gen.atomics.AtomicWorldData; import com.volmit.iris.gen.atomics.MasterLock; import com.volmit.iris.gen.layer.GenLayerText; import com.volmit.iris.gen.layer.GenLayerUpdate; +import com.volmit.iris.gen.scaffold.TerrainChunk; +import com.volmit.iris.gen.scaffold.TerrainTarget; import com.volmit.iris.object.IrisBiome; import com.volmit.iris.object.IrisBiomeMutation; import com.volmit.iris.object.IrisObjectPlacement; @@ -49,18 +50,18 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple private GenLayerText glText; private int sliverBuffer; - public ParallaxChunkGenerator(String dimensionName, int threads) + public ParallaxChunkGenerator(TerrainTarget t, String dimensionName, int threads) { - super(dimensionName, threads); + super(t, dimensionName, threads); setSliverCache(new KMap<>()); setSliverBuffer(sliverBuffer); setMasterLock(new MasterLock()); } - public void onInit(World world, RNG rng) + public void onInit(RNG rng) { - super.onInit(world, rng); - setParallaxMap(new AtomicWorldData(world)); + super.onInit(rng); + setParallaxMap(new AtomicWorldData(getTarget())); setGlText(new GenLayerText(this, rng.nextParallelRNG(32485))); setGlUpdate(null); J.a(() -> getDimension().getParallaxSize(this)); @@ -156,15 +157,15 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple return new AtomicSliverMap(); } - + @Override - public List getDefaultPopulators(World world) + public List getPopulators() { - List g = super.getDefaultPopulators(world); + List g = new KList<>(); if(getGlUpdate() == null) { - setGlUpdate(new GenLayerUpdate(this, world)); + setGlUpdate(new GenLayerUpdate(this)); } g.add(getGlUpdate()); @@ -172,20 +173,20 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple } @Override - protected void onPostGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map) + protected void onPostGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map) { if(getSliverCache().size() > 20000) { getSliverCache().clear(); } - super.onPostGenerate(random, x, z, data, grid, height, biomeMap, map); + super.onPostGenerate(random, x, z, terrain, height, biomeMap, map); PrecisionStopwatch p = PrecisionStopwatch.start(); if(getDimension().isPlaceObjects()) { onGenerateParallax(random, x, z); - getParallaxChunk(x, z).inject(data); + getParallaxChunk(x, z).inject(terrain); getParallaxChunk(x, z).injectUpdates(map); getParallaxChunk(x, z).setWorldGenerated(true); } @@ -194,7 +195,7 @@ public abstract class ParallaxChunkGenerator extends TerrainChunkGenerator imple getMasterLock().clear(); p.end(); getMetrics().getParallax().put(p.getMilliseconds()); - super.onPostParallaxPostGenerate(random, x, z, data, grid, height, biomeMap, map); + super.onPostParallaxPostGenerate(random, x, z, terrain, height, biomeMap, map); getParallaxMap().clean(getTicks()); getData().getObjectLoader().clean(); } diff --git a/src/main/java/com/volmit/iris/gen/ParallelChunkGenerator.java b/src/main/java/com/volmit/iris/gen/ParallelChunkGenerator.java index 5341b13cc..a6d19c0e1 100644 --- a/src/main/java/com/volmit/iris/gen/ParallelChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/ParallelChunkGenerator.java @@ -1,10 +1,10 @@ package com.volmit.iris.gen; -import org.bukkit.World; - import com.volmit.iris.Iris; import com.volmit.iris.gen.atomics.AtomicSliver; import com.volmit.iris.gen.atomics.AtomicSliverMap; +import com.volmit.iris.gen.scaffold.TerrainChunk; +import com.volmit.iris.gen.scaffold.TerrainTarget; import com.volmit.iris.util.BiomeMap; import com.volmit.iris.util.GroupedExecutor; import com.volmit.iris.util.HeightMap; @@ -22,9 +22,9 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator private int threads; private boolean cachingAllowed; - public ParallelChunkGenerator(String dimensionName, int threads) + public ParallelChunkGenerator(TerrainTarget t, String dimensionName, int threads) { - super(dimensionName); + super(t, dimensionName); setThreads(threads); setCachingAllowed(false); } @@ -33,7 +33,7 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator { setThreads(tc); GroupedExecutor e = getAccelerant(); - setAccelerant(new GroupedExecutor(threads, Thread.MAX_PRIORITY, "Iris Generator - " + getWorld().getName())); + setAccelerant(new GroupedExecutor(threads, Thread.MAX_PRIORITY, "Iris Generator - " + getTarget().getName())); ; Iris.executors.add(getAccelerant()); @@ -54,16 +54,16 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator protected abstract int onSampleColumnHeight(int cx, int cz, int wx, int wz, int x, int z); - protected abstract void onPostGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map); + protected abstract void onPostGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map); - protected abstract void onPreGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map); + protected abstract void onPreGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map); protected int sampleHeight(int x, int z) { return onSampleColumnHeight(x >> 4, z >> 4, x, z, x & 15, z & 15); } - protected void onGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid) + protected void onGenerate(RNG random, int x, int z, TerrainChunk terrain) { getCache().targetChunk(x, z); PrecisionStopwatch p = PrecisionStopwatch.start(); @@ -73,7 +73,7 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator BiomeMap biomeMap = new BiomeMap(); int ii, jj; - onPreGenerate(random, x, z, data, grid, height, biomeMap, map); + onPreGenerate(random, x, z, terrain, height, biomeMap, map); for(ii = 0; ii < 16; ii++) { @@ -101,10 +101,10 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator } accelerant.waitFor(key); - map.write(data, grid, height); + map.write(terrain, terrain, height); getMetrics().getTerrain().put(p.getMilliseconds()); p = PrecisionStopwatch.start(); - onPostGenerate(random, x, z, data, grid, height, biomeMap, map); + onPostGenerate(random, x, z, terrain, height, biomeMap, map); } protected void onClose() @@ -113,9 +113,9 @@ public abstract class ParallelChunkGenerator extends DimensionChunkGenerator Iris.executors.remove(accelerant); } - public void onInit(World world, RNG rng) + public void onInit(RNG rng) { - super.onInit(world, rng); + super.onInit(rng); changeThreadCount(getThreads()); } diff --git a/src/main/java/com/volmit/iris/gen/PostBlockChunkGenerator.java b/src/main/java/com/volmit/iris/gen/PostBlockChunkGenerator.java index d18ec4867..68ff4d076 100644 --- a/src/main/java/com/volmit/iris/gen/PostBlockChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/PostBlockChunkGenerator.java @@ -1,7 +1,7 @@ package com.volmit.iris.gen; -import org.bukkit.World; import org.bukkit.block.data.BlockData; +import org.bukkit.generator.ChunkGenerator.ChunkData; import com.volmit.iris.Iris; import com.volmit.iris.gen.post.PostFloatingNibDeleter; @@ -11,6 +11,8 @@ import com.volmit.iris.gen.post.PostPotholeFiller; import com.volmit.iris.gen.post.PostSlabber; import com.volmit.iris.gen.post.PostWallPatcher; import com.volmit.iris.gen.post.PostWaterlogger; +import com.volmit.iris.gen.scaffold.TerrainChunk; +import com.volmit.iris.gen.scaffold.TerrainTarget; import com.volmit.iris.util.CaveResult; import com.volmit.iris.util.IPostBlockAccess; import com.volmit.iris.util.IrisLock; @@ -31,22 +33,22 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp private int minPhase; private int maxPhase; - public PostBlockChunkGenerator(String dimensionName, int threads) + public PostBlockChunkGenerator(TerrainTarget t, String dimensionName, int threads) { - super(dimensionName, threads); + super(t, dimensionName, threads); setPostKey("post-" + dimensionName); setPostLock(new IrisLock("PostChunkGenerator")); } - public void onInit(World world, RNG rng) + public void onInit(RNG rng) { - super.onInit(world, rng); + super.onInit(rng); } @Override - protected void onGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid) + protected void onGenerate(RNG random, int x, int z, TerrainChunk terrain) { - super.onGenerate(random, x, z, data, grid); + super.onGenerate(random, x, z, terrain); if(!getDimension().isPostProcessing()) { @@ -76,7 +78,7 @@ public abstract class PostBlockChunkGenerator extends ParallaxChunkGenerator imp { if(f.getPhase() == hh) { - f.onPost(rxx, rzz, x, z, data); + f.onPost(rxx, rzz, x, z, terrain); } } }); diff --git a/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java b/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java index 0ea6aa226..e6e50d46b 100644 --- a/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/TerrainChunkGenerator.java @@ -1,7 +1,6 @@ package com.volmit.iris.gen; import org.bukkit.Material; -import org.bukkit.World; import org.bukkit.block.Biome; import org.bukkit.block.data.Bisected; import org.bukkit.block.data.Bisected.Half; @@ -13,6 +12,8 @@ import com.volmit.iris.gen.atomics.AtomicSliverMap; import com.volmit.iris.gen.layer.GenLayerBiome; import com.volmit.iris.gen.layer.GenLayerCarve; import com.volmit.iris.gen.layer.GenLayerCave; +import com.volmit.iris.gen.scaffold.TerrainChunk; +import com.volmit.iris.gen.scaffold.TerrainTarget; import com.volmit.iris.noise.CNG; import com.volmit.iris.object.DecorationPart; import com.volmit.iris.object.InferredType; @@ -53,17 +54,17 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator private CNG masterFracture; private ChronoLatch cwarn = new ChronoLatch(1000); - public TerrainChunkGenerator(String dimensionName, int threads) + public TerrainChunkGenerator(TerrainTarget t, String dimensionName, int threads) { - super(dimensionName, threads); + super(t, dimensionName, threads); setGenerators(new KMap<>()); setRegionLock(new IrisLock("BiomeChunkGenerator")); } @Override - public void onInit(World world, RNG rng) + public void onInit(RNG rng) { - super.onInit(world, rng); + super.onInit(rng); loadGenerators(); buildGenLayers(getMasterRandom()); } @@ -113,7 +114,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator } @Override - protected void onPreGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map) + protected void onPreGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map) { } @@ -336,23 +337,23 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator } @Override - protected void onGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid) + protected void onGenerate(RNG random, int x, int z, TerrainChunk terrain) { - super.onGenerate(random, x, z, data, grid); + super.onGenerate(random, x, z, terrain); RNG ro = random.nextParallelRNG((x * x * x) - z); IrisRegion region = sampleRegion((x * 16) + 7, (z * 16) + 7); IrisBiome biome = sampleTrueBiome((x * 16) + 7, (z * 16) + 7); for(IrisDepositGenerator k : getDimension().getDeposits()) { - k.generate(data, ro, this, x, z); + k.generate(terrain, ro, this, x, z); } for(IrisDepositGenerator k : region.getDeposits()) { for(int l = 0; l < ro.i(k.getMinPerChunk(), k.getMaxPerChunk()); l++) { - k.generate(data, ro, this, x, z); + k.generate(terrain, ro, this, x, z); } } @@ -360,7 +361,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator { for(int l = 0; l < ro.i(k.getMinPerChunk(), k.getMaxPerChunk()); l++) { - k.generate(data, ro, this, x, z); + k.generate(terrain, ro, this, x, z); } } } @@ -546,17 +547,17 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator } @Override - protected void onPostGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map) + protected void onPostGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map) { - onPreParallaxPostGenerate(random, x, z, data, grid, height, biomeMap, map); + onPreParallaxPostGenerate(random, x, z, terrain, height, biomeMap, map); } - protected void onPreParallaxPostGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map) + protected void onPreParallaxPostGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map) { } - protected void onPostParallaxPostGenerate(RNG random, int x, int z, ChunkData data, BiomeGrid grid, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map) + protected void onPostParallaxPostGenerate(RNG random, int x, int z, TerrainChunk terrain, HeightMap height, BiomeMap biomeMap, AtomicSliverMap map) { } @@ -815,7 +816,7 @@ public abstract class TerrainChunkGenerator extends ParallelChunkGenerator return 0; }); - return M.lerp(lo, hi, gen.getHeight(rx, rz, getWorld().getSeed() + 239945)); + return M.lerp(lo, hi, gen.getHeight(rx, rz, getTarget().getSeed() + 239945)); } protected void loadGenerators() diff --git a/src/main/java/com/volmit/iris/gen/atomics/AtomicRegionData.java b/src/main/java/com/volmit/iris/gen/atomics/AtomicRegionData.java index 1170691cd..fdd3d88e4 100644 --- a/src/main/java/com/volmit/iris/gen/atomics/AtomicRegionData.java +++ b/src/main/java/com/volmit/iris/gen/atomics/AtomicRegionData.java @@ -7,10 +7,9 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.zip.GZIPInputStream; -import org.bukkit.World; - import com.volmit.iris.Iris; import com.volmit.iris.IrisSettings; +import com.volmit.iris.gen.scaffold.TerrainTarget; import com.volmit.iris.util.ByteArrayTag; import com.volmit.iris.util.CompoundTag; import com.volmit.iris.util.CustomOutputStream; @@ -21,10 +20,10 @@ import com.volmit.iris.util.Tag; public class AtomicRegionData { - private final World world; + private final TerrainTarget world; private Tag[] tag; - public AtomicRegionData(World world) + public AtomicRegionData(TerrainTarget world) { this.world = world; tag = new Tag[1024]; @@ -148,7 +147,7 @@ public class AtomicRegionData return data; } - public World getWorld() + public TerrainTarget getWorld() { return world; } diff --git a/src/main/java/com/volmit/iris/gen/atomics/AtomicWorldData.java b/src/main/java/com/volmit/iris/gen/atomics/AtomicWorldData.java index 99923df15..75b09c91e 100644 --- a/src/main/java/com/volmit/iris/gen/atomics/AtomicWorldData.java +++ b/src/main/java/com/volmit/iris/gen/atomics/AtomicWorldData.java @@ -5,9 +5,8 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; -import org.bukkit.World; - import com.volmit.iris.Iris; +import com.volmit.iris.gen.scaffold.TerrainTarget; import com.volmit.iris.util.ChunkPosition; import com.volmit.iris.util.KList; import com.volmit.iris.util.KMap; @@ -15,7 +14,7 @@ import com.volmit.iris.util.M; public class AtomicWorldData { - private World world; + private TerrainTarget world; private KMap loadedChunks; private KMap loadedSections; private KMap lastRegion; @@ -24,7 +23,7 @@ public class AtomicWorldData private KList unloadChunks; private long last = M.ms(); - public AtomicWorldData(World world) + public AtomicWorldData(TerrainTarget world) { this.world = world; loadedSections = new KMap<>(); @@ -254,7 +253,7 @@ public class AtomicWorldData public File getSubregionFolder() { - return new File(world.getWorldFolder(), "region-parallax"); + return new File(world.getFolder(), "parallax"); } public KMap getLoadedChunks() diff --git a/src/main/java/com/volmit/iris/gen/layer/GenLayerUpdate.java b/src/main/java/com/volmit/iris/gen/layer/GenLayerUpdate.java index 614ae4d13..43f474557 100644 --- a/src/main/java/com/volmit/iris/gen/layer/GenLayerUpdate.java +++ b/src/main/java/com/volmit/iris/gen/layer/GenLayerUpdate.java @@ -32,10 +32,10 @@ public class GenLayerUpdate extends BlockPopulator private ParallaxChunkGenerator gen; private RNG rng; - public GenLayerUpdate(ParallaxChunkGenerator gen, World w) + public GenLayerUpdate(ParallaxChunkGenerator gen) { this.gen = gen; - this.rng = new RNG(w.getSeed() + 4996788).nextParallelRNG(-98618289); + this.rng = new RNG(gen.getTarget().getSeed() + 4996788).nextParallelRNG(-98618289); } @Override diff --git a/src/main/java/com/volmit/iris/gen/nms/NMSCreator.java b/src/main/java/com/volmit/iris/gen/nms/NMSCreator.java new file mode 100644 index 000000000..488178255 --- /dev/null +++ b/src/main/java/com/volmit/iris/gen/nms/NMSCreator.java @@ -0,0 +1,48 @@ +package com.volmit.iris.gen.nms; + +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.WorldCreator; + +import com.volmit.iris.Iris; + +public class NMSCreator +{ + public static World createWorld(WorldCreator creator) + { + return createWorld(creator, true); + } + + public static World createWorld(WorldCreator creator, boolean loadSpawn) + { + try + { + String code = Iris.nmsTag(); + + if(code.equals("v1_16_R2")) + { + return NMSCreator162.createWorld(creator, loadSpawn); + } + else if(code.equals("v1_16_R1")) + { + return NMSCreator161.createWorld(creator, loadSpawn); + } + else if(code.equals("v1_15_R1")) + { + return NMSCreator151.createWorld(creator, loadSpawn); + } + else if(code.equals("v1_14_R1")) + { + return NMSCreator141.createWorld(creator, loadSpawn); + } + } + + catch(Throwable e) + { + e.printStackTrace(); + Iris.warn("Failed to load NMS Spawn for MC:" + Iris.nmsTag() + ". Using Bukkit..."); + } + + return Bukkit.createWorld(creator); + } +} diff --git a/src/main/java/com/volmit/iris/gen/nms/NMSCreator141.java b/src/main/java/com/volmit/iris/gen/nms/NMSCreator141.java new file mode 100644 index 000000000..c07fc5833 --- /dev/null +++ b/src/main/java/com/volmit/iris/gen/nms/NMSCreator141.java @@ -0,0 +1,134 @@ +package com.volmit.iris.gen.nms; + +import java.io.File; +import java.util.Locale; +import java.util.Map; + +import org.apache.commons.lang.Validate; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.WorldCreator; +import org.bukkit.craftbukkit.v1_14_R1.CraftServer; +import org.bukkit.event.Event; +import org.bukkit.event.world.WorldInitEvent; +import org.bukkit.event.world.WorldLoadEvent; +import org.bukkit.generator.ChunkGenerator; + +import com.google.common.base.Preconditions; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; +import com.volmit.iris.util.V; + +import net.minecraft.server.v1_14_R1.DedicatedServer; +import net.minecraft.server.v1_14_R1.DimensionManager; +import net.minecraft.server.v1_14_R1.EnumDifficulty; +import net.minecraft.server.v1_14_R1.EnumGamemode; +import net.minecraft.server.v1_14_R1.GameProfilerFiller; +import net.minecraft.server.v1_14_R1.MinecraftServer; +import net.minecraft.server.v1_14_R1.WorldData; +import net.minecraft.server.v1_14_R1.WorldNBTStorage; +import net.minecraft.server.v1_14_R1.WorldProvider; +import net.minecraft.server.v1_14_R1.WorldServer; +import net.minecraft.server.v1_14_R1.WorldSettings; + +public class NMSCreator141 +{ + @SuppressWarnings({"resource", "deprecation"}) + public static World createWorld(WorldCreator creator, boolean loadSpawn) + { + CraftServer server = ((CraftServer) Bukkit.getServer()); + Map worlds = new V(server).get("worlds"); + DedicatedServer console = new V(server).get("console"); + WorldSettings worldSettings; + Preconditions.checkState((boolean) (!console.worldServer.isEmpty()), (Object) "Cannot create additional worlds on STARTUP"); + Validate.notNull((Object) creator, (String) "Creator may not be null"); + String name = creator.name(); + ChunkGenerator generator = creator.generator(); + File folder = new File(server.getWorldContainer(), name); + World world = server.getWorld(name); + net.minecraft.server.v1_14_R1.WorldType type = net.minecraft.server.v1_14_R1.WorldType.getType((String) creator.type().getName()); + boolean generateStructures = creator.generateStructures(); + if(world != null) + { + return world; + } + if(folder.exists() && !folder.isDirectory()) + { + throw new IllegalArgumentException("File exists with the name '" + name + "' and isn't a folder"); + } + if(generator == null) + { + generator = server.getGenerator(name); + } + console.convertWorld(name); + int dimension = 10 + console.worldServer.size(); + boolean used = false; + block0: do + { + for(WorldServer ss : console.getWorlds()) + { + @SuppressWarnings("unused") + boolean bl = used = ss.getWorldProvider().getDimensionManager().getDimensionID() == dimension; + if(!used) + continue; + ++dimension; + continue block0; + } + } + while(used); + boolean hardcore = false; + WorldNBTStorage sdm = new WorldNBTStorage(server.getWorldContainer(), name, (MinecraftServer) server.getServer(), server.getHandle().getServer().dataConverterManager); + WorldData worlddata = sdm.getWorldData(); + if(worlddata == null) + { + worldSettings = new WorldSettings(creator.seed(), EnumGamemode.getById((int) server.getDefaultGameMode().getValue()), generateStructures, hardcore, type); + JsonElement parsedSettings = new JsonParser().parse(creator.generatorSettings()); + if(parsedSettings.isJsonObject()) + { + worldSettings.setGeneratorSettings((JsonElement) parsedSettings.getAsJsonObject()); + } + worlddata = new WorldData(worldSettings, name); + } + else + { + worlddata.setName(name); + worldSettings = new WorldSettings(worlddata); + } + DimensionManager actualDimension = DimensionManager.a((int) creator.environment().getId()); + DimensionManager internalDimension = DimensionManager.register((String) name.toLowerCase(Locale.ENGLISH), (DimensionManager) new DimensionManager(dimension, actualDimension.getSuffix(), actualDimension.folder, (w, manager) -> (WorldProvider) manager.providerFactory.apply(w, manager), actualDimension.hasSkyLight(), actualDimension)); + //@builder + WorldServer internal = new WorldServer( + (MinecraftServer)console, + console.executorService, + sdm, + worlddata, + internalDimension, + (GameProfilerFiller)console.getMethodProfiler(), + server.getServer().worldLoadListenerFactory.create(11), + creator.environment(), + generator); + //@done + if(!worlds.containsKey(name.toLowerCase(Locale.ENGLISH))) + { + return null; + } + console.initWorld(internal, worlddata, worldSettings); + internal.worldData.setDifficulty(EnumDifficulty.EASY); + internal.setSpawnFlags(true, true); + console.worldServer.put(internal.getWorldProvider().getDimensionManager(), internal); + server.getPluginManager().callEvent((Event) new WorldInitEvent((World) internal.getWorld())); + + if(loadSpawn) + { + server.getServer().loadSpawn(internal.getChunkProvider().playerChunkMap.worldLoadListener, internal); + } + + else + { + MinecraftServer.LOGGER.info("Preparing start region for dimens... Oh wait, We don't do that here anymore."); + } + + server.getPluginManager().callEvent((Event) new WorldLoadEvent((World) internal.getWorld())); + return internal.getWorld(); + } +} diff --git a/src/main/java/com/volmit/iris/gen/nms/NMSCreator151.java b/src/main/java/com/volmit/iris/gen/nms/NMSCreator151.java new file mode 100644 index 000000000..6b29deea1 --- /dev/null +++ b/src/main/java/com/volmit/iris/gen/nms/NMSCreator151.java @@ -0,0 +1,134 @@ +package com.volmit.iris.gen.nms; + +import java.io.File; +import java.util.Locale; +import java.util.Map; + +import org.apache.commons.lang.Validate; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.WorldCreator; +import org.bukkit.craftbukkit.v1_15_R1.CraftServer; +import org.bukkit.event.Event; +import org.bukkit.event.world.WorldInitEvent; +import org.bukkit.event.world.WorldLoadEvent; +import org.bukkit.generator.ChunkGenerator; + +import com.google.common.base.Preconditions; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; +import com.volmit.iris.util.V; + +import net.minecraft.server.v1_15_R1.DedicatedServer; +import net.minecraft.server.v1_15_R1.DimensionManager; +import net.minecraft.server.v1_15_R1.EnumDifficulty; +import net.minecraft.server.v1_15_R1.EnumGamemode; +import net.minecraft.server.v1_15_R1.GameProfilerFiller; +import net.minecraft.server.v1_15_R1.MinecraftServer; +import net.minecraft.server.v1_15_R1.WorldData; +import net.minecraft.server.v1_15_R1.WorldNBTStorage; +import net.minecraft.server.v1_15_R1.WorldProvider; +import net.minecraft.server.v1_15_R1.WorldServer; +import net.minecraft.server.v1_15_R1.WorldSettings; + +public class NMSCreator151 +{ + @SuppressWarnings({"resource", "deprecation"}) + public static World createWorld(WorldCreator creator, boolean loadSpawn) + { + CraftServer server = ((CraftServer) Bukkit.getServer()); + Map worlds = new V(server).get("worlds"); + DedicatedServer console = new V(server).get("console"); + WorldSettings worldSettings; + Preconditions.checkState((boolean) (!console.worldServer.isEmpty()), (Object) "Cannot create additional worlds on STARTUP"); + Validate.notNull((Object) creator, (String) "Creator may not be null"); + String name = creator.name(); + ChunkGenerator generator = creator.generator(); + File folder = new File(server.getWorldContainer(), name); + World world = server.getWorld(name); + net.minecraft.server.v1_15_R1.WorldType type = net.minecraft.server.v1_15_R1.WorldType.getType((String) creator.type().getName()); + boolean generateStructures = creator.generateStructures(); + if(world != null) + { + return world; + } + if(folder.exists() && !folder.isDirectory()) + { + throw new IllegalArgumentException("File exists with the name '" + name + "' and isn't a folder"); + } + if(generator == null) + { + generator = server.getGenerator(name); + } + console.convertWorld(name); + int dimension = 10 + console.worldServer.size(); + boolean used = false; + block0: do + { + for(WorldServer ss : console.getWorlds()) + { + @SuppressWarnings("unused") + boolean bl = used = ss.getWorldProvider().getDimensionManager().getDimensionID() == dimension; + if(!used) + continue; + ++dimension; + continue block0; + } + } + while(used); + boolean hardcore = false; + WorldNBTStorage sdm = new WorldNBTStorage(server.getWorldContainer(), name, (MinecraftServer) server.getServer(), server.getHandle().getServer().dataConverterManager); + WorldData worlddata = sdm.getWorldData(); + if(worlddata == null) + { + worldSettings = new WorldSettings(creator.seed(), EnumGamemode.getById((int) server.getDefaultGameMode().getValue()), generateStructures, hardcore, type); + JsonElement parsedSettings = new JsonParser().parse(creator.generatorSettings()); + if(parsedSettings.isJsonObject()) + { + worldSettings.setGeneratorSettings((JsonElement) parsedSettings.getAsJsonObject()); + } + worlddata = new WorldData(worldSettings, name); + } + else + { + worlddata.setName(name); + worldSettings = new WorldSettings(worlddata); + } + DimensionManager actualDimension = DimensionManager.a((int) creator.environment().getId()); + DimensionManager internalDimension = DimensionManager.register((String) name.toLowerCase(Locale.ENGLISH), (DimensionManager) new DimensionManager(dimension, actualDimension.getSuffix(), actualDimension.folder, (w, manager) -> (WorldProvider) manager.providerFactory.apply(w, manager), actualDimension.hasSkyLight(), actualDimension.getGenLayerZoomer(), actualDimension)); + //@builder + WorldServer internal = new WorldServer( + (MinecraftServer)console, + console.executorService, + sdm, + worlddata, + internalDimension, + (GameProfilerFiller)console.getMethodProfiler(), + server.getServer().worldLoadListenerFactory.create(11), + creator.environment(), + generator); + //@done + if(!worlds.containsKey(name.toLowerCase(Locale.ENGLISH))) + { + return null; + } + console.initWorld(internal, worlddata, worldSettings); + internal.worldData.setDifficulty(EnumDifficulty.EASY); + internal.setSpawnFlags(true, true); + console.worldServer.put(internal.getWorldProvider().getDimensionManager(), internal); + server.getPluginManager().callEvent((Event) new WorldInitEvent((World) internal.getWorld())); + + if(loadSpawn) + { + server.getServer().loadSpawn(internal.getChunkProvider().playerChunkMap.worldLoadListener, internal); + } + + else + { + MinecraftServer.LOGGER.info("Preparing start region for dimens... Oh wait, We don't do that here anymore."); + } + + server.getPluginManager().callEvent((Event) new WorldLoadEvent((World) internal.getWorld())); + return internal.getWorld(); + } +} diff --git a/src/main/java/com/volmit/iris/gen/nms/NMSCreator161.java b/src/main/java/com/volmit/iris/gen/nms/NMSCreator161.java new file mode 100644 index 000000000..1192288ad --- /dev/null +++ b/src/main/java/com/volmit/iris/gen/nms/NMSCreator161.java @@ -0,0 +1,208 @@ +package com.volmit.iris.gen.nms; + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.Properties; +import java.util.Random; + +import org.apache.commons.lang.Validate; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.WorldCreator; +import org.bukkit.craftbukkit.v1_16_R1.CraftServer; +import org.bukkit.event.Event; +import org.bukkit.event.world.WorldInitEvent; +import org.bukkit.event.world.WorldLoadEvent; + +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; +import com.mojang.serialization.DynamicOps; +import com.mojang.serialization.Lifecycle; +import com.volmit.iris.util.V; + +import net.minecraft.server.v1_16_R1.BiomeManager; +import net.minecraft.server.v1_16_R1.Convertable; +import net.minecraft.server.v1_16_R1.DedicatedServer; +import net.minecraft.server.v1_16_R1.DimensionManager; +import net.minecraft.server.v1_16_R1.DynamicOpsNBT; +import net.minecraft.server.v1_16_R1.EnumDifficulty; +import net.minecraft.server.v1_16_R1.EnumGamemode; +import net.minecraft.server.v1_16_R1.GameRules; +import net.minecraft.server.v1_16_R1.GeneratorSettings; +import net.minecraft.server.v1_16_R1.IRegistry; +import net.minecraft.server.v1_16_R1.IWorldDataServer; +import net.minecraft.server.v1_16_R1.MinecraftKey; +import net.minecraft.server.v1_16_R1.MinecraftServer; +import net.minecraft.server.v1_16_R1.MobSpawner; +import net.minecraft.server.v1_16_R1.MobSpawnerCat; +import net.minecraft.server.v1_16_R1.MobSpawnerPatrol; +import net.minecraft.server.v1_16_R1.MobSpawnerPhantom; +import net.minecraft.server.v1_16_R1.MobSpawnerTrader; +import net.minecraft.server.v1_16_R1.NBTBase; +import net.minecraft.server.v1_16_R1.RegistryMaterials; +import net.minecraft.server.v1_16_R1.RegistryReadOps; +import net.minecraft.server.v1_16_R1.ResourceKey; +import net.minecraft.server.v1_16_R1.SaveData; +import net.minecraft.server.v1_16_R1.VillageSiege; +import net.minecraft.server.v1_16_R1.WorldDataServer; +import net.minecraft.server.v1_16_R1.WorldDimension; +import net.minecraft.server.v1_16_R1.WorldServer; +import net.minecraft.server.v1_16_R1.WorldSettings; + +public class NMSCreator161 +{ + @SuppressWarnings({"unchecked", "rawtypes", "resource"}) + public static World createWorld(WorldCreator creator, boolean loadSpawn) + { + CraftServer server = ((CraftServer) Bukkit.getServer()); + Map worlds = new V(server).get("worlds"); + DedicatedServer console = new V(server).get("console"); + Preconditions.checkState(!console.worldServer.isEmpty(), (Object) "Cannot create additional worlds on STARTUP"); + Validate.notNull((Object) creator, "Creator may not be null"); + final String name = creator.name(); + org.bukkit.generator.ChunkGenerator generator = creator.generator(); + final File folder = new File(server.getWorldContainer(), name); + final World world = server.getWorld(name); + + if(world != null) + { + return world; + } + + if(folder.exists() && !folder.isDirectory()) + { + throw new IllegalArgumentException("File exists with the name '" + name + "' and isn't a folder"); + } + + if(generator == null) + { + generator = server.getGenerator(name); + } + + ResourceKey actualDimension = null; + switch(creator.environment()) + { + case NORMAL: + { + actualDimension = (ResourceKey) WorldDimension.OVERWORLD; + break; + } + case NETHER: + { + actualDimension = (ResourceKey) WorldDimension.THE_NETHER; + break; + } + case THE_END: + { + actualDimension = (ResourceKey) WorldDimension.THE_END; + break; + } + default: + { + throw new IllegalArgumentException("Illegal dimension"); + } + } + Convertable.ConversionSession worldSession; + try + { + worldSession = Convertable.a(server.getWorldContainer().toPath()).c(name, (ResourceKey) actualDimension); + } + catch(IOException ex) + { + throw new RuntimeException(ex); + } + MinecraftServer.convertWorld(worldSession); + final boolean hardcore = creator.hardcore(); + final RegistryReadOps registryreadops = (RegistryReadOps) RegistryReadOps.a((DynamicOps) DynamicOpsNBT.a, console.dataPackResources.h(), console.f); + WorldDataServer worlddata = (WorldDataServer) worldSession.a((DynamicOps) registryreadops, console.datapackconfiguration); + if(worlddata == null) + { + final 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) properties); + @SuppressWarnings("deprecation") + final WorldSettings worldSettings = new WorldSettings(name, EnumGamemode.getById(server.getDefaultGameMode().getValue()), hardcore, EnumDifficulty.EASY, false, new GameRules(), console.datapackconfiguration); + worlddata = new WorldDataServer(worldSettings, generatorsettings, Lifecycle.stable()); + } + worlddata.checkName(name); + worlddata.a(console.getServerModName(), console.getModded().isPresent()); + final long j = BiomeManager.a(creator.seed()); + final List list = (List) ImmutableList.of((MobSpawner) new MobSpawnerPhantom(), (MobSpawner) new MobSpawnerPatrol(), (MobSpawner) new MobSpawnerCat(), (MobSpawner) new VillageSiege(), (MobSpawner) new MobSpawnerTrader((IWorldDataServer) worlddata)); + RegistryMaterials registrymaterials = worlddata.getGeneratorSettings().e(); + final WorldDimension worlddimension = (WorldDimension) registrymaterials.a((ResourceKey) actualDimension); + DimensionManager dimensionmanager; + net.minecraft.server.v1_16_R1.ChunkGenerator chunkgenerator; + + if(worlddimension == null) + { + dimensionmanager = DimensionManager.a(); + chunkgenerator = GeneratorSettings.a((long) new Random().nextLong()); + } + + else + { + dimensionmanager = worlddimension.b(); + chunkgenerator = worlddimension.c(); + } + + ResourceKey typeKey = (ResourceKey) console.f.a().c(dimensionmanager).orElseThrow(() -> new IllegalStateException("Unregistered dimension type: " + (Object) dimensionmanager)); + ResourceKey worldKey = ResourceKey.a((ResourceKey) IRegistry.ae, (MinecraftKey) new MinecraftKey(name.toLowerCase(Locale.ENGLISH))); + + //@builder + WorldServer internal = new WorldServer( + (MinecraftServer)console, + console.executorService, + worldSession, + (IWorldDataServer)worlddata, + worldKey, + typeKey, + dimensionmanager, + server.getServer().worldLoadListenerFactory.create(11), + chunkgenerator, + worlddata.getGeneratorSettings().isDebugWorld(), + j, + (List)(creator.environment() == World.Environment.NORMAL ? list : ImmutableList.of()), + true, + creator.environment(), + generator); + + //@done + if(!worlds.containsKey(name.toLowerCase(Locale.ENGLISH))) + { + try + { + internal.close(); + } + + catch(IOException e) + { + e.printStackTrace(); + } + + return null; + } + console.initWorld(internal, (IWorldDataServer) worlddata, (SaveData) worlddata, worlddata.getGeneratorSettings()); + internal.setSpawnFlags(true, true); + console.worldServer.put(internal.getDimensionKey(), internal); + server.getPluginManager().callEvent((Event) new WorldInitEvent((World) internal.getWorld())); + if(loadSpawn) + { + server.getServer().loadSpawn(internal.getChunkProvider().playerChunkMap.worldLoadListener, internal); + } + + else + { + MinecraftServer.LOGGER.info("Preparing start region for dimens... Oh wait, We don't do that here anymore."); + } + + server.getPluginManager().callEvent((Event) new WorldLoadEvent((World) internal.getWorld())); + return (World) internal.getWorld(); + } +} diff --git a/src/main/java/com/volmit/iris/gen/nms/NMSCreator162.java b/src/main/java/com/volmit/iris/gen/nms/NMSCreator162.java new file mode 100644 index 000000000..0171a6bd8 --- /dev/null +++ b/src/main/java/com/volmit/iris/gen/nms/NMSCreator162.java @@ -0,0 +1,209 @@ +package com.volmit.iris.gen.nms; + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.Properties; +import java.util.Random; + +import org.apache.commons.lang.Validate; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.WorldCreator; +import org.bukkit.craftbukkit.v1_16_R2.CraftServer; +import org.bukkit.event.Event; +import org.bukkit.event.world.WorldInitEvent; +import org.bukkit.event.world.WorldLoadEvent; + +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import com.mojang.serialization.DynamicOps; +import com.mojang.serialization.Lifecycle; +import com.volmit.iris.util.V; + +import net.minecraft.server.v1_16_R2.BiomeBase; +import net.minecraft.server.v1_16_R2.BiomeManager; +import net.minecraft.server.v1_16_R2.Convertable; +import net.minecraft.server.v1_16_R2.DataConverterRegistry; +import net.minecraft.server.v1_16_R2.DedicatedServer; +import net.minecraft.server.v1_16_R2.DimensionManager; +import net.minecraft.server.v1_16_R2.DynamicOpsNBT; +import net.minecraft.server.v1_16_R2.EnumDifficulty; +import net.minecraft.server.v1_16_R2.EnumGamemode; +import net.minecraft.server.v1_16_R2.GameRules; +import net.minecraft.server.v1_16_R2.GeneratorSettingBase; +import net.minecraft.server.v1_16_R2.GeneratorSettings; +import net.minecraft.server.v1_16_R2.IRegistry; +import net.minecraft.server.v1_16_R2.IWorldDataServer; +import net.minecraft.server.v1_16_R2.MinecraftKey; +import net.minecraft.server.v1_16_R2.MinecraftServer; +import net.minecraft.server.v1_16_R2.MobSpawner; +import net.minecraft.server.v1_16_R2.MobSpawnerCat; +import net.minecraft.server.v1_16_R2.MobSpawnerPatrol; +import net.minecraft.server.v1_16_R2.MobSpawnerPhantom; +import net.minecraft.server.v1_16_R2.MobSpawnerTrader; +import net.minecraft.server.v1_16_R2.NBTBase; +import net.minecraft.server.v1_16_R2.RegistryMaterials; +import net.minecraft.server.v1_16_R2.RegistryReadOps; +import net.minecraft.server.v1_16_R2.ResourceKey; +import net.minecraft.server.v1_16_R2.SaveData; +import net.minecraft.server.v1_16_R2.VillageSiege; +import net.minecraft.server.v1_16_R2.WorldDataServer; +import net.minecraft.server.v1_16_R2.WorldDimension; +import net.minecraft.server.v1_16_R2.WorldServer; +import net.minecraft.server.v1_16_R2.WorldSettings; + +public class NMSCreator162 +{ + @SuppressWarnings({"unchecked", "rawtypes", "resource"}) + public static World createWorld(WorldCreator creator, boolean loadSpawn) + { + CraftServer server = ((CraftServer) Bukkit.getServer()); + Map worlds = new V(server).get("worlds"); + DedicatedServer console = new V(server).get("console"); + Preconditions.checkState(!console.worldServer.isEmpty(), (Object) "Cannot create additional worlds on STARTUP"); + Validate.notNull((Object) creator, "Creator may not be null"); + final String name = creator.name(); + org.bukkit.generator.ChunkGenerator generator = creator.generator(); + final File folder = new File(server.getWorldContainer(), name); + final World world = server.getWorld(name); + + if(world != null) + { + return world; + } + + if(folder.exists() && !folder.isDirectory()) + { + throw new IllegalArgumentException("File exists with the name '" + name + "' and isn't a folder"); + } + + if(generator == null) + { + generator = server.getGenerator(name); + } + + ResourceKey actualDimension = null; + switch(creator.environment()) + { + case NORMAL: + { + actualDimension = (ResourceKey) WorldDimension.OVERWORLD; + break; + } + case NETHER: + { + actualDimension = (ResourceKey) WorldDimension.THE_NETHER; + break; + } + case THE_END: + { + actualDimension = (ResourceKey) WorldDimension.THE_END; + break; + } + default: + { + throw new IllegalArgumentException("Illegal dimension"); + } + } + Convertable.ConversionSession worldSession; + try + { + worldSession = Convertable.a(server.getWorldContainer().toPath()).c(name, (ResourceKey) actualDimension); + } + catch(IOException ex) + { + throw new RuntimeException(ex); + } + MinecraftServer.convertWorld(worldSession); + final boolean hardcore = creator.hardcore(); + final RegistryReadOps registryreadops = (RegistryReadOps) RegistryReadOps.a((DynamicOps) DynamicOpsNBT.a, console.dataPackResources.h(), console.f); + WorldDataServer worlddata = (WorldDataServer) worldSession.a((DynamicOps) registryreadops, console.datapackconfiguration); + if(worlddata == null) + { + final 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())); + final GeneratorSettings generatorsettings = GeneratorSettings.a(console.aX(), properties); + @SuppressWarnings("deprecation") + final WorldSettings worldSettings = new WorldSettings(name, EnumGamemode.getById(server.getDefaultGameMode().getValue()), hardcore, EnumDifficulty.EASY, false, new GameRules(), console.datapackconfiguration); + worlddata = new WorldDataServer(worldSettings, generatorsettings, 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(worldSession, DataConverterRegistry.a(), console.options.has("eraseCache"), () -> true, (ImmutableSet) worlddata.getGeneratorSettings().d().d().stream().map(entry -> ResourceKey.a(IRegistry.K, entry.getKey().a())).collect(ImmutableSet.toImmutableSet())); + } + final long j = BiomeManager.a(creator.seed()); + final List list = (List) ImmutableList.of((MobSpawner) new MobSpawnerPhantom(), (MobSpawner) new MobSpawnerPatrol(), (MobSpawner) new MobSpawnerCat(), (MobSpawner) new VillageSiege(), (MobSpawner) new MobSpawnerTrader((IWorldDataServer) worlddata)); + final RegistryMaterials registrymaterials = (RegistryMaterials) worlddata.getGeneratorSettings().d(); + final WorldDimension worlddimension = (WorldDimension) registrymaterials.a((ResourceKey) actualDimension); + DimensionManager dimensionmanager; + net.minecraft.server.v1_16_R2.ChunkGenerator chunkgenerator; + + if(worlddimension == null) + { + dimensionmanager = (DimensionManager) console.f.a().d(DimensionManager.OVERWORLD); + chunkgenerator = (net.minecraft.server.v1_16_R2.ChunkGenerator) GeneratorSettings.a((IRegistry) console.f.b(IRegistry.ay), (IRegistry) console.f.b(IRegistry.ar), new Random().nextLong()); + } + else + { + dimensionmanager = worlddimension.b(); + chunkgenerator = worlddimension.c(); + } + + final ResourceKey worldKey = (ResourceKey) ResourceKey.a(IRegistry.L, new MinecraftKey(name.toLowerCase(Locale.ENGLISH))); + //@builder + final WorldServer internal = new WorldServer((MinecraftServer) console, + console.executorService, worldSession, + (IWorldDataServer) worlddata, + (ResourceKey) worldKey, + dimensionmanager, + server.getServer().worldLoadListenerFactory.create(11), + chunkgenerator, + worlddata.getGeneratorSettings().isDebugWorld(), + j, + (List) ((creator.environment() == World.Environment.NORMAL) ? list : ImmutableList.of()), + true, + creator.environment(), + generator); + //@done + if(!worlds.containsKey(name.toLowerCase(Locale.ENGLISH))) + { + try + { + internal.close(); + } + + catch(IOException e) + { + e.printStackTrace(); + } + + return null; + } + console.initWorld(internal, (IWorldDataServer) worlddata, (SaveData) worlddata, worlddata.getGeneratorSettings()); + internal.setSpawnFlags(true, true); + console.worldServer.put(internal.getDimensionKey(), internal); + server.getPluginManager().callEvent((Event) new WorldInitEvent((World) internal.getWorld())); + if(loadSpawn) + { + server.getServer().loadSpawn(internal.getChunkProvider().playerChunkMap.worldLoadListener, internal); + } + + else + { + MinecraftServer.LOGGER.info("Preparing start region for dimens... Oh wait, We don't do that here anymore."); + } + + server.getPluginManager().callEvent((Event) new WorldLoadEvent((World) internal.getWorld())); + return (World) internal.getWorld(); + } +} diff --git a/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java b/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java new file mode 100644 index 000000000..bfc19e222 --- /dev/null +++ b/src/main/java/com/volmit/iris/gen/provisions/ProvisionBukkit.java @@ -0,0 +1,93 @@ +package com.volmit.iris.gen.provisions; + +import java.util.List; +import java.util.Random; + +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.generator.BlockPopulator; +import org.bukkit.generator.ChunkGenerator; + +import com.volmit.iris.gen.scaffold.HeightedFakeWorld; +import com.volmit.iris.gen.scaffold.Provisioned; +import com.volmit.iris.gen.scaffold.TerrainChunk; +import com.volmit.iris.gen.scaffold.TerrainProvider; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = false) +public class ProvisionBukkit extends ChunkGenerator implements Provisioned +{ + private HeightedFakeWorld fakeworld = null; + private boolean worldSet = false; + private final TerrainProvider provider; + + public ProvisionBukkit(TerrainProvider provider) + { + this.provider = provider; + } + + @Override + public ChunkData generateChunkData(World world, Random random, int x, int z, BiomeGrid biome) + { + if(!worldSet) + { + worldSet = true; + provider.getTarget().setRealWorld(world); + } + + TerrainChunk terrain = TerrainChunk.create(world, biome); + getProvider().generate(random, x, z, terrain); + return terrain.getRaw(); + } + + @Override + public boolean canSpawn(World world, int x, int z) + { + return provider.canSpawn(x, z); + } + + @Override + public List getDefaultPopulators(World world) + { + return provider.getPopulators(); + } + + @Override + public Location getFixedSpawnLocation(World world, Random random) + { + return super.getFixedSpawnLocation(world, random); + } + + @Override + public boolean isParallelCapable() + { + return provider.isParallelCapable(); + } + + @Override + public boolean shouldGenerateCaves() + { + return provider.shouldGenerateCaves(); + } + + @Override + public boolean shouldGenerateDecorations() + { + return super.shouldGenerateDecorations(); + } + + @Override + public boolean shouldGenerateMobs() + { + return provider.shouldGenerateMobs(); + } + + @Override + public boolean shouldGenerateStructures() + { + return provider.shouldGenerateVanillaStructures(); + } +} diff --git a/src/main/java/com/volmit/iris/gen/scaffold/BukkitTerrainProvider.java b/src/main/java/com/volmit/iris/gen/scaffold/BukkitTerrainProvider.java deleted file mode 100644 index c110f0b86..000000000 --- a/src/main/java/com/volmit/iris/gen/scaffold/BukkitTerrainProvider.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.volmit.iris.gen.bindings; - -import java.util.List; -import java.util.Random; - -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.generator.BlockPopulator; -import org.bukkit.generator.ChunkGenerator; - -public abstract class BukkitTerrainProvider extends ChunkGenerator implements TerrainProvider -{ - private final TerrainTarget target; - - public BukkitTerrainProvider(TerrainTarget target) - { - this.target = target; - } - - @Override - public abstract void generate(Random random, int x, int z, TerrainChunk chunk); - - @Override - public ChunkData generateChunkData(World world, Random random, int x, int z, BiomeGrid biome) - { - TerrainChunk terrain = TerrainChunk.create(world); - generate(random, x, z, terrain); - return terrain; - } - - @Override - public abstract boolean canSpawn(World world, int x, int z); - - @Override - public boolean canSpawnDefault(World world, int x, int z) - { - return super.canSpawn(world, x, z); - } - - @Override - public abstract List getDefaultPopulators(World world); - - @Override - public abstract Location getFixedSpawnLocation(World world, Random random); - - @Override - public abstract boolean isParallelCapable(); - - @Override - public abstract boolean shouldGenerateCaves(); - - @Override - public abstract boolean shouldGenerateDecorations(); - - @Override - public abstract boolean shouldGenerateMobs(); - - @Override - public abstract boolean shouldGenerateStructures(); - - @Override - public TerrainTarget getTarget() - { - return target; - } -} diff --git a/src/main/java/com/volmit/iris/gen/scaffold/HeightedFakeWorld.java b/src/main/java/com/volmit/iris/gen/scaffold/HeightedFakeWorld.java new file mode 100644 index 000000000..a5a640512 --- /dev/null +++ b/src/main/java/com/volmit/iris/gen/scaffold/HeightedFakeWorld.java @@ -0,0 +1,1305 @@ +package com.volmit.iris.gen.scaffold; + +import java.io.File; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.function.Predicate; + +import org.bukkit.BlockChangeDelegate; +import org.bukkit.Chunk; +import org.bukkit.ChunkSnapshot; +import org.bukkit.Difficulty; +import org.bukkit.Effect; +import org.bukkit.FluidCollisionMode; +import org.bukkit.GameRule; +import org.bukkit.HeightMap; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Particle; +import org.bukkit.Raid; +import org.bukkit.Sound; +import org.bukkit.SoundCategory; +import org.bukkit.StructureType; +import org.bukkit.TreeType; +import org.bukkit.World; +import org.bukkit.WorldBorder; +import org.bukkit.WorldType; +import org.bukkit.block.Biome; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.boss.DragonBattle; +import org.bukkit.entity.AbstractArrow; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.FallingBlock; +import org.bukkit.entity.Item; +import org.bukkit.entity.LightningStrike; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.generator.BlockPopulator; +import org.bukkit.generator.ChunkGenerator; +import org.bukkit.inventory.ItemStack; +import org.bukkit.material.MaterialData; +import org.bukkit.metadata.MetadataValue; +import org.bukkit.plugin.Plugin; +import org.bukkit.util.BoundingBox; +import org.bukkit.util.Consumer; +import org.bukkit.util.RayTraceResult; +import org.bukkit.util.Vector; + +@SuppressWarnings("deprecation") +public class HeightedFakeWorld implements World +{ + private final int height; + + public HeightedFakeWorld(int height) + { + this.height = height; + } + + @Override + public void sendPluginMessage(Plugin source, String channel, byte[] message) + { + + } + + @Override + public Set getListeningPluginChannels() + { + + return null; + } + + @Override + public void setMetadata(String metadataKey, MetadataValue newMetadataValue) + { + + } + + @Override + public List getMetadata(String metadataKey) + { + + return null; + } + + @Override + public boolean hasMetadata(String metadataKey) + { + + return false; + } + + @Override + public void removeMetadata(String metadataKey, Plugin owningPlugin) + { + + } + + @Override + public Block getBlockAt(int x, int y, int z) + { + + return null; + } + + @Override + public Block getBlockAt(Location location) + { + + return null; + } + + @Override + public int getHighestBlockYAt(int x, int z) + { + + return 0; + } + + @Override + public int getHighestBlockYAt(Location location) + { + + return 0; + } + + @Override + public Block getHighestBlockAt(int x, int z) + { + + return null; + } + + @Override + public Block getHighestBlockAt(Location location) + { + + return null; + } + + @Override + public int getHighestBlockYAt(int x, int z, HeightMap heightMap) + { + + return 0; + } + + @Override + public int getHighestBlockYAt(Location location, HeightMap heightMap) + { + + return 0; + } + + @Override + public Block getHighestBlockAt(int x, int z, HeightMap heightMap) + { + + return null; + } + + @Override + public Block getHighestBlockAt(Location location, HeightMap heightMap) + { + + return null; + } + + @Override + public Chunk getChunkAt(int x, int z) + { + + return null; + } + + @Override + public Chunk getChunkAt(Location location) + { + + return null; + } + + @Override + public Chunk getChunkAt(Block block) + { + + return null; + } + + @Override + public boolean isChunkLoaded(Chunk chunk) + { + + return false; + } + + @Override + public Chunk[] getLoadedChunks() + { + + return null; + } + + @Override + public void loadChunk(Chunk chunk) + { + + } + + @Override + public boolean isChunkLoaded(int x, int z) + { + + return false; + } + + @Override + public boolean isChunkGenerated(int x, int z) + { + + return false; + } + + @Override + public boolean isChunkInUse(int x, int z) + { + + return false; + } + + @Override + public void loadChunk(int x, int z) + { + + } + + @Override + public boolean loadChunk(int x, int z, boolean generate) + { + + return false; + } + + @Override + public boolean unloadChunk(Chunk chunk) + { + + return false; + } + + @Override + public boolean unloadChunk(int x, int z) + { + + return false; + } + + @Override + public boolean unloadChunk(int x, int z, boolean save) + { + + return false; + } + + @Override + public boolean unloadChunkRequest(int x, int z) + { + + return false; + } + + @Override + public boolean regenerateChunk(int x, int z) + { + + return false; + } + + @Override + public boolean refreshChunk(int x, int z) + { + + return false; + } + + @Override + public boolean isChunkForceLoaded(int x, int z) + { + + return false; + } + + @Override + public void setChunkForceLoaded(int x, int z, boolean forced) + { + + } + + @Override + public Collection getForceLoadedChunks() + { + + return null; + } + + @Override + public boolean addPluginChunkTicket(int x, int z, Plugin plugin) + { + + return false; + } + + @Override + public boolean removePluginChunkTicket(int x, int z, Plugin plugin) + { + + return false; + } + + @Override + public void removePluginChunkTickets(Plugin plugin) + { + + } + + @Override + public Collection getPluginChunkTickets(int x, int z) + { + + return null; + } + + @Override + public Map> getPluginChunkTickets() + { + + return null; + } + + @Override + public Item dropItem(Location location, ItemStack item) + { + + return null; + } + + @Override + public Item dropItemNaturally(Location location, ItemStack item) + { + + return null; + } + + @Override + public Arrow spawnArrow(Location location, Vector direction, float speed, float spread) + { + + return null; + } + + @Override + public T spawnArrow(Location location, Vector direction, float speed, float spread, Class clazz) + { + + return null; + } + + @Override + public boolean generateTree(Location location, TreeType type) + { + + return false; + } + + @Override + public boolean generateTree(Location loc, TreeType type, BlockChangeDelegate delegate) + { + + return false; + } + + @Override + public Entity spawnEntity(Location loc, EntityType type) + { + + return null; + } + + @Override + public LightningStrike strikeLightning(Location loc) + { + + return null; + } + + @Override + public LightningStrike strikeLightningEffect(Location loc) + { + + return null; + } + + @Override + public List getEntities() + { + + return null; + } + + @Override + public List getLivingEntities() + { + + return null; + } + + @Override + public Collection getEntitiesByClass(@SuppressWarnings("unchecked") Class... classes) + { + + return null; + } + + @Override + public Collection getEntitiesByClass(Class cls) + { + + return null; + } + + @Override + public Collection getEntitiesByClasses(Class... classes) + { + + return null; + } + + @Override + public List getPlayers() + { + + return null; + } + + @Override + public Collection getNearbyEntities(Location location, double x, double y, double z) + { + + return null; + } + + @Override + public Collection getNearbyEntities(Location location, double x, double y, double z, Predicate filter) + { + + return null; + } + + @Override + public Collection getNearbyEntities(BoundingBox boundingBox) + { + + return null; + } + + @Override + public Collection getNearbyEntities(BoundingBox boundingBox, Predicate filter) + { + + return null; + } + + @Override + public RayTraceResult rayTraceEntities(Location start, Vector direction, double maxDistance) + { + + return null; + } + + @Override + public RayTraceResult rayTraceEntities(Location start, Vector direction, double maxDistance, double raySize) + { + + return null; + } + + @Override + public RayTraceResult rayTraceEntities(Location start, Vector direction, double maxDistance, Predicate filter) + { + + return null; + } + + @Override + public RayTraceResult rayTraceEntities(Location start, Vector direction, double maxDistance, double raySize, Predicate filter) + { + + return null; + } + + @Override + public RayTraceResult rayTraceBlocks(Location start, Vector direction, double maxDistance) + { + + return null; + } + + @Override + public RayTraceResult rayTraceBlocks(Location start, Vector direction, double maxDistance, FluidCollisionMode fluidCollisionMode) + { + + return null; + } + + @Override + public RayTraceResult rayTraceBlocks(Location start, Vector direction, double maxDistance, FluidCollisionMode fluidCollisionMode, boolean ignorePassableBlocks) + { + + return null; + } + + @Override + public RayTraceResult rayTrace(Location start, Vector direction, double maxDistance, FluidCollisionMode fluidCollisionMode, boolean ignorePassableBlocks, double raySize, Predicate filter) + { + + return null; + } + + @Override + public String getName() + { + + return null; + } + + @Override + public UUID getUID() + { + + return null; + } + + @Override + public Location getSpawnLocation() + { + + return null; + } + + @Override + public boolean setSpawnLocation(Location location) + { + + return false; + } + + @Override + public boolean setSpawnLocation(int x, int y, int z) + { + + return false; + } + + @Override + public long getTime() + { + + return 0; + } + + @Override + public void setTime(long time) + { + + } + + @Override + public long getFullTime() + { + + return 0; + } + + @Override + public void setFullTime(long time) + { + + } + + @Override + public boolean hasStorm() + { + + return false; + } + + @Override + public void setStorm(boolean hasStorm) + { + + } + + @Override + public int getWeatherDuration() + { + + return 0; + } + + @Override + public void setWeatherDuration(int duration) + { + + } + + @Override + public boolean isThundering() + { + + return false; + } + + @Override + public void setThundering(boolean thundering) + { + + } + + @Override + public int getThunderDuration() + { + + return 0; + } + + @Override + public void setThunderDuration(int duration) + { + + } + + @Override + public boolean createExplosion(double x, double y, double z, float power) + { + + return false; + } + + @Override + public boolean createExplosion(double x, double y, double z, float power, boolean setFire) + { + + return false; + } + + @Override + public boolean createExplosion(double x, double y, double z, float power, boolean setFire, boolean breakBlocks) + { + + return false; + } + + @Override + public boolean createExplosion(double x, double y, double z, float power, boolean setFire, boolean breakBlocks, Entity source) + { + + return false; + } + + @Override + public boolean createExplosion(Location loc, float power) + { + + return false; + } + + @Override + public boolean createExplosion(Location loc, float power, boolean setFire) + { + + return false; + } + + @Override + public boolean createExplosion(Location loc, float power, boolean setFire, boolean breakBlocks) + { + + return false; + } + + @Override + public boolean createExplosion(Location loc, float power, boolean setFire, boolean breakBlocks, Entity source) + { + + return false; + } + + @Override + public Environment getEnvironment() + { + + return null; + } + + @Override + public long getSeed() + { + + return 0; + } + + @Override + public boolean getPVP() + { + + return false; + } + + @Override + public void setPVP(boolean pvp) + { + + } + + @Override + public ChunkGenerator getGenerator() + { + + return null; + } + + @Override + public void save() + { + + } + + @Override + public List getPopulators() + { + + return null; + } + + @Override + public T spawn(Location location, Class clazz) throws IllegalArgumentException + { + + return null; + } + + @Override + public T spawn(Location location, Class clazz, Consumer function) throws IllegalArgumentException + { + + return null; + } + + @Override + public FallingBlock spawnFallingBlock(Location location, MaterialData data) throws IllegalArgumentException + { + + return null; + } + + @Override + public FallingBlock spawnFallingBlock(Location location, BlockData data) throws IllegalArgumentException + { + + return null; + } + + @Override + public FallingBlock spawnFallingBlock(Location location, Material material, byte data) throws IllegalArgumentException + { + + return null; + } + + @Override + public void playEffect(Location location, Effect effect, int data) + { + + } + + @Override + public void playEffect(Location location, Effect effect, int data, int radius) + { + + } + + @Override + public void playEffect(Location location, Effect effect, T data) + { + + } + + @Override + public void playEffect(Location location, Effect effect, T data, int radius) + { + + } + + @Override + public ChunkSnapshot getEmptyChunkSnapshot(int x, int z, boolean includeBiome, boolean includeBiomeTemp) + { + + return null; + } + + @Override + public void setSpawnFlags(boolean allowMonsters, boolean allowAnimals) + { + + } + + @Override + public boolean getAllowAnimals() + { + + return false; + } + + @Override + public boolean getAllowMonsters() + { + + return false; + } + + @Override + public Biome getBiome(int x, int z) + { + + return null; + } + + @Override + public Biome getBiome(int x, int y, int z) + { + + return null; + } + + @Override + public void setBiome(int x, int z, Biome bio) + { + + } + + @Override + public void setBiome(int x, int y, int z, Biome bio) + { + + } + + @Override + public double getTemperature(int x, int z) + { + + return 0; + } + + @Override + public double getTemperature(int x, int y, int z) + { + + return 0; + } + + @Override + public double getHumidity(int x, int z) + { + + return 0; + } + + @Override + public double getHumidity(int x, int y, int z) + { + + return 0; + } + + @Override + public int getMaxHeight() + { + + return height; + } + + @Override + public int getSeaLevel() + { + + return 0; + } + + @Override + public boolean getKeepSpawnInMemory() + { + + return false; + } + + @Override + public void setKeepSpawnInMemory(boolean keepLoaded) + { + + } + + @Override + public boolean isAutoSave() + { + + return false; + } + + @Override + public void setAutoSave(boolean value) + { + + } + + @Override + public void setDifficulty(Difficulty difficulty) + { + + } + + @Override + public Difficulty getDifficulty() + { + + return null; + } + + @Override + public File getWorldFolder() + { + + return null; + } + + @Override + public WorldType getWorldType() + { + + return null; + } + + @Override + public boolean canGenerateStructures() + { + + return false; + } + + @Override + public boolean isHardcore() + { + + return false; + } + + @Override + public void setHardcore(boolean hardcore) + { + + } + + @Override + public long getTicksPerAnimalSpawns() + { + + return 0; + } + + @Override + public void setTicksPerAnimalSpawns(int ticksPerAnimalSpawns) + { + + } + + @Override + public long getTicksPerMonsterSpawns() + { + + return 0; + } + + @Override + public void setTicksPerMonsterSpawns(int ticksPerMonsterSpawns) + { + + } + + @Override + public long getTicksPerWaterSpawns() + { + + return 0; + } + + @Override + public void setTicksPerWaterSpawns(int ticksPerWaterSpawns) + { + + } + + @Override + public long getTicksPerWaterAmbientSpawns() + { + + return 0; + } + + @Override + public void setTicksPerWaterAmbientSpawns(int ticksPerAmbientSpawns) + { + + } + + @Override + public long getTicksPerAmbientSpawns() + { + + return 0; + } + + @Override + public void setTicksPerAmbientSpawns(int ticksPerAmbientSpawns) + { + + } + + @Override + public int getMonsterSpawnLimit() + { + + return 0; + } + + @Override + public void setMonsterSpawnLimit(int limit) + { + + } + + @Override + public int getAnimalSpawnLimit() + { + + return 0; + } + + @Override + public void setAnimalSpawnLimit(int limit) + { + + } + + @Override + public int getWaterAnimalSpawnLimit() + { + + return 0; + } + + @Override + public void setWaterAnimalSpawnLimit(int limit) + { + + } + + @Override + public int getWaterAmbientSpawnLimit() + { + + return 0; + } + + @Override + public void setWaterAmbientSpawnLimit(int limit) + { + + } + + @Override + public int getAmbientSpawnLimit() + { + + return 0; + } + + @Override + public void setAmbientSpawnLimit(int limit) + { + + } + + @Override + public void playSound(Location location, Sound sound, float volume, float pitch) + { + + } + + @Override + public void playSound(Location location, String sound, float volume, float pitch) + { + + } + + @Override + public void playSound(Location location, Sound sound, SoundCategory category, float volume, float pitch) + { + + } + + @Override + public void playSound(Location location, String sound, SoundCategory category, float volume, float pitch) + { + + } + + @Override + public String[] getGameRules() + { + + return null; + } + + @Override + public String getGameRuleValue(String rule) + { + + return null; + } + + @Override + public boolean setGameRuleValue(String rule, String value) + { + + return false; + } + + @Override + public boolean isGameRule(String rule) + { + + return false; + } + + @Override + public T getGameRuleValue(GameRule rule) + { + + return null; + } + + @Override + public T getGameRuleDefault(GameRule rule) + { + + return null; + } + + @Override + public boolean setGameRule(GameRule rule, T newValue) + { + + return false; + } + + @Override + public WorldBorder getWorldBorder() + { + + return null; + } + + @Override + public void spawnParticle(Particle particle, Location location, int count) + { + + } + + @Override + public void spawnParticle(Particle particle, double x, double y, double z, int count) + { + + } + + @Override + public void spawnParticle(Particle particle, Location location, int count, T data) + { + + } + + @Override + public void spawnParticle(Particle particle, double x, double y, double z, int count, T data) + { + + } + + @Override + public void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY, double offsetZ) + { + + } + + @Override + public void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ) + { + + } + + @Override + public void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY, double offsetZ, T data) + { + + } + + @Override + public void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, T data) + { + + } + + @Override + public void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY, double offsetZ, double extra) + { + + } + + @Override + public void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, double extra) + { + + } + + @Override + public void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY, double offsetZ, double extra, T data) + { + + } + + @Override + public void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, double extra, T data) + { + + } + + @Override + public void spawnParticle(Particle particle, Location location, int count, double offsetX, double offsetY, double offsetZ, double extra, T data, boolean force) + { + + } + + @Override + public void spawnParticle(Particle particle, double x, double y, double z, int count, double offsetX, double offsetY, double offsetZ, double extra, T data, boolean force) + { + + } + + @Override + public Location locateNearestStructure(Location origin, StructureType structureType, int radius, boolean findUnexplored) + { + return null; + } + + @Override + public int getViewDistance() + { + return 0; + } + + @Override + public Spigot spigot() + { + return null; + } + + @Override + public Raid locateNearestRaid(Location location, int radius) + { + return null; + } + + @Override + public List getRaids() + { + return null; + } + + @Override + public DragonBattle getEnderDragonBattle() + { + return null; + } +} diff --git a/src/main/java/com/volmit/iris/gen/scaffold/IrisBiomeStorage.java b/src/main/java/com/volmit/iris/gen/scaffold/IrisBiomeStorage.java index 3a562edcb..1fd66fed0 100644 --- a/src/main/java/com/volmit/iris/gen/scaffold/IrisBiomeStorage.java +++ b/src/main/java/com/volmit/iris/gen/scaffold/IrisBiomeStorage.java @@ -1,4 +1,4 @@ -package com.volmit.iris.gen.bindings; +package com.volmit.iris.gen.scaffold; import org.bukkit.block.Biome; import org.bukkit.generator.ChunkGenerator.BiomeGrid; diff --git a/src/main/java/com/volmit/iris/gen/scaffold/IrisGenConfiguration.java b/src/main/java/com/volmit/iris/gen/scaffold/IrisGenConfiguration.java new file mode 100644 index 000000000..6820a7521 --- /dev/null +++ b/src/main/java/com/volmit/iris/gen/scaffold/IrisGenConfiguration.java @@ -0,0 +1,24 @@ +package com.volmit.iris.gen.scaffold; + +import com.volmit.iris.gen.IrisChunkGenerator; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class IrisGenConfiguration +{ + private TerrainTarget target; + + @Builder.Default + private int threads = 16; + + @Builder.Default + private String dimension = ""; + + public IrisChunkGenerator buildGenerator() + { + return new IrisChunkGenerator(this); + } +} diff --git a/src/main/java/com/volmit/iris/gen/scaffold/IrisTerrainChunk.java b/src/main/java/com/volmit/iris/gen/scaffold/IrisTerrainChunk.java index b88c65381..d98c1d73c 100644 --- a/src/main/java/com/volmit/iris/gen/scaffold/IrisTerrainChunk.java +++ b/src/main/java/com/volmit/iris/gen/scaffold/IrisTerrainChunk.java @@ -1,10 +1,10 @@ -package com.volmit.iris.gen.bindings; - -import java.lang.reflect.Constructor; +package com.volmit.iris.gen.scaffold; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; +import org.bukkit.generator.ChunkGenerator.BiomeGrid; import org.bukkit.generator.ChunkGenerator.ChunkData; import org.bukkit.material.MaterialData; @@ -16,39 +16,26 @@ public class IrisTerrainChunk implements TerrainChunk private final Biome[] biome2D; private final IrisBiomeStorage biome3D; private final ChunkData rawChunkData; - private final Constructor construct = buildConstruct(); + private final BiomeGrid storage; public IrisTerrainChunk(int maxHeight) { - rawChunkData = createChunkData(maxHeight); - biome2D = Iris.biome3d ? null : new Biome[256]; - biome3D = Iris.biome3d ? new IrisBiomeStorage() : null; + this(null, maxHeight); } - private Constructor buildConstruct() + public IrisTerrainChunk(BiomeGrid storage, int maxHeight) { - try - { - Class chunkDatazz = Class.forName("org.bukkit.craftbukkit." + Iris.nmsTag() + ".generator.CraftChunkData"); - Constructor construct = chunkDatazz.getConstructor(int.class); - construct.setAccessible(true); - return construct; - } - - catch(Throwable e) - { - Iris.error("Failed create construct for ChunkData(int)"); - e.printStackTrace(); - } - - return null; + this.storage = storage; + rawChunkData = createChunkData(maxHeight); + biome2D = storage != null ? null : Iris.biome3d ? null : new Biome[256]; + biome3D = storage != null ? null : Iris.biome3d ? new IrisBiomeStorage() : null; } private ChunkData createChunkData(int maxHeight) { try { - return (ChunkData) construct.newInstance(maxHeight); + return Bukkit.createChunkData(new HeightedFakeWorld(maxHeight)); } catch(Throwable e) @@ -62,6 +49,11 @@ public class IrisTerrainChunk implements TerrainChunk @Override public Biome getBiome(int x, int z) { + if(storage != null) + { + return storage.getBiome(x, z); + } + if(biome2D != null) { return biome2D[(z << 4) | x]; @@ -73,6 +65,11 @@ public class IrisTerrainChunk implements TerrainChunk @Override public Biome getBiome(int x, int y, int z) { + if(storage != null) + { + return storage.getBiome(x, y, z); + } + if(biome2D != null) { return biome2D[(z << 4) | x]; @@ -84,6 +81,12 @@ public class IrisTerrainChunk implements TerrainChunk @Override public void setBiome(int x, int z, Biome bio) { + if(storage != null) + { + storage.setBiome(x, z, bio); + return; + } + if(biome2D != null) { biome2D[(z << 4) | x] = bio; @@ -96,6 +99,12 @@ public class IrisTerrainChunk implements TerrainChunk @Override public void setBiome(int x, int y, int z, Biome bio) { + if(storage != null) + { + storage.setBiome(x, y, z, bio); + return; + } + if(biome2D != null) { biome2D[(z << 4) | x] = bio; @@ -177,4 +186,10 @@ public class IrisTerrainChunk implements TerrainChunk { return rawChunkData.getData(x, y, z); } + + @Override + public ChunkData getRaw() + { + return rawChunkData; + } } diff --git a/src/main/java/com/volmit/iris/gen/scaffold/IrisWorlds.java b/src/main/java/com/volmit/iris/gen/scaffold/IrisWorlds.java new file mode 100644 index 000000000..0fdcbc6dc --- /dev/null +++ b/src/main/java/com/volmit/iris/gen/scaffold/IrisWorlds.java @@ -0,0 +1,23 @@ +package com.volmit.iris.gen.scaffold; + +import org.bukkit.World; + +import com.volmit.iris.gen.IrisChunkGenerator; + +public class IrisWorlds +{ + public boolean isIrisWorld(World world) + { + return world.getGenerator() instanceof Provisioned; + } + + public IrisChunkGenerator getProvider(World world) + { + if(isIrisWorld(world)) + { + return (IrisChunkGenerator) ((Provisioned) world.getGenerator()).getProvider(); + } + + return null; + } +} diff --git a/src/main/java/com/volmit/iris/gen/scaffold/Provisioned.java b/src/main/java/com/volmit/iris/gen/scaffold/Provisioned.java new file mode 100644 index 000000000..bbb8a5a63 --- /dev/null +++ b/src/main/java/com/volmit/iris/gen/scaffold/Provisioned.java @@ -0,0 +1,6 @@ +package com.volmit.iris.gen.scaffold; + +public interface Provisioned +{ + public TerrainProvider getProvider(); +} diff --git a/src/main/java/com/volmit/iris/gen/scaffold/TerrainChunk.java b/src/main/java/com/volmit/iris/gen/scaffold/TerrainChunk.java index dd67b449c..b5fd84818 100644 --- a/src/main/java/com/volmit/iris/gen/scaffold/TerrainChunk.java +++ b/src/main/java/com/volmit/iris/gen/scaffold/TerrainChunk.java @@ -1,4 +1,4 @@ -package com.volmit.iris.gen.bindings; +package com.volmit.iris.gen.scaffold; import org.bukkit.World; import org.bukkit.block.Biome; @@ -18,6 +18,16 @@ public interface TerrainChunk extends BiomeGrid, ChunkData return new IrisTerrainChunk(maxHeight); } + public static TerrainChunk create(World world, BiomeGrid grid) + { + return create(world.getMaxHeight(), grid); + } + + public static TerrainChunk create(int maxHeight, BiomeGrid grid) + { + return new IrisTerrainChunk(grid, maxHeight); + } + /** * Get biome at x, z within chunk being generated * @@ -114,4 +124,6 @@ public interface TerrainChunk extends BiomeGrid, ChunkData * outside the chunk's bounds */ public BlockData getBlockData(int x, int y, int z); + + public ChunkData getRaw(); } diff --git a/src/main/java/com/volmit/iris/gen/scaffold/TerrainProvider.java b/src/main/java/com/volmit/iris/gen/scaffold/TerrainProvider.java index cd3ba8bbc..e5a88e237 100644 --- a/src/main/java/com/volmit/iris/gen/scaffold/TerrainProvider.java +++ b/src/main/java/com/volmit/iris/gen/scaffold/TerrainProvider.java @@ -1,10 +1,8 @@ -package com.volmit.iris.gen.bindings; +package com.volmit.iris.gen.scaffold; import java.util.List; import java.util.Random; -import org.bukkit.Location; -import org.bukkit.World; import org.bukkit.generator.BlockPopulator; public interface TerrainProvider @@ -13,21 +11,17 @@ public interface TerrainProvider public void generate(Random random, int x, int z, TerrainChunk chunk); - public boolean canSpawn(World world, int x, int z); + public boolean canSpawn(int x, int z); - public boolean canSpawnDefault(World world, int x, int z); - - public List getDefaultPopulators(World world); - - public Location getFixedSpawnLocation(World world, Random random); + public List getPopulators(); public boolean isParallelCapable(); + public boolean shouldGenerateMobs(); + public boolean shouldGenerateCaves(); - + public boolean shouldGenerateDecorations(); - public boolean shouldGenerateMobs(); - - public boolean shouldGenerateStructures(); + public boolean shouldGenerateVanillaStructures(); } diff --git a/src/main/java/com/volmit/iris/gen/scaffold/TerrainTarget.java b/src/main/java/com/volmit/iris/gen/scaffold/TerrainTarget.java index 88cb7871e..4033bb8cb 100644 --- a/src/main/java/com/volmit/iris/gen/scaffold/TerrainTarget.java +++ b/src/main/java/com/volmit/iris/gen/scaffold/TerrainTarget.java @@ -1,9 +1,13 @@ -package com.volmit.iris.gen.bindings; +package com.volmit.iris.gen.scaffold; import java.io.File; +import java.util.List; import org.bukkit.World; import org.bukkit.World.Environment; +import org.bukkit.entity.Player; + +import com.volmit.iris.util.KList; import lombok.Builder; import lombok.Data; @@ -16,6 +20,20 @@ public class TerrainTarget private Environment environment; private String name; private File folder; + private static final KList emptyPlayers = new KList<>(); + private World realWorld; + + public void setRealWorld(World realWorld) + { + if(this.realWorld == null || realWorld != this.realWorld) + { + this.realWorld = realWorld; + this.seed = realWorld.getSeed(); + this.folder = realWorld.getWorldFolder(); + this.environment = realWorld.getEnvironment(); + this.name = realWorld.getName(); + } + } public static TerrainTarget from(World world) { @@ -25,7 +43,61 @@ public class TerrainTarget .seed(world.getSeed()) .folder(world.getWorldFolder()) .name(world.getName()) + .realWorld(world) .build(); //@done } + + public List getPlayers() + { + return realWorld != null ? realWorld.getPlayers() : emptyPlayers; + } + + public boolean isWorld(World world) + { + return world.getName().equals(getName()) && world.getSeed() == getSeed() && getEnvironment().equals(world.getEnvironment()) && world.getWorldFolder().equals(getFolder()); + } + + @Override + public boolean equals(Object obj) + { + if(this == obj) + return true; + if(obj == null) + return false; + if(getClass() != obj.getClass()) + return false; + TerrainTarget other = (TerrainTarget) obj; + if(environment != other.environment) + return false; + if(folder == null) + { + if(other.folder != null) + return false; + } + else if(!folder.equals(other.folder)) + return false; + if(name == null) + { + if(other.name != null) + return false; + } + else if(!name.equals(other.name)) + return false; + if(seed != other.seed) + return false; + return true; + } + + @Override + public int hashCode() + { + final int prime = 31; + int result = 1; + result = prime * result + ((environment == null) ? 0 : environment.hashCode()); + result = prime * result + ((folder == null) ? 0 : folder.hashCode()); + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + (int) (seed ^ (seed >>> 32)); + return result; + } } diff --git a/src/main/java/com/volmit/iris/link/MultiverseCoreLink.java b/src/main/java/com/volmit/iris/link/MultiverseCoreLink.java index 1ca978d0c..7cc6a5c88 100644 --- a/src/main/java/com/volmit/iris/link/MultiverseCoreLink.java +++ b/src/main/java/com/volmit/iris/link/MultiverseCoreLink.java @@ -81,6 +81,17 @@ public class MultiverseCoreLink getList().remove(world.getName()); saveConfig(); } + + public void removeFromConfig(String world) + { + if(!supported()) + { + return; + } + + getList().remove(world); + saveConfig(); + } public void saveConfig() { diff --git a/src/main/java/com/volmit/iris/object/IrisDimension.java b/src/main/java/com/volmit/iris/object/IrisDimension.java index 362f3c76a..c6b48e65f 100644 --- a/src/main/java/com/volmit/iris/object/IrisDimension.java +++ b/src/main/java/com/volmit/iris/object/IrisDimension.java @@ -137,6 +137,10 @@ public class IrisDimension extends IrisRegistrant @DontObfuscate @Desc("Carve terrain or not") private boolean carving = true; + + @DontObfuscate + @Desc("Generate vanilla caves") + private boolean vanillaCaves = false; @DontObfuscate @Desc("Generate vanilla structures") diff --git a/src/main/java/com/volmit/iris/object/IrisEntitySpawn.java b/src/main/java/com/volmit/iris/object/IrisEntitySpawn.java index 0c167cee2..279d17121 100644 --- a/src/main/java/com/volmit/iris/object/IrisEntitySpawn.java +++ b/src/main/java/com/volmit/iris/object/IrisEntitySpawn.java @@ -76,9 +76,9 @@ public class IrisEntitySpawn return null; } - if(rng.aquire(() -> new RNG(g.getWorld().getSeed() + 4)).i(1, getRarity()) == 1) + if(rng.aquire(() -> new RNG(g.getTarget().getSeed() + 4)).i(1, getRarity()) == 1) { - return getRealEntity(g).spawn(g, at, rng.aquire(() -> new RNG(g.getWorld().getSeed() + 4))); + return getRealEntity(g).spawn(g, at, rng.aquire(() -> new RNG(g.getTarget().getSeed() + 4))); } return null;