Auto stash before revert of "Flush "

This commit is contained in:
Daniel Mills 2021-07-13 18:55:51 -04:00
parent d33a02f6cd
commit e7e130460e
11 changed files with 176 additions and 41 deletions

View File

@ -5,7 +5,7 @@ plugins {
} }
group 'com.volmit.iris' group 'com.volmit.iris'
version '1.4.13' version '1.4.14'
def apiVersion = '1.17' def apiVersion = '1.17'
def name = 'Iris' def name = 'Iris'
def main = 'com.volmit.iris.Iris' def main = 'com.volmit.iris.Iris'

View File

@ -20,6 +20,8 @@ public class IrisTerrainActuator extends EngineAssignedActuator<BlockData>
private final RNG rng; private final RNG rng;
private final boolean carving; private final boolean carving;
private final boolean hasUnder; private final boolean hasUnder;
@Getter
private int lastBedrock = -1;
public IrisTerrainActuator(Engine engine) { public IrisTerrainActuator(Engine engine) {
super(engine, "Terrain"); super(engine, "Terrain");
@ -64,6 +66,7 @@ public class IrisTerrainActuator extends EngineAssignedActuator<BlockData>
if(getDimension().isBedrock()) if(getDimension().isBedrock())
{ {
h.set(xf, i, zf, BEDROCK); h.set(xf, i, zf, BEDROCK);
lastBedrock = i;
continue; continue;
} }
} }

View File

@ -27,9 +27,6 @@ public class CommandIrisStudio extends MortarCommand
@Command @Command
private CommandIrisStudioUpdate update; private CommandIrisStudioUpdate update;
//@Command
//private CommandIrisStudioMap map;
@Command @Command
private CommandIrisStudioGoto got0; private CommandIrisStudioGoto got0;
@ -60,6 +57,9 @@ public class CommandIrisStudio extends MortarCommand
@Command @Command
private CommandIrisStudioConvert convert; private CommandIrisStudioConvert convert;
@Command
private CommandIrisStudioMap map;
public CommandIrisStudio() public CommandIrisStudio()
{ {
super("studio", "std", "s"); super("studio", "std", "s");

View File

@ -3,6 +3,7 @@ package com.volmit.iris.manager.command.studio;
import com.volmit.iris.Iris; import com.volmit.iris.Iris;
import com.volmit.iris.IrisSettings; import com.volmit.iris.IrisSettings;
import com.volmit.iris.manager.gui.IrisVision; import com.volmit.iris.manager.gui.IrisVision;
import com.volmit.iris.scaffold.IrisWorlds;
import com.volmit.iris.scaffold.engine.IrisAccess; import com.volmit.iris.scaffold.engine.IrisAccess;
import com.volmit.iris.util.KList; import com.volmit.iris.util.KList;
import com.volmit.iris.util.MortarCommand; import com.volmit.iris.util.MortarCommand;
@ -38,9 +39,21 @@ public class CommandIrisStudioMap extends MortarCommand
return true; return true;
} }
try
{
IrisAccess g = Iris.proj.getActiveProject().getActiveProvider(); IrisAccess g = Iris.proj.getActiveProject().getActiveProvider();
IrisVision.launch(g, 0); IrisVision.launch(g, 0);
sender.sendMessage("Opening Map!"); sender.sendMessage("Opening Map!");
}
catch(Throwable e)
{
IrisAccess g = IrisWorlds.access(sender.player().getWorld());
IrisVision.launch(g, 0);
sender.sendMessage("Opening Map!");
}
return true; return true;
} }

View File

@ -1,7 +1,9 @@
package com.volmit.iris.manager.command.world; package com.volmit.iris.manager.command.world;
import com.volmit.iris.Iris; import com.volmit.iris.Iris;
import com.volmit.iris.pregen.GeneratorQueue;
import com.volmit.iris.pregen.Pregenerator; import com.volmit.iris.pregen.Pregenerator;
import com.volmit.iris.pregen.queue.QueuedWorld;
import com.volmit.iris.util.KList; import com.volmit.iris.util.KList;
import com.volmit.iris.util.MortarCommand; import com.volmit.iris.util.MortarCommand;
import com.volmit.iris.util.MortarSender; import com.volmit.iris.util.MortarSender;

View File

@ -2,7 +2,9 @@ package com.volmit.iris.manager.gui;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import com.volmit.iris.scaffold.engine.Engine;
import com.volmit.iris.util.IrisInterpolation; import com.volmit.iris.util.IrisInterpolation;
import org.bukkit.Material;
public class IrisRenderer public class IrisRenderer
{ {
@ -31,4 +33,8 @@ public class IrisRenderer
return image; return image;
} }
public void set(double worldX, double worldZ) {
((Engine)renderer).getWorld().getBlockAt((int)worldX, 20, (int)worldZ).setType(Material.DIAMOND_BLOCK);
}
} }

