From fb9f8d28f4c4597073031dee58242c3043c85d01 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Wed, 21 Feb 2024 21:24:35 +0100 Subject: [PATCH 01/10] - Lib update fixes all the iris titles/actionbars - Iris .schem Converter --- build.gradle | 4 +- .../iris/core/commands/CommandStudio.java | 6 +- .../volmit/iris/core/tools/IrisConverter.java | 126 ++++++++++++++++++ 3 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 core/src/main/java/com/volmit/iris/core/tools/IrisConverter.java diff --git a/build.gradle b/build.gradle index 0cf2c067d..eeca2a32a 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.1 - Iris Coding/plugins') +registerCustomOutputTask('Pixel', 'C://Users/repix/Iris Dimension Engine/Iris Development/plugins') // ========================== UNIX ============================== registerCustomOutputTaskUnix('CyberpwnLT', '/Users/danielmills/development/server/plugins') registerCustomOutputTaskUnix('PsychoLT', '/Volumes/PRO-G40/Minecraft/MinecraftDevelopment/Server/plugins') @@ -235,7 +235,7 @@ allprojects { implementation 'com.dfsek:Paralithic:0.4.0' implementation 'io.papermc:paperlib:1.0.5' implementation "net.kyori:adventure-text-minimessage:4.13.1" - implementation 'net.kyori:adventure-platform-bukkit:4.3.0' + implementation 'net.kyori:adventure-platform-bukkit:4.3.2' implementation 'net.kyori:adventure-api:4.13.1' compileOnly 'io.lumine:Mythic-Dist:5.2.1' 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 621915632..188ddf298 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 @@ -26,6 +26,7 @@ import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.core.project.IrisProject; import com.volmit.iris.core.service.ConversionSVC; import com.volmit.iris.core.service.StudioSVC; +import com.volmit.iris.core.tools.IrisConverter; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.object.*; @@ -228,7 +229,10 @@ public class CommandStudio implements DecreeExecutor { @Decree(description = "Convert objects in the \"convert\" folder") public void convert() { - Iris.service(ConversionSVC.class).check(sender()); + //Iris.service(ConversionSVC.class).check(sender()); + IrisConverter.convertSchematics(sender()); + + } diff --git a/core/src/main/java/com/volmit/iris/core/tools/IrisConverter.java b/core/src/main/java/com/volmit/iris/core/tools/IrisConverter.java new file mode 100644 index 000000000..da882f56c --- /dev/null +++ b/core/src/main/java/com/volmit/iris/core/tools/IrisConverter.java @@ -0,0 +1,126 @@ +package com.volmit.iris.core.tools; + +import com.volmit.iris.Iris; +import com.volmit.iris.engine.object.*; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.format.C; +import com.volmit.iris.util.format.Form; +import com.volmit.iris.util.math.M; +import com.volmit.iris.util.math.RollingSequence; +import com.volmit.iris.util.nbt.io.NBTUtil; +import com.volmit.iris.util.nbt.io.NamedTag; +import com.volmit.iris.util.nbt.tag.*; +import com.volmit.iris.util.plugin.VolmitPlugin; +import com.volmit.iris.util.plugin.VolmitSender; +import com.volmit.iris.util.scheduling.J; +import com.volmit.iris.util.scheduling.Looper; +import com.volmit.iris.util.scheduling.PrecisionStopwatch; +import javassist.bytecode.ByteArray; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.util.BlockVector; + +import java.io.File; +import java.io.FilenameFilter; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicInteger; + +public class IrisConverter { + public static void convertSchematics(VolmitSender sender) { + Map blockmap = new HashMap<>(); + File folder = Iris.instance.getDataFolder("convert"); + + FilenameFilter filter = (dir, name) -> name.endsWith(".schem"); + File[] fileList = folder.listFiles(filter); + for (File schem : fileList) { + try { + ExecutorService executorService = Executors.newFixedThreadPool(1); + executorService.submit(() -> { + PrecisionStopwatch p = new PrecisionStopwatch(); + boolean largeObject = false; + NamedTag tag = null; + try { + tag = NBTUtil.read(schem); + } catch (IOException e) { + Iris.info(C.RED + "Failed to read: " + schem.getName()); + throw new RuntimeException(e); + } + CompoundTag compound = (CompoundTag) tag.getTag(); + + if (compound.containsKey("Palette") && compound.containsKey("Width") && compound.containsKey("Height") && compound.containsKey("Length")) { + int objW = ((ShortTag) compound.get("Width")).getValue(); + int objH = ((ShortTag) compound.get("Height")).getValue(); + int objD = ((ShortTag) compound.get("Length")).getValue(); + IrisObject object = new IrisObject(objW, objH, objD); + int mv = objW * objH * objD; + AtomicInteger v = new AtomicInteger(0); + if (mv > 100000) { + largeObject = true; + Iris.info(C.GRAY + "Converting.. "+ schem.getName() + " -> " + schem.getName().replace(".schem", ".iob")); + Iris.info(C.GRAY + "- It may take a while"); + if (sender.isPlayer()) { + J.a(() -> { + while (v.get() != mv) { + double pr = ((double) v.get() / (double ) mv); + sender.sendProgress(pr, "Converting"); + J.sleep(16); + } + }); + } + } + CompoundTag paletteTag = (CompoundTag) compound.get("Palette"); + for (Map.Entry> entry : paletteTag.getValue().entrySet()) { + String blockName = entry.getKey(); + BlockData bd = Bukkit.createBlockData(blockName); + Tag blockTag = entry.getValue(); + int blockId = ((IntTag) blockTag).getValue(); + blockmap.put(blockId, bd); + } + + ByteArrayTag byteArray = (ByteArrayTag) compound.get("BlockData"); + byte[] l = byteArray.getValue(); + + for (int h = 0; h < objH; h++) { + for (int d = 0; d < objD; d++) { + for (int w = 0; w < objW; w++) { + BlockData db = blockmap.get((int) l[v.get()]); + object.setUnsigned(w, h, d, db); + v.getAndAdd(1); + } + } + } + + try { + object.write(new File(folder, schem.getName().replace(".schem", ".iob"))); + } catch (IOException e) { + Iris.info(C.RED + "Failed to save: " + schem.getName()); + throw new RuntimeException(e); + } + if (sender.isPlayer()) { + + } + if (largeObject) { + Iris.info(C.GRAY + "Converted "+ schem.getName() + " -> " + schem.getName().replace(".schem", ".iob") + " in " + Form.duration(p.getMillis())); + } else { + Iris.info(C.GRAY + "Converted " + schem.getName() + " -> " + schem.getName().replace(".schem", ".iob")); + } + // schem.delete(); + } + }); + } catch (Exception e) { + Iris.info(C.RED + "Failed to convert: " + schem.getName()); + e.printStackTrace(); + Iris.reportError(e); + } + } + } +} + + + From e407679d2b10ffe55f8d80c09088e656209fb25c Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Fri, 1 Mar 2024 11:44:00 +0100 Subject: [PATCH 02/10] - Improved eta calculation --- .../com/volmit/iris/core/pregenerator/IrisPregenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java b/core/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java index 11128d04a..b335151c6 100644 --- a/core/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java +++ b/core/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java @@ -128,7 +128,7 @@ public class IrisPregenerator { // If yes, use smooth function (which gets more accurate over time since its less sensitive to outliers) ((totalChunks.get() - generated.get()) * ((double) (M.ms() - startTime.get()) / (double) generated.get())) : // If no, use quick function (which is less accurate over time but responds better to the initial delay) - ((totalChunks.get() - generated.get()) / chunksPerSecond.getAverage()) * 1000 // + ((totalChunks.get() - generated.get()) / chunksPerSecond.getAverage()) * 100 // ); } From 34cad8594230ccb91180dc8afeebbac273a1a584 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Fri, 1 Mar 2024 12:32:53 +0100 Subject: [PATCH 03/10] - Fixed Eta --- .../com/volmit/iris/core/pregenerator/IrisPregenerator.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java b/core/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java index b335151c6..c23b6c6fd 100644 --- a/core/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java +++ b/core/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java @@ -115,7 +115,7 @@ public class IrisPregenerator { if(benchmark) { Iris.info(C.GREEN +"Benchmark: " + C.WHITE + Form.f(generated.get()) + " of " + Form.f(totalChunks.get()) + " (%.0f%%) " + Form.f((int) chunksPerSecond.getAverage()) + "/s ETA: " + Form.duration((double) eta, 2), percentage); } else { - Iris.info("Pregen: " + Form.f(generated.get()) + " of " + Form.f(totalChunks.get()) + " (%.0f%%) " + Form.f((int) chunksPerSecond.getAverage()) + "/s ETA: " + Form.duration((double) eta, 2), percentage); + Iris.info("Pregen: " + Form.f(generated.get()) + " of " + Form.f(totalChunks.get()) + " (%.0f%%) " + Form.f((int) chunksPerSecond.getAverage()) + "/s ETA: " + Form.duration(eta, 2), percentage); } } return 1000; @@ -128,7 +128,7 @@ public class IrisPregenerator { // If yes, use smooth function (which gets more accurate over time since its less sensitive to outliers) ((totalChunks.get() - generated.get()) * ((double) (M.ms() - startTime.get()) / (double) generated.get())) : // If no, use quick function (which is less accurate over time but responds better to the initial delay) - ((totalChunks.get() - generated.get()) / chunksPerSecond.getAverage()) * 100 // + ((totalChunks.get() - generated.get()) / chunksPerSecond.getAverage()) * 1000 ); } From 9612fef2a4bd8f670786e064096fb2d87b1ae81f Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Sat, 16 Mar 2024 12:40:40 +0100 Subject: [PATCH 04/10] - Added /iris what region - Sort of Fixed EngineStatus - Added /iris hasAccess - Added /iris irisworlds/worlds - Added Some dev commands - Redid / improved the mantle tectonic unload - Convert still not working so ignore that - Cleaned Iris of IrisPackBenchmarking.java im redoing it on second thought. - Adjusted build.gradle - Renamed some tectonic stuff - Perhaps more? --- build.gradle | 4 +- .../iris/core/commands/CommandDeveloper.java | 134 ++++++-- .../iris/core/commands/CommandIris.java | 40 +++ .../iris/core/commands/CommandWhat.java | 18 +- .../core/pregenerator/IrisPregenerator.java | 11 +- .../iris/core/service/IrisEngineSVC.java | 155 ++++++++- .../volmit/iris/core/tools/IrisConverter.java | 315 ++++++++++++++++-- .../volmit/iris/core/tools/IrisCreator.java | 12 +- .../iris/core/tools/IrisPackBenchmarking.java | 130 +------- .../volmit/iris/engine/IrisEngineMantle.java | 20 +- .../iris/engine/mantle/EngineMantle.java | 2 +- .../com/volmit/iris/util/mantle/Mantle.java | 65 ++-- 12 files changed, 669 insertions(+), 237 deletions(-) diff --git a/build.gradle b/build.gradle index eeca2a32a..bcd5a3319 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/Iris Development/plugins') +registerCustomOutputTask('Pixel', 'C://Users/repix/Iris Dimension Engine/1.20.4 - Iris Development/plugins') // ========================== UNIX ============================== registerCustomOutputTaskUnix('CyberpwnLT', '/Users/danielmills/development/server/plugins') registerCustomOutputTaskUnix('PsychoLT', '/Volumes/PRO-G40/Minecraft/MinecraftDevelopment/Server/plugins') @@ -246,7 +246,7 @@ allprojects { compileOnly 'org.zeroturnaround:zt-zip:1.14' compileOnly 'com.google.code.gson:gson:2.9.0' compileOnly 'org.ow2.asm:asm:9.2' - compileOnly 'com.google.guava:guava:31.1-jre' + compileOnly 'com.google.guava:guava:33.0.0-jre' compileOnly 'bsf:bsf:2.4.0' compileOnly 'rhino:js:1.7R2' compileOnly 'com.github.ben-manes.caffeine:caffeine:3.0.6' 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 898b99fca..06c2f15b0 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 @@ -38,9 +38,13 @@ import net.jpountz.lz4.LZ4FrameInputStream; import net.jpountz.lz4.LZ4FrameOutputStream; import org.apache.commons.lang.RandomStringUtils; import org.bukkit.Bukkit; +import org.bukkit.Chunk; import org.bukkit.World; import java.io.*; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.zip.GZIPInputStream; @@ -51,33 +55,119 @@ public class CommandDeveloper implements DecreeExecutor { private CommandTurboPregen turboPregen; @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; + public void EngineStatus() { + List IrisWorlds = new ArrayList<>(); + int TotalLoadedChunks = 0; + int TotalQueuedTectonicPlates = 0; + int TotalNotQueuedTectonicPlates = 0; + int TotalTectonicPlates = 0; + + long lowestUnloadDuration = 0; + long highestUnloadDuration = 0; + + for (World world : Bukkit.getWorlds()) { + try { + if (IrisToolbelt.access(world).getEngine() != null) { + IrisWorlds.add(world); + } + } catch (Exception e) { + // no + } } - Engine engine = IrisToolbelt.access(world).getEngine(); - if(engine != null) { - long lastUseSize = engine.getMantle().getLastUseMapMemoryUsage(); + for (World world : IrisWorlds) { + Engine engine = IrisToolbelt.access(world).getEngine(); + TotalQueuedTectonicPlates += (int) engine.getMantle().getToUnload(); + TotalNotQueuedTectonicPlates += (int) engine.getMantle().getNotQueuedLoadedRegions(); + TotalTectonicPlates += engine.getMantle().getLoadedRegionCount(); + if (highestUnloadDuration <= (long) engine.getMantle().getTectonicDuration()) { + highestUnloadDuration = (long) engine.getMantle().getTectonicDuration(); + } + if (lowestUnloadDuration >= (long) engine.getMantle().getTectonicDuration()) { + lowestUnloadDuration = (long) engine.getMantle().getTectonicDuration(); + } + for (Chunk chunk : world.getLoadedChunks()) { + if (chunk.isLoaded()) { + TotalLoadedChunks++; + } + } + } + Iris.info("-------------------------"); + Iris.info(C.DARK_PURPLE + "Engine Status"); + Iris.info(C.DARK_PURPLE + "Total Loaded Chunks: " + C.LIGHT_PURPLE + TotalLoadedChunks); + Iris.info(C.DARK_PURPLE + "Tectonic Limit: " + C.LIGHT_PURPLE + IrisEngineSVC.getTectonicLimit()); + Iris.info(C.DARK_PURPLE + "Tectonic Total Plates: " + C.LIGHT_PURPLE + TotalTectonicPlates); + Iris.info(C.DARK_PURPLE + "Tectonic Active Plates: " + C.LIGHT_PURPLE + TotalNotQueuedTectonicPlates); + Iris.info(C.DARK_PURPLE + "Tectonic ToUnload: " + C.LIGHT_PURPLE + TotalQueuedTectonicPlates); + Iris.info(C.DARK_PURPLE + "Lowest Tectonic Unload Duration: " + C.LIGHT_PURPLE + Form.duration(lowestUnloadDuration)); + Iris.info(C.DARK_PURPLE + "Highest Tectonic Unload Duration: " + C.LIGHT_PURPLE + Form.duration(highestUnloadDuration)); + Iris.info(C.DARK_PURPLE + "Cache Size: " + C.LIGHT_PURPLE + Form.f(IrisData.cacheSize())); + Iris.info("-------------------------"); + } - Iris.info("-------------------------"); - Iris.info(C.DARK_PURPLE + "Engine Status"); - Iris.info(C.DARK_PURPLE + "Tectonic Limit: " + C.LIGHT_PURPLE + IrisEngineSVC.getTectonicLimit()); - Iris.info(C.DARK_PURPLE + "Tectonic Loaded Plates: " + C.LIGHT_PURPLE + engine.getMantle().getLoadedRegionCount()); - Iris.info(C.DARK_PURPLE + "Tectonic Plates: " + C.LIGHT_PURPLE + engine.getMantle().getNotClearedLoadedRegions()); - Iris.info(C.DARK_PURPLE + "Tectonic ToUnload: " + C.LIGHT_PURPLE + engine.getMantle().getToUnload()); - 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("-------------------------"); - } else { - Iris.info(C.RED + "Engine is null!"); + @Decree(description = "Test") + public void benchmarkMantle( + @Param(description = "The world to bench", aliases = {"world"}) + World world + ) throws IOException, ClassNotFoundException { + Engine engine = IrisToolbelt.access(world).getEngine(); + int maxHeight = engine.getTarget().getHeight(); + File folder = new File(Bukkit.getWorldContainer(), world.getName()); + int c = 0; + //MCAUtil.read() + + File tectonicplates = new File(folder, "mantle"); + for (File i : Objects.requireNonNull(tectonicplates.listFiles())) { + TectonicPlate.read(maxHeight, i); + c++; + Iris.info("Loaded count: " + c ); + + } + + } + + @Decree(description = "UnloadChunks for good reasons.") + public void unloadchunks() { + List IrisWorlds = new ArrayList<>(); + int chunksUnloaded = 0; + for (World world : Bukkit.getWorlds()) { + try { + if (IrisToolbelt.access(world).getEngine() != null) { + IrisWorlds.add(world); + } + } catch (Exception e) { + // no + } + } + + for (World world : IrisWorlds) { + for (Chunk chunk : world.getLoadedChunks()) { + if (chunk.isLoaded()) { + chunk.unload(); + chunksUnloaded++; + } + } + } + Iris.info(C.IRIS + "Chunks Unloaded: " + chunksUnloaded); + + } + + @Decree(description = "Test", aliases = {"ip"}) + public void network() { + try { + Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces(); + for (NetworkInterface ni : Collections.list(networkInterfaces)) { + Iris.info("Display Name: %s", ni.getDisplayName()); + Enumeration inetAddresses = ni.getInetAddresses(); + for (InetAddress ia : Collections.list(inetAddresses)) { + Iris.info("IP: %s", ia.getHostAddress()); + } + } + } catch (Exception e) { + e.printStackTrace(); } } + @Decree(description = "Test", origin = DecreeOrigin.BOTH) public void test() { Iris.info("Test Developer CMD Executed"); 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 dce8d8db0..471189d9e 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 @@ -24,6 +24,7 @@ import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.core.service.StudioSVC; import com.volmit.iris.core.tools.IrisBenchmarking; 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; @@ -52,6 +53,7 @@ import org.bukkit.scheduler.BukkitRunnable; import java.io.Console; import java.io.File; import java.io.IOException; +import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -216,6 +218,44 @@ 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 = "All Iris Worlds on the server.", aliases = {"worlds"}) + public void irisworlds() { + List IrisWorlds = new ArrayList<>(); + for (World world : Bukkit.getWorlds()) { + try { + if (IrisToolbelt.access(world).getEngine() != null) { + IrisWorlds.add(world); + } + } catch (Exception e) { + // no + } + } + if (sender().isPlayer()) { + sender.sendMessage(C.IRIS + "Iris Worlds:"); + for (World world : IrisWorlds) { + sender.sendMessage(C.GREEN + "- " + world.getName()); + } + } else { + Iris.info(C.IRIS + "Iris Worlds:"); + for (World world : IrisWorlds) { + sender.sendMessage(C.GREEN + "- " + world.getName()); + } + } + } + @Decree(description = "Remove an Iris world", aliases = {"del", "rm", "delete"}, sync = true) public void remove( @Param(description = "The world to remove") diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandWhat.java b/core/src/main/java/com/volmit/iris/core/commands/CommandWhat.java index 3686ad81a..48d8c726e 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandWhat.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandWhat.java @@ -22,7 +22,9 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.edit.BlockSignal; import com.volmit.iris.core.nms.INMS; import com.volmit.iris.core.tools.IrisToolbelt; +import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.object.IrisBiome; +import com.volmit.iris.engine.object.IrisRegion; import com.volmit.iris.util.data.B; import com.volmit.iris.util.decree.DecreeExecutor; import com.volmit.iris.util.decree.DecreeOrigin; @@ -37,6 +39,7 @@ import org.bukkit.Material; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; +import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; @Decree(name = "what", origin = DecreeOrigin.PLAYER, studio = true, description = "Iris What?") @@ -82,6 +85,19 @@ public class CommandWhat implements DecreeExecutor { } } + @Decree(description = "What region am i in?", origin = DecreeOrigin.PLAYER) + public void region() { + try { + Chunk chunk = world().getChunkAt(player().getLocation().getBlockZ() / 16, player().getLocation().getBlockZ() / 16); + IrisRegion r = engine().getRegion(chunk); + sender().sendMessage("IRegion: " + r.getLoadKey() + " (" + r.getName() + ")"); + + } catch (Throwable e) { + Iris.reportError(e); + sender().sendMessage(C.IRIS + "Iris worlds only."); + } + } + @Decree(description = "What block am i looking at?", origin = DecreeOrigin.PLAYER) public void block() { BlockData bd; @@ -147,7 +163,7 @@ public class CommandWhat implements DecreeExecutor { sender().sendMessage("Found " + v.get() + " Nearby Markers (" + marker + ")"); } else { - sender().sendMessage("Iris worlds only."); + sender().sendMessage(C.IRIS + "Iris worlds only."); } } } diff --git a/core/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java b/core/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java index c23b6c6fd..b693e0034 100644 --- a/core/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java +++ b/core/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java @@ -19,9 +19,7 @@ package com.volmit.iris.core.pregenerator; import com.volmit.iris.Iris; -import com.volmit.iris.core.tools.IrisPackBenchmarking; import com.volmit.iris.util.collection.KSet; -import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; import com.volmit.iris.util.mantle.Mantle; import com.volmit.iris.util.math.M; @@ -30,15 +28,12 @@ import com.volmit.iris.util.math.RollingSequence; import com.volmit.iris.util.scheduling.ChronoLatch; import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.Looper; -import lombok.Getter; -import lombok.Setter; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReference; -import static com.volmit.iris.core.tools.IrisPackBenchmarking.benchmark; public class IrisPregenerator { private final PregenTask task; @@ -112,11 +107,7 @@ public class IrisPregenerator { if (cl.flip()) { double percentage = ((double) generated.get() / (double) totalChunks.get()) * 100; - if(benchmark) { - Iris.info(C.GREEN +"Benchmark: " + C.WHITE + Form.f(generated.get()) + " of " + Form.f(totalChunks.get()) + " (%.0f%%) " + Form.f((int) chunksPerSecond.getAverage()) + "/s ETA: " + Form.duration((double) eta, 2), percentage); - } else { - Iris.info("Pregen: " + Form.f(generated.get()) + " of " + Form.f(totalChunks.get()) + " (%.0f%%) " + Form.f((int) chunksPerSecond.getAverage()) + "/s ETA: " + Form.duration(eta, 2), percentage); - } + Iris.info("Pregen: " + Form.f(generated.get()) + " of " + Form.f(totalChunks.get()) + " (%.0f%%) " + Form.f((int) chunksPerSecond.getAverage()) + "/s ETA: " + Form.duration(eta, 2), percentage); } return 1000; } 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 6f3f79535..767e9c166 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 @@ -4,32 +4,67 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.platform.PlatformChunkGenerator; +import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; +import com.volmit.iris.util.mantle.TectonicPlate; import com.volmit.iris.util.misc.getHardware; import com.volmit.iris.util.plugin.IrisService; +import com.volmit.iris.util.scheduling.ChronoLatch; import com.volmit.iris.util.scheduling.Looper; +import com.volmit.iris.util.scheduling.PrecisionStopwatch; import org.bukkit.Bukkit; import org.bukkit.World; +import org.bukkit.event.EventHandler; +import org.bukkit.event.world.WorldLoadEvent; +import org.bukkit.event.world.WorldUnloadEvent; +import org.checkerframework.checker.units.qual.A; -import java.util.ArrayList; -import java.util.List; +import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Supplier; public class IrisEngineSVC implements IrisService { + public static IrisEngineSVC instance; private static final AtomicInteger tectonicLimit = new AtomicInteger(30); private final ReentrantLock lastUseLock = new ReentrantLock(); private final KMap lastUse = new KMap<>(); + private List IrisWorlds; private Looper cacheTicker; + private Looper freezeTicker; private Looper trimTicker; private Looper unloadTicker; + private Looper updateTicker; + private PrecisionStopwatch trimAlive; + private PrecisionStopwatch unloadAlive; + public PrecisionStopwatch trimActiveAlive; + public PrecisionStopwatch unloadActiveAlive; + private AtomicInteger TotalTectonicPlates; + private AtomicInteger TotalQueuedTectonicPlates; + private AtomicInteger TotalNotQueuedTectonicPlates; + private AtomicBoolean IsUnloadAlive; + private AtomicBoolean IsTrimAlive; + ChronoLatch cl; + public List corruptedIrisWorlds = new ArrayList<>(); @Override public void onEnable() { + this.cl = new ChronoLatch(5000); + IrisWorlds = new ArrayList<>(); + IsUnloadAlive = new AtomicBoolean(true); + IsTrimAlive = new AtomicBoolean(true); + trimActiveAlive = new PrecisionStopwatch(); + unloadActiveAlive = new PrecisionStopwatch(); + trimAlive = new PrecisionStopwatch(); + unloadAlive = new PrecisionStopwatch(); + TotalTectonicPlates = new AtomicInteger(); + TotalQueuedTectonicPlates = new AtomicInteger(); + TotalNotQueuedTectonicPlates = new AtomicInteger(); tectonicLimit.set(2); long t = getHardware.getProcessMemory(); while (t > 200) { @@ -37,15 +72,50 @@ public class IrisEngineSVC implements IrisService { t = t - 200; } this.setup(); + trimAlive.begin(); + unloadAlive.begin(); + trimActiveAlive.begin(); + unloadActiveAlive.begin(); + + updateTicker.start(); cacheTicker.start(); trimTicker.start(); unloadTicker.start(); + freezeTicker.start(); + instance = this; + } public static int getTectonicLimit() { 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(); + } + + @EventHandler + public void onWorldLoad(WorldLoadEvent event) { + updateWorlds(); + } + + public void updateWorlds() { + for (World world : Bukkit.getWorlds()) { + try { + if (IrisToolbelt.access(world).getEngine() != null) { + IrisWorlds.add(world); + } + } catch (Exception e) { + // no + } + } + } + private void setup() { cacheTicker = new Looper() { @Override @@ -57,7 +127,7 @@ public class IrisEngineSVC implements IrisService { Long last = lastUse.get(key); if (last == null) continue; - if (now - last > 60000) { // 1 minute + if (now - last > 60000) { lastUse.remove(key); } } @@ -67,11 +137,81 @@ public class IrisEngineSVC implements IrisService { return 1000; } }; + + updateTicker = new Looper() { + @Override + protected long loop() { + try { + TotalQueuedTectonicPlates.set(0); + TotalNotQueuedTectonicPlates.set(0); + TotalTectonicPlates.set(0); + for (World world : IrisWorlds) { + Engine engine = IrisToolbelt.access(world).getEngine(); + TotalQueuedTectonicPlates.addAndGet((int) engine.getMantle().getToUnload()); + TotalNotQueuedTectonicPlates.addAndGet((int) engine.getMantle().getNotQueuedLoadedRegions()); + TotalTectonicPlates.addAndGet(engine.getMantle().getLoadedRegionCount()); + } + } catch (Exception e) { + return -1; + } + return 1000; + } + }; + + freezeTicker = new Looper() { + @Override + protected long loop() { + if (cl.flip()) { + if (!unloadTicker.isAlive()) { + Iris.debug(C.YELLOW + "UnloadTicker Found dead?"); + } + if (!trimTicker.isAlive()) { + Iris.debug(C.YELLOW + "UnloadTicker Found dead?"); + } + Runtime runtime = Runtime.getRuntime(); + long usedMemory = runtime.totalMemory() - runtime.freeMemory(); + long maxMemory = runtime.maxMemory(); + double memoryUsagePercentage = ((double) usedMemory / (double) maxMemory); + double externalTrim = trimActiveAlive.getMillis(); + double externalUnload = unloadActiveAlive.getMillis(); + double localTrim = trimAlive.getMillis(); + double localUnload = unloadAlive.getMillis(); + if (localTrim > 120000) { + Iris.info(C.YELLOW + "EngineSVC Alert! The Trim subsystem has exceeded its expected response time: " + Form.duration(trimAlive.getMillis()) + "."); + } + if (localUnload > 120000) { + Iris.info(C.YELLOW + "EngineSVC Alert! The Tectonic subsystem has exceeded its expected response time: " + Form.duration(trimAlive.getMillis()) + "."); + } + + if (memoryUsagePercentage > 0.9 && tectonicLimit.get() < TotalTectonicPlates.get()) { + if (localTrim > 30000 && externalTrim > 10000) { + Iris.info(C.RED + "CRITICAL EngineSVC FAILURE! The Tectonic Trim subsystem has not trimmed for: " + Form.duration(trimAlive.getMillis()) + "."); + IsTrimAlive.set(false); + } else { + Iris.info(C.IRIS + "EngineSVC reports activity within the Trim subsystem system!"); + IsTrimAlive.set(true); + } + + if (localUnload > 30000 && externalUnload > 12000 && TotalQueuedTectonicPlates.get() != 0) { + Iris.info(C.RED + "CRITICAL EngineSVC FAILURE! The Tectonic Unload subsystem has not unloaded for: " + Form.duration(trimAlive.getMillis()) + "."); + IsUnloadAlive.set(false); + } else { + Iris.info(C.IRIS + "EngineSVC reports activity within the Unload subsystem system!"); + IsUnloadAlive.set(true); + } + } + } + return 1; + } + + }; + 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) { @@ -79,7 +219,9 @@ public class IrisEngineSVC implements IrisService { } } catch (Throwable e) { Iris.reportError(e); - // return -1; + Iris.info(C.RED + "EngineSVC: Failed to trim. Please contact support!"); + e.printStackTrace(); + return -1; } int size = lastUse.size(); @@ -96,6 +238,7 @@ public class IrisEngineSVC implements IrisService { @Override protected long loop() { long start = System.currentTimeMillis(); + unloadAlive.reset(); try { Engine engine = supplier.get(); if (engine != null) { @@ -107,6 +250,8 @@ public class IrisEngineSVC implements IrisService { } } catch (Throwable e) { Iris.reportError(e); + Iris.info(C.RED + "EngineSVC: Failed to unload. Please contact support!"); + e.printStackTrace(); return -1; } @@ -145,6 +290,8 @@ public class IrisEngineSVC implements IrisService { } } } catch (Throwable e) { + Iris.info(C.RED + "EngineSVC: Failed to create supplier. Please contact support!"); + e.printStackTrace(); Iris.reportError(e); } return null; diff --git a/core/src/main/java/com/volmit/iris/core/tools/IrisConverter.java b/core/src/main/java/com/volmit/iris/core/tools/IrisConverter.java index da882f56c..fb4d344eb 100644 --- a/core/src/main/java/com/volmit/iris/core/tools/IrisConverter.java +++ b/core/src/main/java/com/volmit/iris/core/tools/IrisConverter.java @@ -2,30 +2,26 @@ package com.volmit.iris.core.tools; import com.volmit.iris.Iris; import com.volmit.iris.engine.object.*; -import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; -import com.volmit.iris.util.math.M; -import com.volmit.iris.util.math.RollingSequence; import com.volmit.iris.util.nbt.io.NBTUtil; import com.volmit.iris.util.nbt.io.NamedTag; import com.volmit.iris.util.nbt.tag.*; -import com.volmit.iris.util.plugin.VolmitPlugin; import com.volmit.iris.util.plugin.VolmitSender; +import com.volmit.iris.util.reflect.V; import com.volmit.iris.util.scheduling.J; -import com.volmit.iris.util.scheduling.Looper; import com.volmit.iris.util.scheduling.PrecisionStopwatch; -import javassist.bytecode.ByteArray; +import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; import org.bukkit.Bukkit; -import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; -import org.bukkit.util.BlockVector; +import org.bukkit.util.Vector; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -33,15 +29,14 @@ import java.util.concurrent.atomic.AtomicInteger; public class IrisConverter { public static void convertSchematics(VolmitSender sender) { - Map blockmap = new HashMap<>(); File folder = Iris.instance.getDataFolder("convert"); FilenameFilter filter = (dir, name) -> name.endsWith(".schem"); File[] fileList = folder.listFiles(filter); + ExecutorService executorService = Executors.newFixedThreadPool(1); + executorService.submit(() -> { for (File schem : fileList) { try { - ExecutorService executorService = Executors.newFixedThreadPool(1); - executorService.submit(() -> { PrecisionStopwatch p = new PrecisionStopwatch(); boolean largeObject = false; NamedTag tag = null; @@ -57,24 +52,26 @@ public class IrisConverter { int objW = ((ShortTag) compound.get("Width")).getValue(); int objH = ((ShortTag) compound.get("Height")).getValue(); int objD = ((ShortTag) compound.get("Length")).getValue(); - IrisObject object = new IrisObject(objW, objH, objD); int mv = objW * objH * objD; AtomicInteger v = new AtomicInteger(0); - if (mv > 100000) { + AtomicInteger fv = new AtomicInteger(0); + if (mv > 500_000) { largeObject = true; Iris.info(C.GRAY + "Converting.. "+ schem.getName() + " -> " + schem.getName().replace(".schem", ".iob")); Iris.info(C.GRAY + "- It may take a while"); if (sender.isPlayer()) { J.a(() -> { - while (v.get() != mv) { - double pr = ((double) v.get() / (double ) mv); - sender.sendProgress(pr, "Converting"); - J.sleep(16); - } +// while (v.get() != mv) { +// double pr = ((double) v.get() / (double ) mv); +// sender.sendProgress(pr, "Converting"); +// J.sleep(16); +// } }); } } + CompoundTag paletteTag = (CompoundTag) compound.get("Palette"); + Map blockmap = new HashMap<>(paletteTag.size(), 0.9f); for (Map.Entry> entry : paletteTag.getValue().entrySet()) { String blockName = entry.getKey(); BlockData bd = Bukkit.createBlockData(blockName); @@ -84,18 +81,179 @@ public class IrisConverter { } ByteArrayTag byteArray = (ByteArrayTag) compound.get("BlockData"); - byte[] l = byteArray.getValue(); + byte[] originalBlockArray = byteArray.getValue(); + int b = 0; + int a = 0; + Map y = new HashMap<>(); + Map x = new HashMap<>(); + Map z = new HashMap<>(); + + // Height adjustments + for (int h = 0; h < objH; h++) { + if (b == 0) { + y.put(h, (byte) 0); + } + if (b > 0) { + y.put(h, (byte) 1); + } + a = 0; + b = 0; + for (int d = 0; d < objD; d++) { + for (int w = 0; w < objW; w++) { + BlockData db = blockmap.get((int) originalBlockArray[fv.get()]); + if(db.getAsString().contains("minecraft:air")) { + a++; + } else { + b++; + } + fv.getAndAdd(1); + } + } + } + fv.set(0); + + // Width adjustments + for (int w = 0; w < objW; w++) { + if (b == 0) { + x.put(w, (byte) 0); + } + if (b > 0) { + x.put(w, (byte) 1); + } + a = 0; + b = 0; + for (int h = 0; h < objH; h++) { + for (int d = 0; d < objD; d++) { + BlockData db = blockmap.get((int) originalBlockArray[fv.get()]); + if(db.getAsString().contains("minecraft:air")) { + a++; + } else { + b++; + } + fv.getAndAdd(1); + } + } + } + fv.set(0); + + // Depth adjustments + for (int d = 0; d < objD; d++) { + if (b == 0) { + z.put(d, (byte) 0); + } + if (b > 0) { + z.put(d, (byte) 1); + } + a = 0; + b = 0; + for (int h = 0; h < objH; h++) { + for (int w = 0; w < objW; w++) { + BlockData db = blockmap.get((int) originalBlockArray[fv.get()]); + if(db.getAsString().contains("minecraft:air")) { + a++; + } else { + b++; + } + fv.getAndAdd(1); + } + } + } + fv.set(0); + int CorrectObjH = getCorrectY(y, objH); + int CorrectObjW = getCorrectX(x, objW); + int CorrectObjD = getCorrectZ(z, objD); + + //IrisObject object = new IrisObject(CorrectObjW, CorrectObjH, CorrectObjH); + IrisObject object = new IrisObject(objW, objH, objD); + Vector originalVector = new Vector(objW,objH,objD); + + + int[] yc = null; + int[] xc = null; + int[] zc = null; + + + int fo = 0; + int so = 0; + int o = 0; + int c = 0; + for (Integer i : y.keySet()) { + if (y.get(i) == 0) { + o++; + } + if (y.get(i) == 1) { + c++; + if (c == 1) { + fo = o; + } + o = 0; + } + } + so = o; + yc = new int[]{fo, so}; + + fo = 0; + so = 0; + o = 0; + c = 0; + for (Integer i : x.keySet()) { + if (x.get(i) == 0) { + o++; + } + if (x.get(i) == 1) { + c++; + if (c == 1) { + fo = o; + } + o = 0; + } + } + so = o; + xc = new int[]{fo, so}; + + fo = 0; + so = 0; + o = 0; + c = 0; + for (Integer i : z.keySet()) { + if (z.get(i) == 0) { + o++; + } + if (z.get(i) == 1) { + c++; + if (c == 1) { + fo = o; + } + o = 0; + } + } + so = o; + zc = new int[]{fo, so}; + + int h1, h2, w1, w2, v1 = 0, volume = objW * objH * objD; + Map blockLocationMap = new LinkedHashMap<>(); + boolean hasAir = false; + int pos = 0; + for (int i : originalBlockArray) { + blockLocationMap.put(pos, i); + pos++; + } + + for (int h = 0; h < objH; h++) { for (int d = 0; d < objD; d++) { for (int w = 0; w < objW; w++) { - BlockData db = blockmap.get((int) l[v.get()]); - object.setUnsigned(w, h, d, db); + BlockData bd = blockmap.get((int) originalBlockArray[v.get()]); + if (!bd.getMaterial().isAir()) { + object.setUnsigned(w, h, d, bd); + } v.getAndAdd(1); } } } + try { object.write(new File(folder, schem.getName().replace(".schem", ".iob"))); } catch (IOException e) { @@ -103,7 +261,11 @@ public class IrisConverter { throw new RuntimeException(e); } if (sender.isPlayer()) { - + if (largeObject) { + sender.sendMessage(C.IRIS + "Converted "+ schem.getName() + " -> " + schem.getName().replace(".schem", ".iob") + " in " + Form.duration(p.getMillis())); + } else { + sender.sendMessage(C.IRIS + "Converted " + schem.getName() + " -> " + schem.getName().replace(".schem", ".iob")); + } } if (largeObject) { Iris.info(C.GRAY + "Converted "+ schem.getName() + " -> " + schem.getName().replace(".schem", ".iob") + " in " + Form.duration(p.getMillis())); @@ -112,13 +274,120 @@ public class IrisConverter { } // schem.delete(); } - }); } catch (Exception e) { Iris.info(C.RED + "Failed to convert: " + schem.getName()); + if (sender.isPlayer()) { + sender.sendMessage(C.RED + "Failed to convert: " + schem.getName()); + } e.printStackTrace(); Iris.reportError(e); } } + }); + } + + public static boolean isNewPointFurther(int[] originalPoint, int[] oldPoint, int[] newPoint) { + int oX = oldPoint[1]; + int oY = oldPoint[2]; + int oZ = oldPoint[3]; + + int nX = newPoint[1]; + int nY = newPoint[2]; + int nZ = newPoint[3]; + + int orX = originalPoint[1]; + int orY = originalPoint[2]; + int orZ = originalPoint[3]; + + double oldDistance = Math.sqrt(Math.pow(oX - orX, 2) + Math.pow(oY - orY, 2) + Math.pow(oZ - orZ, 2)); + double newDistance = Math.sqrt(Math.pow(nX - orX, 2) + Math.pow(nY - orY, 2) + Math.pow(nZ - orZ, 2)); + + if (newDistance > oldDistance) { + return true; + } + return false; + } + + public static int[] getCoordinates(int pos, int obX, int obY, int obZ) { + int z = 0; + int[] coords = new int[4]; + for (int h = 0; h < obY; h++) { + for (int d = 0; d < obZ; d++) { + for (int w = 0; w < obX; w++) { + if (z == pos) { + coords[1] = w; + coords[2] = h; + coords[3] = d; + return coords; + } + z++; + } + } + } + return null; + } + + public static int getCorrectY(Map y, int H) { + int fo = 0; + int so = 0; + int o = 0; + int c = 0; + for (Integer i : y.keySet()) { + if (y.get(i) == 0) { + o++; + } + if (y.get(i) == 1) { + c++; + if(c == 1){ + fo = o; + } + o = 0; + } + } + so = o; + return H = H - (fo + so); + } + + public static int getCorrectX(Map x, int W) { + int fo = 0; + int so = 0; + int o = 0; + int c = 0; + for (Integer i : x.keySet()) { + if (x.get(i) == 0) { + o++; + } + if (x.get(i) == 1) { + c++; + if(c == 1){ + fo = o; + } + o = 0; + } + } + so = o; + return W = W - (fo + so); + } + + public static int getCorrectZ(Map z, int D) { + int fo = 0; + int so = 0; + int o = 0; + int c = 0; + for (Integer i : z.keySet()) { + if (z.get(i) == 0) { + o++; + } + if (z.get(i) == 1) { + c++; + if(c == 1){ + fo = o; + } + o = 0; + } + } + so = o; + return D = D - (fo + so); } } 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 7e6285d07..3e90aced1 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 @@ -46,10 +46,6 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Supplier; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import static com.volmit.iris.core.tools.IrisPackBenchmarking.benchmark; import static com.volmit.iris.core.safeguard.IrisSafeguard.unstablemode; /** @@ -86,6 +82,10 @@ public class IrisCreator { * the world itself. Studio worlds are deleted when they are unloaded. */ private boolean studio = false; + /** + * Benchmark mode + */ + private boolean benchmark = false; public static boolean removeFromBukkitYml(String name) throws IOException { YamlConfiguration yml = YamlConfiguration.loadConfiguration(BUKKIT_YML); @@ -110,7 +110,7 @@ public class IrisCreator { * @return the IrisAccess * @throws IrisException shit happens */ - IrisPackBenchmarking PackBench = new IrisPackBenchmarking(); + public World create() throws IrisException { if (unstablemode){ Iris.info(C.RED + "Your server is experiencing an incompatibility with the Iris plugin. Please rectify this problem to avoid further complications."); @@ -193,7 +193,7 @@ public class IrisCreator { done.set(true); - if (sender.isPlayer()) { + if (sender.isPlayer() && !benchmark) { J.s(() -> { sender.player().teleport(new Location(world.get(), 0, world.get().getHighestBlockYAt(0, 0), 0)); }); diff --git a/core/src/main/java/com/volmit/iris/core/tools/IrisPackBenchmarking.java b/core/src/main/java/com/volmit/iris/core/tools/IrisPackBenchmarking.java index 13577cc82..60c9aa76b 100644 --- a/core/src/main/java/com/volmit/iris/core/tools/IrisPackBenchmarking.java +++ b/core/src/main/java/com/volmit/iris/core/tools/IrisPackBenchmarking.java @@ -21,97 +21,28 @@ import static com.volmit.iris.core.commands.CommandIris.BenchDimension; public class IrisPackBenchmarking { - public static boolean loaded = false; - public static boolean benchmark = false; - static boolean cancelled = false; - static boolean pregenInProgress = false; - static long startTime; - static long totalChunks; - static long generatedChunks; - static double elapsedTimeNs; + public static IrisPackBenchmarking instance; + long totalChunks; + long generatedChunks; + double elapsedTimeNs; - public static void runBenchmark() { - // IrisPackBenchmarking IrisPackBenchmarking = new IrisPackBenchmarking(); - benchmark = true; - Iris.info(C.BLUE + "Benchmarking Dimension: " + C.AQUA + BenchDimension); - //progress(); - CompletableFuture future = CompletableFuture.runAsync(() -> { - Iris.info(C.GOLD + "Setting everything up.."); - try { - String BenchmarkFolder = "\\Benchmark"; - File folder = new File(BenchmarkFolder); - if (folder.exists() && folder.isDirectory()) { - FileUtils.deleteDirectory(folder); - Iris.debug("Deleted old Benchmark"); - } else { - Iris.info(C.GOLD + "Old Benchmark not found!"); - if(folder.exists()){ - Iris.info(C.RED + "FAILED To remove old Benchmark!"); - //cancelled = true; - - } - } - } catch (Exception e) { - throw new RuntimeException(); - } - - }).thenRun(() -> { - Iris.info(C.GOLD + "Creating Benchmark Environment"); - createBenchmark(); - - }).thenRun(() -> { - Iris.info( C.BLUE + "Benchmark Started!"); - boolean done = false; - startBenchmarkTimer(); - startBenchmark(); - basicScheduler(); - }).thenRun(() -> { - - }); - // cancelled = future.cancel(true); - try { - future.get(); - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - } - - private static void results(){ - double averageCps = calculateAverageCPS(); - Iris.info("Benchmark Dimension: " + BenchDimension); - Iris.info("Speeds"); - Iris.info("- Average CPS: " + roundToTwoDecimalPlaces(averageCps)); - Iris.info("Duration: " + roundToTwoDecimalPlaces(elapsedTimeNs)); + public void runBenchmark() { } - private static void basicScheduler() { - while (true) { - totalChunks = IrisPregenerator.getLongTotalChunks(); - generatedChunks = IrisPregenerator.getLongGeneratedChunks(); - if(totalChunks > 0) { - if (generatedChunks >= totalChunks) { - Iris.info("Benchmark Completed!"); - elapsedTimeNs = stopBenchmarkTimer(); - results(); - break; - } - } - //J.sleep(100); test - } - } - static void createBenchmark(){ + public void createBenchmark(){ try { IrisToolbelt.createWorld() .dimension(BenchDimension) .name("Benchmark") .seed(1337) .studio(false) + .benchmark(true) .create(); } catch (IrisException e) { throw new RuntimeException(e); } } - static void startBenchmark(){ + public void startBenchmark(){ int x = 0; int z = 0; IrisToolbelt.pregenerate(PregenTask @@ -122,49 +53,4 @@ public class IrisPackBenchmarking { .build(), Bukkit.getWorld("Benchmark") ); } - static void startLazyBenchmark(){ - int x = 0; - int z = 0; - LazyPregenerator.LazyPregenJob pregenJob = LazyPregenerator.LazyPregenJob.builder() - //.world("Benchmark") - .healingPosition(0) - .healing(false) - .chunksPerMinute(3200) - .radiusBlocks(5000) - .position(0) - .build(); - - LazyPregenerator pregenerator = new LazyPregenerator(pregenJob, new File("plugins/Iris/lazygen.json")); - pregenerator.start(); - } - public static double calculateAverageCPS() { - double elapsedTimeSec = elapsedTimeNs / 1_000_000_000.0; // Convert to seconds - return generatedChunks / elapsedTimeSec; - } - - private static void startBenchmarkTimer() { - startTime = System.nanoTime(); - } - - private static double stopBenchmarkTimer() { - long endTime = System.nanoTime(); - return (endTime - startTime) / 1_000_000_000.0; - } - - public static void deleteDirectory(File dir) { - File[] files = dir.listFiles(); - if(files != null) { - for(File file: files) { - if(file.isDirectory()) { - deleteDirectory(file); - } else { - file.delete(); - } - } - } - dir.delete(); - } - private static double roundToTwoDecimalPlaces(double value) { - return Double.parseDouble(String.format("%.2f", value)); - } } \ No newline at end of file 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 f61d90531..8e28490d8 100644 --- a/core/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java +++ b/core/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java @@ -19,8 +19,6 @@ package com.volmit.iris.engine; import com.volmit.iris.Iris; -import com.volmit.iris.core.IrisSettings; -import com.volmit.iris.core.tools.IrisPackBenchmarking; import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.mantle.EngineMantle; @@ -47,9 +45,6 @@ import java.io.IOException; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; -import static com.volmit.iris.core.tools.IrisPackBenchmarking.benchmark; -import static com.volmit.iris.core.safeguard.PerformanceSFG.*; - @Data @EqualsAndHashCode(exclude = "engine") @ToString(exclude = "engine") @@ -290,17 +285,10 @@ public class IrisEngineMantle implements EngineMantle { x = Math.max(x, c); x = (Math.max(x, 16) + 16) >> 4; x = x % 2 == 0 ? x + 1 : x; - if (benchmark){ - x = 4; - Iris.info("Mantle Size: " + x + " Chunks " + C.BLUE + "BENCHMARK 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) + ")"); return x; } 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 25aca5aed..62e18e0d8 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 @@ -298,7 +298,7 @@ public interface EngineMantle extends IObjectPlacer { default long getToUnload(){ return getMantle().getToUnload().size(); } - default long getNotClearedLoadedRegions(){ + default long getNotQueuedLoadedRegions(){ return getMantle().getLoadedRegions().size() - getMantle().getToUnload().size(); } default double getTectonicDuration(){ 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 e71652a28..52982442c 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 @@ -21,6 +21,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.service.IrisEngineSVC; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.data.cache.Cache; import com.volmit.iris.engine.framework.Engine; @@ -423,7 +424,7 @@ public class Mantle { ioTrim.set(true); unloadLock.lock(); try { - if (lastUse != null) { + if (lastUse != null && IrisEngineSVC.instance != null) { if (!lastUse.isEmpty()) { Iris.debug("Trimming Tectonic Plates older than " + Form.duration(adjustedIdleDuration.get(), 0)); for (Long i : new ArrayList<>(lastUse.keySet())) { @@ -433,7 +434,7 @@ public class Mantle { if (lastUseTime != null && M.ms() - lastUseTime >= finalAdjustedIdleDuration) { toUnload.add(i); Iris.debug("Tectonic Region added to unload"); - //Iris.panic(); + IrisEngineSVC.instance.trimActiveAlive.reset(); } }); } @@ -452,37 +453,41 @@ public class Mantle { AtomicInteger i = new AtomicInteger(); unloadLock.lock(); BurstExecutor burst = null; - try { - KList copy = toUnload.copy(); - burst = MultiBurst.burst.burst(copy.size()); - burst.setMulticore(copy.size() > tectonicLimit); - for (long id : copy) { - burst.queue(() -> - hyperLock.withLong(id, () -> { - TectonicPlate m = loadedRegions.get(id); - if (m != null) { - try { - m.write(fileForRegion(dataFolder, id)); - loadedRegions.remove(id); - lastUse.remove(id); - toUnload.remove(id); - i.incrementAndGet(); - Iris.debug("Unloaded Tectonic Plate " + C.DARK_GREEN + Cache.keyX(id) + " " + Cache.keyZ(id)); - } catch (IOException e) { - Iris.reportError(e); + if (IrisEngineSVC.instance != null) { + try { + KList copy = toUnload.copy(); + burst = MultiBurst.burst.burst(copy.size()); + burst.setMulticore(copy.size() > tectonicLimit); + for (long id : copy) { + burst.queue(() -> + hyperLock.withLong(id, () -> { + TectonicPlate m = loadedRegions.get(id); + if (m != null) { + try { + m.write(fileForRegion(dataFolder, id)); + loadedRegions.remove(id); + lastUse.remove(id); + toUnload.remove(id); + i.incrementAndGet(); + Iris.debug("Unloaded Tectonic Plate " + C.DARK_GREEN + Cache.keyX(id) + " " + Cache.keyZ(id)); + IrisEngineSVC.instance.unloadActiveAlive.reset(); + } catch (IOException e) { + Iris.reportError(e); + } } - } - })); + })); - } - burst.complete(); - } catch (Throwable e) { - e.printStackTrace(); - if (burst != null) + } burst.complete(); - } finally { - unloadLock.unlock(); - ioTectonicUnload.set(true); + } catch (Throwable e) { + e.printStackTrace(); + if (burst != null) + burst.complete(); + } finally { + unloadLock.unlock(); + ioTectonicUnload.set(true); + } + return i.get(); } return i.get(); } From 8af212fca84c749bdc5fbced1000aca858aa4fd2 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Sun, 17 Mar 2024 17:55:08 +0100 Subject: [PATCH 05/10] - Fixed entities spawning inside blocks or at least it should. --- .../iris/core/commands/CommandDeveloper.java | 18 ++++++--- .../com/volmit/iris/core/nms/INMSBinding.java | 9 +++-- .../iris/core/nms/v1X/NMSBinding1X.java | 10 +++++ .../iris/engine/object/IrisEntitySpawn.java | 39 ++++++++++++++++++- .../iris/core/nms/v1_19_R1/NMSBinding.java | 27 +++++++++++++ .../iris/core/nms/v1_19_R2/NMSBinding.java | 28 +++++++++++++ .../iris/core/nms/v1_19_R3/NMSBinding.java | 28 +++++++++++++ .../iris/core/nms/v1_20_R1/NMSBinding.java | 28 +++++++++++++ .../iris/core/nms/v1_20_R2/NMSBinding.java | 27 +++++++++++++ .../iris/core/nms/v1_20_R3/NMSBinding.java | 34 ++++++++++++++++ 10 files changed, 237 insertions(+), 11 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 06c2f15b0..8363cd146 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 @@ -20,9 +20,12 @@ package com.volmit.iris.core.commands; import com.volmit.iris.Iris; 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.service.IrisEngineSVC; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.framework.Engine; +import com.volmit.iris.engine.object.IrisEntity; import com.volmit.iris.util.decree.DecreeExecutor; import com.volmit.iris.util.decree.DecreeOrigin; import com.volmit.iris.util.decree.annotations.Decree; @@ -31,7 +34,9 @@ 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.mantle.TectonicPlate; +import com.volmit.iris.util.math.Vector3d; import com.volmit.iris.util.plugin.VolmitSender; +import io.lumine.mythic.bukkit.adapters.BukkitEntity; import net.jpountz.lz4.LZ4BlockInputStream; import net.jpountz.lz4.LZ4BlockOutputStream; import net.jpountz.lz4.LZ4FrameInputStream; @@ -40,6 +45,8 @@ import org.apache.commons.lang.RandomStringUtils; import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.World; +import org.bukkit.entity.Creeper; +import org.bukkit.entity.EntityType; import java.io.*; import java.net.InetAddress; @@ -126,6 +133,12 @@ public class CommandDeveloper implements DecreeExecutor { } + @Decree(description = "test") + public void test() throws NoSuchFieldException, IllegalAccessException { + Iris.info("CMD Executed"); + Vector3d box2 = INMS.get().getBoundingbox(EntityType.CREEPER); + } + @Decree(description = "UnloadChunks for good reasons.") public void unloadchunks() { List IrisWorlds = new ArrayList<>(); @@ -168,11 +181,6 @@ public class CommandDeveloper implements DecreeExecutor { } } - @Decree(description = "Test", origin = DecreeOrigin.BOTH) - public void test() { - Iris.info("Test Developer CMD Executed"); - } - @Decree(description = "Test the compression algorithms") public void compression( @Param(description = "base IrisWorld") World world, diff --git a/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java b/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java index 270a04504..5989a50d8 100644 --- a/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java +++ b/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java @@ -19,16 +19,15 @@ package com.volmit.iris.core.nms; import com.volmit.iris.engine.framework.Engine; +import com.volmit.iris.engine.object.IrisEntity; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.mantle.Mantle; +import com.volmit.iris.util.math.Vector3d; import com.volmit.iris.util.nbt.mca.palette.MCABiomeContainer; import com.volmit.iris.util.nbt.mca.palette.MCAPaletteAccess; import com.volmit.iris.util.nbt.tag.CompoundTag; -import org.bukkit.Chunk; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.WorldCreator; +import org.bukkit.*; import org.bukkit.block.Biome; import org.bukkit.entity.Dolphin; import org.bukkit.entity.Entity; @@ -103,4 +102,6 @@ public interface INMSBinding { void setTreasurePos(Dolphin dolphin, com.volmit.iris.core.nms.container.BlockPos pos); void inject(long seed, Engine engine, World world) throws NoSuchFieldException, IllegalAccessException; + + Vector3d getBoundingbox(org.bukkit.entity.EntityType entity); } diff --git a/core/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java b/core/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java index 04c95b4ed..754915c2c 100644 --- a/core/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java +++ b/core/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java @@ -25,6 +25,7 @@ import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.mantle.Mantle; +import com.volmit.iris.util.math.Vector3d; import com.volmit.iris.util.nbt.mca.palette.MCABiomeContainer; import com.volmit.iris.util.nbt.mca.palette.MCAPaletteAccess; import com.volmit.iris.util.nbt.tag.CompoundTag; @@ -85,6 +86,10 @@ public class NMSBinding1X implements INMSBinding { } + public Vector3d getBoundingbox() { + return null; + } + @Override public void deserializeTile(CompoundTag s, Location newPosition) { @@ -203,6 +208,11 @@ public class NMSBinding1X implements INMSBinding { } + @Override + public Vector3d getBoundingbox(org.bukkit.entity.EntityType entity) { + return null; + } + @Override public MCAPaletteAccess createPalette() { Iris.error("Cannot use the global data palette! Iris is incapable of using MCA generation on this version of minecraft!"); diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisEntitySpawn.java b/core/src/main/java/com/volmit/iris/engine/object/IrisEntitySpawn.java index 9b2aa6fb0..a507c342f 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisEntitySpawn.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisEntitySpawn.java @@ -19,21 +19,28 @@ package com.volmit.iris.engine.object; import com.volmit.iris.Iris; +import com.volmit.iris.core.nms.INMS; 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.format.C; import com.volmit.iris.util.math.RNG; +import com.volmit.iris.util.math.Vector3d; import com.volmit.iris.util.matter.MatterMarker; import com.volmit.iris.util.matter.slices.MarkerMatter; +import io.lumine.mythic.bukkit.adapters.BukkitEntity; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import org.bukkit.Chunk; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.World; import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.util.BoundingBox; @Snippet("entity-spawn") @Accessors(chain = true) @@ -165,12 +172,19 @@ public class IrisEntitySpawn implements IRare { return null; } - Entity e = irisEntity.spawn(g, at.add(0.5, 0, 0.5), rng.aquire(() -> new RNG(g.getSeedManager().getEntity()))); + Vector3d boundingBox = INMS.get().getBoundingbox(irisEntity.getType()); + if (!ignoreSurfaces && boundingBox != null) { + boolean isClearForSpawn = isAreaClearForSpawn(at, boundingBox); + if (!isClearForSpawn) { + return null; + } + } + + Entity e = irisEntity.spawn(g, at.add(0.5, 0.5, 0.5), rng.aquire(() -> new RNG(g.getSeedManager().getEntity()))); if (e != null) { Iris.debug("Spawned " + C.DARK_AQUA + "Entity<" + getEntity() + "> " + C.GREEN + e.getType() + C.LIGHT_PURPLE + " @ " + C.GRAY + e.getLocation().getX() + ", " + e.getLocation().getY() + ", " + e.getLocation().getZ()); } - return e; } catch (Throwable e) { Iris.reportError(e); @@ -179,4 +193,25 @@ public class IrisEntitySpawn implements IRare { return null; } } + + private boolean isAreaClearForSpawn(Location center, Vector3d boundingBox) { + World world = center.getWorld(); + int startX = center.getBlockX() - (int) (boundingBox.x / 2); + int endX = center.getBlockX() + (int) (boundingBox.x / 2); + int startY = center.getBlockY(); + int endY = center.getBlockY() + (int) boundingBox.y; + int startZ = center.getBlockZ() - (int) (boundingBox.z / 2); + int endZ = center.getBlockZ() + (int) (boundingBox.z / 2); + + for (int x = startX; x <= endX; x++) { + for (int y = startY; y <= endY; y++) { + for (int z = startZ; z <= endZ; z++) { + if (world.getBlockAt(x, y, z).getType() != Material.AIR) { + return false; + } + } + } + } + return true; + } } diff --git a/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/NMSBinding.java b/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/NMSBinding.java index eec445bee..ff0433491 100644 --- a/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/NMSBinding.java +++ b/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/NMSBinding.java @@ -10,6 +10,7 @@ import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.hunk.Hunk; import com.volmit.iris.util.json.JSONObject; import com.volmit.iris.util.mantle.Mantle; +import com.volmit.iris.util.math.Vector3d; import com.volmit.iris.util.matter.MatterBiomeInject; import com.volmit.iris.util.nbt.io.NBTUtil; import com.volmit.iris.util.nbt.mca.NBTWorld; @@ -24,6 +25,7 @@ import net.minecraft.nbt.NbtIo; import net.minecraft.nbt.TagParser; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; @@ -54,8 +56,10 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.util.Iterator; import java.util.List; +import java.util.Vector; import java.util.concurrent.atomic.AtomicInteger; public class NMSBinding implements INMSBinding { @@ -483,6 +487,29 @@ public class NMSBinding implements INMSBinding { biomeSource.set(serverLevel.getChunkSource().chunkMap.generator, customBiomeSource); } + public Vector3d getBoundingbox(org.bukkit.entity.EntityType entity) { + Field[] fields = EntityType.class.getDeclaredFields(); + for (Field field : fields) { + if (Modifier.isStatic(field.getModifiers()) && field.getType().equals(EntityType.class)) { + try { + EntityType entityType = (EntityType) field.get(null); + if (entityType.getDescriptionId().equals("entity.minecraft." + entity.name().toLowerCase())) { + Vector v1 = new Vector<>(); + v1.add(entityType.getHeight()); + entityType.getDimensions(); + Vector3d box = new Vector3d( entityType.getWidth(), entityType.getHeight(), entityType.getWidth()); + //System.out.println("Entity Type: " + entityType.getDescriptionId() + ", " + "Height: " + height + ", Width: " + width); + return box; + } + } catch (IllegalAccessException e) { + Iris.error("Unable to get entity dimensions!"); + e.printStackTrace(); + } + } + } + return null; + } + private static Field getField(Class clazz, Class fieldType) throws NoSuchFieldException { try { for (Field f : clazz.getDeclaredFields()) { diff --git a/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/NMSBinding.java b/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/NMSBinding.java index bcdda2dea..7609c6195 100644 --- a/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/NMSBinding.java +++ b/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/NMSBinding.java @@ -10,6 +10,7 @@ import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.hunk.Hunk; import com.volmit.iris.util.json.JSONObject; import com.volmit.iris.util.mantle.Mantle; +import com.volmit.iris.util.math.Vector3d; import com.volmit.iris.util.matter.MatterBiomeInject; import com.volmit.iris.util.nbt.io.NBTUtil; import com.volmit.iris.util.nbt.mca.NBTWorld; @@ -25,6 +26,7 @@ import net.minecraft.nbt.NbtIo; import net.minecraft.nbt.TagParser; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; @@ -54,8 +56,10 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.util.Iterator; import java.util.List; +import java.util.Vector; import java.util.concurrent.atomic.AtomicInteger; public class NMSBinding implements INMSBinding { @@ -483,6 +487,30 @@ public class NMSBinding implements INMSBinding { biomeSource.set(serverLevel.getChunkSource().chunkMap.generator, customBiomeSource); } + + public Vector3d getBoundingbox(org.bukkit.entity.EntityType entity) { + Field[] fields = EntityType.class.getDeclaredFields(); + for (Field field : fields) { + if (Modifier.isStatic(field.getModifiers()) && field.getType().equals(EntityType.class)) { + try { + EntityType entityType = (EntityType) field.get(null); + if (entityType.getDescriptionId().equals("entity.minecraft." + entity.name().toLowerCase())) { + Vector v1 = new Vector<>(); + v1.add(entityType.getHeight()); + entityType.getDimensions(); + Vector3d box = new Vector3d( entityType.getWidth(), entityType.getHeight(), entityType.getWidth()); + //System.out.println("Entity Type: " + entityType.getDescriptionId() + ", " + "Height: " + height + ", Width: " + width); + return box; + } + } catch (IllegalAccessException e) { + Iris.error("Unable to get entity dimensions!"); + e.printStackTrace(); + } + } + } + return null; + } + private static Field getField(Class clazz, Class fieldType) throws NoSuchFieldException { try { for (Field f : clazz.getDeclaredFields()) { diff --git a/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java b/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java index f11974faf..2244ed16c 100644 --- a/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java +++ b/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java @@ -10,6 +10,7 @@ import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.hunk.Hunk; import com.volmit.iris.util.json.JSONObject; import com.volmit.iris.util.mantle.Mantle; +import com.volmit.iris.util.math.Vector3d; import com.volmit.iris.util.matter.MatterBiomeInject; import com.volmit.iris.util.nbt.io.NBTUtil; import com.volmit.iris.util.nbt.mca.NBTWorld; @@ -25,6 +26,7 @@ import net.minecraft.nbt.NbtIo; import net.minecraft.nbt.TagParser; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; @@ -56,8 +58,10 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.util.Iterator; import java.util.List; +import java.util.Vector; import java.util.concurrent.atomic.AtomicInteger; public class NMSBinding implements INMSBinding { @@ -486,6 +490,30 @@ public class NMSBinding implements INMSBinding { biomeSource.set(serverLevel.getChunkSource().chunkMap.generator, customBiomeSource); } + + public Vector3d getBoundingbox(org.bukkit.entity.EntityType entity) { + Field[] fields = EntityType.class.getDeclaredFields(); + for (Field field : fields) { + if (Modifier.isStatic(field.getModifiers()) && field.getType().equals(EntityType.class)) { + try { + EntityType entityType = (EntityType) field.get(null); + if (entityType.getDescriptionId().equals("entity.minecraft." + entity.name().toLowerCase())) { + Vector v1 = new Vector<>(); + v1.add(entityType.getHeight()); + entityType.getDimensions(); + Vector3d box = new Vector3d( entityType.getWidth(), entityType.getHeight(), entityType.getWidth()); + //System.out.println("Entity Type: " + entityType.getDescriptionId() + ", " + "Height: " + height + ", Width: " + width); + return box; + } + } catch (IllegalAccessException e) { + Iris.error("Unable to get entity dimensions!"); + e.printStackTrace(); + } + } + } + return null; + } + private static Field getField(Class clazz, Class fieldType) throws NoSuchFieldException { try { for (Field f : clazz.getDeclaredFields()) { diff --git a/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java b/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java index 02169ff3f..4852ee5fa 100644 --- a/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java +++ b/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java @@ -10,6 +10,7 @@ import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.hunk.Hunk; import com.volmit.iris.util.json.JSONObject; import com.volmit.iris.util.mantle.Mantle; +import com.volmit.iris.util.math.Vector3d; import com.volmit.iris.util.matter.MatterBiomeInject; import com.volmit.iris.util.nbt.io.NBTUtil; import com.volmit.iris.util.nbt.mca.NBTWorld; @@ -25,6 +26,7 @@ import net.minecraft.nbt.NbtIo; import net.minecraft.nbt.TagParser; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.EntityDimensions; import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; @@ -45,6 +47,7 @@ import org.bukkit.craftbukkit.v1_20_R1.entity.CraftDolphin; import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack; import org.bukkit.entity.Dolphin; import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; import org.bukkit.generator.ChunkGenerator; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; @@ -56,8 +59,10 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.util.Iterator; import java.util.List; +import java.util.Vector; import java.util.concurrent.atomic.AtomicInteger; public class NMSBinding implements INMSBinding { @@ -474,6 +479,29 @@ public class NMSBinding implements INMSBinding { cd.getHandle().setGotFish(true); } + public Vector3d getBoundingbox(org.bukkit.entity.EntityType entity) { + Field[] fields = net.minecraft.world.entity.EntityType.class.getDeclaredFields(); + for (Field field : fields) { + if (Modifier.isStatic(field.getModifiers()) && field.getType().equals(net.minecraft.world.entity.EntityType.class)) { + try { + net.minecraft.world.entity.EntityType entityType = (net.minecraft.world.entity.EntityType) field.get(null); + if (entityType.getDescriptionId().equals("entity.minecraft." + entity.name().toLowerCase())) { + Vector v1 = new Vector<>(); + v1.add(entityType.getHeight()); + entityType.getDimensions(); + Vector3d box = new Vector3d( entityType.getWidth(), entityType.getHeight(), entityType.getWidth()); + //System.out.println("Entity Type: " + entityType.getDescriptionId() + ", " + "Height: " + height + ", Width: " + width); + return box; + } + } catch (IllegalAccessException e) { + Iris.error("Unable to get entity dimensions!"); + e.printStackTrace(); + } + } + } + return null; + } + public void inject(long seed, Engine engine, World world) throws NoSuchFieldException, IllegalAccessException { ServerLevel serverLevel = ((CraftWorld)world).getHandle(); Class clazz = serverLevel.getChunkSource().chunkMap.generator.getClass(); diff --git a/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java b/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java index 1f02cf3ab..e39897d6b 100644 --- a/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java +++ b/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java @@ -10,6 +10,7 @@ import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.hunk.Hunk; import com.volmit.iris.util.json.JSONObject; import com.volmit.iris.util.mantle.Mantle; +import com.volmit.iris.util.math.Vector3d; import com.volmit.iris.util.matter.MatterBiomeInject; import com.volmit.iris.util.nbt.io.NBTUtil; import com.volmit.iris.util.nbt.mca.NBTWorld; @@ -26,6 +27,7 @@ import net.minecraft.nbt.TagParser; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; @@ -57,8 +59,10 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.util.Iterator; import java.util.List; +import java.util.Vector; import java.util.concurrent.atomic.AtomicInteger; public class NMSBinding implements INMSBinding { @@ -486,6 +490,29 @@ public class NMSBinding implements INMSBinding { biomeSource.set(serverLevel.getChunkSource().chunkMap.generator, customBiomeSource); } + public Vector3d getBoundingbox(org.bukkit.entity.EntityType entity) { + Field[] fields = EntityType.class.getDeclaredFields(); + for (Field field : fields) { + if (Modifier.isStatic(field.getModifiers()) && field.getType().equals(EntityType.class)) { + try { + EntityType entityType = (EntityType) field.get(null); + if (entityType.getDescriptionId().equals("entity.minecraft." + entity.name().toLowerCase())) { + Vector v1 = new Vector<>(); + v1.add(entityType.getHeight()); + entityType.getDimensions(); + Vector3d box = new Vector3d( entityType.getWidth(), entityType.getHeight(), entityType.getWidth()); + //System.out.println("Entity Type: " + entityType.getDescriptionId() + ", " + "Height: " + height + ", Width: " + width); + return box; + } + } catch (IllegalAccessException e) { + Iris.error("Unable to get entity dimensions!"); + e.printStackTrace(); + } + } + } + return null; + } + private static Field getField(Class clazz, Class fieldType) throws NoSuchFieldException { try { for (Field f : clazz.getDeclaredFields()) { diff --git a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java index 167400d19..0cf438604 100644 --- a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java +++ b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java @@ -5,16 +5,21 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.nms.INMSBinding; import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.framework.Engine; +import com.volmit.iris.engine.object.IrisEntity; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; +import com.volmit.iris.util.format.Form; import com.volmit.iris.util.hunk.Hunk; import com.volmit.iris.util.json.JSONObject; import com.volmit.iris.util.mantle.Mantle; +import com.volmit.iris.util.math.Vector3d; import com.volmit.iris.util.matter.MatterBiomeInject; import com.volmit.iris.util.nbt.io.NBTUtil; import com.volmit.iris.util.nbt.mca.NBTWorld; import com.volmit.iris.util.nbt.mca.palette.*; import com.volmit.iris.util.nbt.tag.CompoundTag; +import com.volmit.iris.util.scheduling.PrecisionStopwatch; +import io.lumine.mythic.bukkit.adapters.BukkitEntity; import it.unimi.dsi.fastutil.objects.Object2IntMap; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; @@ -26,6 +31,8 @@ import net.minecraft.nbt.TagParser; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.EntityTypeTags; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; @@ -44,6 +51,7 @@ import org.bukkit.craftbukkit.v1_20_R3.block.data.CraftBlockData; import org.bukkit.craftbukkit.v1_20_R3.entity.CraftDolphin; import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_20_R3.util.CraftNamespacedKey; +import org.bukkit.entity.Creeper; import org.bukkit.entity.Dolphin; import org.bukkit.entity.Entity; import org.bukkit.generator.ChunkGenerator; @@ -57,8 +65,11 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.util.Iterator; import java.util.List; +import java.util.Optional; +import java.util.Vector; import java.util.concurrent.atomic.AtomicInteger; public class NMSBinding implements INMSBinding { @@ -486,6 +497,29 @@ public class NMSBinding implements INMSBinding { biomeSource.set(serverLevel.getChunkSource().chunkMap.generator, customBiomeSource); } + public Vector3d getBoundingbox(org.bukkit.entity.EntityType entity) { + Field[] fields = EntityType.class.getDeclaredFields(); + for (Field field : fields) { + if (Modifier.isStatic(field.getModifiers()) && field.getType().equals(EntityType.class)) { + try { + EntityType entityType = (EntityType) field.get(null); + if (entityType.getDescriptionId().equals("entity.minecraft." + entity.name().toLowerCase())) { + Vector v1 = new Vector<>(); + v1.add(entityType.getHeight()); + entityType.getDimensions(); + Vector3d box = new Vector3d( entityType.getWidth(), entityType.getHeight(), entityType.getWidth()); + //System.out.println("Entity Type: " + entityType.getDescriptionId() + ", " + "Height: " + height + ", Width: " + width); + return box; + } + } catch (IllegalAccessException e) { + Iris.error("Unable to get entity dimensions!"); + e.printStackTrace(); + } + } + } + return null; + } + private static Field getField(Class clazz, Class fieldType) throws NoSuchFieldException { try { for (Field f : clazz.getDeclaredFields()) { From 7b1e666b3b492d81f29103b4b80e652f6d02b935 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Mon, 18 Mar 2024 11:22:35 +0100 Subject: [PATCH 06/10] - No studio tectonic clearing. --- .../main/java/com/volmit/iris/core/service/IrisEngineSVC.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 767e9c166..a998e9bd4 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 @@ -281,7 +281,7 @@ public class IrisEngineSVC implements IrisService { if (generator != null) { Engine engine = generator.getEngine(); - if (engine != null) { + if (engine != null && !engine.isStudio()) { lastUseLock.lock(); lastUse.put(world, System.currentTimeMillis()); lastUseLock.unlock(); @@ -290,7 +290,7 @@ public class IrisEngineSVC implements IrisService { } } } catch (Throwable e) { - Iris.info(C.RED + "EngineSVC: Failed to create supplier. Please contact support!"); + Iris.info(C.RED + "EngineSVC: Failed to create supplier."); e.printStackTrace(); Iris.reportError(e); } From 50686795d02580e493cf50b10c73382e4c7fb8e7 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Wed, 20 Mar 2024 11:32:44 +0100 Subject: [PATCH 07/10] - Added /iris what region - Sort of Fixed EngineStatus - Added /iris hasAccess - Added /iris irisworlds/worlds - Added Some dev commands - Redid / improved the mantle tectonic unload - Convert still not working so ignore that - Cleaned Iris of IrisPackBenchmarking.java im redoing it on second thought. - Adjusted build.gradle - Renamed some tectonic stuff - Fixed Eta - Fixed entities spawning inside blocks or at least it should. - Lib update fixes all the iris titles/actionbars - Cave spawning adjustments, now they get engine height if caveStartHeight is too large. - Perhaps more? --- .../volmit/iris/core/commands/CommandDeveloper.java | 12 +++++++++++- .../volmit/iris/engine/object/IrisCavePlacer.java | 10 +++++++++- 2 files changed, 20 insertions(+), 2 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 8363cd146..3509c262e 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 @@ -25,6 +25,9 @@ import com.volmit.iris.core.nms.v1X.NMSBinding1X; import com.volmit.iris.core.service.IrisEngineSVC; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.framework.Engine; +import com.volmit.iris.engine.mantle.components.MantleObjectComponent; +import com.volmit.iris.engine.object.IrisBiome; +import com.volmit.iris.engine.object.IrisCave; import com.volmit.iris.engine.object.IrisEntity; import com.volmit.iris.util.decree.DecreeExecutor; import com.volmit.iris.util.decree.DecreeOrigin; @@ -44,6 +47,7 @@ import net.jpountz.lz4.LZ4FrameOutputStream; import org.apache.commons.lang.RandomStringUtils; import org.bukkit.Bukkit; import org.bukkit.Chunk; +import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Creeper; import org.bukkit.entity.EntityType; @@ -136,7 +140,13 @@ public class CommandDeveloper implements DecreeExecutor { @Decree(description = "test") public void test() throws NoSuchFieldException, IllegalAccessException { Iris.info("CMD Executed"); - Vector3d box2 = INMS.get().getBoundingbox(EntityType.CREEPER); + Engine engine = IrisToolbelt.access(player().getWorld()).getEngine(); + Location at = player().getLocation(); + IrisBiome caveBiome = engine.getMantle().getComplex().getCaveBiomeStream().get(at.getBlockX(), at.getBlockZ()); + if (!caveBiome.getName().contains("Subterranean Land")) { + sender().sendMessage("Cool cave?: " + caveBiome.getName()); + } + } @Decree(description = "UnloadChunks for good reasons.") diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisCavePlacer.java b/core/src/main/java/com/volmit/iris/engine/object/IrisCavePlacer.java index 17dd4623d..911323e4a 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisCavePlacer.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisCavePlacer.java @@ -52,6 +52,8 @@ public class IrisCavePlacer implements IRare { private String cave; @Desc("If set to true, this cave is allowed to break the surface") private boolean breakSurface = true; + @Desc("If set to true, this cave is allowed to get placed above the terrain level") + private boolean ignoreHeightLimit = false; @Desc("The height range this cave can spawn at. If breakSurface is false, the output of this range will be clamped by the current world height to prevent surface breaking.") private IrisStyledRange caveStartHeight = new IrisStyledRange(13, 120, new IrisGeneratorStyle(NoiseStyle.STATIC)); @@ -82,13 +84,19 @@ public class IrisCavePlacer implements IRare { } if (y == -1) { + if(!ignoreHeightLimit) { + int eH = engine.getHeight(x, z); + if (caveStartHeight.getMax() > eH) { + caveStartHeight.setMax(eH); + } + } int h = (int) caveStartHeight.get(rng, x, z, data); int ma = breakSurface ? h : (int) (engine.getComplex().getHeightStream().get(x, z) - 9); y = Math.min(h, ma); } try { - cave.generate(mantle, rng, engine, x + rng.nextInt(15), y, z + rng.nextInt(15), waterHint); + cave.generate(mantle, rng, engine, x + rng.nextInt(15), y, z + rng.nextInt(15), waterHint); } catch (Throwable e) { e.printStackTrace(); fail.set(true); From eb94d97ea41930fe5733b8b4abbf87a4851782d2 Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Sun, 31 Mar 2024 17:53:10 +0200 Subject: [PATCH 08/10] - Fixed caves breaksurface - changes --- core/src/main/java/com/volmit/iris/Iris.java | 9 +- .../com/volmit/iris/core/IrisSettings.java | 1 + .../iris/core/commands/CommandDeepSearch.java | 2 +- .../iris/core/commands/CommandDeveloper.java | 21 +- .../iris/core/commands/CommandIris.java | 2 - .../iris/core/commands/CommandPregen.java | 1 + .../volmit/iris/core/gui/PregeneratorJob.java | 5 +- .../pregenerator/DeepSearchPregenerator.java | 70 +++---- .../core/pregenerator/IrisPregenerator.java | 29 +-- .../iris/core/pregenerator/PregenTask.java | 2 + .../iris/core/safeguard/ServerBootSFG.java | 33 +--- .../iris/core/service/IrisEngineSVC.java | 108 +++++------ .../iris/core/service/WorldLoadSFG.java | 31 --- .../iris/core/tools/IrisPackBenchmarking.java | 179 ++++++++++++++++-- .../iris/engine/mantle/EngineMantle.java | 1 + .../engine/object/IrisBiomeGeneratorLink.java | 12 ++ .../iris/engine/object/IrisCavePlacer.java | 8 +- 17 files changed, 320 insertions(+), 194 deletions(-) delete mode 100644 core/src/main/java/com/volmit/iris/core/service/WorldLoadSFG.java diff --git a/core/src/main/java/com/volmit/iris/Iris.java b/core/src/main/java/com/volmit/iris/Iris.java index a39306991..70031c5ee 100644 --- a/core/src/main/java/com/volmit/iris/Iris.java +++ b/core/src/main/java/com/volmit/iris/Iris.java @@ -364,6 +364,13 @@ public class Iris extends VolmitPlugin implements Listener { return Integer.parseInt(version); } + public static String getJava() { + String javaRuntimeName = System.getProperty("java.vm.name"); + String javaRuntimeVendor = System.getProperty("java.vendor"); + String javaRuntimeVersion = System.getProperty("java.vm.version"); + return String.format("%s %s (build %s)", javaRuntimeName, javaRuntimeVendor, javaRuntimeVersion); + } + public static void reportErrorChunk(int x, int z, Throwable e, String extra) { if (IrisSettings.get().getGeneral().isDebug()) { File f = instance.getDataFile("debug", "chunk-errors", "chunk." + x + "." + z + ".txt"); @@ -804,6 +811,7 @@ public class Iris extends VolmitPlugin implements Listener { if (!passedserversoftware) { Iris.info("Server type & version: " + C.RED + Bukkit.getVersion()); } else { Iris.info("Server type & version: " + Bukkit.getVersion()); } + Iris.info("Java: " + getJava()); if (!instance.getServer().getVersion().contains("Purpur")) { if (instance.getServer().getVersion().contains("Spigot") && instance.getServer().getVersion().contains("Bukkit")) { Iris.info(C.RED + " Iris requires paper or above to function properly.."); @@ -842,7 +850,6 @@ public class Iris extends VolmitPlugin implements Listener { Iris.warn("6GB+ Ram is recommended"); } Iris.info("Bukkit version: " + Bukkit.getBukkitVersion()); - Iris.info("Java version: " + getJavaVersion()); Iris.info("Custom Biomes: " + INMS.get().countCustomBiomes()); setupChecks(); printPacks(); 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 335207de5..4abe1ba79 100644 --- a/core/src/main/java/com/volmit/iris/core/IrisSettings.java +++ b/core/src/main/java/com/volmit/iris/core/IrisSettings.java @@ -177,6 +177,7 @@ public class IrisSettings { public static class IrisSettingsGenerator { public String defaultWorldType = "overworld"; public int maxBiomeChildDepth = 4; + // public boolean forceConvertTo320Height = false; public boolean preventLeafDecay = true; } diff --git a/core/src/main/java/com/volmit/iris/core/commands/CommandDeepSearch.java b/core/src/main/java/com/volmit/iris/core/commands/CommandDeepSearch.java index 96c91305f..d8cd6a260 100644 --- a/core/src/main/java/com/volmit/iris/core/commands/CommandDeepSearch.java +++ b/core/src/main/java/com/volmit/iris/core/commands/CommandDeepSearch.java @@ -74,7 +74,7 @@ public class CommandDeepSearch implements DecreeExecutor { } DeepSearchPregenerator.DeepSearchJob DeepSearchJob = DeepSearchPregenerator.DeepSearchJob.builder() - .world(worldName) + .world(world) .radiusBlocks(radius) .position(0) .build(); 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 3509c262e..759596ea5 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 @@ -23,12 +23,15 @@ 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.service.IrisEngineSVC; +import com.volmit.iris.core.tools.IrisPackBenchmarking; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.mantle.components.MantleObjectComponent; import com.volmit.iris.engine.object.IrisBiome; import com.volmit.iris.engine.object.IrisCave; +import com.volmit.iris.engine.object.IrisDimension; import com.volmit.iris.engine.object.IrisEntity; +import com.volmit.iris.util.data.Dimension; import com.volmit.iris.util.decree.DecreeExecutor; import com.volmit.iris.util.decree.DecreeOrigin; import com.volmit.iris.util.decree.annotations.Decree; @@ -137,15 +140,19 @@ public class CommandDeveloper implements DecreeExecutor { } + @Decree(description = "Test") + public void packBenchmark( + @Param(description = "The pack to bench", aliases = {"pack"}) + IrisDimension dimension + ) { + Iris.info("test"); + IrisPackBenchmarking benchmark = new IrisPackBenchmarking(dimension, 1); + + } + @Decree(description = "test") public void test() throws NoSuchFieldException, IllegalAccessException { - Iris.info("CMD Executed"); - Engine engine = IrisToolbelt.access(player().getWorld()).getEngine(); - Location at = player().getLocation(); - IrisBiome caveBiome = engine.getMantle().getComplex().getCaveBiomeStream().get(at.getBlockX(), at.getBlockZ()); - if (!caveBiome.getName().contains("Subterranean Land")) { - sender().sendMessage("Cool cave?: " + caveBiome.getName()); - } + IrisEngineSVC.instance.engineStatus(); } 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 471189d9e..fc8a2d90b 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 @@ -76,8 +76,6 @@ public class CommandIris implements DecreeExecutor { private CommandEdit edit; private CommandFind find; private CommandDeveloper developer; - - public static @Getter String BenchDimension; public static boolean worldCreation = false; String WorldToLoad; String WorldEngine; 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 73f93091d..e3ed1c844 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 @@ -56,6 +56,7 @@ public class CommandPregen implements DecreeExecutor { IrisToolbelt.pregenerate(PregenTask .builder() .center(new Position2(center.getBlockX() >> 9, center.getBlockZ() >> 9)) + .gui(true) .width(w) .height(w) .build(), world); diff --git a/core/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java b/core/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java index 25f3ee710..6d3534971 100644 --- a/core/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java +++ b/core/src/main/java/com/volmit/iris/core/gui/PregeneratorJob.java @@ -24,6 +24,7 @@ import com.volmit.iris.core.pregenerator.IrisPregenerator; import com.volmit.iris.core.pregenerator.PregenListener; import com.volmit.iris.core.pregenerator.PregenTask; import com.volmit.iris.core.pregenerator.PregeneratorMethod; +import com.volmit.iris.core.tools.IrisPackBenchmarking; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.format.Form; @@ -44,6 +45,8 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Consumer; +import static com.volmit.iris.core.tools.IrisPackBenchmarking.benchmarkInProgress; + public class PregeneratorJob implements PregenListener { private static final Color COLOR_EXISTS = parseColor("#4d7d5b"); private static final Color COLOR_BLACK = parseColor("#4d7d5b"); @@ -86,7 +89,7 @@ public class PregeneratorJob implements PregenListener { max.setZ(Math.max((zz << 5) + 31, max.getZ())); }); - if (IrisSettings.get().getGui().isUseServerLaunchedGuis()) { + if (IrisSettings.get().getGui().isUseServerLaunchedGuis() && task.isGui()) { open(); } diff --git a/core/src/main/java/com/volmit/iris/core/pregenerator/DeepSearchPregenerator.java b/core/src/main/java/com/volmit/iris/core/pregenerator/DeepSearchPregenerator.java index c0a20534c..c60724d2a 100644 --- a/core/src/main/java/com/volmit/iris/core/pregenerator/DeepSearchPregenerator.java +++ b/core/src/main/java/com/volmit/iris/core/pregenerator/DeepSearchPregenerator.java @@ -5,18 +5,16 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.object.IrisBiome; +import com.volmit.iris.util.collection.KList; 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.mantle.MantleFlag; import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.RollingSequence; import com.volmit.iris.util.math.Spiraler; import com.volmit.iris.util.scheduling.ChronoLatch; import com.volmit.iris.util.scheduling.J; -import com.volmit.iris.util.scheduling.PrecisionStopwatch; -import io.papermc.lib.PaperLib; import lombok.Builder; import lombok.Data; import lombok.Getter; @@ -33,7 +31,6 @@ import java.io.IOException; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; -import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; @@ -56,10 +53,12 @@ public class DeepSearchPregenerator extends Thread implements Listener { private final RollingSequence chunksPerMinute; private final AtomicInteger chunkCachePos; private final AtomicInteger chunkCacheSize; + private int pos; private final AtomicInteger foundCacheLast; private final AtomicInteger foundCache; private LinkedHashMap chunkCache; - private final ReentrantLock cacheLock = new ReentrantLock(); + private KList chunkQueue; + private final ReentrantLock cacheLock; private static final Map jobs = new HashMap<>(); @@ -69,11 +68,13 @@ public class DeepSearchPregenerator extends Thread implements Listener { this.chunkCachePos = new AtomicInteger(1000); this.foundCacheLast = new AtomicInteger(); this.foundCache = new AtomicInteger(); + this.cacheLock = new ReentrantLock(); this.destination = destination; - this.chunkCache = new LinkedHashMap(); + this.chunkCache = new LinkedHashMap<>(); this.maxPosition = new Spiraler(job.getRadiusBlocks() * 2, job.getRadiusBlocks() * 2, (x, z) -> { }).count(); - this.world = Bukkit.getWorld(job.getWorld()); + this.world = Bukkit.getWorld(job.getWorld().getUID()); + this.chunkQueue = new KList<>(); this.latch = new ChronoLatch(3000); this.startTime = new AtomicLong(M.ms()); this.chunksPerSecond = new RollingSequence(10); @@ -81,7 +82,9 @@ public class DeepSearchPregenerator extends Thread implements Listener { foundChunks = new AtomicInteger(0); this.foundLast = new AtomicInteger(0); this.foundTotalChunks = new AtomicInteger((int) Math.ceil(Math.pow((2.0 * job.getRadiusBlocks()) / 16, 2))); - jobs.put(job.getWorld(), job); + + this.pos = 0; + jobs.put(job.getWorld().getName(), job); DeepSearchPregenerator.instance = this; } @@ -108,29 +111,22 @@ public class DeepSearchPregenerator extends Thread implements Listener { // chunkCache(); //todo finish this if (latch.flip() && !job.paused) { if (cacheLock.isLocked()) { - Iris.info("DeepFinder: Caching: " + chunkCachePos.get() + " Of " + chunkCacheSize.get()); + } else { + long eta = computeETA(); + save(); + int secondGenerated = foundChunks.get() - foundLast.get(); + foundLast.set(foundChunks.get()); + secondGenerated = secondGenerated / 3; + chunksPerSecond.put(secondGenerated); + chunksPerMinute.put(secondGenerated * 60); + Iris.info("DeepFinder: " + C.IRIS + world.getName() + C.RESET + " Searching: " + Form.f(foundChunks.get()) + " of " + Form.f(foundTotalChunks.get()) + " " + Form.f((int) chunksPerSecond.getAverage()) + "/s ETA: " + Form.duration((double) eta, 2)); } - long eta = computeETA(); - save(); - int secondGenerated = foundChunks.get() - foundLast.get(); - foundLast.set(foundChunks.get()); - secondGenerated = secondGenerated / 3; - chunksPerSecond.put(secondGenerated); - chunksPerMinute.put(secondGenerated * 60); - Iris.info("deepFinder: " + C.IRIS + world.getName() + C.RESET + " RTT: " + Form.f(foundChunks.get()) + " of " + Form.f(foundTotalChunks.get()) + " " + Form.f((int) chunksPerSecond.getAverage()) + "/s ETA: " + Form.duration((double) eta, 2)); } - if (foundChunks.get() >= foundTotalChunks.get()) { Iris.info("Completed DeepSearch!"); interrupt(); - } else { - int pos = job.getPosition() + 1; - job.setPosition(pos); - if (!job.paused) { - tickSearch(getChunk(pos)); - } } } @@ -141,22 +137,18 @@ public class DeepSearchPregenerator extends Thread implements Listener { private final ExecutorService executorService = Executors.newSingleThreadExecutor(); - private void tickSearch(Position2 chunk) { - executorService.submit(() -> { - CountDownLatch latch = new CountDownLatch(1); - try { - findInChunk(world, chunk.getX(), chunk.getZ()); - } catch (IOException e) { - throw new RuntimeException(e); + private void queueSystem(Position2 chunk) { + if (chunkQueue.isEmpty()) { + for (int limit = 512; limit != 0; limit--) { + pos = job.getPosition() + 1; + chunkQueue.add(getChunk(pos)); } - Iris.verbose("Generated Async " + chunk); - latch.countDown(); + } else { + //MCAUtil.read(); + + } + - try { - latch.await(); - } catch (InterruptedException ignored) {} - foundChunks.addAndGet(1); - }); } private void findInChunk(World world, int x, int z) throws IOException { @@ -271,7 +263,7 @@ public class DeepSearchPregenerator extends Thread implements Listener { @Data @Builder public static class DeepSearchJob { - private String world; + private World world; @Builder.Default private int radiusBlocks = 5000; @Builder.Default diff --git a/core/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java b/core/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java index b693e0034..b5b705900 100644 --- a/core/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java +++ b/core/src/main/java/com/volmit/iris/core/pregenerator/IrisPregenerator.java @@ -19,7 +19,11 @@ package com.volmit.iris.core.pregenerator; import com.volmit.iris.Iris; +import com.volmit.iris.core.pack.IrisPack; +import com.volmit.iris.core.tools.IrisPackBenchmarking; +import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KSet; +import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; import com.volmit.iris.util.mantle.Mantle; import com.volmit.iris.util.math.M; @@ -45,6 +49,7 @@ public class IrisPregenerator { private final RollingSequence chunksPerSecond; private final RollingSequence chunksPerMinute; private final RollingSequence regionsPerMinute; + private final KList chunksPerSecondHistory; private static AtomicInteger generated; private final AtomicInteger generatedLast; private final AtomicInteger generatedLastMinute; @@ -57,8 +62,6 @@ public class IrisPregenerator { private final KSet net; private final ChronoLatch cl; private final ChronoLatch saveLatch = new ChronoLatch(30000); - static long long_generatedChunks = 0; - static long long_totalChunks = 0; public IrisPregenerator(PregenTask task, PregeneratorMethod generator, PregenListener listener) { this.listener = listenify(listener); @@ -75,6 +78,7 @@ public class IrisPregenerator { chunksPerSecond = new RollingSequence(10); chunksPerMinute = new RollingSequence(10); regionsPerMinute = new RollingSequence(10); + chunksPerSecondHistory = new KList<>(); generated = new AtomicInteger(0); generatedLast = new AtomicInteger(0); generatedLastMinute = new AtomicInteger(0); @@ -88,6 +92,7 @@ public class IrisPregenerator { int secondGenerated = generated.get() - generatedLast.get(); generatedLast.set(generated.get()); chunksPerSecond.put(secondGenerated); + chunksPerSecondHistory.add(secondGenerated); if (minuteLatch.flip()) { int minuteGenerated = generated.get() - generatedLastMinute.get(); @@ -95,8 +100,6 @@ public class IrisPregenerator { chunksPerMinute.put(minuteGenerated); regionsPerMinute.put((double) minuteGenerated / 1024D); } - long_generatedChunks = generated.get(); - long_totalChunks = totalChunks.get(); listener.onTick(chunksPerSecond.getAverage(), chunksPerMinute.getAverage(), regionsPerMinute.getAverage(), @@ -107,7 +110,11 @@ public class IrisPregenerator { if (cl.flip()) { double percentage = ((double) generated.get() / (double) totalChunks.get()) * 100; - Iris.info("Pregen: " + Form.f(generated.get()) + " of " + Form.f(totalChunks.get()) + " (%.0f%%) " + Form.f((int) chunksPerSecond.getAverage()) + "/s ETA: " + Form.duration(eta, 2), percentage); + if (!IrisPackBenchmarking.benchmarkInProgress) { + Iris.info("Pregen: " + Form.f(generated.get()) + " of " + Form.f(totalChunks.get()) + " (%.0f%%) " + Form.f((int) chunksPerSecond.getAverage()) + "/s ETA: " + Form.duration(eta, 2), percentage); + } else { + Iris.info("Benchmarking: " + Form.f(generated.get()) + " of " + Form.f(totalChunks.get()) + " (%.0f%%) " + Form.f((int) chunksPerSecond.getAverage()) + "/s ETA: " + Form.duration(eta, 2), percentage); + } } return 1000; } @@ -123,13 +130,6 @@ public class IrisPregenerator { ); } - public static long getLongGeneratedChunks() { - return long_generatedChunks; - } - public static long getLongTotalChunks() { - return long_totalChunks; - } - public void close() { shutdown.set(true); @@ -142,6 +142,11 @@ public class IrisPregenerator { task.iterateRegions((x, z) -> visitRegion(x, z, true)); task.iterateRegions((x, z) -> visitRegion(x, z, false)); shutdown(); + if (!IrisPackBenchmarking.benchmarkInProgress) { + Iris.info(C.IRIS + "Pregen stopped."); + } else { + IrisPackBenchmarking.instance.finishedBenchmark(chunksPerSecondHistory); + } } private void checkRegions() { diff --git a/core/src/main/java/com/volmit/iris/core/pregenerator/PregenTask.java b/core/src/main/java/com/volmit/iris/core/pregenerator/PregenTask.java index 4abe057f8..015a418a1 100644 --- a/core/src/main/java/com/volmit/iris/core/pregenerator/PregenTask.java +++ b/core/src/main/java/com/volmit/iris/core/pregenerator/PregenTask.java @@ -35,6 +35,8 @@ public class PregenTask { private static final KList ORDER_CENTER = computeChunkOrder(); private static final KMap> ORDERS = new KMap<>(); + @Builder.Default + private boolean gui = false; @Builder.Default private Position2 center = new Position2(0, 0); @Builder.Default 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 6fc87f183..754744e41 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 @@ -3,11 +3,11 @@ 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 org.apache.logging.log4j.core.util.ExecutorServices; import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; -import javax.print.attribute.standard.Severity; +import javax.tools.JavaCompiler; +import javax.tools.ToolProvider; import java.io.File; import java.nio.channels.FileChannel; import java.nio.file.Files; @@ -17,9 +17,6 @@ import java.nio.file.StandardOpenOption; import java.util.HashMap; import java.util.Map; import java.util.StringJoiner; -import java.util.concurrent.Executor; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; import static com.volmit.iris.Iris.getJavaVersion; import static com.volmit.iris.Iris.instance; @@ -128,25 +125,15 @@ public class ServerBootSFG { } } - public static boolean isJDK() { - String path = System.getProperty("sun.boot.library.path"); - if (path != null) { - String javacPath = ""; - if (path.endsWith(File.separator + "bin")) { - javacPath = path; - } else { - int libIndex = path.lastIndexOf(File.separator + "lib"); - if (libIndex > 0) { - javacPath = path.substring(0, libIndex) + File.separator + "bin"; - } - } - if (checkJavac(javacPath)) - return true; - } - path = System.getProperty("java.home"); - return path != null && checkJavac(path + File.separator + "bin"); - } + public static boolean isJDK() { + try { + JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); + // If the compiler is null, it means this is a JRE environment, not a JDK. + return compiler != null; + } catch (Exception ignored) {} + return false; + } public static boolean hasPrivileges() { Path pv = Paths.get(Bukkit.getWorldContainer() + "iristest.json"); try (FileChannel fc = FileChannel.open(pv, StandardOpenOption.CREATE, StandardOpenOption.DELETE_ON_CLOSE, StandardOpenOption.READ, StandardOpenOption.WRITE)) { 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 a998e9bd4..b2595e3ad 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 @@ -1,6 +1,7 @@ package com.volmit.iris.core.service; import com.volmit.iris.Iris; +import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.platform.PlatformChunkGenerator; @@ -17,6 +18,8 @@ import com.volmit.iris.util.scheduling.PrecisionStopwatch; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.event.EventHandler; +import org.bukkit.event.server.PluginDisableEvent; +import org.bukkit.event.server.ServerLoadEvent; import org.bukkit.event.world.WorldLoadEvent; import org.bukkit.event.world.WorldUnloadEvent; import org.checkerframework.checker.units.qual.A; @@ -30,12 +33,13 @@ import java.util.function.Supplier; public class IrisEngineSVC implements IrisService { public static IrisEngineSVC instance; + public boolean isServerShuttingDown = false; + public boolean isServerLoaded = false; private static final AtomicInteger tectonicLimit = new AtomicInteger(30); - private final ReentrantLock lastUseLock = new ReentrantLock(); - private final KMap lastUse = new KMap<>(); + private ReentrantLock lastUseLock; + private KMap lastUse; private List IrisWorlds; private Looper cacheTicker; - private Looper freezeTicker; private Looper trimTicker; private Looper unloadTicker; private Looper updateTicker; @@ -55,6 +59,8 @@ public class IrisEngineSVC implements IrisService { @Override public void onEnable() { this.cl = new ChronoLatch(5000); + lastUse = new KMap<>(); + lastUseLock = new ReentrantLock(); IrisWorlds = new ArrayList<>(); IsUnloadAlive = new AtomicBoolean(true); IsTrimAlive = new AtomicBoolean(true); @@ -81,11 +87,19 @@ public class IrisEngineSVC implements IrisService { cacheTicker.start(); trimTicker.start(); unloadTicker.start(); - freezeTicker.start(); instance = this; } + public void engineStatus() { + boolean trimAlive = trimTicker.isAlive(); + boolean unloadAlive = unloadTicker.isAlive(); + Iris.info("Status:"); + Iris.info("- Trim: " + trimAlive); + Iris.info("- Unload: " + unloadAlive); + + } + public static int getTectonicLimit() { return tectonicLimit.get(); } @@ -104,6 +118,18 @@ public class IrisEngineSVC implements IrisService { updateWorlds(); } + @EventHandler + public void onServerBoot(ServerLoadEvent event) { + isServerLoaded = true; + } + + @EventHandler + public void onPluginDisable(PluginDisableEvent event) { + if (event.getPlugin().equals(Iris.instance)) { + isServerShuttingDown = true; + } + } + public void updateWorlds() { for (World world : Bukkit.getWorlds()) { try { @@ -146,11 +172,33 @@ public class IrisEngineSVC implements IrisService { TotalNotQueuedTectonicPlates.set(0); TotalTectonicPlates.set(0); for (World world : IrisWorlds) { - Engine engine = IrisToolbelt.access(world).getEngine(); + Engine engine = Objects.requireNonNull(IrisToolbelt.access(world)).getEngine(); TotalQueuedTectonicPlates.addAndGet((int) engine.getMantle().getToUnload()); TotalNotQueuedTectonicPlates.addAndGet((int) engine.getMantle().getNotQueuedLoadedRegions()); TotalTectonicPlates.addAndGet(engine.getMantle().getLoadedRegionCount()); } + if (!isServerShuttingDown && isServerLoaded) { + if (!trimTicker.isAlive()) { + Iris.info(C.IRIS + "TrimTicker found dead! Booting it up!"); + try { + trimTicker.start(); + } catch (Exception e) { + Iris.error("What happened?"); + e.printStackTrace(); + } + } + + if (!unloadTicker.isAlive()) { + Iris.info(C.IRIS + "UnloadTicker found dead! Booting it up!"); + try { + unloadTicker.start(); + } catch (Exception e) { + Iris.error("What happened?"); + e.printStackTrace(); + } + } + } + } catch (Exception e) { return -1; } @@ -158,54 +206,6 @@ public class IrisEngineSVC implements IrisService { } }; - freezeTicker = new Looper() { - @Override - protected long loop() { - if (cl.flip()) { - if (!unloadTicker.isAlive()) { - Iris.debug(C.YELLOW + "UnloadTicker Found dead?"); - } - if (!trimTicker.isAlive()) { - Iris.debug(C.YELLOW + "UnloadTicker Found dead?"); - } - Runtime runtime = Runtime.getRuntime(); - long usedMemory = runtime.totalMemory() - runtime.freeMemory(); - long maxMemory = runtime.maxMemory(); - double memoryUsagePercentage = ((double) usedMemory / (double) maxMemory); - double externalTrim = trimActiveAlive.getMillis(); - double externalUnload = unloadActiveAlive.getMillis(); - double localTrim = trimAlive.getMillis(); - double localUnload = unloadAlive.getMillis(); - if (localTrim > 120000) { - Iris.info(C.YELLOW + "EngineSVC Alert! The Trim subsystem has exceeded its expected response time: " + Form.duration(trimAlive.getMillis()) + "."); - } - if (localUnload > 120000) { - Iris.info(C.YELLOW + "EngineSVC Alert! The Tectonic subsystem has exceeded its expected response time: " + Form.duration(trimAlive.getMillis()) + "."); - } - - if (memoryUsagePercentage > 0.9 && tectonicLimit.get() < TotalTectonicPlates.get()) { - if (localTrim > 30000 && externalTrim > 10000) { - Iris.info(C.RED + "CRITICAL EngineSVC FAILURE! The Tectonic Trim subsystem has not trimmed for: " + Form.duration(trimAlive.getMillis()) + "."); - IsTrimAlive.set(false); - } else { - Iris.info(C.IRIS + "EngineSVC reports activity within the Trim subsystem system!"); - IsTrimAlive.set(true); - } - - if (localUnload > 30000 && externalUnload > 12000 && TotalQueuedTectonicPlates.get() != 0) { - Iris.info(C.RED + "CRITICAL EngineSVC FAILURE! The Tectonic Unload subsystem has not unloaded for: " + Form.duration(trimAlive.getMillis()) + "."); - IsUnloadAlive.set(false); - } else { - Iris.info(C.IRIS + "EngineSVC reports activity within the Unload subsystem system!"); - IsUnloadAlive.set(true); - } - } - } - return 1; - } - - }; - trimTicker = new Looper() { private final Supplier supplier = createSupplier(); @Override @@ -250,7 +250,7 @@ public class IrisEngineSVC implements IrisService { } } catch (Throwable e) { Iris.reportError(e); - Iris.info(C.RED + "EngineSVC: Failed to unload. Please contact support!"); + Iris.info(C.RED + "EngineSVC: Failed to unload."); e.printStackTrace(); return -1; } diff --git a/core/src/main/java/com/volmit/iris/core/service/WorldLoadSFG.java b/core/src/main/java/com/volmit/iris/core/service/WorldLoadSFG.java deleted file mode 100644 index 845edf054..000000000 --- a/core/src/main/java/com/volmit/iris/core/service/WorldLoadSFG.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.volmit.iris.core.service; - -import com.volmit.iris.Iris; -import com.volmit.iris.util.plugin.IrisService; -import org.bukkit.World; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.world.WorldLoadEvent; -import org.bukkit.plugin.java.JavaPlugin; - -import static java.lang.System.getLogger; - -public class WorldLoadSFG implements IrisService { - private JavaPlugin plugin; - @EventHandler - public void onWorldLoad(WorldLoadEvent event) { - World world = event.getWorld(); - - } - - @Override - public void onEnable() { - this.plugin = Iris.instance; - plugin.getServer().getPluginManager().registerEvents(this, plugin); - } - - @Override - public void onDisable() { - - } -} diff --git a/core/src/main/java/com/volmit/iris/core/tools/IrisPackBenchmarking.java b/core/src/main/java/com/volmit/iris/core/tools/IrisPackBenchmarking.java index 60c9aa76b..7993cf6e7 100644 --- a/core/src/main/java/com/volmit/iris/core/tools/IrisPackBenchmarking.java +++ b/core/src/main/java/com/volmit/iris/core/tools/IrisPackBenchmarking.java @@ -2,38 +2,132 @@ package com.volmit.iris.core.tools; import com.volmit.iris.Iris; -import com.volmit.iris.core.pregenerator.IrisPregenerator; -import com.volmit.iris.core.pregenerator.LazyPregenerator; import com.volmit.iris.core.pregenerator.PregenTask; +import com.volmit.iris.engine.framework.Engine; +import com.volmit.iris.engine.object.IrisDimension; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.exceptions.IrisException; -import com.volmit.iris.util.format.C; +import com.volmit.iris.util.format.Form; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.scheduling.J; -import org.apache.commons.io.FileUtils; +import com.volmit.iris.util.scheduling.PrecisionStopwatch; +import lombok.Getter; import org.bukkit.Bukkit; import java.io.File; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; - -import static com.volmit.iris.core.commands.CommandIris.BenchDimension; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.time.Clock; +import java.time.LocalDateTime; +import java.util.Collections; +import java.util.concurrent.*; public class IrisPackBenchmarking { + @Getter public static IrisPackBenchmarking instance; - long totalChunks; - long generatedChunks; - double elapsedTimeNs; + public static boolean benchmarkInProgress = false; + private IrisDimension IrisDimension; + private int radius; + private boolean finished = false; + PrecisionStopwatch stopwatch; - public void runBenchmark() { + public IrisPackBenchmarking(IrisDimension dimension, int r) { + instance = this; + this.IrisDimension = dimension; + this.radius = r; + runBenchmark(); + } + + private void runBenchmark() { + this.stopwatch = new PrecisionStopwatch(); + ExecutorService service = Executors.newSingleThreadExecutor(); + service.submit(() -> { + Iris.info("Setting up benchmark environment "); + benchmarkInProgress = true; + File file = new File("benchmark"); + if (file.exists()) { + deleteDirectory(file.toPath()); + } + createBenchmark(); + while (!IrisToolbelt.isIrisWorld(Bukkit.getWorld("benchmark"))) { + J.sleep(1000); + Iris.debug("Iris PackBenchmark: Waiting..."); + } + Iris.info("Starting Benchmark!"); + stopwatch.begin(); + startBenchmark(); + }); } - public void createBenchmark(){ + + public boolean getBenchmarkInProgress() { + return benchmarkInProgress; + } + + public void finishedBenchmark(KList cps) { + try { + String time = Form.duration(stopwatch.getMillis()); + Engine engine = IrisToolbelt.access(Bukkit.getWorld("benchmark")).getEngine(); + Iris.info("-----------------"); + Iris.info("Results:"); + Iris.info("- Total time: " + time); + Iris.info("- Average CPS: " + calculateAverage(cps)); + Iris.info(" - Median CPS: " + calculateMedian(cps)); + Iris.info(" - Highest CPS: " + findHighest(cps)); + Iris.info(" - Lowest CPS: " + findLowest(cps)); + Iris.info("-----------------"); + Iris.info("Creating a report.."); + File profilers = new File("plugins" + File.separator + "Iris" + File.separator + "packbenchmarks"); + profilers.mkdir(); + + File results = new File("plugins " + File.separator + "Iris", IrisDimension.getName() + LocalDateTime.now(Clock.systemDefaultZone()) + ".txt"); + results.createNewFile(); + KMap metrics = engine.getMetrics().pull(); + try (FileWriter writer = new FileWriter(results)) { + writer.write("-----------------\n"); + writer.write("Results:\n"); + writer.write("Dimension: " + IrisDimension.getName() + "\n"); + writer.write("- Date of Benchmark: " + LocalDateTime.now(Clock.systemDefaultZone()) + "\n"); + writer.write("\n"); + writer.write("Metrics"); + for (String m : metrics.k()) { + double i = metrics.get(m); + writer.write("- " + m + ": " + i); + } + writer.write("- " + metrics); + writer.write("Benchmark: " + LocalDateTime.now(Clock.systemDefaultZone()) + "\n"); + writer.write("- Total time: " + time + "\n"); + writer.write("- Average CPS: " + calculateAverage(cps) + "\n"); + writer.write(" - Median CPS: " + calculateMedian(cps) + "\n"); + writer.write(" - Highest CPS: " + findHighest(cps) + "\n"); + writer.write(" - Lowest CPS: " + findLowest(cps) + "\n"); + writer.write("-----------------\n"); + Iris.info("Finished generating a report!"); + } catch (IOException e) { + Iris.error("An error occurred writing to the file."); + e.printStackTrace(); + } + + Bukkit.getServer().unloadWorld("benchmark", true); + stopwatch.end(); + } catch (Exception e) { + Iris.error("Something has gone wrong!"); + e.printStackTrace(); + } + } + private void createBenchmark(){ try { IrisToolbelt.createWorld() - .dimension(BenchDimension) - .name("Benchmark") + .dimension(IrisDimension.getName()) + .name("benchmark") .seed(1337) .studio(false) .benchmark(true) @@ -42,15 +136,66 @@ public class IrisPackBenchmarking { throw new RuntimeException(e); } } - public void startBenchmark(){ + + private void startBenchmark(){ int x = 0; int z = 0; IrisToolbelt.pregenerate(PregenTask .builder() + .gui(false) .center(new Position2(x, z)) .width(5) .height(5) - .build(), Bukkit.getWorld("Benchmark") + .build(), Bukkit.getWorld("benchmark") ); } + + private double calculateAverage(KList list) { + double sum = 0; + for (int num : list) { + sum += num; + } + return sum / list.size(); + } + + private double calculateMedian(KList list) { + Collections.sort(list); + int middle = list.size() / 2; + + if (list.size() % 2 == 1) { + return list.get(middle); + } else { + return (list.get(middle - 1) + list.get(middle)) / 2.0; + } + } + + private int findLowest(KList list) { + return Collections.min(list); + } + + private int findHighest(KList list) { + return Collections.max(list); + } + + private boolean deleteDirectory(Path dir) { + try { + Files.walkFileTree(dir, new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + Files.delete(file); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { + Files.delete(dir); + return FileVisitResult.CONTINUE; + } + }); + return true; + } catch (IOException e) { + e.printStackTrace(); + return false; + } + } } \ No newline at end of file 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 62e18e0d8..187b41685 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 @@ -23,6 +23,7 @@ import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.engine.IrisComplex; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.EngineTarget; +import com.volmit.iris.engine.framework.SeedManager; import com.volmit.iris.engine.mantle.components.MantleJigsawComponent; import com.volmit.iris.engine.mantle.components.MantleObjectComponent; import com.volmit.iris.engine.object.IObjectPlacer; 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 177283f74..2571389ca 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,6 +18,7 @@ package com.volmit.iris.engine.object; +import com.volmit.iris.core.IrisSettings; import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.object.annotations.*; import com.volmit.iris.util.data.DataProvider; @@ -69,6 +70,17 @@ public class IrisBiomeGeneratorLink { 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); } diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisCavePlacer.java b/core/src/main/java/com/volmit/iris/engine/object/IrisCavePlacer.java index 911323e4a..acaa55904 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisCavePlacer.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisCavePlacer.java @@ -52,8 +52,6 @@ public class IrisCavePlacer implements IRare { private String cave; @Desc("If set to true, this cave is allowed to break the surface") private boolean breakSurface = true; - @Desc("If set to true, this cave is allowed to get placed above the terrain level") - private boolean ignoreHeightLimit = false; @Desc("The height range this cave can spawn at. If breakSurface is false, the output of this range will be clamped by the current world height to prevent surface breaking.") private IrisStyledRange caveStartHeight = new IrisStyledRange(13, 120, new IrisGeneratorStyle(NoiseStyle.STATIC)); @@ -84,15 +82,13 @@ public class IrisCavePlacer implements IRare { } if (y == -1) { - if(!ignoreHeightLimit) { + if(!breakSurface) { int eH = engine.getHeight(x, z); if (caveStartHeight.getMax() > eH) { caveStartHeight.setMax(eH); } } - int h = (int) caveStartHeight.get(rng, x, z, data); - int ma = breakSurface ? h : (int) (engine.getComplex().getHeightStream().get(x, z) - 9); - y = Math.min(h, ma); + y = (int) caveStartHeight.get(rng, x, z, data); } try { From ba68ab9e06d633f853c579273719d894c90b95ec Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Sun, 31 Mar 2024 17:58:47 +0200 Subject: [PATCH 09/10] f --- .../java/com/volmit/iris/core/commands/CommandStudio.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) 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 188ddf298..7e3f7e5a6 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 @@ -229,13 +229,10 @@ public class CommandStudio implements DecreeExecutor { @Decree(description = "Convert objects in the \"convert\" folder") public void convert() { - //Iris.service(ConversionSVC.class).check(sender()); - IrisConverter.convertSchematics(sender()); - - + Iris.service(ConversionSVC.class).check(sender()); + //IrisConverter.convertSchematics(sender()); } - @Decree(description = "Execute a script", aliases = "run", origin = DecreeOrigin.PLAYER) public void execute( @Param(description = "The script to run") From f587816b302e23274fd50926e9e9bb5f661fef5a Mon Sep 17 00:00:00 2001 From: RePixelatedMC Date: Sun, 31 Mar 2024 18:33:35 +0200 Subject: [PATCH 10/10] merges --- .../iris/core/nms/v1_19_R1/NMSBinding.java | 63 +++++++++-------- .../iris/core/nms/v1_19_R2/NMSBinding.java | 2 +- .../iris/core/nms/v1_19_R3/NMSBinding.java | 66 +++++++++--------- .../iris/core/nms/v1_20_R1/NMSBinding.java | 2 +- .../iris/core/nms/v1_20_R2/NMSBinding.java | 62 ++++++++--------- .../iris/core/nms/v1_20_R3/NMSBinding.java | 69 +++++++++---------- 6 files changed, 127 insertions(+), 137 deletions(-) diff --git a/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/NMSBinding.java b/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/NMSBinding.java index 2317f0fcb..49c921288 100644 --- a/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/NMSBinding.java +++ b/nms/v1_19_R1/src/main/java/com/volmit/iris/core/nms/v1_19_R1/NMSBinding.java @@ -1,5 +1,34 @@ package com.volmit.iris.core.nms.v1_19_R1; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.Iterator; +import java.util.List; +import java.util.Vector; +import java.util.concurrent.atomic.AtomicInteger; + +import org.bukkit.*; +import org.bukkit.block.Biome; +import org.bukkit.block.data.BlockData; +import org.bukkit.craftbukkit.v1_19_R1.CraftChunk; +import org.bukkit.craftbukkit.v1_19_R1.CraftServer; +import org.bukkit.craftbukkit.v1_19_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_19_R1.block.CraftBlock; +import org.bukkit.craftbukkit.v1_19_R1.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_19_R1.entity.CraftDolphin; +import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack; +import org.bukkit.entity.Dolphin; +import org.bukkit.entity.Entity; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.generator.ChunkGenerator; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.INMSBinding; @@ -16,6 +45,7 @@ import com.volmit.iris.util.nbt.io.NBTUtil; import com.volmit.iris.util.nbt.mca.NBTWorld; import com.volmit.iris.util.nbt.mca.palette.*; import com.volmit.iris.util.nbt.tag.CompoundTag; + import it.unimi.dsi.fastutil.objects.Object2IntMap; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; @@ -32,39 +62,8 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.LevelChunk; -import org.bukkit.*; -import org.bukkit.block.Biome; -import org.bukkit.block.data.BlockData; - -import org.bukkit.craftbukkit.v1_19_R1.CraftChunk; -import org.bukkit.craftbukkit.v1_19_R1.CraftServer; -import org.bukkit.craftbukkit.v1_19_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_19_R1.block.CraftBlock; -import org.bukkit.craftbukkit.v1_19_R1.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_19_R1.entity.CraftDolphin; -import org.bukkit.craftbukkit.v1_19_R1.entity.CraftWarden; -import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack; -import org.bukkit.entity.Dolphin; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.event.entity.CreatureSpawnEvent; -import org.bukkit.generator.ChunkGenerator; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.NotNull; import sun.misc.Unsafe; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.Iterator; -import java.util.List; -import java.util.Vector; -import java.util.concurrent.atomic.AtomicInteger; - public class NMSBinding implements INMSBinding { private final KMap baseBiomeCache = new KMap<>(); private final BlockData AIR = Material.AIR.createBlockData(); @@ -514,7 +513,7 @@ public class NMSBinding implements INMSBinding { } @Override - public Entity spawnEntity(Location location, EntityType type, CreatureSpawnEvent.SpawnReason reason) { + public Entity spawnEntity(Location location, org.bukkit.entity.EntityType type, CreatureSpawnEvent.SpawnReason reason) { return ((CraftWorld) location.getWorld()).spawn(location, type.getEntityClass(), null, reason); } diff --git a/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/NMSBinding.java b/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/NMSBinding.java index 07a28b5cd..8aa76bc52 100644 --- a/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/NMSBinding.java +++ b/nms/v1_19_R2/src/main/java/com/volmit/iris/core/nms/v1_19_R2/NMSBinding.java @@ -515,7 +515,7 @@ public class NMSBinding implements INMSBinding { } @Override - public Entity spawnEntity(Location location, EntityType type, CreatureSpawnEvent.SpawnReason reason) { + public Entity spawnEntity(Location location, org.bukkit.entity.EntityType type, CreatureSpawnEvent.SpawnReason reason) { return ((CraftWorld) location.getWorld()).spawn(location, type.getEntityClass(), null, reason); } diff --git a/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java b/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java index 7648ba946..c32354ae9 100644 --- a/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java +++ b/nms/v1_19_R3/src/main/java/com/volmit/iris/core/nms/v1_19_R3/NMSBinding.java @@ -1,5 +1,34 @@ package com.volmit.iris.core.nms.v1_19_R3; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.Iterator; +import java.util.List; +import java.util.Vector; +import java.util.concurrent.atomic.AtomicInteger; + +import org.bukkit.*; +import org.bukkit.block.Biome; +import org.bukkit.block.data.BlockData; +import org.bukkit.craftbukkit.v1_19_R3.CraftChunk; +import org.bukkit.craftbukkit.v1_19_R3.CraftServer; +import org.bukkit.craftbukkit.v1_19_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_19_R3.block.CraftBlock; +import org.bukkit.craftbukkit.v1_19_R3.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_19_R3.entity.CraftDolphin; +import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack; +import org.bukkit.entity.Dolphin; +import org.bukkit.entity.Entity; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.generator.ChunkGenerator; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.INMSBinding; @@ -16,6 +45,7 @@ import com.volmit.iris.util.nbt.io.NBTUtil; import com.volmit.iris.util.nbt.mca.NBTWorld; import com.volmit.iris.util.nbt.mca.palette.*; import com.volmit.iris.util.nbt.tag.CompoundTag; + import it.unimi.dsi.fastutil.objects.Object2IntMap; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; @@ -34,38 +64,8 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.level.chunk.LevelChunk; -import org.bukkit.*; -import org.bukkit.block.Biome; -import org.bukkit.block.data.BlockData; - -import org.bukkit.craftbukkit.v1_19_R3.CraftChunk; -import org.bukkit.craftbukkit.v1_19_R3.CraftServer; -import org.bukkit.craftbukkit.v1_19_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_19_R3.block.CraftBlock; -import org.bukkit.craftbukkit.v1_19_R3.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_19_R3.entity.CraftDolphin; -import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack; -import org.bukkit.entity.Dolphin; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.event.entity.CreatureSpawnEvent; -import org.bukkit.generator.ChunkGenerator; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.NotNull; import sun.misc.Unsafe; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.Iterator; -import java.util.List; -import java.util.Vector; -import java.util.concurrent.atomic.AtomicInteger; - public class NMSBinding implements INMSBinding { private final KMap baseBiomeCache = new KMap<>(); private final BlockData AIR = Material.AIR.createBlockData(); @@ -492,7 +492,6 @@ public class NMSBinding implements INMSBinding { biomeSource.set(serverLevel.getChunkSource().chunkMap.generator, customBiomeSource); } - public Vector3d getBoundingbox(org.bukkit.entity.EntityType entity) { Field[] fields = EntityType.class.getDeclaredFields(); for (Field field : fields) { @@ -516,10 +515,9 @@ public class NMSBinding implements INMSBinding { return null; } - @Override - public Entity spawnEntity(Location location, EntityType type, CreatureSpawnEvent.SpawnReason reason) { - if (type == EntityType.CAMEL) { + public Entity spawnEntity(Location location, org.bukkit.entity.EntityType type, CreatureSpawnEvent.SpawnReason reason) { + if (type == org.bukkit.entity.EntityType.CAMEL) { return null; } return ((CraftWorld) location.getWorld()).spawn(location, type.getEntityClass(), null, reason); diff --git a/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java b/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java index 38db0098a..165f97808 100644 --- a/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java +++ b/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java @@ -505,7 +505,7 @@ public class NMSBinding implements INMSBinding { } @Override - public Entity spawnEntity(Location location, EntityType type, CreatureSpawnEvent.SpawnReason reason) { + public Entity spawnEntity(Location location, org.bukkit.entity.EntityType type, CreatureSpawnEvent.SpawnReason reason) { return ((CraftWorld) location.getWorld()).spawn(location, type.getEntityClass(), null, reason); } diff --git a/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java b/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java index 3e20e15f2..73a15d89c 100644 --- a/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java +++ b/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java @@ -1,5 +1,34 @@ package com.volmit.iris.core.nms.v1_20_R2; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.Iterator; +import java.util.List; +import java.util.Vector; +import java.util.concurrent.atomic.AtomicInteger; + +import org.bukkit.*; +import org.bukkit.block.Biome; +import org.bukkit.block.data.BlockData; +import org.bukkit.craftbukkit.v1_20_R2.CraftChunk; +import org.bukkit.craftbukkit.v1_20_R2.CraftServer; +import org.bukkit.craftbukkit.v1_20_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R2.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_20_R2.entity.CraftDolphin; +import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R2.util.CraftNamespacedKey; +import org.bukkit.entity.Dolphin; +import org.bukkit.entity.Entity; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.generator.ChunkGenerator; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.INMSBinding; @@ -16,6 +45,7 @@ import com.volmit.iris.util.nbt.io.NBTUtil; import com.volmit.iris.util.nbt.mca.NBTWorld; import com.volmit.iris.util.nbt.mca.palette.*; import com.volmit.iris.util.nbt.tag.CompoundTag; + import it.unimi.dsi.fastutil.objects.Object2IntMap; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; @@ -35,38 +65,8 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.level.chunk.LevelChunk; -import org.bukkit.*; -import org.bukkit.block.Biome; -import org.bukkit.block.data.BlockData; - -import org.bukkit.craftbukkit.v1_20_R2.CraftChunk; -import org.bukkit.craftbukkit.v1_20_R2.CraftServer; -import org.bukkit.craftbukkit.v1_20_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R2.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_20_R2.entity.CraftDolphin; -import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_20_R2.util.CraftNamespacedKey; -import org.bukkit.entity.Dolphin; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.event.entity.CreatureSpawnEvent; -import org.bukkit.generator.ChunkGenerator; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.NotNull; import sun.misc.Unsafe; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.Iterator; -import java.util.List; -import java.util.Vector; -import java.util.concurrent.atomic.AtomicInteger; - public class NMSBinding implements INMSBinding { private final KMap baseBiomeCache = new KMap<>(); private final BlockData AIR = Material.AIR.createBlockData(); @@ -516,7 +516,7 @@ public class NMSBinding implements INMSBinding { } @Override - public Entity spawnEntity(Location location, EntityType type, CreatureSpawnEvent.SpawnReason reason) { + public Entity spawnEntity(Location location, org.bukkit.entity.EntityType type, CreatureSpawnEvent.SpawnReason reason) { return ((CraftWorld) location.getWorld()).spawn(location, type.getEntityClass(), null, reason); } diff --git a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java index 125fe23ca..01fa75d94 100644 --- a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java +++ b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java @@ -1,14 +1,41 @@ package com.volmit.iris.core.nms.v1_20_R3; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.Iterator; +import java.util.List; +import java.util.Vector; +import java.util.concurrent.atomic.AtomicInteger; + +import org.bukkit.*; +import org.bukkit.block.Biome; +import org.bukkit.block.data.BlockData; +import org.bukkit.craftbukkit.v1_20_R3.CraftChunk; +import org.bukkit.craftbukkit.v1_20_R3.CraftServer; +import org.bukkit.craftbukkit.v1_20_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R3.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_20_R3.entity.CraftDolphin; +import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R3.util.CraftNamespacedKey; +import org.bukkit.entity.Dolphin; +import org.bukkit.entity.Entity; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.generator.ChunkGenerator; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.INMSBinding; import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.framework.Engine; -import com.volmit.iris.engine.object.IrisEntity; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; -import com.volmit.iris.util.format.Form; import com.volmit.iris.util.hunk.Hunk; import com.volmit.iris.util.json.JSONObject; import com.volmit.iris.util.mantle.Mantle; @@ -18,8 +45,7 @@ import com.volmit.iris.util.nbt.io.NBTUtil; import com.volmit.iris.util.nbt.mca.NBTWorld; import com.volmit.iris.util.nbt.mca.palette.*; import com.volmit.iris.util.nbt.tag.CompoundTag; -import com.volmit.iris.util.scheduling.PrecisionStopwatch; -import io.lumine.mythic.bukkit.adapters.BukkitEntity; + import it.unimi.dsi.fastutil.objects.Object2IntMap; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; @@ -31,7 +57,6 @@ import net.minecraft.nbt.TagParser; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; -import net.minecraft.tags.EntityTypeTags; import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.block.Block; @@ -40,40 +65,8 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.level.chunk.LevelChunk; -import org.bukkit.*; -import org.bukkit.block.Biome; -import org.bukkit.block.data.BlockData; - -import org.bukkit.craftbukkit.v1_20_R3.CraftChunk; -import org.bukkit.craftbukkit.v1_20_R3.CraftServer; -import org.bukkit.craftbukkit.v1_20_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_20_R3.block.data.CraftBlockData; -import org.bukkit.craftbukkit.v1_20_R3.entity.CraftDolphin; -import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack; -import org.bukkit.craftbukkit.v1_20_R3.util.CraftNamespacedKey; -import org.bukkit.entity.Creeper; -import org.bukkit.entity.Dolphin; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.event.entity.CreatureSpawnEvent; -import org.bukkit.generator.ChunkGenerator; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.NotNull; import sun.misc.Unsafe; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.Iterator; -import java.util.List; -import java.util.Optional; -import java.util.Vector; -import java.util.concurrent.atomic.AtomicInteger; - public class NMSBinding implements INMSBinding { private final KMap baseBiomeCache = new KMap<>(); private final BlockData AIR = Material.AIR.createBlockData(); @@ -524,7 +517,7 @@ public class NMSBinding implements INMSBinding { @Override - public Entity spawnEntity(Location location, EntityType type, CreatureSpawnEvent.SpawnReason reason) { + public Entity spawnEntity(Location location, org.bukkit.entity.EntityType type, CreatureSpawnEvent.SpawnReason reason) { return ((CraftWorld) location.getWorld()).spawn(location, type.getEntityClass(), null, reason); }