diff --git a/pom.xml b/pom.xml index 47acee84a..3aa591270 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 bytecode.ninja Iris - 1.0.14 + 1.0.15 Iris false diff --git a/src/main/java/com/volmit/iris/IrisSettings.java b/src/main/java/com/volmit/iris/IrisSettings.java index 6919f28d5..a4a0acab3 100644 --- a/src/main/java/com/volmit/iris/IrisSettings.java +++ b/src/main/java/com/volmit/iris/IrisSettings.java @@ -90,10 +90,6 @@ public class IrisSettings @Desc("Skips preparing spawn by using nms to hijack the world init phase") public boolean skipPrepareSpawnNMS = true; - @DontObfuscate - @Desc("Used to activate Iris") - public String activationCode = ""; - public static IrisSettings get() { if(settings != null) diff --git a/src/main/java/com/volmit/iris/gen/IrisTerrainProvider.java b/src/main/java/com/volmit/iris/gen/IrisTerrainProvider.java index 34b9cb3f0..09593e05e 100644 --- a/src/main/java/com/volmit/iris/gen/IrisTerrainProvider.java +++ b/src/main/java/com/volmit/iris/gen/IrisTerrainProvider.java @@ -1,8 +1,11 @@ package com.volmit.iris.gen; import java.awt.Color; +import java.io.File; import java.io.IOException; import java.util.Random; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; import java.util.function.Function; import org.bukkit.Bukkit; @@ -33,10 +36,15 @@ import com.volmit.iris.object.IrisRegion; import com.volmit.iris.util.FastBlockData; import com.volmit.iris.util.Form; import com.volmit.iris.util.IrisStructureResult; +import com.volmit.iris.util.J; import com.volmit.iris.util.KList; +import com.volmit.iris.util.M; +import com.volmit.iris.util.O; import com.volmit.iris.util.PrecisionStopwatch; import com.volmit.iris.util.RNG; +import com.volmit.iris.util.Spiraler; +import io.papermc.lib.PaperLib; import lombok.Data; import lombok.EqualsAndHashCode; @@ -613,4 +621,84 @@ public class IrisTerrainProvider extends SkyTerrainProvider implements IrisConte { return true; } + + public File[] scrapeRegion(int x, int z, Consumer progress) + { + int minX = x << 5; + int minZ = z << 5; + int maxX = x + 31; + int maxZ = z + 31; + AtomicInteger outputs = new AtomicInteger(0); + + new Spiraler(36, 36, (vx, vz) -> + { + int ax = vx + 16 + minX; + int az = vz + 16 + minZ; + + if(ax > maxX || ax < minX || az > maxZ || az < minZ) + { + return; + } + + PaperLib.getChunkAtAsyncUrgently(getTarget().getRealWorld(), ax, az, true).thenAccept((c) -> + { + outputs.addAndGet(1); + }); + }).drain(); + + long ms = M.ms(); + int lastChange = outputs.get(); + while(outputs.get() != 1024) + { + J.sleep(1000); + + if(outputs.get() != lastChange) + { + lastChange = outputs.get(); + ms = M.ms(); + progress.accept((double) lastChange / 1024D); + } + + if(outputs.get() == lastChange && M.ms() - ms > 60000) + { + Iris.error("Cant get this chunk region waited 60 seconds!"); + break; + } + } + + progress.accept(1D); + O b = new O(); + b.set(false); + J.s(() -> + { + getTarget().getRealWorld().save(); + Iris.instance.getServer().dispatchCommand(Bukkit.getConsoleSender(), "save-all"); + b.set(true); + }); + + try + { + getParallaxMap().saveAll(); + } + + catch(IOException e) + { + e.printStackTrace(); + } + + while(!b.get()) + { + J.sleep(10); + } + + File r = new File(getTarget().getRealWorld().getWorldFolder(), "region/r." + x + "." + z + ".mca"); + File p = new File(getTarget().getRealWorld().getWorldFolder(), "parallax/sr." + x + "." + z + ".smca"); + + if(r.exists() && p.exists()) + { + return new File[] {r, p}; + } + + return null; + } } diff --git a/src/main/java/com/volmit/iris/gui/PregenGui.java b/src/main/java/com/volmit/iris/gui/PregenGui.java index 49f3669d0..476372b2c 100644 --- a/src/main/java/com/volmit/iris/gui/PregenGui.java +++ b/src/main/java/com/volmit/iris/gui/PregenGui.java @@ -81,7 +81,7 @@ public class PregenGui extends JPanel g.drawString(i, 20, hh += h); } - J.sleep((long) 1); + J.sleep((long) 250); repaint(); } @@ -99,6 +99,7 @@ public class PregenGui extends JPanel bg.fillRect(x, z, xa - x, za - z); } + @SuppressWarnings("deprecation") private static void createAndShowGUI(PregenJob j) { JFrame frame = new JFrame("Pregen View"); @@ -107,6 +108,10 @@ public class PregenGui extends JPanel nv.job = j; j.subscribe((c, b) -> { + if(b.equals(Color.pink) && c.equals(new ChunkPosition(Integer.MAX_VALUE, Integer.MAX_VALUE))) + { + frame.hide(); + } nv.l.lock(); nv.order.add(() -> nv.draw(c, b, nv.minC, nv.maxC, nv.bg)); nv.l.unlock(); diff --git a/src/main/java/com/volmit/iris/util/PregenJob.java b/src/main/java/com/volmit/iris/util/PregenJob.java index ee5e6003b..5a4cfc9bf 100644 --- a/src/main/java/com/volmit/iris/util/PregenJob.java +++ b/src/main/java/com/volmit/iris/util/PregenJob.java @@ -12,15 +12,16 @@ import org.bukkit.event.Listener; import org.bukkit.event.world.ChunkUnloadEvent; import com.volmit.iris.Iris; -import com.volmit.iris.IrisSettings; import com.volmit.iris.gen.IrisTerrainProvider; import com.volmit.iris.gen.provisions.ProvisionBukkit; import com.volmit.iris.gui.PregenGui; import io.papermc.lib.PaperLib; +import lombok.Getter; public class PregenJob implements Listener { + @Getter private World world; private int size; private int total; @@ -43,12 +44,14 @@ public class PregenJob implements Listener private Spiraler spiraler; private Spiraler chunkSpiraler; private boolean first; - private Consumer2 consumer; + private static Consumer2 consumer; private IrisTerrainProvider tp; private double cps = 0; private int lg = 0; private long lt = M.ms(); - private int cubeSize = IrisSettings.get().getPregenTileSize(); + private int cubeSize = 32; + private long nogen = M.ms(); + private KList requeueMCA = new KList(); private RollingSequence acps = new RollingSequence(PaperLib.isPaper() ? 8 : 32); int xc = 0; @@ -109,6 +112,11 @@ public class PregenJob implements Listener try { Bukkit.getScheduler().cancelTask(task); + + if(consumer != null) + { + consumer.accept(new ChunkPosition(Integer.MAX_VALUE, Integer.MAX_VALUE), Color.pink); + } } catch(Throwable e) @@ -172,7 +180,7 @@ public class PregenJob implements Listener public void tick() { - if((total - genned < 0 || genned > (((size + 32) / 16) * (size + 32) / 16)) && !completed) + if(M.ms() - nogen > 5000 && Math.min((double) genned / (double) total, 1.0) > 0.99 && !completed) { completed = true; @@ -185,7 +193,12 @@ public class PregenJob implements Listener Iris.instance.unregisterListener(this); completed = true; sender.sendMessage("Pregen Completed!"); + if(consumer != null) + { + consumer.accept(new ChunkPosition(Integer.MAX_VALUE, Integer.MAX_VALUE), Color.pink); + } onDone.run(); + return; } if(completed) @@ -221,10 +234,22 @@ public class PregenJob implements Listener tickChunk(); } - else if(spiraler.hasNext()) + else if(spiraler.hasNext() || requeueMCA.isNotEmpty()) { saveAllRequest(); - spiraler.next(); + + if(requeueMCA.isNotEmpty()) + { + ChunkPosition posf = requeueMCA.popRandom(); + mcaX = posf.getX(); + mcaZ = posf.getZ(); + chunkSpiraler.retarget(cubeSize, cubeSize); + } + + else if(spiraler.hasNext()) + { + spiraler.next(); + } while(chunkSpiraler.hasNext()) { @@ -284,10 +309,11 @@ public class PregenJob implements Listener consumer.accept(new ChunkPosition(cx, cz), Color.magenta); } - PaperLib.getChunkAtAsync(world, cx, cz).thenAccept(chunk -> + PaperLib.getChunkAtAsyncUrgently(world, cx, cz, true).thenAccept(chunk -> { working.release(); genned++; + nogen = M.ms(); if(consumer != null) { @@ -312,6 +338,7 @@ public class PregenJob implements Listener world.loadChunk(chunkX, chunkZ); genned++; + nogen = M.ms(); if(consumer != null) { @@ -392,4 +419,10 @@ public class PregenJob implements Listener return new String[] {"Progress: " + Form.pc(Math.min((double) genned / (double) total, 1.0), 0), "Generated: " + Form.f(genned) + " Chunks", "Remaining: " + Form.f(total - genned) + " Chunks", "Elapsed: " + Form.duration((long) s.getMilliseconds(), 2), "Estimate: " + ((genned >= total - 5 ? "Any second..." : s.getMilliseconds() < 25000 ? "Calculating..." : Form.duration(eta, 2))), "ChunksMS: " + Form.duration(1000D / cps, 2), "Chunks/s: " + Form.f(cps, 1), }; } + + public void progressMCA(Color color, int x, int z, double pct) + { + // TODO Auto-generated method stub + + } }