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'
version '1.4.13'
version '1.4.14'
def apiVersion = '1.17'
def name = '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 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<BlockData>
if(getDimension().isBedrock())
{
h.set(xf, i, zf, BEDROCK);
lastBedrock = i;
continue;
}
}

View File

@ -27,9 +27,6 @@ public class CommandIrisStudio extends MortarCommand
@Command
private CommandIrisStudioUpdate update;
//@Command
//private CommandIrisStudioMap map;
@Command
private CommandIrisStudioGoto got0;
@ -60,6 +57,9 @@ public class CommandIrisStudio extends MortarCommand
@Command
private CommandIrisStudioConvert convert;
@Command
private CommandIrisStudioMap map;
public CommandIrisStudio()
{
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.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;
}
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;
}

View File

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

View File

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

View File

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

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 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);
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;

View File

@ -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<ChunkPosition> errors;
private final KList<Runnable> 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<ChunkPosition> 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<ChunkPosition> 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,6 +307,8 @@ public class Pregenerator implements Listener
method.set("PaperAsync (Slow)");
mcaIteration.accept(mcaox, mcaoz, (ii, jj) -> {
e.queue(() -> {
try
{
CompletableFuture<Chunk> cc = PaperLib.getChunkAtAsync(world, ii, jj);
draw(ii, jj, COLOR_MCA_GENERATE_SLOW_ASYNC);
cc.join();
@ -300,6 +316,17 @@ public class Pregenerator implements Listener
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<ChunkPosition> computeChunkOrder() {
ChunkPosition center = new ChunkPosition(15, 15);
KList<ChunkPosition> p = new KList<>();

View File

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