View File

@ -3,6 +3,8 @@ package com.volmit.iris.manager.gui;
import com.volmit.iris.Iris; import com.volmit.iris.Iris;
import com.volmit.iris.scaffold.engine.IrisAccess; import com.volmit.iris.scaffold.engine.IrisAccess;
import com.volmit.iris.util.*; import com.volmit.iris.util.*;
import org.bukkit.World;
import org.bukkit.entity.Player;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.swing.*; import javax.swing.*;
@ -24,6 +26,7 @@ public class IrisVision extends JPanel implements MouseWheelListener
private static final long serialVersionUID = 2094606939770332040L; private static final long serialVersionUID = 2094606939770332040L;
private IrisRenderer renderer; private IrisRenderer renderer;
private int posX = 0; private int posX = 0;
private World world;
private int posZ = 0; private int posZ = 0;
private double scale = 128; private double scale = 128;
private double mscale = 1D; private double mscale = 1D;
@ -176,6 +179,26 @@ public class IrisVision extends JPanel implements MouseWheelListener
return null; 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 @Override
public void paint(Graphics gx) public void paint(Graphics gx)
{ {
@ -204,7 +227,7 @@ public class IrisVision extends JPanel implements MouseWheelListener
w = getWidth(); w = getWidth();
h = getHeight(); h = getHeight();
double vscale = scale; double vscale = scale;
scale = w / 32D; scale = w / 16D;
if(scale != vscale) 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()) if(!isVisible())
{ {
return; 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"); JFrame frame = new JFrame("Vision");
IrisVision nv = new IrisVision(); IrisVision nv = new IrisVision();
nv.world = world;
nv.renderer = new IrisRenderer(r); nv.renderer = new IrisRenderer(r);
frame.add(nv); frame.add(nv);
frame.setSize(1440, 820); frame.setSize(1440, 820);
@ -306,7 +336,7 @@ public class IrisVision extends JPanel implements MouseWheelListener
public static void launch(IrisAccess g, int i) { public static void launch(IrisAccess g, int i) {
J.a(() -> 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());
}); });
} }

View File

@ -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;
}

View File

