From e7e130460e3dfdeab2eb942d7076c1d6b7353a44 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 13 Jul 2021 18:55:51 -0400 Subject: [PATCH] Auto stash before revert of "Flush " --- build.gradle | 2 +- .../actuator/IrisTerrainActuator.java | 3 + .../command/studio/CommandIrisStudio.java | 8 +- .../command/studio/CommandIrisStudioMap.java | 19 ++++- .../command/world/CommandIrisPregen.java | 2 + .../volmit/iris/manager/gui/IrisRenderer.java | 6 ++ .../volmit/iris/manager/gui/IrisVision.java | 36 +++++++- .../volmit/iris/manager/gui/TileRender.java | 14 ++++ .../volmit/iris/pregen/DirectWorldWriter.java | 22 ++--- .../com/volmit/iris/pregen/Pregenerator.java | 82 ++++++++++++++----- .../iris/scaffold/engine/EngineCompound.java | 23 ++++++ 11 files changed, 176 insertions(+), 41 deletions(-) create mode 100644 src/main/java/com/volmit/iris/manager/gui/TileRender.java diff --git a/build.gradle b/build.gradle index e103148ac..93ddbb6ad 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { } group 'com.volmit.iris' -version '1.4.13' +version '1.4.14' def apiVersion = '1.17' def name = 'Iris' def main = 'com.volmit.iris.Iris' diff --git a/src/main/java/com/volmit/iris/generator/actuator/IrisTerrainActuator.java b/src/main/java/com/volmit/iris/generator/actuator/IrisTerrainActuator.java index d49bb2373..79886d562 100644 --- a/src/main/java/com/volmit/iris/generator/actuator/IrisTerrainActuator.java +++ b/src/main/java/com/volmit/iris/generator/actuator/IrisTerrainActuator.java @@ -20,6 +20,8 @@ public class IrisTerrainActuator extends EngineAssignedActuator private final RNG rng; private final boolean carving; private final boolean hasUnder; + @Getter + private int lastBedrock = -1; public IrisTerrainActuator(Engine engine) { super(engine, "Terrain"); @@ -64,6 +66,7 @@ public class IrisTerrainActuator extends EngineAssignedActuator if(getDimension().isBedrock()) { h.set(xf, i, zf, BEDROCK); + lastBedrock = i; continue; } } diff --git a/src/main/java/com/volmit/iris/manager/command/studio/CommandIrisStudio.java b/src/main/java/com/volmit/iris/manager/command/studio/CommandIrisStudio.java index 3d099556c..4d78fe7db 100644 --- a/src/main/java/com/volmit/iris/manager/command/studio/CommandIrisStudio.java +++ b/src/main/java/com/volmit/iris/manager/command/studio/CommandIrisStudio.java @@ -27,9 +27,6 @@ public class CommandIrisStudio extends MortarCommand @Command private CommandIrisStudioUpdate update; - //@Command - //private CommandIrisStudioMap map; - @Command private CommandIrisStudioGoto got0; @@ -56,10 +53,13 @@ public class CommandIrisStudio extends MortarCommand @Command private CommandIrisStudioTPStudio tps; - + @Command private CommandIrisStudioConvert convert; + @Command + private CommandIrisStudioMap map; + public CommandIrisStudio() { super("studio", "std", "s"); diff --git a/src/main/java/com/volmit/iris/manager/command/studio/CommandIrisStudioMap.java b/src/main/java/com/volmit/iris/manager/command/studio/CommandIrisStudioMap.java index 1596d32f8..f98f0b919 100644 --- a/src/main/java/com/volmit/iris/manager/command/studio/CommandIrisStudioMap.java +++ b/src/main/java/com/volmit/iris/manager/command/studio/CommandIrisStudioMap.java @@ -3,6 +3,7 @@ package com.volmit.iris.manager.command.studio; import com.volmit.iris.Iris; import com.volmit.iris.IrisSettings; import com.volmit.iris.manager.gui.IrisVision; +import com.volmit.iris.scaffold.IrisWorlds; import com.volmit.iris.scaffold.engine.IrisAccess; import com.volmit.iris.util.KList; import com.volmit.iris.util.MortarCommand; @@ -38,9 +39,21 @@ public class CommandIrisStudioMap extends MortarCommand return true; } - IrisAccess g = Iris.proj.getActiveProject().getActiveProvider(); - IrisVision.launch(g, 0); - sender.sendMessage("Opening Map!"); + + try + { + IrisAccess g = Iris.proj.getActiveProject().getActiveProvider(); + IrisVision.launch(g, 0); + sender.sendMessage("Opening Map!"); + } + + catch(Throwable e) + { + IrisAccess g = IrisWorlds.access(sender.player().getWorld()); + IrisVision.launch(g, 0); + sender.sendMessage("Opening Map!"); + } + return true; } diff --git a/src/main/java/com/volmit/iris/manager/command/world/CommandIrisPregen.java b/src/main/java/com/volmit/iris/manager/command/world/CommandIrisPregen.java index 69aba6b7f..b15e09c18 100644 --- a/src/main/java/com/volmit/iris/manager/command/world/CommandIrisPregen.java +++ b/src/main/java/com/volmit/iris/manager/command/world/CommandIrisPregen.java @@ -1,7 +1,9 @@ package com.volmit.iris.manager.command.world; import com.volmit.iris.Iris; +import com.volmit.iris.pregen.GeneratorQueue; import com.volmit.iris.pregen.Pregenerator; +import com.volmit.iris.pregen.queue.QueuedWorld; import com.volmit.iris.util.KList; import com.volmit.iris.util.MortarCommand; import com.volmit.iris.util.MortarSender; diff --git a/src/main/java/com/volmit/iris/manager/gui/IrisRenderer.java b/src/main/java/com/volmit/iris/manager/gui/IrisRenderer.java index 823a66cc7..3b4dc367b 100644 --- a/src/main/java/com/volmit/iris/manager/gui/IrisRenderer.java +++ b/src/main/java/com/volmit/iris/manager/gui/IrisRenderer.java @@ -2,7 +2,9 @@ package com.volmit.iris.manager.gui; import java.awt.image.BufferedImage; +import com.volmit.iris.scaffold.engine.Engine; import com.volmit.iris.util.IrisInterpolation; +import org.bukkit.Material; public class IrisRenderer { @@ -31,4 +33,8 @@ public class IrisRenderer return image; } + + public void set(double worldX, double worldZ) { + ((Engine)renderer).getWorld().getBlockAt((int)worldX, 20, (int)worldZ).setType(Material.DIAMOND_BLOCK); + } } diff --git a/src/main/java/com/volmit/iris/manager/gui/IrisVision.java b/src/main/java/com/volmit/iris/manager/gui/IrisVision.java index 7c409bf50..ab5a0c7e5 100644 --- a/src/main/java/com/volmit/iris/manager/gui/IrisVision.java +++ b/src/main/java/com/volmit/iris/manager/gui/IrisVision.java @@ -3,6 +3,8 @@ package com.volmit.iris.manager.gui; import com.volmit.iris.Iris; import com.volmit.iris.scaffold.engine.IrisAccess; import com.volmit.iris.util.*; +import org.bukkit.World; +import org.bukkit.entity.Player; import javax.imageio.ImageIO; import javax.swing.*; @@ -24,6 +26,7 @@ public class IrisVision extends JPanel implements MouseWheelListener private static final long serialVersionUID = 2094606939770332040L; private IrisRenderer renderer; private int posX = 0; + private World world; private int posZ = 0; private double scale = 128; private double mscale = 1D; @@ -176,6 +179,26 @@ public class IrisVision extends JPanel implements MouseWheelListener return null; } + private double getWorldX(double screenX) + { + return (screenX + oxp) * mscale; + } + + private double getWorldZ(double screenZ) + { + return (screenZ + ozp) * mscale; + } + + private double getScreenX(double x) + { + return (oxp + x) / mscale; + } + + private double getScreenZ(double z) + { + return (ozp + z) / mscale; + } + @Override public void paint(Graphics gx) { @@ -204,7 +227,7 @@ public class IrisVision extends JPanel implements MouseWheelListener w = getWidth(); h = getHeight(); double vscale = scale; - scale = w / 32D; + scale = w / 16D; if(scale != vscale) { @@ -257,6 +280,12 @@ public class IrisVision extends JPanel implements MouseWheelListener } } + for(Player i : world.getPlayers()) + { + g.setColor(Color.getHSBColor(RNG.r.f(), 1f, 1f)); + g.drawRect((int)getScreenX(i.getLocation().getX()), (int)getScreenZ(i.getLocation().getZ()), 4, 4); + } + if(!isVisible()) { return; @@ -279,10 +308,11 @@ public class IrisVision extends JPanel implements MouseWheelListener }); } - private static void createAndShowGUI(Renderer r, int s) + private static void createAndShowGUI(Renderer r, int s, World world) { JFrame frame = new JFrame("Vision"); IrisVision nv = new IrisVision(); + nv.world = world; nv.renderer = new IrisRenderer(r); frame.add(nv); frame.setSize(1440, 820); @@ -306,7 +336,7 @@ public class IrisVision extends JPanel implements MouseWheelListener public static void launch(IrisAccess g, int i) { J.a(() -> { - createAndShowGUI((x, z) -> g.getEngineAccess(i).draw(x, z), i); + createAndShowGUI((x, z) -> g.getEngineAccess(i).draw(x, z), i, g.getCompound().getWorld()); }); } diff --git a/src/main/java/com/volmit/iris/manager/gui/TileRender.java b/src/main/java/com/volmit/iris/manager/gui/TileRender.java new file mode 100644 index 000000000..4c1062efc --- /dev/null +++ b/src/main/java/com/volmit/iris/manager/gui/TileRender.java @@ -0,0 +1,14 @@ +package com.volmit.iris.manager.gui; + +import lombok.Builder; +import lombok.Data; + +import java.awt.image.BufferedImage; + +@Builder +@Data +public class TileRender +{ + private BufferedImage image; + private int quality; +} diff --git a/src/main/java/com/volmit/iris/pregen/DirectWorldWriter.java b/src/main/java/com/volmit/iris/pregen/DirectWorldWriter.java index 79c69a795..7ae9010aa 100644 --- a/src/main/java/com/volmit/iris/pregen/DirectWorldWriter.java +++ b/src/main/java/com/volmit/iris/pregen/DirectWorldWriter.java @@ -18,6 +18,7 @@ import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; import java.io.File; +import java.io.IOException; import java.util.Map; public class DirectWorldWriter { @@ -51,16 +52,6 @@ public class DirectWorldWriter { f.createNewFile(); } - try - { - writeBuffer.get(i).cleanupPalettesAndBlockStates(); - } - - catch(Throwable e) - { - - } - MCAUtil.write(writeBuffer.get(i), f, true); writeBuffer.remove(i); } catch (Throwable e) { @@ -202,6 +193,10 @@ public class DirectWorldWriter { return s; } + public void deleteChunk(int x, int z) { + + } + public Chunk getChunk(int x, int z) { MCAFile mca = getMCA(x >> 5, z >> 5); @@ -227,7 +222,12 @@ public class DirectWorldWriter { } File f = getMCAFile(x, z); - mca = new MCAFile(x, z); + try { + mca = f.exists() ? MCAUtil.read(f) : new MCAFile(x, z); + } catch (IOException e) { + e.printStackTrace(); + mca = new MCAFile(x, z); + } writeBuffer.put(key, mca); return mca; diff --git a/src/main/java/com/volmit/iris/pregen/Pregenerator.java b/src/main/java/com/volmit/iris/pregen/Pregenerator.java index b026fab18..c5725e06c 100644 --- a/src/main/java/com/volmit/iris/pregen/Pregenerator.java +++ b/src/main/java/com/volmit/iris/pregen/Pregenerator.java @@ -11,6 +11,7 @@ import io.papermc.lib.PaperLib; import lombok.Data; import org.bukkit.Bukkit; import org.bukkit.Chunk; +import org.bukkit.Material; import org.bukkit.World; import org.bukkit.event.Listener; @@ -39,17 +40,22 @@ import java.util.concurrent.locks.ReentrantLock; public class Pregenerator implements Listener { private static Pregenerator instance; - private static final Color COLOR_MCA_PREPARE = Color.decode("#16211d"); - private static final Color COLOR_MCA_GENERATE = Color.decode("#34c0eb"); - private static final Color COLOR_MCA_GENERATE_SLOW = Color.decode("#34c0eb"); - private static final Color COLOR_MCA_GENERATE_SLOW_ASYNC = Color.decode("#34c0eb"); - private static final Color COLOR_MCA_GENERATED = Color.decode("#34eb83"); - private static final Color COLOR_MCA_SEALED = Color.decode("#34eb83"); - private static final Color COLOR_MCA_DEFERRED = Color.decode("#211617"); + private static final Color COLOR_ERROR = Color.decode("#E34113"); + private static final Color COLOR_MCA_PREPARE = Color.decode("#3CAAB5"); + private static final Color COLOR_MCA_RELOAD = Color.decode("#41FF61"); + private static final Color COLOR_MCA_GENERATE = Color.decode("#33FF8F"); + private static final Color COLOR_MCA_GENERATE_SLOW = Color.decode("#13BAE3"); + private static final Color COLOR_MCA_GENERATE_SLOW_ASYNC = Color.decode("#13BAE3"); + private static final Color COLOR_MCA_GENERATED = Color.decode("#33FF8F"); + private static final Color COLOR_MCA_GENERATED_MCA = Color.decode("#13E3C9"); + private static final Color COLOR_MCA_SEALED = Color.decode("#33FF8F"); + private static final Color COLOR_MCA_DEFERRED = Color.decode("#3CB57A"); private final World world; + private int lowestBedrock; private final DirectWorldWriter directWriter; private final AtomicBoolean active; private final AtomicBoolean running; + private final KList errors; private final KList onComplete; private final ChunkPosition max; private final ChunkPosition min; @@ -68,6 +74,8 @@ public class Pregenerator implements Listener private final AtomicInteger vcaz; private final long elapsed; private final ChronoLatch latch; + private IrisAccess access; + private final KList regionReload; public Pregenerator(World world, int blockSize, Runnable onComplete) { @@ -83,11 +91,13 @@ public class Pregenerator implements Listener public Pregenerator(World world, int blockSize, boolean dogui) throws HeadlessException { instance(); + regionReload = new KList<>(); latch = new ChronoLatch(5000); memoryMetric = new AtomicReference<>("..."); method = new AtomicReference<>("STARTUP"); memory = new AtomicLong(0); this.world = world; + errors = new KList<>(); vmcax = new AtomicInteger(); vmcaz = new AtomicInteger(); vcax = new AtomicInteger(); @@ -97,7 +107,7 @@ public class Pregenerator implements Listener totalChunks = new AtomicInteger(0); generated = new AtomicInteger(0); mcaDefer = new KList<>(); - IrisAccess access = IrisWorlds.access(world); + access = IrisWorlds.access(world); this.directWriter = new DirectWorldWriter(world.getWorldFolder()); this.running = new AtomicBoolean(true); this.active = new AtomicBoolean(true); @@ -115,6 +125,10 @@ public class Pregenerator implements Listener totalChunks.getAndAdd(1024); draw.add(() -> drawMCA(xx, zz, COLOR_MCA_PREPARE)); }).drain(); + if(access != null) + { + lowestBedrock = access.getCompound().getLowestBedrock(); + } gui = dogui ?(IrisSettings.get().getGui().isLocalPregenGui() && IrisSettings.get().getGui().isUseServerLaunchedGuis() ? MCAPregenGui.createAndShowGUI(this) : null) : null; flushWorld(); KList order = computeChunkOrder(); @@ -135,7 +149,6 @@ public class Pregenerator implements Listener else { drawMCA(xx, zz, COLOR_MCA_DEFERRED); - mcaDefer.add(new ChunkPosition(xx, zz)); } }); @@ -163,7 +176,6 @@ public class Pregenerator implements Listener vmcaz.set(p.getZ()); generateDeferedMCARegion(p.getX(), p.getZ(), burst, mcaIteration); flushWorld(); - drawMCA(p.getX(), p.getZ(), COLOR_MCA_SEALED); } burst.shutdownNow(); @@ -225,7 +237,7 @@ public class Pregenerator implements Listener mcaIteration.accept(mcaox, mcaoz, (ii, jj) -> e.queue(() -> { draw(ii, jj, COLOR_MCA_GENERATE); access.directWriteChunk(world, ii, jj, directWriter); - draw(ii, jj, COLOR_MCA_GENERATED); + draw(ii, jj, COLOR_MCA_GENERATED_MCA); generated.getAndIncrement(); vcax.set(ii); vcaz.set(jj); @@ -236,12 +248,14 @@ public class Pregenerator implements Listener { drawMCA(x, z, COLOR_MCA_DEFERRED); generated.set(generated.get() - 1024); - mcaDefer.add(new ChunkPosition(x, z)); } + totalChunks.getAndAdd(1024); + mcaDefer.add(new ChunkPosition(x, z)); } else { + totalChunks.getAndAdd(1024); mcaDefer.add(new ChunkPosition(x, z)); e.complete(); return false; @@ -293,13 +307,26 @@ public class Pregenerator implements Listener method.set("PaperAsync (Slow)"); mcaIteration.accept(mcaox, mcaoz, (ii, jj) -> { e.queue(() -> { - CompletableFuture cc = PaperLib.getChunkAtAsync(world, ii, jj); - draw(ii, jj, COLOR_MCA_GENERATE_SLOW_ASYNC); - cc.join(); - draw(ii, jj, COLOR_MCA_GENERATED); - generated.getAndIncrement(); - vcax.set(ii); - vcaz.set(jj); + try + { + CompletableFuture cc = PaperLib.getChunkAtAsync(world, ii, jj); + draw(ii, jj, COLOR_MCA_GENERATE_SLOW_ASYNC); + cc.join(); + draw(ii, jj, COLOR_MCA_GENERATED); + generated.getAndIncrement(); + vcax.set(ii); + vcaz.set(jj); + } + + catch(Throwable ex) + { + draw(ii, jj, COLOR_ERROR); + ChunkPosition pos = new ChunkPosition(ii, jj); + errors.add(pos); + totalChunks.addAndGet(1024); + mcaDefer.add(new ChunkPosition(pos.getX() >> 5, pos.getZ() >> 5)); + Iris.warn("Hole Detected in Chunk: " + pos.getX() + ", " + pos.getZ() + " (at block " + (pos.getX() << 4) + ", " + lowestBedrock + ", " + (pos.getZ() << 4) + ")"); + } }); }); e.complete(); @@ -314,7 +341,9 @@ public class Pregenerator implements Listener q.add(() -> { draw(ii, jj, COLOR_MCA_GENERATE_SLOW); world.getChunkAt(ii, jj).load(true); + Chunk c = world.getChunkAt(ii, jj); draw(ii, jj, COLOR_MCA_GENERATED); + checkForError(c); m.getAndIncrement(); generated.getAndIncrement(); vcax.set(ii); @@ -355,6 +384,21 @@ public class Pregenerator implements Listener } } + private void checkForError(Chunk c) { + if(lowestBedrock >= 0 && lowestBedrock < 256) + { + if(!c.getBlock(14, lowestBedrock, 14).getType().equals(Material.BEDROCK)) + { + ChunkPosition pos = new ChunkPosition(c.getX(), c.getZ()); + errors.add(pos); + totalChunks.addAndGet(1024); + mcaDefer.add(new ChunkPosition(pos.getX() >> 5, pos.getZ() >> 5)); + draw(pos.getX(), pos.getZ(), COLOR_ERROR); + Iris.warn("Hole Detected in Chunk: " + pos.getX() + ", " + pos.getZ() + " (at block " + (pos.getX() << 4) + ", " + lowestBedrock + ", " + (pos.getZ() << 4) + ")"); + } + } + } + private KList computeChunkOrder() { ChunkPosition center = new ChunkPosition(15, 15); KList p = new KList<>(); diff --git a/src/main/java/com/volmit/iris/scaffold/engine/EngineCompound.java b/src/main/java/com/volmit/iris/scaffold/engine/EngineCompound.java index dcc547b88..e98bdea4b 100644 --- a/src/main/java/com/volmit/iris/scaffold/engine/EngineCompound.java +++ b/src/main/java/com/volmit/iris/scaffold/engine/EngineCompound.java @@ -1,5 +1,6 @@ package com.volmit.iris.scaffold.engine; +import com.volmit.iris.generator.actuator.IrisTerrainActuator; import com.volmit.iris.manager.IrisDataManager; import com.volmit.iris.object.IrisBiome; import com.volmit.iris.object.IrisDimension; @@ -151,4 +152,26 @@ public interface EngineCompound extends Listener, Hotloadable, DataProvider } void updateWorld(World world); + + default int getLowestBedrock() + { + int f = Integer.MAX_VALUE; + + for(int i = 0; i < getSize(); i++) + { + Engine e = getEngine(i); + + if(e.getDimension().isBedrock()) + { + int m = ((IrisTerrainActuator)e.getFramework().getTerrainActuator()).getLastBedrock(); + + if(f > m) + { + f = m; + } + } + } + + return f; + } }