From d49f7d7821733751989d12e269367ab285f27dbf Mon Sep 17 00:00:00 2001 From: Julian Krings Date: Sun, 13 Jul 2025 17:43:11 +0200 Subject: [PATCH] add parameter to the create command to make it your main world --- .../iris/core/commands/CommandIris.java | 50 ++++++++++++------- .../main/java/com/volmit/iris/util/io/IO.java | 20 ++++++++ 2 files changed, 52 insertions(+), 18 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java b/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java index 38e2266e3..84f601642 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandIris.java @@ -27,10 +27,8 @@ import com.volmit.iris.core.service.StudioSVC; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.object.IrisDimension; -import com.volmit.iris.core.safeguard.UtilsSFG; import com.volmit.iris.engine.object.IrisWorld; import com.volmit.iris.engine.platform.BukkitChunkGenerator; -import com.volmit.iris.engine.platform.DummyChunkGenerator; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.decree.DecreeExecutor; import com.volmit.iris.util.decree.DecreeOrigin; @@ -39,8 +37,11 @@ import com.volmit.iris.util.decree.annotations.Param; import com.volmit.iris.util.decree.specialhandlers.NullablePlayerHandler; import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; +import com.volmit.iris.util.io.IO; +import com.volmit.iris.util.misc.ServerProperties; import com.volmit.iris.util.plugin.VolmitSender; import com.volmit.iris.util.scheduling.J; +import lombok.SneakyThrows; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.WorldCreator; @@ -51,15 +52,13 @@ import org.bukkit.entity.Player; import org.bukkit.generator.ChunkGenerator; import org.bukkit.scheduler.BukkitRunnable; -import java.io.File; -import java.io.IOException; +import java.io.*; import java.util.Collections; import java.util.List; +import java.util.concurrent.atomic.AtomicReference; import static com.volmit.iris.Iris.service; import static com.volmit.iris.core.service.EditSVC.deletingWorld; -import static com.volmit.iris.core.safeguard.IrisSafeguard.unstablemode; -import static com.volmit.iris.core.safeguard.ServerBootSFG.incompatibilities; import static org.bukkit.Bukkit.getServer; @Decree(name = "iris", aliases = {"ir", "irs"}, description = "Basic Command") @@ -74,6 +73,7 @@ public class CommandIris implements DecreeExecutor { private CommandFind find; private CommandDeveloper developer; public static boolean worldCreation = false; + private static final AtomicReference mainWorld = new AtomicReference<>(); String WorldEngine; String worldNameToCheck = "YourWorldName"; VolmitSender sender = Iris.getSender(); @@ -85,7 +85,9 @@ public class CommandIris implements DecreeExecutor { @Param(aliases = "dimension", description = "The dimension type to create the world with", defaultValue = "default") IrisDimension type, @Param(description = "The seed to generate the world with", defaultValue = "1337") - long seed + long seed, + @Param(aliases = "main-world", description = "Whether or not to automatically use this world as the main world", defaultValue = "false") + boolean main ) { if (name.equalsIgnoreCase("iris")) { sender().sendMessage(C.RED + "You cannot use the world name \"iris\" for creating worlds as Iris uses this directory for studio worlds."); @@ -113,6 +115,12 @@ public class CommandIris implements DecreeExecutor { .sender(sender()) .studio(false) .create(); + if (main) { + Runtime.getRuntime().addShutdownHook(mainWorld.updateAndGet(old -> { + if (old != null) Runtime.getRuntime().removeShutdownHook(old); + return new Thread(() -> updateMainWorld(name)); + })); + } } catch (Throwable e) { sender().sendMessage(C.RED + "Exception raised during creation. See the console for more details."); Iris.error("Exception raised during world creation: " + e.getMessage()); @@ -124,6 +132,23 @@ public class CommandIris implements DecreeExecutor { sender().sendMessage(C.GREEN + "Successfully created your world!"); } + @SneakyThrows + private void updateMainWorld(String newName) { + File worlds = Bukkit.getWorldContainer(); + var data = ServerProperties.DATA; + try (var in = new FileInputStream(ServerProperties.SERVER_PROPERTIES)) { + data.load(in); + } + for (String sub : List.of("datapacks", "playerdata", "advancements", "stats")) { + IO.copyDirectory(new File(worlds, ServerProperties.LEVEL_NAME + "/" + sub).toPath(), new File(worlds, newName + "/" + sub).toPath()); + } + + data.setProperty("level-name", newName); + try (var out = new FileOutputStream(ServerProperties.SERVER_PROPERTIES)) { + data.store(out, null); + } + } + @Decree(description = "Teleport to another world", aliases = {"tp"}, sync = true) public void teleport( @Param(description = "World to teleport to") @@ -580,17 +605,6 @@ public class CommandIris implements DecreeExecutor { } public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) { Iris.debug("Default World Generator Called for " + worldName + " using ID: " + id); - if (worldName.equals("test")) { - try { - throw new RuntimeException(); - } catch (Throwable e) { - Iris.info(e.getStackTrace()[1].getClassName()); - if (e.getStackTrace()[1].getClassName().contains("com.onarandombox.MultiverseCore")) { - Iris.debug("MVC Test detected, Quick! Send them the dummy!"); - return new DummyChunkGenerator(); - } - } - } IrisDimension dim; if (id == null || id.isEmpty()) { dim = IrisData.loadAnyDimension(IrisSettings.get().getGenerator().getDefaultWorldType()); diff --git a/core/src/main/java/com/volmit/iris/util/io/IO.java b/core/src/main/java/com/volmit/iris/util/io/IO.java index 61deb3670..247dfefb1 100644 --- a/core/src/main/java/com/volmit/iris/util/io/IO.java +++ b/core/src/main/java/com/volmit/iris/util/io/IO.java @@ -30,6 +30,7 @@ import org.apache.commons.io.function.IOFunction; import java.io.*; import java.nio.charset.StandardCharsets; import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.security.DigestInputStream; import java.security.MessageDigest; @@ -592,6 +593,25 @@ public class IO { } } + public static void copyDirectory(Path source, Path target) throws IOException { + Files.walk(source).forEach(sourcePath -> { + Path targetPath = target.resolve(source.relativize(sourcePath)); + + try { + if (Files.isDirectory(sourcePath)) { + if (!Files.exists(targetPath)) { + Files.createDirectories(targetPath); + } + } else { + Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES); + } + } catch (IOException e) { + Iris.error("Failed to copy " + targetPath); + e.printStackTrace(); + } + }); + } + /** * Unconditionally close an Reader. *