@ -18,6 +18,7 @@ import org.bukkit.block.Biome;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import java.io.File; import java.io.File;
import java.io.IOException;
import java.util.Map; import java.util.Map;
public class DirectWorldWriter { public class DirectWorldWriter {
@ -51,16 +52,6 @@ public class DirectWorldWriter {
f.createNewFile(); f.createNewFile();
} }
try
{
writeBuffer.get(i).cleanupPalettesAndBlockStates();
}
catch(Throwable e)
{
}
MCAUtil.write(writeBuffer.get(i), f, true); MCAUtil.write(writeBuffer.get(i), f, true);
writeBuffer.remove(i); writeBuffer.remove(i);
} catch (Throwable e) { } catch (Throwable e) {
@ -202,6 +193,10 @@ public class DirectWorldWriter {
return s; return s;
} }
public void deleteChunk(int x, int z) {
}
public Chunk getChunk(int x, int z) public Chunk getChunk(int x, int z)
{ {
MCAFile mca = getMCA(x >> 5, z >> 5); MCAFile mca = getMCA(x >> 5, z >> 5);
@ -227,7 +222,12 @@ public class DirectWorldWriter {
} }
File f = getMCAFile(x, z); File f = getMCAFile(x, z);
try {
mca = f.exists() ? MCAUtil.read(f) : new MCAFile(x, z);
} catch (IOException e) {
e.printStackTrace();
mca = new MCAFile(x, z); mca = new MCAFile(x, z);
}
writeBuffer.put(key, mca); writeBuffer.put(key, mca);
return mca; return mca;

View File

@ -11,6 +11,7 @@ import io.papermc.lib.PaperLib;
import lombok.Data; import lombok.Data;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Chunk; import org.bukkit.Chunk;
import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
@ -39,17 +40,22 @@ import java.util.concurrent.locks.ReentrantLock;
public class Pregenerator implements Listener public class Pregenerator implements Listener
{ {
private static Pregenerator instance; private static Pregenerator instance;
private static final Color COLOR_MCA_PREPARE = Color.decode("#16211d"); private static final Color COLOR_ERROR = Color.decode("#E34113");
private static final Color COLOR_MCA_GENERATE = Color.decode("#34c0eb"); private static final Color COLOR_MCA_PREPARE = Color.decode("#3CAAB5");
private static final Color COLOR_MCA_GENERATE_SLOW = Color.decode("#34c0eb"); private static final Color COLOR_MCA_RELOAD = Color.decode("#41FF61");
private static final Color COLOR_MCA_GENERATE_SLOW_ASYNC = Color.decode("#34c0eb"); private static final Color COLOR_MCA_GENERATE = Color.decode("#33FF8F");
private static final Color COLOR_MCA_GENERATED = Color.decode("#34eb83"); private static final Color COLOR_MCA_GENERATE_SLOW = Color.decode("#13BAE3");
private static final Color COLOR_MCA_SEALED = Color.decode("#34eb83"); private static final Color COLOR_MCA_GENERATE_SLOW_ASYNC = Color.decode("#13BAE3");
private static final Color COLOR_MCA_DEFERRED = Color.decode("#211617"); 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 final World world;
private int lowestBedrock;
private final DirectWorldWriter directWriter; private final DirectWorldWriter directWriter;
private final AtomicBoolean active; private final AtomicBoolean active;
private final AtomicBoolean running; private final AtomicBoolean running;
private final KList<ChunkPosition> errors;
private final KList<Runnable> onComplete; private final KList<Runnable> onComplete;
private final ChunkPosition max; private final ChunkPosition max;
private final ChunkPosition min; private final ChunkPosition min;
@ -68,6 +74,8 @@ public class Pregenerator implements Listener
private final AtomicInteger vcaz; private final AtomicInteger vcaz;
private final long elapsed; private final long elapsed;
private final ChronoLatch latch; private final ChronoLatch latch;
private IrisAccess access;
private final KList<ChunkPosition> regionReload;
public Pregenerator(World world, int blockSize, Runnable onComplete) 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 public Pregenerator(World world, int blockSize, boolean dogui) throws HeadlessException
{ {
instance(); instance();
regionReload = new KList<>();
latch = new ChronoLatch(5000); latch = new ChronoLatch(5000);
memoryMetric = new AtomicReference<>("..."); memoryMetric = new AtomicReference<>("...");
method = new AtomicReference<>("STARTUP"); method = new AtomicReference<>("STARTUP");
memory = new AtomicLong(0); memory = new AtomicLong(0);
this.world = world; this.world = world;
errors = new KList<>();
vmcax = new AtomicInteger(); vmcax = new AtomicInteger();
vmcaz = new AtomicInteger(); vmcaz = new AtomicInteger();
vcax = new AtomicInteger(); vcax = new AtomicInteger();
@ -97,7 +107,7 @@ public class Pregenerator implements Listener
totalChunks = new AtomicInteger(0); totalChunks = new AtomicInteger(0);
generated = new AtomicInteger(0); generated = new AtomicInteger(0);
mcaDefer = new KList<>(); mcaDefer = new KList<>();
IrisAccess access = IrisWorlds.access(world); access = IrisWorlds.access(world);
this.directWriter = new DirectWorldWriter(world.getWorldFolder()); this.directWriter = new DirectWorldWriter(world.getWorldFolder());
this.running = new AtomicBoolean(true); this.running = new AtomicBoolean(true);
this.active = new AtomicBoolean(true); this.active = new AtomicBoolean(true);
@ -115,6 +125,10 @@ public class Pregenerator implements Listener
totalChunks.getAndAdd(1024); totalChunks.getAndAdd(1024);
draw.add(() -> drawMCA(xx, zz, COLOR_MCA_PREPARE)); draw.add(() -> drawMCA(xx, zz, COLOR_MCA_PREPARE));
}).drain(); }).drain();
if(access != null)
{
lowestBedrock = access.getCompound().getLowestBedrock();
}
gui = dogui ?(IrisSettings.get().getGui().isLocalPregenGui() && IrisSettings.get().getGui().isUseServerLaunchedGuis() ? MCAPregenGui.createAndShowGUI(this) : null) : null; gui = dogui ?(IrisSettings.get().getGui().isLocalPregenGui() && IrisSettings.get().getGui().isUseServerLaunchedGuis() ? MCAPregenGui.createAndShowGUI(this) : null) : null;
flushWorld(); flushWorld();
KList<ChunkPosition> order = computeChunkOrder(); KList<ChunkPosition> order = computeChunkOrder();
@ -135,7 +149,6 @@ public class Pregenerator implements Listener
else else
{ {
drawMCA(xx, zz, COLOR_MCA_DEFERRED); 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()); vmcaz.set(p.getZ());
generateDeferedMCARegion(p.getX(), p.getZ(), burst, mcaIteration); generateDeferedMCARegion(p.getX(), p.getZ(), burst, mcaIteration);
flushWorld(); flushWorld();
drawMCA(p.getX(), p.getZ(), COLOR_MCA_SEALED);
} }
burst.shutdownNow(); burst.shutdownNow();
@ -225,7 +237,7 @@ public class Pregenerator implements Listener
mcaIteration.accept(mcaox, mcaoz, (ii, jj) -> e.queue(() -> { mcaIteration.accept(mcaox, mcaoz, (ii, jj) -> e.queue(() -> {
draw(ii, jj, COLOR_MCA_GENERATE); draw(ii, jj, COLOR_MCA_GENERATE);
access.directWriteChunk(world, ii, jj, directWriter); access.directWriteChunk(world, ii, jj, directWriter);
draw(ii, jj, COLOR_MCA_GENERATED); draw(ii, jj, COLOR_MCA_GENERATED_MCA);
generated.getAndIncrement(); generated.getAndIncrement();
vcax.set(ii); vcax.set(ii);
vcaz.set(jj); vcaz.set(jj);
@ -236,12 +248,14 @@ public class Pregenerator implements Listener
{ {
drawMCA(x, z, COLOR_MCA_DEFERRED); drawMCA(x, z, COLOR_MCA_DEFERRED);
generated.set(generated.get() - 1024); generated.set(generated.get() - 1024);
mcaDefer.add(new ChunkPosition(x, z));
} }
totalChunks.getAndAdd(1024);
mcaDefer.add(new ChunkPosition(x, z));
} }
else else
{ {
totalChunks.getAndAdd(1024);
mcaDefer.add(new ChunkPosition(x, z)); mcaDefer.add(new ChunkPosition(x, z));
e.complete(); e.complete();
return false; return false;
@ -293,6 +307,8 @@ public class Pregenerator implements Listener
method.set("PaperAsync (Slow)"); method.set("PaperAsync (Slow)");
mcaIteration.accept(mcaox, mcaoz, (ii, jj) -> { mcaIteration.accept(mcaox, mcaoz, (ii, jj) -> {
e.queue(() -> { e.queue(() -> {
try
{
CompletableFuture<Chunk> cc = PaperLib.getChunkAtAsync(world, ii, jj); CompletableFuture<Chunk> cc = PaperLib.getChunkAtAsync(world, ii, jj);
draw(ii, jj, COLOR_MCA_GENERATE_SLOW_ASYNC); draw(ii, jj, COLOR_MCA_GENERATE_SLOW_ASYNC);
cc.join(); cc.join();
@ -300,6 +316,17 @@ public class Pregenerator implements Listener
generated.getAndIncrement(); generated.getAndIncrement();
vcax.set(ii); vcax.set(ii);
vcaz.set(jj); 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(); e.complete();
@ -314,7 +341,9 @@ public class Pregenerator implements Listener
q.add(() -> { q.add(() -> {
draw(ii, jj, COLOR_MCA_GENERATE_SLOW); draw(ii, jj, COLOR_MCA_GENERATE_SLOW);
world.getChunkAt(ii, jj).load(true); world.getChunkAt(ii, jj).load(true);
Chunk c = world.getChunkAt(ii, jj);
draw(ii, jj, COLOR_MCA_GENERATED); draw(ii, jj, COLOR_MCA_GENERATED);
checkForError(c);
m.getAndIncrement(); m.getAndIncrement();
generated.getAndIncrement(); generated.getAndIncrement();
vcax.set(ii); 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<ChunkPosition> computeChunkOrder() { private KList<ChunkPosition> computeChunkOrder() {
ChunkPosition center = new ChunkPosition(15, 15); ChunkPosition center = new ChunkPosition(15, 15);
KList<ChunkPosition> p = new KList<>(); KList<ChunkPosition> p = new KList<>();

View File

@ -1,5 +1,6 @@
package com.volmit.iris.scaffold.engine; package com.volmit.iris.scaffold.engine;
import com.volmit.iris.generator.actuator.IrisTerrainActuator;
import com.volmit.iris.manager.IrisDataManager; import com.volmit.iris.manager.IrisDataManager;
import com.volmit.iris.object.IrisBiome; import com.volmit.iris.object.IrisBiome;
import com.volmit.iris.object.IrisDimension; import com.volmit.iris.object.IrisDimension;
@ -151,4 +152,26 @@ public interface EngineCompound extends Listener, Hotloadable, DataProvider
} }
void updateWorld(World world); 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;
}
} }