mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-19 02:36:59 +00:00
Auto stash before revert of "Flush "
This commit is contained in:
parent
d33a02f6cd
commit
e7e130460e
@ -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'
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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");
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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());
|
||||
});
|
||||
}
|
||||
|
||||
|
14
src/main/java/com/volmit/iris/manager/gui/TileRender.java
Normal file
14
src/main/java/com/volmit/iris/manager/gui/TileRender.java
Normal 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;
|
||||
}
|
@ -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;
|
||||
|
@ -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<>();
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user