From b898f73a054ea1d4c171b6ff30b9ff90fcaa906c Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Tue, 9 Apr 2024 17:04:32 +0200 Subject: [PATCH] Fixed another potential mem leak Added the base of smart320height --- build.gradle | 2 +- .../iris/core/commands/CommandIris.java | 51 +++---- .../iris/core/commands/CommandStudio.java | 2 +- .../core/gui/components/IrisRenderer.java | 4 +- .../iris/core/service/IrisEngineSVC.java | 137 ++++++++++-------- .../com/volmit/iris/engine/IrisComplex.java | 4 +- .../volmit/iris/engine/object/IrisBiome.java | 17 ++- .../engine/object/IrisBiomeGeneratorLink.java | 50 +++++-- 8 files changed, 150 insertions(+), 117 deletions(-) diff --git a/build.gradle b/build.gradle index 2b06a50d5..51b518b72 100644 --- a/build.gradle +++ b/build.gradle @@ -37,7 +37,7 @@ registerCustomOutputTask('Coco', 'D://mcsm/plugins') registerCustomOutputTask('Strange', 'D://Servers/1.17 Test Server/plugins') registerCustomOutputTask('Vatuu', 'D://Minecraft/Servers/1.19.4/plugins') registerCustomOutputTask('CrazyDev22', 'C://Users/Julian/Desktop/server/plugins') -registerCustomOutputTask('Pixel', 'C://Users/repix/Iris Dimension Engine/1.20.4 - Iris Development/plugins') +registerCustomOutputTask('Pixel', 'C://Users/repix/Iris Dimension Engine/1.20.4 - Development/plugins') // ========================== UNIX ============================== registerCustomOutputTaskUnix('CyberpwnLT', '/Users/danielmills/development/server/plugins') registerCustomOutputTaskUnix('PsychoLT', '/Volumes/PRO-G40/Minecraft/MinecraftDevelopment/Server/plugins') 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 bf7b05b48..a5c66f743 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 @@ -30,6 +30,7 @@ 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; import com.volmit.iris.util.decree.annotations.Decree; @@ -216,41 +217,41 @@ public class CommandIris implements DecreeExecutor { Iris.service(StudioSVC.class).open(sender(), 1337, "overworld"); } - @Decree(description = "Check if iris has access to that specific world") - public void hasAccess( - @Param(description = "The world to access", aliases = {"world"}) - World world - ) { - Engine engine = IrisToolbelt.access(world).getEngine(); - if (engine != null) { - sender().sendMessage("Access granted successfully."); - } else { - sender().sendMessage(C.RED + "Failed to grant access."); - } - } + @Decree(description = "Check access of all worlds.", aliases = {"accesslist"}) + public void worlds() { + KList IrisWorlds = new KList<>(); + KList BukkitWorlds = new KList<>(); - @Decree(description = "All Iris Worlds on the server.", aliases = {"worlds"}) - public void irisworlds() { - List IrisWorlds = new ArrayList<>(); - for (World world : Bukkit.getWorlds()) { + for (World w : Bukkit.getServer().getWorlds()) { try { - if (IrisToolbelt.access(world).getEngine() != null) { - IrisWorlds.add(world); + Engine engine = IrisToolbelt.access(w).getEngine(); + if (engine != null) { + IrisWorlds.add(w); } } catch (Exception e) { - // no + BukkitWorlds.add(w); } } + if (sender().isPlayer()) { - sender.sendMessage(C.IRIS + "Iris Worlds:"); - for (World world : IrisWorlds) { - sender.sendMessage(C.GREEN + "- " + world.getName()); + sender().sendMessage(C.BLUE + "Iris Worlds: "); + for (World IrisWorld : IrisWorlds.copy()) { + sender().sendMessage(C.IRIS + "- " +IrisWorld.getName()); + } + sender().sendMessage(C.GOLD + "Bukkit Worlds: "); + for (World BukkitWorld : BukkitWorlds.copy()) { + sender().sendMessage(C.GRAY + "- " +BukkitWorld.getName()); } } else { - Iris.info(C.IRIS + "Iris Worlds:"); - for (World world : IrisWorlds) { - sender.sendMessage(C.GREEN + "- " + world.getName()); + Iris.info(C.BLUE + "Iris Worlds: "); + for (World IrisWorld : IrisWorlds.copy()) { + Iris.info(C.IRIS + "- " +IrisWorld.getName()); } + Iris.info(C.GOLD + "Bukkit Worlds: "); + for (World BukkitWorld : BukkitWorlds.copy()) { + Iris.info(C.GRAY + "- " +BukkitWorld.getName()); + } + } } diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java b/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java index 7e3f7e5a6..bea1dcd2b 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandStudio.java @@ -85,7 +85,7 @@ import java.util.function.Supplier; public class CommandStudio implements DecreeExecutor { private CommandFind find; private CommandEdit edit; - private CommandDeepSearch deepSearch; + //private CommandDeepSearch deepSearch; public static String hrf(Duration duration) { return duration.toString().substring(2).replaceAll("(\\d[HMS])(?!$)", "$1 ").toLowerCase(); diff --git a/core/src/main/java/com/volmit/iris/core/gui/components/IrisRenderer.java b/core/src/main/java/com/volmit/iris/core/gui/components/IrisRenderer.java index 2820b8999..a96432427 100644 --- a/core/src/main/java/com/volmit/iris/core/gui/components/IrisRenderer.java +++ b/core/src/main/java/com/volmit/iris/core/gui/components/IrisRenderer.java @@ -55,10 +55,10 @@ public class IrisRenderer { IrisBiome b = renderer.getBiome((int) Math.round(x), renderer.getMaxHeight() - 1, (int) Math.round(z)); IrisBiomeGeneratorLink g = b.getGenerators().get(0); Color c; - if (g.getMax() <= 0) { + if (g.getMax(renderer) <= 0) { // Max is below water level, so it is most likely an ocean biome c = Color.BLUE; - } else if (g.getMin() < 0) { + } else if (g.getMin(renderer) < 0) { // Min is below water level, but max is not, so it is most likely a shore biome c = Color.YELLOW; } else { diff --git a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java index b2595e3ad..2220ccc26 100644 --- a/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/IrisEngineSVC.java @@ -78,6 +78,9 @@ public class IrisEngineSVC implements IrisService { t = t - 200; } this.setup(); + this.TrimLogic(); + this.UnloadLogic(); + trimAlive.begin(); unloadAlive.begin(); trimActiveAlive.begin(); @@ -85,8 +88,8 @@ public class IrisEngineSVC implements IrisService { updateTicker.start(); cacheTicker.start(); - trimTicker.start(); - unloadTicker.start(); + //trimTicker.start(); + //unloadTicker.start(); instance = this; } @@ -104,10 +107,6 @@ public class IrisEngineSVC implements IrisService { return tectonicLimit.get(); } - public void EngineReport() { - Iris.info(C.RED + "CRITICAL ENGINE FAILURE! The Tectonic Trim subsystem has not responded for: " + Form.duration(trimAlive.getMillis()) + "."); - } - @EventHandler public void onWorldUnload(WorldUnloadEvent event) { updateWorlds(); @@ -179,9 +178,9 @@ public class IrisEngineSVC implements IrisService { } if (!isServerShuttingDown && isServerLoaded) { if (!trimTicker.isAlive()) { - Iris.info(C.IRIS + "TrimTicker found dead! Booting it up!"); + Iris.info(C.RED + "TrimTicker found dead! Booting it up!"); try { - trimTicker.start(); + TrimLogic(); } catch (Exception e) { Iris.error("What happened?"); e.printStackTrace(); @@ -189,9 +188,9 @@ public class IrisEngineSVC implements IrisService { } if (!unloadTicker.isAlive()) { - Iris.info(C.IRIS + "UnloadTicker found dead! Booting it up!"); + Iris.info(C.RED + "UnloadTicker found dead! Booting it up!"); try { - unloadTicker.start(); + UnloadLogic(); } catch (Exception e) { Iris.error("What happened?"); e.printStackTrace(); @@ -205,63 +204,72 @@ public class IrisEngineSVC implements IrisService { return 1000; } }; + } + public void TrimLogic() { + if (trimTicker == null || !trimTicker.isAlive()) { + trimTicker = new Looper() { + private final Supplier supplier = createSupplier(); - trimTicker = new Looper() { - private final Supplier supplier = createSupplier(); - @Override - protected long loop() { - long start = System.currentTimeMillis(); - trimAlive.reset(); - try { - Engine engine = supplier.get(); - if (engine != null) { - engine.getMantle().trim(tectonicLimit.get() / lastUse.size()); - } - } catch (Throwable e) { - Iris.reportError(e); - Iris.info(C.RED + "EngineSVC: Failed to trim. Please contact support!"); - e.printStackTrace(); - return -1; - } - - int size = lastUse.size(); - long time = (size > 0 ? 1000/size : 1000) - (System.currentTimeMillis() - start); - if (time <= 0) - return 0; - return time; - } - }; - - unloadTicker = new Looper() { - private final Supplier supplier = createSupplier(); - - @Override - protected long loop() { - long start = System.currentTimeMillis(); - unloadAlive.reset(); - try { - Engine engine = supplier.get(); - if (engine != null) { - long unloadStart = System.currentTimeMillis(); - int count = engine.getMantle().unloadTectonicPlate(tectonicLimit.get() / lastUse.size()); - if (count > 0) { - Iris.debug(C.GOLD + "Unloaded " + C.YELLOW + count + " TectonicPlates in " + C.RED + Form.duration(System.currentTimeMillis() - unloadStart, 2)); + @Override + protected long loop() { + long start = System.currentTimeMillis(); + trimAlive.reset(); + try { + Engine engine = supplier.get(); + if (engine != null) { + engine.getMantle().trim(tectonicLimit.get() / lastUse.size()); } + } catch (Throwable e) { + Iris.reportError(e); + Iris.info(C.RED + "EngineSVC: Failed to trim."); + e.printStackTrace(); + return -1; } - } catch (Throwable e) { - Iris.reportError(e); - Iris.info(C.RED + "EngineSVC: Failed to unload."); - e.printStackTrace(); - return -1; - } - int size = lastUse.size(); - long time = (size > 0 ? 1000/size : 1000) - (System.currentTimeMillis() - start); - if (time <= 0) - return 0; - return time; - } - }; + int size = lastUse.size(); + long time = (size > 0 ? 1000 / size : 1000) - (System.currentTimeMillis() - start); + if (time <= 0) + return 0; + return time; + } + }; + trimTicker.start(); + } + } + public void UnloadLogic() { + if (unloadTicker == null || !unloadTicker.isAlive()) { + unloadTicker = new Looper() { + private final Supplier supplier = createSupplier(); + + @Override + protected long loop() { + long start = System.currentTimeMillis(); + unloadAlive.reset(); + try { + Engine engine = supplier.get(); + if (engine != null) { + long unloadStart = System.currentTimeMillis(); + int count = engine.getMantle().unloadTectonicPlate(tectonicLimit.get() / lastUse.size()); + if (count > 0) { + Iris.debug(C.GOLD + "Unloaded " + C.YELLOW + count + " TectonicPlates in " + C.RED + Form.duration(System.currentTimeMillis() - unloadStart, 2)); + } + } + } catch (Throwable e) { + Iris.reportError(e); + Iris.info(C.RED + "EngineSVC: Failed to unload."); + e.printStackTrace(); + return -1; + } + + int size = lastUse.size(); + long time = (size > 0 ? 1000 / size : 1000) - (System.currentTimeMillis() - start); + if (time <= 0) + return 0; + return time; + } + }; + unloadTicker.start(); + } } private Supplier createSupplier() { @@ -281,7 +289,8 @@ public class IrisEngineSVC implements IrisService { if (generator != null) { Engine engine = generator.getEngine(); - if (engine != null && !engine.isStudio()) { + boolean closed = engine.getMantle().getData().isClosed(); + if (engine != null && !engine.isStudio() && !closed) { lastUseLock.lock(); lastUse.put(world, System.currentTimeMillis()); lastUseLock.unlock(); diff --git a/core/src/main/java/com/volmit/iris/engine/IrisComplex.java b/core/src/main/java/com/volmit/iris/engine/IrisComplex.java index db92954a8..3b271951f 100644 --- a/core/src/main/java/com/volmit/iris/engine/IrisComplex.java +++ b/core/src/main/java/com/volmit/iris/engine/IrisComplex.java @@ -292,7 +292,7 @@ public class IrisComplex implements DataProvider { double b = 0; for (IrisGenerator gen : generators) { - b += bx.getGenLinkMax(gen.getLoadKey()); + b += bx.getGenLinkMax(gen.getLoadKey(), engine); } return b; @@ -311,7 +311,7 @@ public class IrisComplex implements DataProvider { double b = 0; for (IrisGenerator gen : generators) { - b += bx.getGenLinkMin(gen.getLoadKey()); + b += bx.getGenLinkMin(gen.getLoadKey(), engine); } return b; diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisBiome.java b/core/src/main/java/com/volmit/iris/engine/object/IrisBiome.java index c08d3fa11..d75dca7ad 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisBiome.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisBiome.java @@ -194,13 +194,14 @@ public class IrisBiome extends IrisRegistrant implements IRare { return getCustomDerivitives() != null && getCustomDerivitives().isNotEmpty(); } - public double getGenLinkMax(String loadKey) { + public double getGenLinkMax(String loadKey, Engine engine) { Integer v = genCacheMax.aquire(() -> { KMap l = new KMap<>(); for (IrisBiomeGeneratorLink i : getGenerators()) { - l.put(i.getGenerator(), i.getMax()); + l.put(i.getGenerator(), i.getMax(engine)); + } return l; @@ -209,13 +210,13 @@ public class IrisBiome extends IrisRegistrant implements IRare { return v == null ? 0 : v; } - public double getGenLinkMin(String loadKey) { + public double getGenLinkMin(String loadKey, Engine engine) { Integer v = genCacheMin.aquire(() -> { KMap l = new KMap<>(); for (IrisBiomeGeneratorLink i : getGenerators()) { - l.put(i.getGenerator(), i.getMin()); + l.put(i.getGenerator(), i.getMin(engine)); } return l; @@ -450,26 +451,26 @@ public class IrisBiome extends IrisRegistrant implements IRare { return real; } - public int getMaxHeight() { + public int getMaxHeight(Engine engine) { return maxHeight.aquire(() -> { int maxHeight = 0; for (IrisBiomeGeneratorLink i : getGenerators()) { - maxHeight += i.getMax(); + maxHeight += i.getMax(engine); } return maxHeight; }); } - public int getMaxWithObjectHeight(IrisData data) { + public int getMaxWithObjectHeight(IrisData data, Engine engine) { return maxWithObjectHeight.aquire(() -> { int maxHeight = 0; for (IrisBiomeGeneratorLink i : getGenerators()) { - maxHeight += i.getMax(); + maxHeight += i.getMax(engine); } int gg = 0; diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisBiomeGeneratorLink.java b/core/src/main/java/com/volmit/iris/engine/object/IrisBiomeGeneratorLink.java index 2571389ca..5a7ccdb7a 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisBiomeGeneratorLink.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisBiomeGeneratorLink.java @@ -18,14 +18,14 @@ package com.volmit.iris.engine.object; +import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; import com.volmit.iris.engine.data.cache.AtomicCache; +import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.object.annotations.*; import com.volmit.iris.util.data.DataProvider; import com.volmit.iris.util.interpolation.IrisInterpolation; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; import lombok.experimental.Accessors; @Snippet("generator-layer") @@ -45,11 +45,13 @@ public class IrisBiomeGeneratorLink { @MinNumber(-2032) // TODO: WARNING HEIGHT @MaxNumber(2032) // TODO: WARNING HEIGHT @Desc("The min block value (value + fluidHeight)") + @Getter(AccessLevel.NONE) private int min = 0; @DependsOn({"min", "max"}) @Required @MinNumber(-2032) // TODO: WARNING HEIGHT @MaxNumber(2032) // TODO: WARNING HEIGHT + @Getter(AccessLevel.NONE) @Desc("The max block value (value + fluidHeight)") private int max = 0; @@ -66,21 +68,41 @@ public class IrisBiomeGeneratorLink { }); } + private int calculateHeight(Engine engine, int option) { + int dmx = engine.getDimension().getMaxHeight(); + int dmn = engine.getDimension().getMinHeight(); + int mx = max; // 500 + int mn = min; // 160 + if (true) { // todo after merge + if (mx > 0) mx = Math.min((int)(((float)mx / (float)dmx) * 300.0f), 300); + if (mx < 0) mx = Math.min((int)(((float)mx / (float)dmn) * 300.0f), 56); + + if (mn > 0) mn = Math.min((int)(((float)mn / (float)dmx) * 300.0f), 300); + if (mn < 0) mn = Math.min((int)(((float)mn / (float)dmn) * 300.0f), 56); + + } + + if (option == 1) { + return mx; + } + if (option == 0) { + return mn; + } + Iris.error("Fatal Generator error!"); + return 0; + } + + public int getMax(Engine engine) { + return calculateHeight(engine, 1); + } + public int getMin(Engine engine) { + return calculateHeight(engine, 0); + } + public double getHeight(DataProvider xg, double x, double z, long seed) { double g = getCachedGenerator(xg).getHeight(x, z, seed); g = g < 0 ? 0 : g; g = g > 1 ? 1 : g; -// if (IrisSettings.get().getGenerator().forceConvertTo320Height) { -// if (max > 320 || min > 320) { -// double scaleFactor = 320.0 / Math.max(max, min); -// min *= (int) scaleFactor; -// max *= (int) scaleFactor; -// if (min < 0) { -// -// } -// } -// } - // todo This return IrisInterpolation.lerp(min, max, g); }