From 468c69d2dd29dbbd7768f396138d928666295a80 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Fri, 16 Oct 2020 23:45:44 -0400 Subject: [PATCH] Bugfixes & Performance Improvements --- pom.xml | 13 +- .../com/volmit/iris/command/CommandIris.java | 6 + .../iris/command/CommandIrisCreate.java | 5 + .../iris/command/CommandIrisDownload.java | 9 +- .../command/CommandIrisUpdateProject.java | 38 +++++ .../iris/command/CommandIrisUpdateWorld.java | 63 ++++++++ .../iris/command/CommandIrisWhatBlock.java | 1 - .../com/volmit/iris/gen/nms/NMSCreator.java | 45 +++--- .../java/com/volmit/iris/gui/PregenGui.java | 2 +- .../volmit/iris/manager/ProjectManager.java | 33 ++++- .../java/com/volmit/iris/util/PregenJob.java | 140 +++++++++++++++--- 11 files changed, 296 insertions(+), 59 deletions(-) create mode 100644 src/main/java/com/volmit/iris/command/CommandIrisUpdateProject.java create mode 100644 src/main/java/com/volmit/iris/command/CommandIrisUpdateWorld.java diff --git a/pom.xml b/pom.xml index 8ca35728d..47acee84a 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 bytecode.ninja Iris - 1.0.13 + 1.0.14 Iris false @@ -144,6 +144,10 @@ spigot-repo https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + papermc + https://papermc.io/repo/repository/maven-public/ + bcn http://bytecode.ninja/repository/bcn/ @@ -170,6 +174,13 @@ 1.16.1-R0.1-SNAPSHOT provided + + + io.papermc + paperlib + 1.0.5 + compile + org.bukkit.craftbukkit diff --git a/src/main/java/com/volmit/iris/command/CommandIris.java b/src/main/java/com/volmit/iris/command/CommandIris.java index 9bd850905..fea017b90 100644 --- a/src/main/java/com/volmit/iris/command/CommandIris.java +++ b/src/main/java/com/volmit/iris/command/CommandIris.java @@ -22,6 +22,12 @@ public class CommandIris extends MortarCommand @Command private CommandIrisDownload download; + @Command + private CommandIrisUpdateProject updateProject; + + @Command + private CommandIrisUpdateWorld updateWorld; + @Command private CommandIrisWhat what; diff --git a/src/main/java/com/volmit/iris/command/CommandIrisCreate.java b/src/main/java/com/volmit/iris/command/CommandIrisCreate.java index d84ea18a6..03c7eaee2 100644 --- a/src/main/java/com/volmit/iris/command/CommandIrisCreate.java +++ b/src/main/java/com/volmit/iris/command/CommandIrisCreate.java @@ -34,6 +34,11 @@ public class CommandIrisCreate extends MortarCommand @Override public boolean handle(MortarSender sender, String[] args) { + if(args.length == 0) + { + sender.sendMessage("/iris create [type=overworld] [seed=1337] [pregen=5000] [-zip]"); + } + String worldName = args[0]; String type = "overworld"; long seed = 1337; diff --git a/src/main/java/com/volmit/iris/command/CommandIrisDownload.java b/src/main/java/com/volmit/iris/command/CommandIrisDownload.java index 61e81408b..38467f534 100644 --- a/src/main/java/com/volmit/iris/command/CommandIrisDownload.java +++ b/src/main/java/com/volmit/iris/command/CommandIrisDownload.java @@ -1,7 +1,6 @@ package com.volmit.iris.command; import com.volmit.iris.Iris; -import com.volmit.iris.IrisSettings; import com.volmit.iris.util.C; import com.volmit.iris.util.J; import com.volmit.iris.util.MortarCommand; @@ -20,15 +19,9 @@ public class CommandIrisDownload extends MortarCommand @Override public boolean handle(MortarSender sender, String[] args) { - if(!IrisSettings.get().isStudio()) - { - sender.sendMessage("To use Iris Studio, please enable studio in Iris/settings.json"); - return true; - } - if(args.length < 1) { - sender.sendMessage("/iris std dl " + C.BOLD + ""); + sender.sendMessage("/iris dl " + C.BOLD + ""); return true; } diff --git a/src/main/java/com/volmit/iris/command/CommandIrisUpdateProject.java b/src/main/java/com/volmit/iris/command/CommandIrisUpdateProject.java new file mode 100644 index 000000000..1e8f6372f --- /dev/null +++ b/src/main/java/com/volmit/iris/command/CommandIrisUpdateProject.java @@ -0,0 +1,38 @@ +package com.volmit.iris.command; + +import com.volmit.iris.Iris; +import com.volmit.iris.util.C; +import com.volmit.iris.util.J; +import com.volmit.iris.util.MortarCommand; +import com.volmit.iris.util.MortarSender; + +public class CommandIrisUpdateProject extends MortarCommand +{ + public CommandIrisUpdateProject() + { + super("update-project", "^project"); + requiresPermission(Iris.perm.studio); + setDescription("Update a project from git."); + setCategory("Studio"); + } + + @Override + public boolean handle(MortarSender sender, String[] args) + { + if(args.length < 1) + { + sender.sendMessage("/iris update-project " + C.BOLD + ""); + return true; + } + + J.a(() -> Iris.proj.downloadSearch(sender, args[0], false, true)); + + return true; + } + + @Override + protected String getArgsUsage() + { + return ""; + } +} diff --git a/src/main/java/com/volmit/iris/command/CommandIrisUpdateWorld.java b/src/main/java/com/volmit/iris/command/CommandIrisUpdateWorld.java new file mode 100644 index 000000000..99574fbe5 --- /dev/null +++ b/src/main/java/com/volmit/iris/command/CommandIrisUpdateWorld.java @@ -0,0 +1,63 @@ +package com.volmit.iris.command; + +import java.io.File; + +import com.volmit.iris.Iris; +import com.volmit.iris.util.C; +import com.volmit.iris.util.J; +import com.volmit.iris.util.MortarCommand; +import com.volmit.iris.util.MortarSender; + +public class CommandIrisUpdateWorld extends MortarCommand +{ + public CommandIrisUpdateWorld() + { + super("update-world", "^world"); + requiresPermission(Iris.perm.studio); + setDescription("Update a world from a project."); + setCategory("Studio"); + } + + @Override + public boolean handle(MortarSender sender, String[] args) + { + if(args.length < 2) + { + sender.sendMessage("/iris update-world " + C.BOLD + " "); + return true; + } + + boolean fresh = false; + + for(String i : args) + { + if(i.equalsIgnoreCase("--fresh-download")) + { + fresh = true; + } + } + + boolean bfre = fresh; + + J.a(() -> + { + File folder = new File(args[0]); + folder.mkdirs(); + + if(bfre) + { + Iris.proj.downloadSearch(sender, args[1], false, true); + } + + Iris.proj.installIntoWorld(sender, args[1], folder); + }); + + return true; + } + + @Override + protected String getArgsUsage() + { + return " "; + } +} diff --git a/src/main/java/com/volmit/iris/command/CommandIrisWhatBlock.java b/src/main/java/com/volmit/iris/command/CommandIrisWhatBlock.java index e27af3d3b..464040f93 100644 --- a/src/main/java/com/volmit/iris/command/CommandIrisWhatBlock.java +++ b/src/main/java/com/volmit/iris/command/CommandIrisWhatBlock.java @@ -1,7 +1,6 @@ package com.volmit.iris.command; import org.bukkit.FluidCollisionMode; -import org.bukkit.Material; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; diff --git a/src/main/java/com/volmit/iris/gen/nms/NMSCreator.java b/src/main/java/com/volmit/iris/gen/nms/NMSCreator.java index 47a05800a..18d28835d 100644 --- a/src/main/java/com/volmit/iris/gen/nms/NMSCreator.java +++ b/src/main/java/com/volmit/iris/gen/nms/NMSCreator.java @@ -7,6 +7,8 @@ import org.bukkit.WorldCreator; import com.volmit.iris.Iris; import com.volmit.iris.IrisSettings; +import io.papermc.lib.PaperLib; + public class NMSCreator { public static World createWorld(WorldCreator creator) @@ -18,31 +20,34 @@ public class NMSCreator { if(IrisSettings.get().isSkipPrepareSpawnNMS()) { - try + if(!PaperLib.isPaper()) { - String code = Iris.nmsTag(); + try + { + String code = Iris.nmsTag(); - if(code.equals("v1_16_R2")) - { - return NMSCreator162.createWorld(creator, loadSpawn); + if(code.equals("v1_16_R2")) + { + return NMSCreator162.createWorld(creator, loadSpawn); + } + else if(code.equals("v1_16_R1")) + { + return NMSCreator161.createWorld(creator, loadSpawn); + } + else if(code.equals("v1_15_R1")) + { + return NMSCreator151.createWorld(creator, loadSpawn); + } + else if(code.equals("v1_14_R1")) + { + return NMSCreator141.createWorld(creator, loadSpawn); + } } - else if(code.equals("v1_16_R1")) - { - return NMSCreator161.createWorld(creator, loadSpawn); - } - else if(code.equals("v1_15_R1")) - { - return NMSCreator151.createWorld(creator, loadSpawn); - } - else if(code.equals("v1_14_R1")) - { - return NMSCreator141.createWorld(creator, loadSpawn); - } - } - catch(Throwable e) - { + catch(Throwable e) + { + } } } diff --git a/src/main/java/com/volmit/iris/gui/PregenGui.java b/src/main/java/com/volmit/iris/gui/PregenGui.java index d8a3b01b8..49f3669d0 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) 1000); + J.sleep((long) 1); repaint(); } diff --git a/src/main/java/com/volmit/iris/manager/ProjectManager.java b/src/main/java/com/volmit/iris/manager/ProjectManager.java index 03b5f5337..ae94405f3 100644 --- a/src/main/java/com/volmit/iris/manager/ProjectManager.java +++ b/src/main/java/com/volmit/iris/manager/ProjectManager.java @@ -81,7 +81,17 @@ public class ProjectManager else { sender.sendMessage("Found " + type + " dimension in " + ProjectManager.workspaceName + " folder. Repackaging"); - ZipUtil.unpack(Iris.proj.compilePackage(sender, type, true, true), iris); + File f = new IrisProject(new File(getWorkspaceFolder(), type)).getPath(); + + try + { + FileUtils.copyDirectory(f, iris); + } + + catch(IOException e) + { + e.printStackTrace(); + } } File dimf = new File(iris, "dimensions/" + type + ".json"); @@ -145,6 +155,11 @@ public class ProjectManager } public void downloadSearch(MortarSender sender, String key, boolean trim) + { + downloadSearch(sender, key, trim, false); + } + + public void downloadSearch(MortarSender sender, String key, boolean trim, boolean forceOverwrite) { String repo = getListing(false).get(key); @@ -157,7 +172,7 @@ public class ProjectManager sender.sendMessage("Found '" + key + "' in the Iris Listing as " + repo); try { - download(sender, repo, trim); + download(sender, repo, trim, forceOverwrite); } catch(JsonSyntaxException | IOException e) { @@ -166,6 +181,11 @@ public class ProjectManager } public void download(MortarSender sender, String repo, boolean trim) throws JsonSyntaxException, IOException + { + download(sender, repo, trim, false); + } + + public void download(MortarSender sender, String repo, boolean trim, boolean forceOverwrite) throws JsonSyntaxException, IOException { String url = "https://codeload.github.com/" + repo + "/zip/master"; sender.sendMessage("Downloading " + url); @@ -208,6 +228,13 @@ public class ProjectManager String key = dim.getName().split("\\Q.\\E")[0]; IrisDimension d = new Gson().fromJson(IO.readAll(dim), IrisDimension.class); sender.sendMessage("Importing " + d.getName() + " (" + key + ")"); + File packEntry = new File(packs, key); + + if(forceOverwrite) + { + IO.delete(packEntry); + } + Iris.globaldata.dump(); Iris.globaldata.preferFolder(null); @@ -217,8 +244,6 @@ public class ProjectManager return; } - File packEntry = new File(packs, key); - if(packEntry.exists() && packEntry.listFiles().length > 0) { sender.sendMessage("Another pack is using the key " + key + ". IMPORT FAILED!"); diff --git a/src/main/java/com/volmit/iris/util/PregenJob.java b/src/main/java/com/volmit/iris/util/PregenJob.java index ecbd9b3bf..ee5e6003b 100644 --- a/src/main/java/com/volmit/iris/util/PregenJob.java +++ b/src/main/java/com/volmit/iris/util/PregenJob.java @@ -1,6 +1,7 @@ package com.volmit.iris.util; import java.awt.Color; +import java.util.concurrent.Semaphore; import java.util.concurrent.atomic.AtomicInteger; import org.bukkit.Bukkit; @@ -16,6 +17,8 @@ import com.volmit.iris.gen.IrisTerrainProvider; import com.volmit.iris.gen.provisions.ProvisionBukkit; import com.volmit.iris.gui.PregenGui; +import io.papermc.lib.PaperLib; + public class PregenJob implements Listener { private World world; @@ -24,6 +27,7 @@ public class PregenJob implements Listener private int genned; private boolean completed; public static int task = -1; + private Semaphore working; private AtomicInteger g = new AtomicInteger(); private PrecisionStopwatch s; private ChronoLatch cl; @@ -41,20 +45,22 @@ public class PregenJob implements Listener private boolean first; private 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 RollingSequence acps = new RollingSequence(PaperLib.isPaper() ? 8 : 32); int xc = 0; public PregenJob(World world, int size, MortarSender sender, Runnable onDone) { g.set(0); + working = new Semaphore(tc()); this.s = PrecisionStopwatch.start(); Iris.instance.registerListener(this); this.world = world; this.size = size; this.onDone = onDone; - world.getWorldBorder().setCenter(0, 0); - world.getWorldBorder().setWarningDistance(64); - world.getWorldBorder().setSize(size); this.sender = sender; cl = new ChronoLatch(3000); clx = new ChronoLatch(20000); @@ -93,6 +99,11 @@ public class PregenJob implements Listener task = Bukkit.getScheduler().scheduleSyncRepeatingTask(Iris.instance, this::onTick, 0, 0); } + public int tc() + { + return 48; + } + public static void stop() { try @@ -116,9 +127,17 @@ public class PregenJob implements Listener PrecisionStopwatch p = PrecisionStopwatch.start(); - while(p.getMilliseconds() < 7000) + if(PaperLib.isPaper()) { - tick(); + tickPaper(); + } + + else + { + while(p.getMilliseconds() < 7000) + { + tick(); + } } if(cl.flip()) @@ -138,8 +157,37 @@ public class PregenJob implements Listener } } + public void tickPaper() + { + if(working.getQueueLength() >= tc() / 2) + { + return; + } + + for(int i = 0; i < 128; i++) + { + tick(); + } + } + public void tick() { + if((total - genned < 0 || genned > (((size + 32) / 16) * (size + 32) / 16)) && !completed) + { + completed = true; + + for(Chunk i : world.getLoadedChunks()) + { + i.unload(true); + } + + saveAll(); + Iris.instance.unregisterListener(this); + completed = true; + sender.sendMessage("Pregen Completed!"); + onDone.run(); + } + if(completed) { return; @@ -190,18 +238,21 @@ public class PregenJob implements Listener chunkSpiraler.retarget(cubeSize, cubeSize); } - else + else if(!completed) { - for(Chunk i : world.getLoadedChunks()) - { - i.unload(true); - } + genned += (((size + 32) / 16) * (size + 32) / 16) + 100000; + } - saveAll(); - Iris.instance.unregisterListener(this); - completed = true; - sender.sendMessage("Pregen Completed!"); - onDone.run(); + double dur = M.ms() - lt; + + if(dur > 1000 && genned > lg) + { + int gain = genned - lg; + double rat = dur / 1000D; + acps.put((double) gain / rat); + cps = acps.getAverage(); + lt = M.ms(); + lg = genned; } } @@ -214,17 +265,58 @@ public class PregenJob implements Listener { if(isChunkWithin(chunkX, chunkZ)) { - if(consumer != null) + if(PaperLib.isPaper()) { - consumer.accept(new ChunkPosition(chunkX, chunkZ), Color.blue.darker().darker()); + if(consumer != null) + { + consumer.accept(new ChunkPosition(chunkX, chunkZ), Color.magenta.darker().darker().darker()); + } + int cx = chunkX; + int cz = chunkZ; + J.a(() -> + { + try + { + working.acquire(); + + if(consumer != null) + { + consumer.accept(new ChunkPosition(cx, cz), Color.magenta); + } + + PaperLib.getChunkAtAsync(world, cx, cz).thenAccept(chunk -> + { + working.release(); + genned++; + + if(consumer != null) + { + consumer.accept(new ChunkPosition(chunk.getX(), chunk.getZ()), tp != null ? tp.render(chunk.getX() * 16, chunk.getZ() * 16) : Color.blue); + } + }); + } + + catch(InterruptedException e) + { + e.printStackTrace(); + } + }); } - world.loadChunk(chunkX, chunkZ); - genned++; - - if(consumer != null) + else { - consumer.accept(new ChunkPosition(chunkX, chunkZ), tp != null ? tp.render(chunkX * 16, chunkZ * 16) : Color.blue); + if(consumer != null) + { + consumer.accept(new ChunkPosition(chunkX, chunkZ), Color.blue.darker().darker()); + } + + world.loadChunk(chunkX, chunkZ); + genned++; + + if(consumer != null) + { + consumer.accept(new ChunkPosition(chunkX, chunkZ), tp != null ? tp.render(chunkX * 16, chunkZ * 16) : Color.blue); + } } } @@ -295,9 +387,9 @@ public class PregenJob implements Listener public String[] getProgress() { - long eta = (long) ((total - genned) * (s.getMilliseconds() / (double) genned)); + long eta = (long) ((total - genned) * 1000D / cps); - 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((s.getMilliseconds() / (double) genned), 2), "Chunks/s: " + Form.f(1000D / (s.getMilliseconds() / genned), 1), + 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), }; } }