diff --git a/build.gradle b/build.gradle index 2cd4374fe..bdc00df7d 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { } group 'com.volmit.iris' -version '1.4.2' +version '1.4.3' def apiVersion = '1.17' def name = 'Iris' def main = 'com.volmit.iris.Iris' diff --git a/src/main/java/com/volmit/iris/manager/IrisProject.java b/src/main/java/com/volmit/iris/manager/IrisProject.java index a06e7ad33..7c887f429 100644 --- a/src/main/java/com/volmit/iris/manager/IrisProject.java +++ b/src/main/java/com/volmit/iris/manager/IrisProject.java @@ -134,86 +134,85 @@ public class IrisProject .seed(1337) .name(wfp) .studioMode() - .asyncPrepare() .create(); - IrisAccess gx = ((IrisAccess)c.generator()); - sender.sendMessage("Generating with " + Iris.getThreadCount() + " threads per chunk"); - O done = new O<>(); - done.set(false); - activeProvider = gx; - J.a(() -> - { - double last = 0; - int req = 300; - double lpc = 0; - boolean fc; + IrisAccess gx = ((IrisAccess)c.generator()); + sender.sendMessage("Generating with " + Iris.getThreadCount() + " threads per chunk"); + O done = new O<>(); + done.set(false); + activeProvider = gx; - while(!done.get()) - { - boolean derp = false; + J.a(() -> + { + double last = 0; + int req = 300; + double lpc = 0; + boolean fc; - assert gx != null; - double v = (double) gx.getGenerated() / (double) req; - fc = lpc != v; - lpc = v; + while(!done.get()) + { + boolean derp = false; - if(last > v || v > 1) - { - derp = true; - v = last; - } + assert gx != null; + double v = (double) gx.getGenerated() / (double) req; + fc = lpc != v; + lpc = v; - else - { - last = v; - } + if(last > v || v > 1) + { + derp = true; + v = last; + } - if(fc) - { - sender.sendMessage(C.WHITE + "Generating " + Form.pc(v) + (derp ? (C.GRAY + " (Waiting on Server...)") : (C.GRAY + " (" + (req - gx.getGenerated()) + " Left)"))); - } + else + { + last = v; + } - if (sender.isPlayer()){ - sender.player().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(C.BLUE + "Creating studio world. Please wait...")); - } + if(fc) + { + sender.sendMessage(C.WHITE + "Generating " + Form.pc(v) + (derp ? (C.GRAY + " (Waiting on Server...)") : (C.GRAY + " (" + (req - gx.getGenerated()) + " Left)"))); + } - J.sleep(1500); + if (sender.isPlayer()){ + sender.player().spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(C.BLUE + "Creating studio world. Please wait...")); + } - if(gx.isFailing()) - { + J.sleep(1500); - sender.sendMessage("Generation Failed!"); - return; - } - } - }); + if(gx.isFailing()) + { - //@builder - World world = c.createWorld(); - Iris.linkMultiverseCore.removeFromConfig(world); + sender.sendMessage("Generation Failed!"); + return; + } + } + }); - done.set(true); - sender.sendMessage(C.WHITE + "Generating Complete!"); + //@builder + World world = c.createWorld(); + Iris.linkMultiverseCore.removeFromConfig(world); - if(sender.isPlayer()) - { - assert world != null; - sender.player().teleport(world.getSpawnLocation()); - } + done.set(true); + sender.sendMessage(C.WHITE + "Generating Complete!"); - Bukkit.getScheduler().scheduleSyncDelayedTask(Iris.instance, () -> - { - sender.sendMessage("Hotloading Active! Change any files and watch your changes appear as you load new chunks!"); + if(sender.isPlayer()) + { + assert world != null; + sender.player().teleport(world.getSpawnLocation()); + } - if(sender.isPlayer()) - { - sender.player().setGameMode(GameMode.SPECTATOR); - } + Bukkit.getScheduler().scheduleSyncDelayedTask(Iris.instance, () -> + { + sender.sendMessage("Hotloading Active! Change any files and watch your changes appear as you load new chunks!"); - onDone.run(); - }, 0); + if(sender.isPlayer()) + { + sender.player().setGameMode(GameMode.SPECTATOR); + } + onDone.run(); + }, 0); } public void close() diff --git a/src/main/java/com/volmit/iris/manager/command/world/CommandIrisCreate.java b/src/main/java/com/volmit/iris/manager/command/world/CommandIrisCreate.java index f99f92ce4..d77615fb8 100644 --- a/src/main/java/com/volmit/iris/manager/command/world/CommandIrisCreate.java +++ b/src/main/java/com/volmit/iris/manager/command/world/CommandIrisCreate.java @@ -14,6 +14,9 @@ import org.bukkit.World; import org.bukkit.WorldCreator; import java.io.File; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; +import java.util.concurrent.atomic.AtomicReferenceArray; public class CommandIrisCreate extends MortarCommand { @@ -42,20 +45,80 @@ public class CommandIrisCreate extends MortarCommand String worldName = args[0]; String type = IrisSettings.get().getGenerator().getDefaultWorldType(); long seed = 1337; - int pregen = 0; + AtomicInteger pregen = new AtomicInteger(0); boolean multiverse = Iris.linkMultiverseCore.supported(); for(String i : args) { type = i.startsWith("type=") ? i.split("\\Q=\\E")[1] : type; seed = i.startsWith("seed=") ? Long.valueOf(i.split("\\Q=\\E")[1]) : seed; - pregen = i.startsWith("pregen=") ? getVal(i.split("\\Q=\\E")[1]) : pregen; + pregen.set(i.startsWith("pregen=") ? getVal(i.split("\\Q=\\E")[1]) : pregen.get()); } Iris.linkMultiverseCore.assignWorldType(worldName, type); - World world = null; + final AtomicReference world = new AtomicReference<>(); IrisDimension dim; File folder = new File(worldName); + + + + Runnable onDone = () -> { + + sender.sendMessage(worldName + " Spawn Area generated."); + sender.sendMessage("You must remember to either have multiverse installed or use the Bukkit method, otherwise the world will go corrupt!"); + sender.sendMessage("Wiki: https://volmitsoftware.gitbook.io/iris/getting-started"); + + O b = new O(); + b.set(true); + + if(sender.isPlayer()) + { + try + { + sender.player().teleport(world.get().getSpawnLocation()); + } + + catch(Throwable e) + { + + } + } + + if(pregen.get() > 0) + { + b.set(false); + sender.sendMessage("Pregenerating " + worldName + " " + pregen + " x " + pregen); + sender.sendMessage("Expect server lag during this time. Use '/iris pregen stop' to cancel"); + + new Pregenerator(world.get(), pregen.get(), () -> + { + b.set(true); + }); + } + + World ww = world.get(); + if (ww == null){ + sender.sendMessage("World not created, can not finish"); + return; + } + J.a(() -> + { + while(!b.get()) + { + J.sleep(1000); + } + + + Bukkit.getScheduler().scheduleSyncDelayedTask(Iris.instance, () -> + { + ww.save(); + sender.sendMessage("All Done!"); + }); + }); + }; + + + if(multiverse) { dim = IrisDataManager.loadAnyDimension(type); @@ -81,7 +144,8 @@ public class CommandIrisCreate extends MortarCommand command += " -g Iris:" + dim.getLoadKey(); sender.sendMessage("Delegating " + command); Bukkit.dispatchCommand(sender, command); - world= Bukkit.getWorld(worldName); + world.set(Bukkit.getWorld(worldName)); + onDone.run(); } else @@ -99,92 +163,43 @@ public class CommandIrisCreate extends MortarCommand WorldCreator wc = new IrisWorldCreator().dimension(dim).name(worldName) .productionMode().seed(seed).create(); - sender.sendMessage("Generating with " + Iris.getThreadCount() + " threads per chunk"); - O done = new O(); - done.set(false); - J.a(() -> - { - double last = 0; - int req = 800; - while(!done.get()) + J.s(() -> { + sender.sendMessage("Generating with " + Iris.getThreadCount() + " threads per chunk"); + O done = new O<>(); + done.set(false); + + J.a(() -> { - boolean derp = false; - double v = (double) ((IrisAccess) wc.generator()).getGenerated() / (double) req; - - if(last > v || v > 1) + double last = 0; + int req = 800; + while(!done.get()) { - derp = true; - v = last; + boolean derp = false; + double v = (double) ((IrisAccess) wc.generator()).getGenerated() / (double) req; + + if(last > v || v > 1) + { + derp = true; + v = last; + } + + else + { + last = v; + } + + sender.sendMessage("Generating " + Form.pc(v) + (derp ? " (Waiting on Server...)" : "")); + J.sleep(3000); } + }); - else - { - last = v; - } + world.set(wc.createWorld()); - sender.sendMessage("Generating " + Form.pc(v) + (derp ? " (Waiting on Server...)" : "")); - J.sleep(3000); - } - }); - - world = wc.createWorld(); - - done.set(true); - } - - - sender.sendMessage(worldName + " Spawn Area generated."); - sender.sendMessage("You must remember to either have multiverse installed or use the Bukkit method, otherwise the world will go corrupt!"); - sender.sendMessage("Wiki: https://volmitsoftware.gitbook.io/iris/getting-started"); - - O b = new O(); - b.set(true); - - if(sender.isPlayer()) - { - try - { - sender.player().teleport(world.getSpawnLocation()); - } - - catch(Throwable e) - { - - } - } - - if(pregen > 0) - { - b.set(false); - sender.sendMessage("Pregenerating " + worldName + " " + pregen + " x " + pregen); - sender.sendMessage("Expect server lag during this time. Use '/iris pregen stop' to cancel"); - - new Pregenerator(world, pregen, () -> - { - b.set(true); + done.set(true); }); } - World ww = world; - if (ww == null){ - sender.sendMessage("World not created, can not finish"); - return true; - } - J.a(() -> - { - while(!b.get()) - { - J.sleep(1000); - } - - - Bukkit.getScheduler().scheduleSyncDelayedTask(Iris.instance, () -> - { - ww.save(); - sender.sendMessage("All Done!"); - }); - }); return true; } diff --git a/src/main/java/com/volmit/iris/scaffold/IrisWorldCreator.java b/src/main/java/com/volmit/iris/scaffold/IrisWorldCreator.java index 44cdc47b2..142e9f139 100644 --- a/src/main/java/com/volmit/iris/scaffold/IrisWorldCreator.java +++ b/src/main/java/com/volmit/iris/scaffold/IrisWorldCreator.java @@ -1,20 +1,10 @@ package com.volmit.iris.scaffold; -import com.volmit.iris.Iris; import com.volmit.iris.manager.IrisDataManager; import com.volmit.iris.object.IrisDimension; import com.volmit.iris.scaffold.engine.EngineCompositeGenerator; -import com.volmit.iris.util.Form; -import com.volmit.iris.util.J; -import org.bukkit.Bukkit; import org.bukkit.World; -import org.bukkit.World.Environment; import org.bukkit.WorldCreator; -import org.bukkit.entity.Player; -import org.bukkit.generator.ChunkGenerator; - -import java.util.function.Consumer; -import java.util.function.Supplier; public class IrisWorldCreator { @@ -22,7 +12,6 @@ public class IrisWorldCreator private boolean studio = false; private String dimensionName = null; private long seed = 1337; - private boolean asyncPrepare = false; public IrisWorldCreator() { @@ -59,12 +48,6 @@ public class IrisWorldCreator return this; } - public IrisWorldCreator asyncPrepare() - { - this.asyncPrepare = true; - return this; - } - public IrisWorldCreator productionMode() { this.studio = false; @@ -81,24 +64,6 @@ public class IrisWorldCreator .generator(g).seed(seed); } - public void createAsync(Consumer result) - { - EngineCompositeGenerator g = new EngineCompositeGenerator(dimensionName, !studio); - Environment env = findEnvironment(); - g.prepareSpawnAsync(seed, name, env, 16, (progresss) -> { - for(Player i : Bukkit.getOnlinePlayers()) - { - i.sendMessage("Async Prepare 32x32: " + Form.pc(progresss, 2)); - } - - }, () -> { - J.s(() -> result.accept(new WorldCreator(name) - .environment(env) - .generateStructures(true) - .generator(g).seed(seed))); - }); - } - private World.Environment findEnvironment() { IrisDimension dim = IrisDataManager.loadAnyDimension(dimensionName); if(dim == null || dim.getEnvironment() == null) diff --git a/src/main/java/com/volmit/iris/scaffold/engine/EngineCompositeGenerator.java b/src/main/java/com/volmit/iris/scaffold/engine/EngineCompositeGenerator.java index 512dbdf34..084d07685 100644 --- a/src/main/java/com/volmit/iris/scaffold/engine/EngineCompositeGenerator.java +++ b/src/main/java/com/volmit/iris/scaffold/engine/EngineCompositeGenerator.java @@ -77,40 +77,6 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce }); } - public void prepareSpawnAsync(long seed, String worldName, World.Environment env, int radius, Consumer progress, Runnable onComplete) - { - // TODO: WARNING HEIGHT - prepareSpawnAsync(256, seed, worldName, env, radius, progress, onComplete); - } - - public void prepareSpawnAsync(int worldHeight, long seed, String worldName, World.Environment env, int radius, Consumer progress, Runnable onComplete) - { - FakeWorld world = new FakeWorld(worldHeight, seed, new File(worldName), env); - world.setWorldName(worldName); - AtomicInteger generated = new AtomicInteger(); - int total = (int) Math.pow(radius * 2, 2); - MultiBurst.burst.lazy(() -> { - progress.accept(0D); - BurstExecutor burst = MultiBurst.burst.burst(total); - new Spiraler(radius * 2, radius * 2, (x, z) -> burst.queue(() -> { - try { - precache(world, x, z); - generated.getAndIncrement(); - } - - catch(Throwable e) - { - e.printStackTrace(); - } - })).drain(); - burst.complete(); - System.out.println("BURSTER FINISHED TOTAL IS " + total + " OF GENNED " + generated.get()); - J.sleep(5000); - progress.accept(1D); - onComplete.run(); - }); - } - public void hotload() { if(isStudio()) @@ -318,7 +284,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce return dim; } - private synchronized void initialize(World world) { + public synchronized void initialize(World world) { if (initialized.get()) { return; } @@ -353,6 +319,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce @NotNull @Override public ChunkData generateChunkData(@NotNull World world, @NotNull Random ignored, int x, int z, @NotNull BiomeGrid biome) { + long key = Cache.key(x, z); TerrainChunk tc = TerrainChunk.create(world, biome); generateChunkRawData(world, x, z, tc).run(); return tc.getRaw(); @@ -370,9 +337,7 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce for(int j = 0; j < 32; j++) { int jj = j; - e.queue(() -> { - directWriteChunk(w, ii + mcaox, jj + mcaoz, writer); - }); + e.queue(() -> directWriteChunk(w, ii + mcaox, jj + mcaoz, writer)); } }