From be3d7ef11d7a4189843705b91c439a32eb7612fd Mon Sep 17 00:00:00 2001 From: CocoTheOwner Date: Fri, 6 Aug 2021 16:52:15 +0200 Subject: [PATCH] Upgrade pregen command. PregenTask now takes width & height ins o radius --- .../volmit/iris/core/command/CommandIris.java | 1 + .../command/pregen/CommandIrisPregen.java | 65 ++++++ .../pregen/CommandIrisPregenCreate.java | 174 ++++++++++++++++ .../command/pregen/CommandIrisPregenStop.java | 43 ++++ .../pregen/CommandIrisPregenToggle.java | 37 ++++ .../core/command/world/CommandIrisPregen.java | 185 ------------------ .../volmit/iris/core/gui/PregeneratorJob.java | 5 +- .../iris/core/pregenerator/PregenTask.java | 9 +- 8 files changed, 329 insertions(+), 190 deletions(-) create mode 100644 src/main/java/com/volmit/iris/core/command/pregen/CommandIrisPregen.java create mode 100644 src/main/java/com/volmit/iris/core/command/pregen/CommandIrisPregenCreate.java create mode 100644 src/main/java/com/volmit/iris/core/command/pregen/CommandIrisPregenStop.java create mode 100644 src/main/java/com/volmit/iris/core/command/pregen/CommandIrisPregenToggle.java delete mode 100644 src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java diff --git a/src/main/java/com/volmit/iris/core/command/CommandIris.java b/src/main/java/com/volmit/iris/core/command/CommandIris.java index dfdee227d..49edcc0f7 100644 --- a/src/main/java/com/volmit/iris/core/command/CommandIris.java +++ b/src/main/java/com/volmit/iris/core/command/CommandIris.java @@ -21,6 +21,7 @@ package com.volmit.iris.core.command; import com.volmit.iris.Iris; import com.volmit.iris.core.command.jigsaw.CommandIrisJigsaw; import com.volmit.iris.core.command.object.CommandIrisObject; +import com.volmit.iris.core.command.pregen.CommandIrisPregen; import com.volmit.iris.core.command.studio.CommandIrisStudio; import com.volmit.iris.core.command.what.CommandIrisWhat; import com.volmit.iris.core.command.world.*; diff --git a/src/main/java/com/volmit/iris/core/command/pregen/CommandIrisPregen.java b/src/main/java/com/volmit/iris/core/command/pregen/CommandIrisPregen.java new file mode 100644 index 000000000..6b85af100 --- /dev/null +++ b/src/main/java/com/volmit/iris/core/command/pregen/CommandIrisPregen.java @@ -0,0 +1,65 @@ +/* + * Iris is a World Generator for Minecraft Bukkit Servers + * Copyright (c) 2021 Arcane Arts (Volmit Software) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.volmit.iris.core.command.pregen; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.tools.IrisToolbelt; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.plugin.Command; +import com.volmit.iris.util.plugin.MortarCommand; +import com.volmit.iris.util.plugin.VolmitSender; + +public class CommandIrisPregen extends MortarCommand { + @Command + private CommandIrisPregenCreate start; + + @Command + private CommandIrisPregenStop stop; + + @Command + private CommandIrisPregenToggle toggle; + + public CommandIrisPregen() { + super("pregen", "preg", "p"); + requiresPermission(Iris.perm); + setCategory("Pregen"); + setDescription("Pregeneration Commands"); + } + + @Override + public void addTabOptions(VolmitSender sender, String[] args, KList list) { + + } + + @Override + public boolean handle(VolmitSender sender, String[] args) { + if (!IrisToolbelt.isIrisWorld(sender.player().getWorld())){ + sender.sendMessage("Pregen only works in Iris worlds!"); + } + + sender.sendMessage("Iris Pregen Commands:"); + printHelp(sender); + return true; + } + + @Override + protected String getArgsUsage() { + return "[subcommand]"; + } +} diff --git a/src/main/java/com/volmit/iris/core/command/pregen/CommandIrisPregenCreate.java b/src/main/java/com/volmit/iris/core/command/pregen/CommandIrisPregenCreate.java new file mode 100644 index 000000000..24357970b --- /dev/null +++ b/src/main/java/com/volmit/iris/core/command/pregen/CommandIrisPregenCreate.java @@ -0,0 +1,174 @@ +package com.volmit.iris.core.command.pregen; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.gui.PregeneratorJob; +import com.volmit.iris.core.pregenerator.PregenTask; +import com.volmit.iris.core.pregenerator.methods.HybridPregenMethod; +import com.volmit.iris.core.tools.IrisToolbelt; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.math.Position2; +import com.volmit.iris.util.plugin.MortarCommand; +import com.volmit.iris.util.plugin.VolmitSender; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.checkerframework.checker.units.qual.K; + +import java.util.Arrays; + +public class CommandIrisPregenCreate extends MortarCommand { + + public CommandIrisPregenCreate() { + super("create", "c", "new", "+"); + requiresPermission(Iris.perm); + setCategory("Pregen"); + setDescription("Create a new pregeneration task"); + } + + @Override + public void addTabOptions(VolmitSender sender, String[] args, KList list) { + + list.add("5000"); + list.add("size=5000 world=IrisWorld x=500 z=-1000"); + list.add("5000 world=IrisWorld x=500 z=-1000"); + list.add("world=IrisWorld x=500 z=-1000"); + for (World w : Bukkit.getServer().getWorlds()) { + list.add(w.getName()); + } + } + + @Override + protected String getArgsUsage() { + return null; + } + + @Override + public boolean handle(VolmitSender sender, String[] args) { + + if (PregeneratorJob.getInstance() != null) { + sender.sendMessage("Pregeneration task already ongoing. You can stop it with /ir p stop"); + return true; + } + + World world = null; + int width = -1; + int height = -1; + int x = 0; + int z = 0; + + KList failed = new KList<>(); + for (String a : args) { + if (a.contains("=")) { + String pre = a.split("=")[0]; + String val = a.split("=")[1]; + if (pre.equals("world")){ + world = Bukkit.getWorld(val); + } else if (!isVal(val)){ + sender.sendMessage("Parameters other than `world=` require a number (+ c|chunk|r|region|k), given: '" + a + "' is invalid"); + } else { + switch (pre) { + case "width" -> width = getVal(val); + case "height" -> height = getVal(val); + case "radius" -> { + width = getVal(val); + height = getVal(val); + } + case "x" -> x = getVal(val); + case "z" -> z = getVal(val); + } + } + } else if (isVal(a)) { + width = getVal(a); + height = getVal(a); + } else { + failed.add(a); + } + } + + if (width == -1 || height == -1){ + sender.sendMessage("Size not specified"); + sender.sendMessage(getArgsUsage()); + } + + world = world == null ? sender.player().getWorld() : world; + + KList details = new KList<>( + "Pregeneration details:", + " - World > " + world.getName(), + " - Width/Height > " + width + "/" + height, + " - Center x,z > " + x + "," + z, + failed.isEmpty() ? "(No failed arguments)" : "FAILED ARGS: " + failed + ); + + + if (pregenerate(world, width, height, x, z)){ + sender.sendMessage("Successfully started pregen"); + } else { + sender.sendMessage("Failed to start pregen. Doublecheck your arguments!"); + } + sender.sendMessage(details.array()); + + return true; + } + + /** + * Pregenerate a + * @param world world with a + * @param width and + * @param height with center + * @param x and + * @param z coords + * @return true if successful + */ + private boolean pregenerate(World world, int width, int height, int x, int z){ + try { + IrisToolbelt.pregenerate(PregenTask + .builder() + .center(new Position2(x, z)) + .width(width >> 9 + 1) + .height(height >> 9 + 1) + .build(), world); + } catch (Throwable e){ + Iris.reportError(e); + return false; + } + return true; + } + + private int getVal(String arg) { + + if (arg.toLowerCase().endsWith("c") || arg.toLowerCase().endsWith("chunks")) { + return Integer.parseInt(arg.toLowerCase().replaceAll("\\Qc\\E", "").replaceAll("\\Qchunks\\E", "")) * 16; + } + + if (arg.toLowerCase().endsWith("r") || arg.toLowerCase().endsWith("regions")) { + return Integer.parseInt(arg.toLowerCase().replaceAll("\\Qr\\E", "").replaceAll("\\Qregions\\E", "")) * 512; + } + + if (arg.toLowerCase().endsWith("k")) { + return Integer.parseInt(arg.toLowerCase().replaceAll("\\Qk\\E", "")) * 1000; + } + + return Integer.parseInt(arg.toLowerCase()); + } + + /** + * Checks if the + * @param arg argument + * @return is valid -> true + */ + private boolean isVal(String arg) { + try { + Integer.parseInt( + arg.toLowerCase() + .replace("chunks", "") + .replace("c", "") + .replace("regions", "") + .replace("r", "") + .replace("k", "") + ); + } catch (NumberFormatException e) { + return false; + } + return true; + } +} diff --git a/src/main/java/com/volmit/iris/core/command/pregen/CommandIrisPregenStop.java b/src/main/java/com/volmit/iris/core/command/pregen/CommandIrisPregenStop.java new file mode 100644 index 000000000..daa68ef8e --- /dev/null +++ b/src/main/java/com/volmit/iris/core/command/pregen/CommandIrisPregenStop.java @@ -0,0 +1,43 @@ +package com.volmit.iris.core.command.pregen; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.gui.PregeneratorJob; +import com.volmit.iris.core.pregenerator.PregenTask; +import com.volmit.iris.core.pregenerator.methods.HybridPregenMethod; +import com.volmit.iris.core.tools.IrisToolbelt; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.math.Position2; +import com.volmit.iris.util.plugin.MortarCommand; +import com.volmit.iris.util.plugin.VolmitSender; +import org.bukkit.Bukkit; +import org.bukkit.World; + +public class CommandIrisPregenStop extends MortarCommand { + + public CommandIrisPregenStop() { + super("stop", "s", "x", "close"); + requiresPermission(Iris.perm); + setCategory("Pregen"); + setDescription("Stop an ongoing pregeneration task"); + } + + @Override + public boolean handle(VolmitSender sender, String[] args) { + if (PregeneratorJob.shutdownInstance()){ + sender.sendMessage("Stopped pregeneration task"); + } else { + sender.sendMessage("No active pregeneration tasks to stop"); + } + return true; + } + + @Override + public void addTabOptions(VolmitSender sender, String[] args, KList list) { + + } + + @Override + protected String getArgsUsage() { + return null; + } +} diff --git a/src/main/java/com/volmit/iris/core/command/pregen/CommandIrisPregenToggle.java b/src/main/java/com/volmit/iris/core/command/pregen/CommandIrisPregenToggle.java new file mode 100644 index 000000000..3406a09fe --- /dev/null +++ b/src/main/java/com/volmit/iris/core/command/pregen/CommandIrisPregenToggle.java @@ -0,0 +1,37 @@ +package com.volmit.iris.core.command.pregen; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.gui.PregeneratorJob; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.plugin.MortarCommand; +import com.volmit.iris.util.plugin.VolmitSender; + +public class CommandIrisPregenToggle extends MortarCommand { + + public CommandIrisPregenToggle() { + super("toggle", "t", "pause", "continue", "p", "c"); + requiresPermission(Iris.perm); + setCategory("Pregen"); + setDescription("Toggle an ongoing pregeneration task"); + } + + @Override + public boolean handle(VolmitSender sender, String[] args) { + if (PregeneratorJob.pauseResume()){ + sender.sendMessage("Toggled pregeneration task, now: " + (PregeneratorJob.isPaused() ? "Paused" : "Running")); + } else { + sender.sendMessage("No active pregeneration tasks to toggle"); + } + return true; + } + + @Override + public void addTabOptions(VolmitSender sender, String[] args, KList list) { + + } + + @Override + protected String getArgsUsage() { + return null; + } +} diff --git a/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java b/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java deleted file mode 100644 index cd083c332..000000000 --- a/src/main/java/com/volmit/iris/core/command/world/CommandIrisPregen.java +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Iris is a World Generator for Minecraft Bukkit Servers - * Copyright (c) 2021 Arcane Arts (Volmit Software) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.volmit.iris.core.command.world; - -import com.volmit.iris.Iris; -import com.volmit.iris.core.gui.PregeneratorJob; -import com.volmit.iris.core.pregenerator.PregenTask; -import com.volmit.iris.core.pregenerator.methods.HybridPregenMethod; -import com.volmit.iris.core.tools.IrisToolbelt; -import com.volmit.iris.util.collection.KList; -import com.volmit.iris.util.math.Position2; -import com.volmit.iris.util.plugin.MortarCommand; -import com.volmit.iris.util.plugin.VolmitSender; -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.bukkit.entity.Player; - -import java.awt.*; - -public class CommandIrisPregen extends MortarCommand { - public CommandIrisPregen() { - super("pregen", "preg", "p"); - setDescription( - """ - Pregen this world with optional parameters:\s - '1k' = 1000 * 2 by 1000 * 2 blocks, '1c' = 2 by 2 chunks, and '1r' = 64 by 64 chunks. - If you are using the console or want to pregen a world you're not in: - also specify the name of the world. E.g. /ir pregen 5k world""" - ); - requiresPermission(Iris.perm.studio); - setCategory("Pregen"); - } - - @Override - public void addTabOptions(VolmitSender sender, String[] args, KList list) { - list.add("stop"); - list.add("pause"); - list.add("resume"); - list.add("500"); - list.add("1000"); - list.add("10k"); - list.add("25k"); - list.add("10c"); - list.add("25c"); - list.add("5r"); - list.add("10r"); - for (World w : Bukkit.getServer().getWorlds()) { - list.add(w.getName()); - } - } - - @Override - public boolean handle(VolmitSender sender, String[] args) { - if (args.length == 0) { - sender.sendMessage("/iris pregen "); - return true; - } - - if (args[0].equalsIgnoreCase("stop") || args[0].equalsIgnoreCase("x")) { - if (PregeneratorJob.shutdownInstance()) { - sender.sendMessage("Stopped Pregen. Finishing last region file before shutting down..."); - } else { - sender.sendMessage("No Active Pregens."); - } - return true; - } else if (args[0].equalsIgnoreCase("pause") || args[0].equalsIgnoreCase("resume")) { - if (PregeneratorJob.getInstance() != null) { - PregeneratorJob.pauseResume(); - - if (PregeneratorJob.isPaused()) { - sender.sendMessage("Pregen Paused"); - } else { - sender.sendMessage("Pregen Resumed"); - } - } else { - sender.sendMessage("No Active Pregens"); - } - - return true; - } else if (sender.isPlayer()) { - Player p = sender.player(); - World world; - if (args.length != 2) { - world = p.getWorld(); - } else { - try { - world = Bukkit.getWorld(args[1]); - } catch (Exception e) { - Iris.reportError(e); - sender.sendMessage("Could not find specified world"); - sender.sendMessage("Please doublecheck your command. E.g. /ir pregen 5k world"); - return true; - } - } - try { - IrisToolbelt.pregenerate(PregenTask - .builder() - .center(new Position2(0, 0)) - .radius(((getVal(args[0]) >> 4) >> 5) + 1) - .build(), world); - } catch (NumberFormatException e) { - Iris.reportError(e); - sender.sendMessage("Invalid argument in command"); - return true; - } catch (NullPointerException e) { - Iris.reportError(e); - e.printStackTrace(); - sender.sendMessage("No radius specified (check error in console)"); - } catch (HeadlessException e) { - Iris.reportError(e); - sender.sendMessage("If you are seeing this and are using a hosted server, please turn off 'useServerLaunchedGUIs' in the settings"); - } - - return true; - } else { - if (args.length < 1) { - sender.sendMessage("Please specify the radius of the pregen and the name of the world. E.g. /ir pregen 5k world"); - return true; - } - if (args.length < 2) { - sender.sendMessage("Please specify the name of the world after the command. E.g. /ir pregen 5k world"); - return true; - } - World world = Bukkit.getWorld(args[1]); - try { - new PregeneratorJob(PregenTask - .builder() - .center(new Position2(0, 0)) - .radius(((getVal(args[0]) >> 4) >> 5) + 1) - .build(), - new HybridPregenMethod(world, Runtime.getRuntime().availableProcessors())); - } catch (NumberFormatException e) { - Iris.reportError(e); - sender.sendMessage("Invalid argument in command"); - return true; - } catch (NullPointerException e) { - Iris.reportError(e); - sender.sendMessage("Not all required parameters specified"); - } catch (HeadlessException e) { - Iris.reportError(e); - sender.sendMessage("If you are seeing this and are using a hosted server, please turn off 'useServerLaunchedGUIs' in the settings"); - } - - return true; - } - } - - private int getVal(String arg) { - - if (arg.toLowerCase().endsWith("c") || arg.toLowerCase().endsWith("chunks")) { - return Integer.parseInt(arg.toLowerCase().replaceAll("\\Qc\\E", "").replaceAll("\\Qchunks\\E", "")) * 16; - } - - if (arg.toLowerCase().endsWith("r") || arg.toLowerCase().endsWith("regions")) { - return Integer.parseInt(arg.toLowerCase().replaceAll("\\Qr\\E", "").replaceAll("\\Qregions\\E", "")) * 512; - } - - if (arg.toLowerCase().endsWith("k")) { - return Integer.parseInt(arg.toLowerCase().replaceAll("\\Qk\\E", "")) * 1000; - } - - return Integer.parseInt(arg.toLowerCase()); - } - - @Override - protected String getArgsUsage() { - return "[radius]"; - } -} diff --git a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java index 801b98d6f..6757a5a7f 100644 --- a/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java +++ b/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java @@ -103,9 +103,9 @@ public class PregeneratorJob implements PregenListener { return instance; } - public static void pauseResume() { + public static boolean pauseResume() { if (instance == null) { - return; + return false; } if (isPaused()) { @@ -113,6 +113,7 @@ public class PregeneratorJob implements PregenListener { } else { instance.pregenerator.pause(); } + return true; } public static boolean isPaused() { diff --git a/src/main/java/com/volmit/iris/core/pregenerator/PregenTask.java b/src/main/java/com/volmit/iris/core/pregenerator/PregenTask.java index cc87b439d..5a1907ca3 100644 --- a/src/main/java/com/volmit/iris/core/pregenerator/PregenTask.java +++ b/src/main/java/com/volmit/iris/core/pregenerator/PregenTask.java @@ -34,12 +34,15 @@ public class PregenTask { private Position2 center = new Position2(0, 0); @Builder.Default - private int radius = 1; + private int width = 1; + + @Builder.Default + private int height = 1; private static final KList order = computeChunkOrder(); public void iterateRegions(Spiraled s) { - new Spiraler(radius * 2, radius * 2, s) + new Spiraler(getWidth() * 2, getHeight() * 2, s) .setOffset(center.getX(), center.getZ()).drain(); } @@ -50,7 +53,7 @@ public class PregenTask { } public void iterateAllChunks(Spiraled s) { - new Spiraler(radius * 2, radius * 2, (x, z) -> iterateRegion(x, z, s)) + new Spiraler(getWidth() * 2, getHeight() * 2, (x, z) -> iterateRegion(x, z, s)) .setOffset(center.getX(), center.getZ()).drain(); }