From 9e02c318a141dbf93c35e706a3fdd36a8f065116 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Sat, 11 Nov 2023 09:50:24 +0100 Subject: [PATCH 01/12] Refactoring and a new pregen message --- core/src/main/java/com/volmit/iris/Iris.java | 8 ++--- .../iris/core/commands/CommandIris.java | 9 ++---- .../iris/core/commands/CommandPregen.java | 1 - .../safeguard/IrisSafeguard.java | 2 +- .../safeguard/PerformanceSFG.java | 2 +- .../safeguard/ServerBootSFG.java | 7 ++--- .../{engine => core}/safeguard/UtilsSFG.java | 29 +++++++++---------- .../volmit/iris/core/tools/IrisCreator.java | 4 +-- 8 files changed, 26 insertions(+), 36 deletions(-) rename core/src/main/java/com/volmit/iris/{engine => core}/safeguard/IrisSafeguard.java (86%) rename core/src/main/java/com/volmit/iris/{engine => core}/safeguard/PerformanceSFG.java (87%) rename core/src/main/java/com/volmit/iris/{engine => core}/safeguard/ServerBootSFG.java (92%) rename core/src/main/java/com/volmit/iris/{engine => core}/safeguard/UtilsSFG.java (81%) diff --git a/core/src/main/java/com/volmit/iris/Iris.java b/core/src/main/java/com/volmit/iris/Iris.java index 6aa236a30..849ac00e8 100644 --- a/core/src/main/java/com/volmit/iris/Iris.java +++ b/core/src/main/java/com/volmit/iris/Iris.java @@ -39,8 +39,8 @@ import com.volmit.iris.engine.object.IrisDimension; 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.engine.safeguard.IrisSafeguard; -import com.volmit.iris.engine.safeguard.UtilsSFG; +import com.volmit.iris.core.safeguard.IrisSafeguard; +import com.volmit.iris.core.safeguard.UtilsSFG; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.exceptions.IrisException; @@ -95,8 +95,8 @@ import java.net.URL; import java.util.Date; import java.util.Map; -import static com.volmit.iris.engine.safeguard.IrisSafeguard.unstablemode; -import static com.volmit.iris.engine.safeguard.ServerBootSFG.passedserversoftware; +import static com.volmit.iris.core.safeguard.IrisSafeguard.unstablemode; +import static com.volmit.iris.core.safeguard.ServerBootSFG.passedserversoftware; import static com.volmit.iris.util.misc.getHardware.getCPUModel; import static com.volmit.iris.util.misc.getHardware.getCPUThreads; 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 2a4dd688a..7d13a044b 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 @@ -22,13 +22,11 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.service.StudioSVC; import com.volmit.iris.core.tools.IrisBenchmarking; -import com.volmit.iris.core.tools.IrisCreator; 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.engine.object.IrisWorld; import com.volmit.iris.engine.platform.PlatformChunkGenerator; -import com.volmit.iris.engine.safeguard.UtilsSFG; +import com.volmit.iris.core.safeguard.UtilsSFG; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.decree.DecreeContext; import com.volmit.iris.util.decree.DecreeExecutor; @@ -38,7 +36,6 @@ 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.mantle.MantleChunk; import com.volmit.iris.util.parallel.BurstExecutor; import com.volmit.iris.util.parallel.MultiBurst; import com.volmit.iris.util.plugin.VolmitSender; @@ -58,8 +55,8 @@ import java.util.concurrent.Future; import static com.volmit.iris.core.service.EditSVC.deletingWorld; import static com.volmit.iris.core.tools.IrisBenchmarking.inProgress; -import static com.volmit.iris.engine.safeguard.IrisSafeguard.unstablemode; -import static com.volmit.iris.engine.safeguard.ServerBootSFG.incompatiblePlugins; +import static com.volmit.iris.core.safeguard.IrisSafeguard.unstablemode; +import static com.volmit.iris.core.safeguard.ServerBootSFG.incompatiblePlugins; @Decree(name = "iris", aliases = {"ir", "irs"}, description = "Basic Command") public class CommandIris implements DecreeExecutor { diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandPregen.java b/core/src/main/java/com/volmit/iris/core/commands/CommandPregen.java index b59687ce6..a9bc9ff7a 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandPregen.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandPregen.java @@ -111,7 +111,6 @@ public class CommandPregen implements DecreeExecutor { public void stop() { if (PregeneratorJob.shutdownInstance()) { Iris.info( C.BLUE + "Finishing up mca region..."); - sender().sendMessage(C.DARK_BLUE + "Stopped pregeneration task"); } else { sender().sendMessage(C.YELLOW + "No active pregeneration tasks to stop"); } diff --git a/core/src/main/java/com/volmit/iris/engine/safeguard/IrisSafeguard.java b/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java similarity index 86% rename from core/src/main/java/com/volmit/iris/engine/safeguard/IrisSafeguard.java rename to core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java index 218fc4845..8943a629e 100644 --- a/core/src/main/java/com/volmit/iris/engine/safeguard/IrisSafeguard.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java @@ -1,4 +1,4 @@ -package com.volmit.iris.engine.safeguard; +package com.volmit.iris.core.safeguard; import com.volmit.iris.Iris; diff --git a/core/src/main/java/com/volmit/iris/engine/safeguard/PerformanceSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/PerformanceSFG.java similarity index 87% rename from core/src/main/java/com/volmit/iris/engine/safeguard/PerformanceSFG.java rename to core/src/main/java/com/volmit/iris/core/safeguard/PerformanceSFG.java index 35ea78a57..84ee2b1f8 100644 --- a/core/src/main/java/com/volmit/iris/engine/safeguard/PerformanceSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/PerformanceSFG.java @@ -1,4 +1,4 @@ -package com.volmit.iris.engine.safeguard; +package com.volmit.iris.core.safeguard; import com.volmit.iris.core.IrisSettings; import oshi.SystemInfo; diff --git a/core/src/main/java/com/volmit/iris/engine/safeguard/ServerBootSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java similarity index 92% rename from core/src/main/java/com/volmit/iris/engine/safeguard/ServerBootSFG.java rename to core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java index 713b3cbef..37b52939d 100644 --- a/core/src/main/java/com/volmit/iris/engine/safeguard/ServerBootSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java @@ -1,18 +1,15 @@ -package com.volmit.iris.engine.safeguard; +package com.volmit.iris.core.safeguard; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.INMS; import com.volmit.iris.core.nms.v1X.NMSBinding1X; -import com.volmit.iris.util.format.C; -import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; import java.util.*; -import static com.volmit.iris.Iris.dump; import static com.volmit.iris.Iris.instance; -import static com.volmit.iris.engine.safeguard.IrisSafeguard.unstablemode; +import static com.volmit.iris.core.safeguard.IrisSafeguard.unstablemode; public class ServerBootSFG { public static final Map incompatiblePlugins = new HashMap<>(); diff --git a/core/src/main/java/com/volmit/iris/engine/safeguard/UtilsSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java similarity index 81% rename from core/src/main/java/com/volmit/iris/engine/safeguard/UtilsSFG.java rename to core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java index fa94e33a3..746512698 100644 --- a/core/src/main/java/com/volmit/iris/engine/safeguard/UtilsSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/UtilsSFG.java @@ -1,22 +1,19 @@ -package com.volmit.iris.engine.safeguard; +package com.volmit.iris.core.safeguard; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; import com.volmit.iris.util.format.C; -import static com.volmit.iris.engine.safeguard.IrisSafeguard.unstablemode; -import static com.volmit.iris.engine.safeguard.ServerBootSFG.*; - public class UtilsSFG { public static void UnstableMode(){ - if (unstablemode) { + if (IrisSafeguard.unstablemode) { Iris.safeguard(C.DARK_RED + "Iris is running in Unstable Mode"); } else { Iris.safeguard(C.BLUE + "Iris is running Stable"); } } public static void SupportedServerSoftware(){ - if (!passedserversoftware) { + if (!ServerBootSFG.passedserversoftware) { Iris.safeguard(C.DARK_RED + "Server is running unsupported server software"); Iris.safeguard(C.RED + "Supported: Purpur, Pufferfish, Paper, Spigot, Bukkit"); } @@ -24,31 +21,31 @@ public class UtilsSFG { public static void printIncompatibleWarnings(){ // String SupportedIrisVersion = getDescription().getVersion(); //todo Automatic version - if (safeguardPassed) { + if (ServerBootSFG.safeguardPassed) { Iris.safeguard(C.BLUE + "0 Conflicts found"); } else { - Iris.safeguard(C.DARK_RED + "" + count + " Conflicts found"); - unstablemode = true; + Iris.safeguard(C.DARK_RED + "" + ServerBootSFG.count + " Conflicts found"); + IrisSafeguard.unstablemode = true; - if (incompatiblePlugins.get("Multiverse-Core")) { + if (ServerBootSFG.incompatiblePlugins.get("Multiverse-Core")) { Iris.safeguard(C.RED + "Multiverse"); Iris.safeguard(C.RED + "- The plugin Multiverse is not compatible with the server."); Iris.safeguard(C.RED + "- If you want to have a world manager, consider using PhantomWorlds or MyWorlds instead."); } - if (incompatiblePlugins.get("Dynmap")) { + if (ServerBootSFG.incompatiblePlugins.get("Dynmap")) { Iris.safeguard(C.RED + "Dynmap"); Iris.safeguard(C.RED + "- The plugin Dynmap is not compatible with the server."); Iris.safeguard(C.RED + "- If you want to have a map plugin like Dynmap, consider Bluemap."); } - if (incompatiblePlugins.get("TerraformGenerator") || incompatiblePlugins.get("Stratos")) { + if (ServerBootSFG.incompatiblePlugins.get("TerraformGenerator") || ServerBootSFG.incompatiblePlugins.get("Stratos")) { Iris.safeguard(C.YELLOW + "Terraform Generator / Stratos"); Iris.safeguard(C.YELLOW + "- Iris is not compatible with other worldgen plugins."); } - if (unsuportedversion) { + if (ServerBootSFG.unsuportedversion) { Iris.safeguard(C.RED + "Server Version"); Iris.safeguard(C.RED + "- Iris only supports 1.19.2 > 1.20.2"); } - if (!passedserversoftware) { + if (!ServerBootSFG.passedserversoftware) { Iris.safeguard(C.RED + "Unsupported Server Software"); Iris.safeguard(C.RED + "- Please consider using Paper or Purpur instead."); @@ -57,12 +54,12 @@ public class UtilsSFG { } public static String MSGIncompatibleWarnings() { - return allIncompatiblePlugins; + return ServerBootSFG.allIncompatiblePlugins; } public static void unstablePrompt() { - if (unstablemode) { + if (IrisSafeguard.unstablemode) { Iris.info(""); Iris.info(C.DARK_GRAY + "--==<" + C.RED + " IMPORTANT " + C.DARK_GRAY + ">==--"); Iris.info(C.RED + "Iris is running in unstable mode what may cause the following issues."); diff --git a/core/src/main/java/com/volmit/iris/core/tools/IrisCreator.java b/core/src/main/java/com/volmit/iris/core/tools/IrisCreator.java index 04e8b9cba..f9cb549c0 100644 --- a/core/src/main/java/com/volmit/iris/core/tools/IrisCreator.java +++ b/core/src/main/java/com/volmit/iris/core/tools/IrisCreator.java @@ -26,7 +26,7 @@ import com.volmit.iris.core.pregenerator.PregenTask; import com.volmit.iris.core.service.StudioSVC; import com.volmit.iris.engine.object.IrisDimension; import com.volmit.iris.engine.platform.PlatformChunkGenerator; -import com.volmit.iris.engine.safeguard.UtilsSFG; +import com.volmit.iris.core.safeguard.UtilsSFG; import com.volmit.iris.util.exceptions.IrisException; import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; @@ -47,7 +47,7 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.function.Supplier; import static com.volmit.iris.core.tools.IrisPackBenchmarking.benchmark; -import static com.volmit.iris.engine.safeguard.IrisSafeguard.unstablemode; +import static com.volmit.iris.core.safeguard.IrisSafeguard.unstablemode; /** * Makes it a lot easier to setup an engine, world, studio or whatever From 8912cfe37b4d6fa3e515d027c8afb3143c07d6e6 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Sat, 11 Nov 2023 16:14:37 +0100 Subject: [PATCH 02/12] fixed declaration --- core/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java b/core/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java index d7a88eb77..3108b4b8e 100644 --- a/core/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java +++ b/core/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java @@ -46,7 +46,7 @@ import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import static com.volmit.iris.core.tools.IrisPackBenchmarking.benchmark; -import static com.volmit.iris.engine.safeguard.PerformanceSFG.lowPerformance; +import static com.volmit.iris.core.safeguard.PerformanceSFG.*; @Data public class IrisEngineMantle implements EngineMantle { From 6ff597591836f215dfb93671d592216be0b69f07 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Sat, 11 Nov 2023 21:25:24 +0100 Subject: [PATCH 03/12] - HotDrop iris worlds lmao --- core/src/main/java/com/volmit/iris/Iris.java | 7 + .../com/volmit/iris/core/IrisSettings.java | 1 + .../core/commands/CommandWorldManager.java | 2 +- .../iris/core/safeguard/ServerBootSFG.java | 38 ++++ .../iris/core/service/HotDropWorldSVC.java | 142 ++++++++++++++ .../volmit/iris/util/SFG/WorldHandlerSFG.java | 179 ++++++++++++++++++ 6 files changed, 368 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java create mode 100644 core/src/main/java/com/volmit/iris/util/SFG/WorldHandlerSFG.java diff --git a/core/src/main/java/com/volmit/iris/Iris.java b/core/src/main/java/com/volmit/iris/Iris.java index 849ac00e8..75af63cf8 100644 --- a/core/src/main/java/com/volmit/iris/Iris.java +++ b/core/src/main/java/com/volmit/iris/Iris.java @@ -30,7 +30,9 @@ import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.core.nms.INMS; import com.volmit.iris.core.nms.v1X.NMSBinding1X; import com.volmit.iris.core.pregenerator.LazyPregenerator; +import com.volmit.iris.core.safeguard.ServerBootSFG; import com.volmit.iris.core.service.ChunkHandlerSVC; +import com.volmit.iris.core.service.HotDropWorldSVC; import com.volmit.iris.core.service.StudioSVC; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.EnginePanic; @@ -478,7 +480,12 @@ public class Iris extends VolmitPlugin implements Listener { chunkHandlerSVC = new ChunkHandlerSVC(this); Iris.info(C.LIGHT_PURPLE + "Started Intergrated ChunkHandlerSVC"); } + + HotDropWorldSVC hotDropWorldSVC = new HotDropWorldSVC(this); + hotDropWorldSVC.start(); + autoStartStudio(); + ServerBootSFG.CheckIrisWorlds(); checkForBukkitWorlds(); IrisToolbelt.retainMantleDataForSlice(String.class.getCanonicalName()); IrisToolbelt.retainMantleDataForSlice(BlockData.class.getCanonicalName()); diff --git a/core/src/main/java/com/volmit/iris/core/IrisSettings.java b/core/src/main/java/com/volmit/iris/core/IrisSettings.java index 2c570a788..cefe5c9ec 100644 --- a/core/src/main/java/com/volmit/iris/core/IrisSettings.java +++ b/core/src/main/java/com/volmit/iris/core/IrisSettings.java @@ -126,6 +126,7 @@ public class IrisSettings { public boolean markerEntitySpawningSystem = true; public boolean effectSystem = true; public boolean worldEditWandCUI = true; + public boolean AutoFindIrisWorlds = false; } @Data diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandWorldManager.java b/core/src/main/java/com/volmit/iris/core/commands/CommandWorldManager.java index 1f82ea3d9..4ea17348c 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandWorldManager.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandWorldManager.java @@ -85,7 +85,7 @@ public class CommandWorldManager implements DecreeExecutor { @Param(description = "The name of the world to load") String world ) { - World worldloaded = Bukkit.getWorld(world); + World worldloaded = Bukkit.getWorld(world); worldNameToCheck = world; boolean worldExists = doesWorldExist(worldNameToCheck); WorldEngine = world; diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java index 37b52939d..a677cf334 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java @@ -1,15 +1,20 @@ package com.volmit.iris.core.safeguard; import com.volmit.iris.Iris; +import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.nms.INMS; import com.volmit.iris.core.nms.v1X.NMSBinding1X; +import com.volmit.iris.util.SFG.WorldHandlerSFG; import org.bukkit.Bukkit; +import org.bukkit.World; import org.bukkit.plugin.Plugin; +import java.io.File; import java.util.*; import static com.volmit.iris.Iris.instance; import static com.volmit.iris.core.safeguard.IrisSafeguard.unstablemode; +import static com.volmit.iris.core.tools.IrisToolbelt.access; public class ServerBootSFG { public static final Map incompatiblePlugins = new HashMap<>(); @@ -70,6 +75,39 @@ public class ServerBootSFG { unstablemode = true; Iris.safeguard("Unstable mode has been activated."); } + } + public static void CheckIrisWorlds() { + if (IrisSettings.get().getWorld().AutoFindIrisWorlds) { + StringJoiner joiner = new StringJoiner(", "); + // Get the main server folder + File serverFolder = Bukkit.getWorldContainer(); + + // List all files in the server folder + File[] listOfFiles = serverFolder.listFiles(); + + if (listOfFiles != null) { + for (File file : listOfFiles) { + // Check if it is a directory (world folders are directories) + if (file.isDirectory()) { + // Check for an "iris" folder inside the world directory + File irisFolder = new File(file, "iris"); + if (irisFolder.exists() && irisFolder.isDirectory()) { + String worldName = file.getName(); + joiner.add(worldName); + + // Check if the world is already loaded + if (Bukkit.getWorld(worldName) == null) { + WorldHandlerSFG.LoadWorld(worldName); + } + } + } + } + } else { + Bukkit.getLogger().warning("No files found in the server folder."); + } + // No Idea what I should do with this + String worldsList = joiner.toString(); + } } } diff --git a/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java b/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java new file mode 100644 index 000000000..20e9c8231 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java @@ -0,0 +1,142 @@ +package com.volmit.iris.core.service; + +import java.nio.file.*; +import static java.nio.file.StandardWatchEventKinds.*; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.JsonParseException; +import com.volmit.iris.Iris; +import com.volmit.iris.util.SFG.WorldHandlerSFG; +import com.volmit.iris.util.format.C; +import com.volmit.iris.util.scheduling.Looper; +import org.bukkit.Bukkit; +import org.bukkit.plugin.java.JavaPlugin; + +public class HotDropWorldSVC extends Looper { + private WatchService watchService; + private JavaPlugin plugin; + + public HotDropWorldSVC(JavaPlugin plugin) { + this.plugin = plugin; + try { + this.watchService = FileSystems.getDefault().newWatchService(); + Path path = Paths.get(Bukkit.getWorldContainer().getAbsolutePath()); + path.register(watchService, ENTRY_CREATE); + } catch (Exception e) { + Iris.reportError(e); + e.printStackTrace(); + } + } + + @Override + protected long loop() { + WatchKey key; + try { + key = watchService.poll(); + if (key != null) { + for (WatchEvent event : key.pollEvents()) { + WatchEvent.Kind kind = event.kind(); + + if (kind == ENTRY_CREATE) { + WatchEvent ev = (WatchEvent) event; + Path filename = ev.context(); + + File newDir = new File(Bukkit.getWorldContainer(), filename.toString()); + File irisFolder = new File(newDir, "iris"); + if (irisFolder.exists() && irisFolder.isDirectory()) { + Iris.info("World HotDrop Detected!"); + String worldName = newDir.getName(); + String version = getVersionFromIrisFolder(irisFolder); + + if (Bukkit.getWorld(worldName) == null && isPackValid(worldName, version)) { + Bukkit.getScheduler().runTask(this.plugin, () -> WorldHandlerSFG.LoadWorld(worldName)); + } + } + } + } + key.reset(); + } + } catch (Throwable e) { + Iris.reportError(e); + e.printStackTrace(); + return -1; + } + + return 1000; // Loop every 1000 milliseconds (1 second) + } + + private String getVersionFromIrisFolder(File irisFolder) { + File versionFile = new File(irisFolder, "some_version_file.json"); // Replace with actual file name + + if (versionFile.exists() && versionFile.isFile()) { + try (FileReader reader = new FileReader(versionFile)) { + JsonObject jsonObject = JsonParser.parseReader(reader).getAsJsonObject(); + if (jsonObject.has("version")) { + return jsonObject.get("version").getAsString(); + } + } catch (IOException | JsonParseException e) { + Iris.reportError(e); + e.printStackTrace(); + // Optionally, log additional information or take alternative action + } + } + + return "???"; // Default or unknown version + } + + + private boolean isPackValid(String worldPackName, String version) { + try { + File packFolder = Iris.service(StudioSVC.class).getWorkspaceFolder(); + File[] serverPacks = packFolder.listFiles(File::isDirectory); + if (serverPacks != null) { + for (File serverPack : serverPacks) { + String serverPackName = serverPack.getName(); + String serverPackVersion = getPackVersion(serverPack); + + if (serverPackName.equals(worldPackName)) { + if (serverPackVersion.equals(version)) { + return true; + } else { + Iris.info("Version mismatch for pack '" + worldPackName + "'. Expected: " + serverPackVersion + ", Found: " + version); + Iris.info(C.GOLD + "Cant load the world!"); + return false; + } + } + } + Iris.info("Pack '" + worldPackName + "' not found on the server."); + Iris.info(C.GOLD + "Cant load the world!"); + } else { + Iris.info("No packs found in the server's workspace folder."); + } + } catch (Exception e) { + Iris.reportError(e); + e.printStackTrace(); + Iris.info("Error checking if pack is valid: " + e.getMessage()); + } + return false; + } + + + private String getPackVersion(File pack) { + String version = "???"; + File dimensionFile = new File(pack, "dimensions/" + pack.getName() + ".json"); + if (dimensionFile.isFile()) { + try (FileReader reader = new FileReader(dimensionFile)) { + JsonObject json = JsonParser.parseReader(reader).getAsJsonObject(); + if (json.has("version")) { + version = json.get("version").getAsString(); + } + } catch (IOException | JsonParseException e) { + Iris.reportError(e); + e.printStackTrace(); + // Handle error (e.g., logging, user notification) + } + } + return version; + } +} + diff --git a/core/src/main/java/com/volmit/iris/util/SFG/WorldHandlerSFG.java b/core/src/main/java/com/volmit/iris/util/SFG/WorldHandlerSFG.java new file mode 100644 index 000000000..8ff552d27 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/util/SFG/WorldHandlerSFG.java @@ -0,0 +1,179 @@ +package com.volmit.iris.util.SFG; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.IrisSettings; +import com.volmit.iris.core.loader.IrisData; +import com.volmit.iris.core.service.StudioSVC; +import com.volmit.iris.engine.object.IrisDimension; +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.format.C; +import com.volmit.iris.util.plugin.VolmitSender; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.WorldCreator; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.generator.ChunkGenerator; + +import java.io.File; +import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.Objects; + +import static com.volmit.iris.Iris.service; + +public class WorldHandlerSFG { + static String WorldToLoad; + static String WorldEngine; + static String worldNameToCheck = "YourWorldName"; + private static VolmitSender sender; + public static void LoadWorld(String selectedWorld){ + if(Objects.equals(selectedWorld, "Benchmark")){ + return; + } + worldNameToCheck = selectedWorld; + boolean worldExists = doesWorldExist(worldNameToCheck); + WorldEngine = selectedWorld; + + if (!worldExists) { + return; + } + WorldToLoad = selectedWorld; + File BUKKIT_YML = new File("bukkit.yml"); + String pathtodim = selectedWorld + "\\iris\\pack\\dimensions\\"; + File directory = new File(Bukkit.getWorldContainer(), pathtodim); + + String dimension = null; + if (directory.exists() && directory.isDirectory()) { + File[] files = directory.listFiles(); + if (files != null) { + for (File file : files) { + if (file.isFile()) { + String fileName = file.getName(); + if (fileName.endsWith(".json")) { + dimension = fileName.substring(0, fileName.length() - 5); + } + } + } + } + } else { + return; + } + + YamlConfiguration yml = YamlConfiguration.loadConfiguration(BUKKIT_YML); + String gen = "Iris:" + dimension; + ConfigurationSection section = yml.contains("worlds") ? yml.getConfigurationSection("worlds") : yml.createSection("worlds"); + if (!section.contains(selectedWorld)) { + section.createSection(selectedWorld).set("generator", gen); + try { + yml.save(BUKKIT_YML); + Iris.info("Registered \"" + selectedWorld + "\" in bukkit.yml"); + } catch (IOException e) { + Iris.error("Failed to update bukkit.yml!"); + e.printStackTrace(); + } + } + checkForBukkitWorlds(); + } + static boolean doesWorldExist(String worldName) { + File worldContainer = Bukkit.getWorldContainer(); + File worldDirectory = new File(worldContainer, worldName); + return worldDirectory.exists() && worldDirectory.isDirectory(); + } + private static void checkForBukkitWorlds() { + FileConfiguration fc = new YamlConfiguration(); + try { + fc.load(new File("bukkit.yml")); + ConfigurationSection section = fc.getConfigurationSection("worlds"); + if (section == null) { + return; + } + + List worldsToLoad = Collections.singletonList(WorldToLoad); + + for (String s : section.getKeys(false)) { + if (!worldsToLoad.contains(s)) { + continue; + } + ConfigurationSection entry = section.getConfigurationSection(s); + if (!entry.contains("generator", true)) { + continue; + } + String generator = entry.getString("generator"); + if (generator.startsWith("Iris:")) { + generator = generator.split("\\Q:\\E")[1]; + } else if (generator.equalsIgnoreCase("Iris")) { + generator = IrisSettings.get().getGenerator().getDefaultWorldType(); + } else { + continue; + } + Iris.info("2 World: %s | Generator: %s", s, generator); + if (Bukkit.getWorlds().stream().anyMatch(w -> w.getName().equals(s))) { + continue; + } + Iris.info(C.LIGHT_PURPLE + "Preparing Spawn for " + s + "' using Iris:" + generator + "..."); + new WorldCreator(s) + .generator(getDefaultWorldGenerator(s, generator)) + .environment(IrisData.loadAnyDimension(generator).getEnvironment()) + .createWorld(); + Iris.info(C.LIGHT_PURPLE + "Loaded " + s + "!"); + } + } catch (Throwable e) { + e.printStackTrace(); + } + } + public static 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()); + } else { + dim = IrisData.loadAnyDimension(id); + } + Iris.debug("Generator ID: " + id + " requested by bukkit/plugin"); + + if (dim == null) { + Iris.warn("Unable to find dimension type " + id + " Looking for online packs..."); + + service(StudioSVC.class).downloadSearch(new VolmitSender(Bukkit.getConsoleSender()), id, true); + dim = IrisData.loadAnyDimension(id); + + if (dim == null) { + throw new RuntimeException("Can't find dimension " + id + "!"); + } else { + Iris.info("Resolved missing dimension, proceeding with generation."); + } + } + Iris.debug("Assuming IrisDimension: " + dim.getName()); + IrisWorld w = IrisWorld.builder() + .name(worldName) + .seed(1337) + .environment(dim.getEnvironment()) + .worldFolder(new File(Bukkit.getWorldContainer(), worldName)) + .minHeight(dim.getMinHeight()) + .maxHeight(dim.getMaxHeight()) + .build(); + Iris.debug("Generator Config: " + w.toString()); + File ff = new File(w.worldFolder(), "iris/pack"); + if (!ff.exists() || ff.listFiles().length == 0) { + ff.mkdirs(); + service(StudioSVC.class).installIntoWorld(sender, dim.getLoadKey(), ff.getParentFile()); + } + return new BukkitChunkGenerator(w, false, ff, dim.getLoadKey()); + } +} From acac2d0fc59a19b50a831f03c0c05ddfdaf973d2 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Sat, 11 Nov 2023 21:26:31 +0100 Subject: [PATCH 04/12] Removed GPT 4 Comments lmao --- .../com/volmit/iris/core/service/HotDropWorldSVC.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java b/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java index 20e9c8231..44166f64b 100644 --- a/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java @@ -65,11 +65,11 @@ public class HotDropWorldSVC extends Looper { return -1; } - return 1000; // Loop every 1000 milliseconds (1 second) + return 1000; } private String getVersionFromIrisFolder(File irisFolder) { - File versionFile = new File(irisFolder, "some_version_file.json"); // Replace with actual file name + File versionFile = new File(irisFolder, "some_version_file.json"); if (versionFile.exists() && versionFile.isFile()) { try (FileReader reader = new FileReader(versionFile)) { @@ -80,14 +80,12 @@ public class HotDropWorldSVC extends Looper { } catch (IOException | JsonParseException e) { Iris.reportError(e); e.printStackTrace(); - // Optionally, log additional information or take alternative action } } - return "???"; // Default or unknown version + return "???"; } - private boolean isPackValid(String worldPackName, String version) { try { File packFolder = Iris.service(StudioSVC.class).getWorkspaceFolder(); @@ -120,7 +118,6 @@ public class HotDropWorldSVC extends Looper { return false; } - private String getPackVersion(File pack) { String version = "???"; File dimensionFile = new File(pack, "dimensions/" + pack.getName() + ".json"); @@ -133,7 +130,6 @@ public class HotDropWorldSVC extends Looper { } catch (IOException | JsonParseException e) { Iris.reportError(e); e.printStackTrace(); - // Handle error (e.g., logging, user notification) } } return version; From 2b4bc621acfb8cfa64b6d6da012b7a77e0257f13 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Sat, 11 Nov 2023 21:56:28 +0100 Subject: [PATCH 05/12] misc --- core/src/main/java/com/volmit/iris/Iris.java | 7 ------- core/src/main/java/com/volmit/iris/core/IrisSettings.java | 1 - .../java/com/volmit/iris/core/safeguard/IrisSafeguard.java | 3 ++- .../java/com/volmit/iris/core/safeguard/ServerBootSFG.java | 2 -- .../java/com/volmit/iris/core/service/ChunkHandlerSVC.java | 2 +- 5 files changed, 3 insertions(+), 12 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/Iris.java b/core/src/main/java/com/volmit/iris/Iris.java index 75af63cf8..bffe76848 100644 --- a/core/src/main/java/com/volmit/iris/Iris.java +++ b/core/src/main/java/com/volmit/iris/Iris.java @@ -31,7 +31,6 @@ import com.volmit.iris.core.nms.INMS; import com.volmit.iris.core.nms.v1X.NMSBinding1X; import com.volmit.iris.core.pregenerator.LazyPregenerator; import com.volmit.iris.core.safeguard.ServerBootSFG; -import com.volmit.iris.core.service.ChunkHandlerSVC; import com.volmit.iris.core.service.HotDropWorldSVC; import com.volmit.iris.core.service.StudioSVC; import com.volmit.iris.core.tools.IrisToolbelt; @@ -444,7 +443,6 @@ public class Iris extends VolmitPlugin implements Listener { private static void fixShading() { ShadeFix.fix(ComponentSerializer.class); } - private ChunkHandlerSVC chunkHandlerSVC; private void enable() { instance = this; services = new KMap<>(); @@ -476,11 +474,6 @@ public class Iris extends VolmitPlugin implements Listener { UtilsSFG.SupportedServerSoftware(); UtilsSFG.printIncompatibleWarnings(); UtilsSFG.unstablePrompt(); - if(IrisSettings.get().getGeneral().useIntegratedChunkHandler) { - chunkHandlerSVC = new ChunkHandlerSVC(this); - Iris.info(C.LIGHT_PURPLE + "Started Intergrated ChunkHandlerSVC"); - } - HotDropWorldSVC hotDropWorldSVC = new HotDropWorldSVC(this); hotDropWorldSVC.start(); diff --git a/core/src/main/java/com/volmit/iris/core/IrisSettings.java b/core/src/main/java/com/volmit/iris/core/IrisSettings.java index cefe5c9ec..2c570a788 100644 --- a/core/src/main/java/com/volmit/iris/core/IrisSettings.java +++ b/core/src/main/java/com/volmit/iris/core/IrisSettings.java @@ -126,7 +126,6 @@ public class IrisSettings { public boolean markerEntitySpawningSystem = true; public boolean effectSystem = true; public boolean worldEditWandCUI = true; - public boolean AutoFindIrisWorlds = false; } @Data diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java b/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java index 8943a629e..a7d945dfc 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java @@ -1,9 +1,10 @@ package com.volmit.iris.core.safeguard; import com.volmit.iris.Iris; +import com.volmit.iris.core.IrisSettings; +import com.volmit.iris.util.format.C; public class IrisSafeguard { - // more planned and WIP public static boolean unstablemode = false; public static void IrisSafeguardSystem() { Iris.info("Enabled Iris SafeGuard"); diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java index a677cf334..4aa78c7c8 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/ServerBootSFG.java @@ -77,7 +77,6 @@ public class ServerBootSFG { } } public static void CheckIrisWorlds() { - if (IrisSettings.get().getWorld().AutoFindIrisWorlds) { StringJoiner joiner = new StringJoiner(", "); // Get the main server folder @@ -108,6 +107,5 @@ public class ServerBootSFG { } // No Idea what I should do with this String worldsList = joiner.toString(); - } } } diff --git a/core/src/main/java/com/volmit/iris/core/service/ChunkHandlerSVC.java b/core/src/main/java/com/volmit/iris/core/service/ChunkHandlerSVC.java index c245653be..91531b049 100644 --- a/core/src/main/java/com/volmit/iris/core/service/ChunkHandlerSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/ChunkHandlerSVC.java @@ -22,7 +22,7 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; public class ChunkHandlerSVC implements Listener { - // Idk how it works but it works lol + // Does nothing for now private final JavaPlugin plugin; private static BukkitTask task; private final Map worlds = new ConcurrentHashMap<>(); From ba55ff6a4ba3c7aaba01788401cebd4ac8644d04 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Sun, 12 Nov 2023 10:19:39 +0100 Subject: [PATCH 06/12] typo --- core/src/main/java/com/volmit/iris/util/mantle/Mantle.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java b/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java index 6ef668ff5..113405abf 100644 --- a/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java +++ b/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java @@ -443,7 +443,7 @@ public class Mantle { try { return getSafe(x, z).get(); } catch (InterruptedException e) { - Iris.warn("Failed to get Tectonic Plate " + x + " " + z + " Due to a thread intterruption (hotload?)"); + Iris.warn("Failed to get Tectonic Plate " + x + " " + z + " Due to a thread interruption (hotload?)"); Iris.reportError(e); } catch (ExecutionException e) { Iris.warn("Failed to get Tectonic Plate " + x + " " + z + " Due to a thread execution exception (engine close?)"); From 48b757f6931dfbaea85e960f49ab7f6e2fffd9c5 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Wed, 15 Nov 2023 08:43:38 +0100 Subject: [PATCH 07/12] Forgot those --- core/src/main/java/com/volmit/iris/Iris.java | 3 - .../iris/core/commands/CommandDeveloper.java | 67 ++++++++++ .../iris/core/commands/CommandIris.java | 1 + .../iris/core/service/HotDropWorldSVC.java | 18 ++- .../iris/core/service/MemoryLeakSVC.java | 78 ++++++++++++ .../iris/engine/mantle/EngineMantle.java | 7 ++ .../com/volmit/iris/util/mantle/Mantle.java | 115 +++++++++++++----- .../volmit/iris/util/misc/getHardware.java | 14 +++ 8 files changed, 267 insertions(+), 36 deletions(-) create mode 100644 core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java create mode 100644 core/src/main/java/com/volmit/iris/core/service/MemoryLeakSVC.java diff --git a/core/src/main/java/com/volmit/iris/Iris.java b/core/src/main/java/com/volmit/iris/Iris.java index bffe76848..4b48913fe 100644 --- a/core/src/main/java/com/volmit/iris/Iris.java +++ b/core/src/main/java/com/volmit/iris/Iris.java @@ -31,7 +31,6 @@ import com.volmit.iris.core.nms.INMS; import com.volmit.iris.core.nms.v1X.NMSBinding1X; import com.volmit.iris.core.pregenerator.LazyPregenerator; import com.volmit.iris.core.safeguard.ServerBootSFG; -import com.volmit.iris.core.service.HotDropWorldSVC; import com.volmit.iris.core.service.StudioSVC; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.EnginePanic; @@ -474,8 +473,6 @@ public class Iris extends VolmitPlugin implements Listener { UtilsSFG.SupportedServerSoftware(); UtilsSFG.printIncompatibleWarnings(); UtilsSFG.unstablePrompt(); - HotDropWorldSVC hotDropWorldSVC = new HotDropWorldSVC(this); - hotDropWorldSVC.start(); autoStartStudio(); ServerBootSFG.CheckIrisWorlds(); diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java new file mode 100644 index 000000000..0cc026dff --- /dev/null +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java @@ -0,0 +1,67 @@ +/* + * Iris is a World Generator for Minecraft Bukkit Servers + * Copyright (c) 2022 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.commands; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.loader.IrisData; +import com.volmit.iris.core.tools.IrisToolbelt; +import com.volmit.iris.engine.framework.Engine; +import com.volmit.iris.engine.mantle.EngineMantle; +import com.volmit.iris.util.decree.DecreeExecutor; +import com.volmit.iris.util.decree.DecreeOrigin; +import com.volmit.iris.util.decree.annotations.Decree; +import com.volmit.iris.util.decree.annotations.Param; +import com.volmit.iris.util.format.C; +import com.volmit.iris.util.format.Form; +import com.volmit.iris.util.mantle.Mantle; +import org.bukkit.Bukkit; +import org.bukkit.World; + +@Decree(name = "Developer", origin = DecreeOrigin.BOTH, description = "Iris World Manager", aliases = {"dev"}) +public class CommandDeveloper implements DecreeExecutor { + + @Decree(description = "Get Loaded TectonicPlates Count", origin = DecreeOrigin.BOTH, sync = true) + public void EngineStatus( + @Param(description = "World") + World world + ) { + if (!IrisToolbelt.isIrisWorld(world)) { + sender().sendMessage(C.RED + "This is not an Iris world. Iris worlds: " + String.join(", ", Bukkit.getServer().getWorlds().stream().filter(IrisToolbelt::isIrisWorld).map(World::getName).toList())); + return; + } + + Engine engine = IrisToolbelt.access(world).getEngine(); + if(engine != null) { + long lastUseSize = engine.getMantle().getLastUseMapMemoryUsage(); + long outputToUnload = engine.getMantle().getToUnload(); + + Iris.info("-------------------------"); + Iris.info(C.DARK_PURPLE + "Engine Status"); + Iris.info(C.DARK_PURPLE + "Tectonic Plates: " + C.LIGHT_PURPLE + engine.getMantle().getLoadedRegionCount()); + Iris.info(C.DARK_PURPLE + "Tectonic ToUnload: " + C.LIGHT_PURPLE + outputToUnload); + Iris.info(C.DARK_PURPLE + "Cache Size: " + C.LIGHT_PURPLE + Form.f(IrisData.cacheSize())); + Iris.info(C.DARK_PURPLE + "LastUse Size: " + C.LIGHT_PURPLE + Form.mem(lastUseSize) + " MB"); + Iris.info("-------------------------"); + } else { + Iris.info(C.RED + "Engine is null!"); + } + } +} + + 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 7d13a044b..b80548c29 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 @@ -69,6 +69,7 @@ public class CommandIris implements DecreeExecutor { private CommandEdit edit; private CommandFind find; private CommandWorldManager manager; + private CommandDeveloper developer; public static @Getter String BenchDimension; diff --git a/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java b/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java index 44166f64b..88bab482b 100644 --- a/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/HotDropWorldSVC.java @@ -11,16 +11,28 @@ import com.google.gson.JsonParseException; import com.volmit.iris.Iris; import com.volmit.iris.util.SFG.WorldHandlerSFG; import com.volmit.iris.util.format.C; +import com.volmit.iris.util.plugin.IrisService; import com.volmit.iris.util.scheduling.Looper; import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; -public class HotDropWorldSVC extends Looper { +public class HotDropWorldSVC extends Looper implements IrisService { private WatchService watchService; private JavaPlugin plugin; - public HotDropWorldSVC(JavaPlugin plugin) { - this.plugin = plugin; + @Override + public void onEnable() { + this.plugin = Iris.instance; // Assuming Iris.instance is your plugin instance + initializeWatchService(); + + } + + @Override + public void onDisable() { + + } + + private void initializeWatchService() { try { this.watchService = FileSystems.getDefault().newWatchService(); Path path = Paths.get(Bukkit.getWorldContainer().getAbsolutePath()); diff --git a/core/src/main/java/com/volmit/iris/core/service/MemoryLeakSVC.java b/core/src/main/java/com/volmit/iris/core/service/MemoryLeakSVC.java new file mode 100644 index 000000000..3baab50ed --- /dev/null +++ b/core/src/main/java/com/volmit/iris/core/service/MemoryLeakSVC.java @@ -0,0 +1,78 @@ +package com.volmit.iris.core.service; + +import java.nio.file.*; +import static java.nio.file.StandardWatchEventKinds.*; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.JsonParseException; +import com.volmit.iris.Iris; +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.util.SFG.WorldHandlerSFG; +import com.volmit.iris.util.format.C; +import com.volmit.iris.util.misc.getHardware; +import com.volmit.iris.util.plugin.IrisService; +import com.volmit.iris.util.scheduling.Looper; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.plugin.java.JavaPlugin; + +public class MemoryLeakSVC extends Looper implements IrisService { + private WatchService watchService; + private JavaPlugin plugin; + + @Override + public void onEnable() { + //Iris.info("Enabled Mem Leak Detection thing wow it actually worked"); + //this.plugin = Iris.instance; + } + + @Override + public void onDisable() { + + } + + @Override + protected long loop() { + try { + if (getHardware.getAvailableProcessMemory() < 50){ + PrintMemoryLeakDetected(); + for (World world : Bukkit.getWorlds()) { + if (IrisToolbelt.isIrisWorld(world)){ + Engine engine = IrisToolbelt.access(world).getEngine(); + if (engine.getMantle().getLoadedRegionCount() > 0){ + if (!IrisToolbelt.isIrisWorld(world)) { + Iris.info(C.RED + "This is not an Iris world. Iris worlds: " + String.join(", ", Bukkit.getServer().getWorlds().stream().filter(IrisToolbelt::isIrisWorld).map(World::getName).toList())); + return -1; + } + Iris.info(C.GREEN + "Unloading world: " + world.getName()); + try { + IrisToolbelt.evacuate(world); + Bukkit.unloadWorld(world, false); + Iris.info(C.GREEN + "World unloaded successfully."); + } catch (Exception e) { + Iris.info(C.RED + "Failed to unload the world: " + e.getMessage()); + e.printStackTrace(); + } + + } + } + } + } + } catch (Throwable e) { + Iris.reportError(e); + e.printStackTrace(); + return -1; + } + + return 1000; + } + public void PrintMemoryLeakDetected(){ + Iris.info(C.DARK_RED + "--==< MEMORY LEAK DETECTED >==--"); + } +} + diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java index 5dbd7a7d1..04a5263f3 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java @@ -257,6 +257,9 @@ public interface EngineMantle extends IObjectPlacer { default int getLoadedRegionCount() { return getMantle().getLoadedRegionCount(); } + default long getLastUseMapMemoryUsage(){ + return getMantle().LastUseMapMemoryUsage(); + } MantleJigsawComponent getJigsawComponent(); @@ -288,4 +291,8 @@ public interface EngineMantle extends IObjectPlacer { }); } } + + default long getToUnload(){ + return getMantle().ToUnloadTectonic(); + } } diff --git a/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java b/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java index 113405abf..6630fc019 100644 --- a/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java +++ b/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java @@ -36,6 +36,7 @@ import com.volmit.iris.util.function.Consumer4; import com.volmit.iris.util.math.M; import com.volmit.iris.util.matter.Matter; import com.volmit.iris.util.matter.MatterSlice; +import com.volmit.iris.util.misc.getHardware; import com.volmit.iris.util.parallel.BurstExecutor; import com.volmit.iris.util.parallel.HyperLock; import com.volmit.iris.util.parallel.MultiBurst; @@ -45,16 +46,18 @@ import org.bukkit.Chunk; import java.io.EOFException; import java.io.File; import java.io.IOException; +import java.util.HashSet; import java.util.Map; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; +import java.util.Set; +import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; /** * The mantle can store any type of data slice anywhere and manage regions & IO on it's own. * This class is fully thread safe read & writeNodeData */ + public class Mantle { private final File dataFolder; private final int worldHeight; @@ -66,6 +69,11 @@ public class Mantle { private final AtomicBoolean closed; private final MultiBurst ioBurst; private final AtomicBoolean io; + private final Object gcMonitor = new Object(); + long apm = getHardware.getAvailableProcessMemory(); + private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); + int tectonicLimitBeforeOutMemory; + double tectonicLimit = 30; /** * Create a new mantle @@ -374,45 +382,92 @@ public class Mantle { Iris.debug("The Mantle has Closed " + C.DARK_AQUA + dataFolder.getAbsolutePath()); } + /** + * Estimates the memory usage of the lastUse map. + * + * @return Estimated memory usage in bytes. + */ + + public long LastUseMapMemoryUsage() { + long numberOfEntries = lastUse.size(); + long bytesPerEntry = Long.BYTES * 2; + return numberOfEntries * bytesPerEntry; + } + /** * Save & unload regions that have not been used for more than the * specified amount of milliseconds * - * @param idleDuration the duration + * @param baseIdleDuration the duration */ - public synchronized void trim(long idleDuration) { + + AtomicInteger FakeToUnload = new AtomicInteger(0); + + + public synchronized void trim(long baseIdleDuration) { if (closed.get()) { throw new RuntimeException("The Mantle is closed"); } + double adjustedIdleDuration = baseIdleDuration; + + if (loadedRegions.size() > tectonicLimit) { + adjustedIdleDuration = Math.max(adjustedIdleDuration - ( 1000 * (loadedRegions.size() - tectonicLimit) * 1.35), 4000); + } + io.set(true); - Iris.debug("Trimming Tectonic Plates older than " + Form.duration((double) idleDuration, 0)); - unload.clear(); - for (Long i : lastUse.keySet()) { - hyperLock.withLong(i, () -> { - if (M.ms() - lastUse.get(i) >= idleDuration) { - unload.add(i); - } - }); + try { + Iris.debug("Trimming Tectonic Plates older than " + Form.duration(adjustedIdleDuration, 0)); + Set toUnload = new HashSet<>(); + + for (Long i : lastUse.keySet()) { + double finalAdjustedIdleDuration = adjustedIdleDuration; + hyperLock.withLong(i, () -> { + if (M.ms() - lastUse.get(i) >= finalAdjustedIdleDuration) { + toUnload.add(i); + FakeToUnload.addAndGet(1); + Iris.debug("Tectonic Region added to unload"); + } + }); + } + + // Create a thread pool to handle unloading tasks + ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); + + for (Long i : toUnload) { + executor.submit(() -> { + hyperLock.withLong(i, () -> { + TectonicPlate m = loadedRegions.get(i); + if (m != null) { + try { + m.write(fileForRegion(dataFolder, i)); + loadedRegions.remove(i); + lastUse.remove(i); + Iris.debug("Unloaded Tectonic Plate " + C.DARK_GREEN + Cache.keyX(i) + " " + Cache.keyZ(i)); + FakeToUnload.addAndGet(-1); + } catch (IOException e) { + e.printStackTrace(); + } + } + }); + }); + } + + // Shutdown the executor and wait for tasks to complete + executor.shutdown(); + executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + e.printStackTrace(); + } finally { + io.set(false); } - - for (Long i : unload) { - hyperLock.withLong(i, () -> { - TectonicPlate m = loadedRegions.remove(i); - lastUse.remove(i); - - try { - m.write(fileForRegion(dataFolder, i)); - } catch (IOException e) { - e.printStackTrace(); - } - - Iris.debug("Unloaded Tectonic Plate " + C.DARK_GREEN + Cache.keyX(i) + " " + Cache.keyZ(i)); - }); - } - io.set(false); } + public long ToUnloadTectonic(){ + return FakeToUnload.get(); + } + /** * This retreives a future of the Tectonic Plate at the given coordinates. @@ -443,7 +498,7 @@ public class Mantle { try { return getSafe(x, z).get(); } catch (InterruptedException e) { - Iris.warn("Failed to get Tectonic Plate " + x + " " + z + " Due to a thread interruption (hotload?)"); + Iris.warn("Failed to get Tectonic Plate " + x + " " + z + " Due to a thread intterruption (hotload?)"); Iris.reportError(e); } catch (ExecutionException e) { Iris.warn("Failed to get Tectonic Plate " + x + " " + z + " Due to a thread execution exception (engine close?)"); diff --git a/core/src/main/java/com/volmit/iris/util/misc/getHardware.java b/core/src/main/java/com/volmit/iris/util/misc/getHardware.java index ea5aa06d5..80221590d 100644 --- a/core/src/main/java/com/volmit/iris/util/misc/getHardware.java +++ b/core/src/main/java/com/volmit/iris/util/misc/getHardware.java @@ -22,6 +22,20 @@ public class getHardware { long maxMemory = Runtime.getRuntime().maxMemory() / (1024 * 1024); return maxMemory; } + public static long getProcessUsedMemory() { + Runtime runtime = Runtime.getRuntime(); + + long totalMemory = runtime.totalMemory(); + long freeMemory = runtime.freeMemory(); + long usedMemory = totalMemory - freeMemory; + + return usedMemory / (1024 * 1024); + } + + public static long getAvailableProcessMemory(){ + long availableMemory = getHardware.getProcessMemory() - getHardware.getProcessUsedMemory(); + return availableMemory; + } public static String getCPUModel() { try { From 7a729c39a68d67abfd9fe6b58d9d9ddc15531683 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Wed, 15 Nov 2023 09:58:46 +0100 Subject: [PATCH 08/12] e --- .../java/com/volmit/iris/util/mantle/Mantle.java | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java b/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java index 6630fc019..3d772d452 100644 --- a/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java +++ b/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java @@ -412,7 +412,7 @@ public class Mantle { double adjustedIdleDuration = baseIdleDuration; if (loadedRegions.size() > tectonicLimit) { - adjustedIdleDuration = Math.max(adjustedIdleDuration - ( 1000 * (loadedRegions.size() - tectonicLimit) * 1.35), 4000); + adjustedIdleDuration = Math.max(adjustedIdleDuration - (1000 * (loadedRegions.size() - tectonicLimit) * 1.35), 4000); } io.set(true); @@ -432,11 +432,10 @@ public class Mantle { }); } - // Create a thread pool to handle unloading tasks - ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); + BurstExecutor burstExecutor = new BurstExecutor(Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()), toUnload.size()); for (Long i : toUnload) { - executor.submit(() -> { + burstExecutor.queue(() -> { hyperLock.withLong(i, () -> { TectonicPlate m = loadedRegions.get(i); if (m != null) { @@ -454,16 +453,13 @@ public class Mantle { }); } - // Shutdown the executor and wait for tasks to complete - executor.shutdown(); - executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - e.printStackTrace(); + burstExecutor.complete(); + } finally { io.set(false); } } + public long ToUnloadTectonic(){ return FakeToUnload.get(); } From 4e4f7f693de9e87e8571712b66b6e6d420797009 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Wed, 15 Nov 2023 11:14:26 +0100 Subject: [PATCH 09/12] Sync --- .../com/volmit/iris/core/IrisSettings.java | 1 + .../iris/core/commands/CommandDeveloper.java | 4 ++- .../iris/core/safeguard/PerformanceSFG.java | 1 - .../volmit/iris/engine/IrisEngineMantle.java | 13 +++------ .../iris/engine/mantle/EngineMantle.java | 6 ++++ .../com/volmit/iris/util/mantle/Mantle.java | 29 +++++++++++++++---- 6 files changed, 37 insertions(+), 17 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/IrisSettings.java b/core/src/main/java/com/volmit/iris/core/IrisSettings.java index 2c570a788..d37dfb1b5 100644 --- a/core/src/main/java/com/volmit/iris/core/IrisSettings.java +++ b/core/src/main/java/com/volmit/iris/core/IrisSettings.java @@ -141,6 +141,7 @@ public class IrisSettings { public int resourceLoaderCacheSize = 1_024; public int objectLoaderCacheSize = 4_096; public int scriptLoaderCacheSize = 512; + public boolean dynamicPerformanceMode = true; } @Data diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java index 0cc026dff..fa3572de6 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java @@ -53,10 +53,12 @@ public class CommandDeveloper implements DecreeExecutor { Iris.info("-------------------------"); Iris.info(C.DARK_PURPLE + "Engine Status"); + Iris.info(C.DARK_PURPLE + "Tectonic Limit: " + C.LIGHT_PURPLE + engine.getMantle().getTectonicLimit()); Iris.info(C.DARK_PURPLE + "Tectonic Plates: " + C.LIGHT_PURPLE + engine.getMantle().getLoadedRegionCount()); Iris.info(C.DARK_PURPLE + "Tectonic ToUnload: " + C.LIGHT_PURPLE + outputToUnload); + Iris.info(C.DARK_PURPLE + "Tectonic Unload Duration: " + C.LIGHT_PURPLE + Form.duration(engine.getMantle().getTectonicDuration())); Iris.info(C.DARK_PURPLE + "Cache Size: " + C.LIGHT_PURPLE + Form.f(IrisData.cacheSize())); - Iris.info(C.DARK_PURPLE + "LastUse Size: " + C.LIGHT_PURPLE + Form.mem(lastUseSize) + " MB"); + Iris.info(C.DARK_PURPLE + "LastUse Size: " + C.LIGHT_PURPLE + Form.mem(lastUseSize)); Iris.info("-------------------------"); } else { Iris.info(C.RED + "Engine is null!"); diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/PerformanceSFG.java b/core/src/main/java/com/volmit/iris/core/safeguard/PerformanceSFG.java index 84ee2b1f8..aef67226e 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/PerformanceSFG.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/PerformanceSFG.java @@ -7,7 +7,6 @@ import oshi.hardware.GlobalMemory; import static com.volmit.iris.util.misc.getHardware.*; public class PerformanceSFG { - public static boolean lowPerformance = false; public static void calculatePerformance(){ diff --git a/core/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java b/core/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java index 3108b4b8e..3a2cb9cdd 100644 --- a/core/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java +++ b/core/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java @@ -290,15 +290,10 @@ public class IrisEngineMantle implements EngineMantle { x = 4; Iris.info("Mantle Size: " + x + " Chunks " + C.BLUE + "BENCHMARK MODE"); } else { - if(lowPerformance){ - x = 4; - Iris.info("Mantle Size: " + x + " Chunks" + C.GOLD + "LOW PERFORMANCE MODE"); - } else { - Iris.info("Mantle Size: " + x + " Chunks"); - Iris.info(" Object Mantle Size: " + u + " (" + ((Math.max(u, 16) + 16) >> 4) + ")"); - Iris.info(" Jigsaw Mantle Size: " + jig + " (" + ((Math.max(jig, 16) + 16) >> 4) + ")"); - Iris.info(" Carving Mantle Size: " + c + " (" + ((Math.max(c, 16) + 16) >> 4) + ")"); - } + Iris.info("Mantle Size: " + x + " Chunks"); + Iris.info(" Object Mantle Size: " + u + " (" + ((Math.max(u, 16) + 16) >> 4) + ")"); + Iris.info(" Jigsaw Mantle Size: " + jig + " (" + ((Math.max(jig, 16) + 16) >> 4) + ")"); + Iris.info(" Carving Mantle Size: " + c + " (" + ((Math.max(c, 16) + 16) >> 4) + ")"); } diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java index 04a5263f3..719f2482a 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java @@ -295,4 +295,10 @@ public interface EngineMantle extends IObjectPlacer { default long getToUnload(){ return getMantle().ToUnloadTectonic(); } + default long getTectonicLimit(){ + return getTectonicLimit(); + } + default long getTectonicDuration(){ + return getMantle().getTectonicUnloadDuration(); + } } diff --git a/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java b/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java index 3d772d452..0465fc2aa 100644 --- a/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java +++ b/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java @@ -18,6 +18,7 @@ package com.volmit.iris.util.mantle; +import com.google.common.util.concurrent.AtomicDouble; import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.tools.IrisToolbelt; @@ -73,7 +74,6 @@ public class Mantle { long apm = getHardware.getAvailableProcessMemory(); private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); int tectonicLimitBeforeOutMemory; - double tectonicLimit = 30; /** * Create a new mantle @@ -400,29 +400,43 @@ public class Mantle { * * @param baseIdleDuration the duration */ - + @Getter AtomicInteger FakeToUnload = new AtomicInteger(0); + AtomicDouble adjustedIdleDuration = new AtomicDouble(0); + double tectonicLimit = 30; public synchronized void trim(long baseIdleDuration) { if (closed.get()) { throw new RuntimeException("The Mantle is closed"); } + if (IrisSettings.get().getPerformance().dynamicPerformanceMode){ + tectonicLimit = 2; + long t = getHardware.getProcessMemory(); + for (; t > 250;){ + tectonicLimit++; + t = t - 250; + } - double adjustedIdleDuration = baseIdleDuration; + } + + adjustedIdleDuration.set(baseIdleDuration); if (loadedRegions.size() > tectonicLimit) { - adjustedIdleDuration = Math.max(adjustedIdleDuration - (1000 * (loadedRegions.size() - tectonicLimit) * 1.35), 4000); + adjustedIdleDuration.set(Math.max(adjustedIdleDuration.get() - (1000 * (loadedRegions.size() - tectonicLimit) * 1.35), 4000)); + if (getHardware.getProcessMemory() < 5000 && IrisSettings.get().getPerformance().dynamicPerformanceMode) { + adjustedIdleDuration.set(Math.max(adjustedIdleDuration.get() - (1000 * (loadedRegions.size() - tectonicLimit) * 2.65), 4000)); + } } io.set(true); try { - Iris.debug("Trimming Tectonic Plates older than " + Form.duration(adjustedIdleDuration, 0)); + Iris.debug("Trimming Tectonic Plates older than " + Form.duration(adjustedIdleDuration.get(), 0)); Set toUnload = new HashSet<>(); for (Long i : lastUse.keySet()) { - double finalAdjustedIdleDuration = adjustedIdleDuration; + double finalAdjustedIdleDuration = adjustedIdleDuration.get(); hyperLock.withLong(i, () -> { if (M.ms() - lastUse.get(i) >= finalAdjustedIdleDuration) { toUnload.add(i); @@ -463,6 +477,9 @@ public class Mantle { public long ToUnloadTectonic(){ return FakeToUnload.get(); } + public double getTectonicUnloadDuration(){ + return adjustedIdleDuration.get(); + } /** From 4a3a7bc98dc9f9da216d9c19d24c97946425311c Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Wed, 15 Nov 2023 11:16:33 +0100 Subject: [PATCH 10/12] Whoop --- core/src/main/java/com/volmit/iris/util/mantle/Mantle.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java b/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java index 0465fc2aa..52f87eb38 100644 --- a/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java +++ b/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java @@ -477,8 +477,8 @@ public class Mantle { public long ToUnloadTectonic(){ return FakeToUnload.get(); } - public double getTectonicUnloadDuration(){ - return adjustedIdleDuration.get(); + public long getTectonicUnloadDuration(){ + return (long) adjustedIdleDuration.get(); } From c71c2494af495595ee8440e21a5bccaf604f22ec Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Wed, 15 Nov 2023 12:22:36 +0100 Subject: [PATCH 11/12] sync --- .../com/volmit/iris/core/commands/CommandDeveloper.java | 2 +- .../java/com/volmit/iris/engine/mantle/EngineMantle.java | 6 +++--- core/src/main/java/com/volmit/iris/util/mantle/Mantle.java | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java index fa3572de6..78a65a322 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandDeveloper.java @@ -56,7 +56,7 @@ public class CommandDeveloper implements DecreeExecutor { Iris.info(C.DARK_PURPLE + "Tectonic Limit: " + C.LIGHT_PURPLE + engine.getMantle().getTectonicLimit()); Iris.info(C.DARK_PURPLE + "Tectonic Plates: " + C.LIGHT_PURPLE + engine.getMantle().getLoadedRegionCount()); Iris.info(C.DARK_PURPLE + "Tectonic ToUnload: " + C.LIGHT_PURPLE + outputToUnload); - Iris.info(C.DARK_PURPLE + "Tectonic Unload Duration: " + C.LIGHT_PURPLE + Form.duration(engine.getMantle().getTectonicDuration())); + Iris.info(C.DARK_PURPLE + "Tectonic Unload Duration: " + C.LIGHT_PURPLE + Form.duration((long) engine.getMantle().getTectonicDuration())); Iris.info(C.DARK_PURPLE + "Cache Size: " + C.LIGHT_PURPLE + Form.f(IrisData.cacheSize())); Iris.info(C.DARK_PURPLE + "LastUse Size: " + C.LIGHT_PURPLE + Form.mem(lastUseSize)); Iris.info("-------------------------"); diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java index 719f2482a..bc4e9f5d2 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/EngineMantle.java @@ -295,10 +295,10 @@ public interface EngineMantle extends IObjectPlacer { default long getToUnload(){ return getMantle().ToUnloadTectonic(); } - default long getTectonicLimit(){ - return getTectonicLimit(); + default double getTectonicLimit(){ + return getMantle().getTectonicLimit(); } - default long getTectonicDuration(){ + default double getTectonicDuration(){ return getMantle().getTectonicUnloadDuration(); } } diff --git a/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java b/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java index 52f87eb38..4d6eaa38f 100644 --- a/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java +++ b/core/src/main/java/com/volmit/iris/util/mantle/Mantle.java @@ -403,6 +403,7 @@ public class Mantle { @Getter AtomicInteger FakeToUnload = new AtomicInteger(0); AtomicDouble adjustedIdleDuration = new AtomicDouble(0); + @Getter double tectonicLimit = 30; @@ -477,11 +478,10 @@ public class Mantle { public long ToUnloadTectonic(){ return FakeToUnload.get(); } - public long getTectonicUnloadDuration(){ - return (long) adjustedIdleDuration.get(); + public double getTectonicUnloadDuration(){ + return adjustedIdleDuration.get(); } - /** * This retreives a future of the Tectonic Plate at the given coordinates. * All methods accessing tectonic plates should go through this method From a6d0d85b8492ce3a9c9b73e2bcf15fdc683b0447 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Wed, 15 Nov 2023 12:48:26 +0100 Subject: [PATCH 12/12] deleted unused class --- .../iris/core/service/MemoryLeakSVC.java | 78 ------------------- 1 file changed, 78 deletions(-) delete mode 100644 core/src/main/java/com/volmit/iris/core/service/MemoryLeakSVC.java diff --git a/core/src/main/java/com/volmit/iris/core/service/MemoryLeakSVC.java b/core/src/main/java/com/volmit/iris/core/service/MemoryLeakSVC.java deleted file mode 100644 index 3baab50ed..000000000 --- a/core/src/main/java/com/volmit/iris/core/service/MemoryLeakSVC.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.volmit.iris.core.service; - -import java.nio.file.*; -import static java.nio.file.StandardWatchEventKinds.*; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import com.google.gson.JsonParseException; -import com.volmit.iris.Iris; -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.util.SFG.WorldHandlerSFG; -import com.volmit.iris.util.format.C; -import com.volmit.iris.util.misc.getHardware; -import com.volmit.iris.util.plugin.IrisService; -import com.volmit.iris.util.scheduling.Looper; -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.bukkit.plugin.java.JavaPlugin; - -public class MemoryLeakSVC extends Looper implements IrisService { - private WatchService watchService; - private JavaPlugin plugin; - - @Override - public void onEnable() { - //Iris.info("Enabled Mem Leak Detection thing wow it actually worked"); - //this.plugin = Iris.instance; - } - - @Override - public void onDisable() { - - } - - @Override - protected long loop() { - try { - if (getHardware.getAvailableProcessMemory() < 50){ - PrintMemoryLeakDetected(); - for (World world : Bukkit.getWorlds()) { - if (IrisToolbelt.isIrisWorld(world)){ - Engine engine = IrisToolbelt.access(world).getEngine(); - if (engine.getMantle().getLoadedRegionCount() > 0){ - if (!IrisToolbelt.isIrisWorld(world)) { - Iris.info(C.RED + "This is not an Iris world. Iris worlds: " + String.join(", ", Bukkit.getServer().getWorlds().stream().filter(IrisToolbelt::isIrisWorld).map(World::getName).toList())); - return -1; - } - Iris.info(C.GREEN + "Unloading world: " + world.getName()); - try { - IrisToolbelt.evacuate(world); - Bukkit.unloadWorld(world, false); - Iris.info(C.GREEN + "World unloaded successfully."); - } catch (Exception e) { - Iris.info(C.RED + "Failed to unload the world: " + e.getMessage()); - e.printStackTrace(); - } - - } - } - } - } - } catch (Throwable e) { - Iris.reportError(e); - e.printStackTrace(); - return -1; - } - - return 1000; - } - public void PrintMemoryLeakDetected(){ - Iris.info(C.DARK_RED + "--==< MEMORY LEAK DETECTED >==--"); - } -} -