From 2e2ea8f1e4388c650de2bf8f87e04ca253f69b5c Mon Sep 17 00:00:00 2001 From: Julian Krings Date: Tue, 8 Jul 2025 09:19:57 +0200 Subject: [PATCH 1/6] use paper plugin loader to avoid maven central warning --- core/build.gradle.kts | 3 ++ core/paper-loader/build.gradle.kts | 3 ++ .../com/volmit/iris/IrisPluginLoader.java | 37 +++++++++++++++++++ core/src/main/resources/plugin.yml | 5 ++- settings.gradle.kts | 2 +- 5 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 core/paper-loader/build.gradle.kts create mode 100644 core/paper-loader/src/main/java/com/volmit/iris/IrisPluginLoader.java diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 17158627f..4d7f24b67 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -25,6 +25,7 @@ plugins { val apiVersion = "1.19" val main = "com.volmit.iris.Iris" +val loader = "com.volmit.iris.IrisPluginLoader" val dynamic: Configuration by configurations.creating configurations.compileOnly { extendsFrom(dynamic) } @@ -69,6 +70,7 @@ dependencies { implementation("net.kyori:adventure-platform-bukkit:4.3.4") implementation("net.kyori:adventure-api:4.17.0") implementation("org.bstats:bstats-bukkit:3.1.0") + implementation(project(":core:paper-loader")) // Dynamically Loaded dynamic("commons-io:commons-io:2.13.0") @@ -118,6 +120,7 @@ tasks { "version" to rootProject.version, "apiVersion" to apiVersion, "main" to main, + "loader" to loader, "libraries" to dynamic.allDependencies.map { "\n - $it" }.sorted().joinToString("") ) filesMatching("**/plugin.yml") { diff --git a/core/paper-loader/build.gradle.kts b/core/paper-loader/build.gradle.kts new file mode 100644 index 000000000..367c9bbc9 --- /dev/null +++ b/core/paper-loader/build.gradle.kts @@ -0,0 +1,3 @@ +dependencies { + compileOnly("io.papermc.paper:paper-api:1.20.1-R0.1-SNAPSHOT") +} \ No newline at end of file diff --git a/core/paper-loader/src/main/java/com/volmit/iris/IrisPluginLoader.java b/core/paper-loader/src/main/java/com/volmit/iris/IrisPluginLoader.java new file mode 100644 index 000000000..c032b5b22 --- /dev/null +++ b/core/paper-loader/src/main/java/com/volmit/iris/IrisPluginLoader.java @@ -0,0 +1,37 @@ +package com.volmit.iris; + +import io.papermc.paper.plugin.loader.PluginClasspathBuilder; +import io.papermc.paper.plugin.loader.PluginLoader; +import io.papermc.paper.plugin.loader.library.impl.MavenLibraryResolver; +import lombok.SneakyThrows; +import org.bukkit.configuration.file.YamlConfiguration; +import org.eclipse.aether.artifact.DefaultArtifact; +import org.eclipse.aether.graph.Dependency; +import org.eclipse.aether.repository.RemoteRepository; +import org.jetbrains.annotations.NotNull; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.URI; + +@SuppressWarnings("all") +public class IrisPluginLoader implements PluginLoader { + + @SneakyThrows + @Override + public void classloader(@NotNull PluginClasspathBuilder builder) { + var pluginUri = URI.create("jar:file:" + builder.getContext().getPluginSource().toAbsolutePath() + "!/plugin.yml"); + var plugin = YamlConfiguration.loadConfiguration(new BufferedReader(new InputStreamReader(pluginUri.toURL().openStream()))); + var repository = "https://maven-central.storage-download.googleapis.com/maven2"; + + try { + var field = MavenLibraryResolver.class.getDeclaredField("MAVEN_CENTRAL_DEFAULT_MIRROR"); + repository = (String) field.get(null); + } catch (Throwable e) {} + + var resolver = new MavenLibraryResolver(); + resolver.addRepository(new RemoteRepository.Builder("central", "default", repository).build()); + plugin.getStringList("libraries").forEach(library -> resolver.addDependency(new Dependency(new DefaultArtifact(library), null))); + builder.addLibrary(resolver); + } +} diff --git a/core/src/main/resources/plugin.yml b/core/src/main/resources/plugin.yml index 89fbfb449..5b6fc940c 100644 --- a/core/src/main/resources/plugin.yml +++ b/core/src/main/resources/plugin.yml @@ -10,4 +10,7 @@ commands: iris: aliases: [ ir, irs ] api-version: '${apiVersion}' -hotload-dependencies: false \ No newline at end of file +hotload-dependencies: false + +paper-plugin-loader: ${loader} +paper-skip-libraries: true \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 18cbee3fe..138a3c25c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -21,7 +21,7 @@ plugins { rootProject.name = "Iris" -include(":core", ":core:agent") +include(":core", ":core:agent", ":core:paper-loader") include( ":nms:v1_21_R5", ":nms:v1_21_R4", From 6b193f695a6d5f7ebb508c4d76484ab3d343d6ea Mon Sep 17 00:00:00 2001 From: Julian Krings Date: Tue, 8 Jul 2025 18:46:59 +0200 Subject: [PATCH 2/6] switch to slimjar --- build.gradle.kts | 2 +- core/build.gradle.kts | 82 +++++----- core/paper-loader/build.gradle.kts | 3 - .../com/volmit/iris/IrisPluginLoader.java | 37 ----- core/src/main/java/com/volmit/iris/Iris.java | 128 ++------------- .../iris/core/safeguard/IrisSafeguard.java | 5 + .../com/volmit/iris/util/misc/Bindings.java | 146 ++++++++++++++++++ core/src/main/resources/plugin.yml | 7 +- settings.gradle.kts | 2 +- 9 files changed, 215 insertions(+), 197 deletions(-) delete mode 100644 core/paper-loader/build.gradle.kts delete mode 100644 core/paper-loader/src/main/java/com/volmit/iris/IrisPluginLoader.java create mode 100644 core/src/main/java/com/volmit/iris/util/misc/Bindings.java diff --git a/build.gradle.kts b/build.gradle.kts index d3cfd5fee..44ef145a6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -30,7 +30,7 @@ buildscript { plugins { java `java-library` - id("com.gradleup.shadow") version "8.3.6" + id("com.gradleup.shadow") version "9.0.0-rc1" id("de.undercouch.download") version "5.0.1" id("xyz.jpenilla.run-paper") version "2.3.1" id("io.sentry.jvm.gradle") version "5.7.0" diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 4d7f24b67..9aa0f57a2 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -1,3 +1,7 @@ +import io.github.slimjar.func.slimjar +import io.github.slimjar.resolver.data.Mirror +import java.net.URI + /* * Iris is a World Generator for Minecraft Bukkit Servers * Copyright (c) 2021 Arcane Arts (Volmit Software) @@ -21,14 +25,11 @@ plugins { `java-library` id("com.gradleup.shadow") id("io.sentry.jvm.gradle") + id("de.crazydev22.slimjar") version "2.0.6" } val apiVersion = "1.19" val main = "com.volmit.iris.Iris" -val loader = "com.volmit.iris.IrisPluginLoader" - -val dynamic: Configuration by configurations.creating -configurations.compileOnly { extendsFrom(dynamic) } /** * Dependencies. @@ -64,30 +65,32 @@ dependencies { //implementation files("libs/CustomItems.jar") // Shaded - implementation("com.dfsek:paralithic:0.8.1") - implementation("io.papermc:paperlib:1.0.5") - implementation("net.kyori:adventure-text-minimessage:4.17.0") - implementation("net.kyori:adventure-platform-bukkit:4.3.4") - implementation("net.kyori:adventure-api:4.17.0") - implementation("org.bstats:bstats-bukkit:3.1.0") - implementation(project(":core:paper-loader")) + implementation(slimjar()) // Dynamically Loaded - dynamic("commons-io:commons-io:2.13.0") - dynamic("commons-lang:commons-lang:2.6") - dynamic("com.github.oshi:oshi-core:6.6.5") - dynamic("org.lz4:lz4-java:1.8.0") - dynamic("it.unimi.dsi:fastutil:8.5.8") - dynamic("com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-lru:1.4.2") - dynamic("org.zeroturnaround:zt-zip:1.14") - dynamic("com.google.code.gson:gson:2.10.1") - dynamic("org.ow2.asm:asm:9.8") - dynamic("bsf:bsf:2.4.0") - dynamic("rhino:js:1.7R2") - dynamic("com.github.ben-manes.caffeine:caffeine:3.0.6") - dynamic("org.apache.commons:commons-lang3:3.12.0") - dynamic("net.bytebuddy:byte-buddy:1.17.5") - dynamic("net.bytebuddy:byte-buddy-agent:1.17.5") + slim("com.dfsek:paralithic:0.8.1") + slim("io.papermc:paperlib:1.0.5") + slim("net.kyori:adventure-text-minimessage:4.17.0") + slim("net.kyori:adventure-platform-bukkit:4.3.4") + slim("net.kyori:adventure-api:4.17.0") + slim("org.bstats:bstats-bukkit:3.1.0") + slim("io.sentry:sentry:8.12.0") + + slim("commons-io:commons-io:2.13.0") + slim("commons-lang:commons-lang:2.6") + slim("com.github.oshi:oshi-core:6.6.5") + slim("org.lz4:lz4-java:1.8.0") + slim("it.unimi.dsi:fastutil:8.5.8") + slim("com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-lru:1.4.2") + slim("org.zeroturnaround:zt-zip:1.14") + slim("com.google.code.gson:gson:2.10.1") + slim("org.ow2.asm:asm:9.8") + slim("bsf:bsf:2.4.0") + slim("rhino:js:1.7R2") + slim("com.github.ben-manes.caffeine:caffeine:3.0.6") + slim("org.apache.commons:commons-lang3:3.12.0") + slim("net.bytebuddy:byte-buddy:1.17.5") + slim("net.bytebuddy:byte-buddy-agent:1.17.5") } java { @@ -95,6 +98,7 @@ java { } sentry { + autoInstallation.enabled = false includeSourceContext = true org = "volmit-software" @@ -102,6 +106,20 @@ sentry { authToken = findProperty("sentry.auth.token") as String? ?: System.getenv("SENTRY_AUTH_TOKEN") } +slimJar { + mirrors = listOf(Mirror( + URI.create("https://maven-central.storage-download.googleapis.com/maven2").toURL(), + URI.create("https://repo.maven.apache.org/maven2/").toURL() + )) + + val libs = "com.volmit.iris.util" + relocate("com.dfsek.paralithic", "$libs.paralithic") + relocate("io.papermc.lib", "$libs.paper") + relocate("net.kyori", "$libs.kyori") + relocate("org.bstats", "$libs.metrics") + relocate("io.sentry", "$libs.sentry") +} + tasks { /** * We need parameter meta for the decree command system @@ -120,8 +138,6 @@ tasks { "version" to rootProject.version, "apiVersion" to apiVersion, "main" to main, - "loader" to loader, - "libraries" to dynamic.allDependencies.map { "\n - $it" }.sorted().joinToString("") ) filesMatching("**/plugin.yml") { expand(inputs.properties) @@ -130,17 +146,7 @@ tasks { shadowJar { mergeServiceFiles() - relocate("com.dfsek.paralithic", "com.volmit.iris.util.paralithic") - relocate("io.papermc.lib", "com.volmit.iris.util.paper") - relocate("net.kyori", "com.volmit.iris.util.kyori") - relocate("org.bstats", "com.volmit.iris.util.metrics") - relocate("io.sentry", "com.volmit.iris.util.sentry") - //minimize() - dependencies { - exclude(dependency("org.ow2.asm:asm:")) - exclude(dependency("org.jetbrains:")) - } } } diff --git a/core/paper-loader/build.gradle.kts b/core/paper-loader/build.gradle.kts deleted file mode 100644 index 367c9bbc9..000000000 --- a/core/paper-loader/build.gradle.kts +++ /dev/null @@ -1,3 +0,0 @@ -dependencies { - compileOnly("io.papermc.paper:paper-api:1.20.1-R0.1-SNAPSHOT") -} \ No newline at end of file diff --git a/core/paper-loader/src/main/java/com/volmit/iris/IrisPluginLoader.java b/core/paper-loader/src/main/java/com/volmit/iris/IrisPluginLoader.java deleted file mode 100644 index c032b5b22..000000000 --- a/core/paper-loader/src/main/java/com/volmit/iris/IrisPluginLoader.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.volmit.iris; - -import io.papermc.paper.plugin.loader.PluginClasspathBuilder; -import io.papermc.paper.plugin.loader.PluginLoader; -import io.papermc.paper.plugin.loader.library.impl.MavenLibraryResolver; -import lombok.SneakyThrows; -import org.bukkit.configuration.file.YamlConfiguration; -import org.eclipse.aether.artifact.DefaultArtifact; -import org.eclipse.aether.graph.Dependency; -import org.eclipse.aether.repository.RemoteRepository; -import org.jetbrains.annotations.NotNull; - -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.net.URI; - -@SuppressWarnings("all") -public class IrisPluginLoader implements PluginLoader { - - @SneakyThrows - @Override - public void classloader(@NotNull PluginClasspathBuilder builder) { - var pluginUri = URI.create("jar:file:" + builder.getContext().getPluginSource().toAbsolutePath() + "!/plugin.yml"); - var plugin = YamlConfiguration.loadConfiguration(new BufferedReader(new InputStreamReader(pluginUri.toURL().openStream()))); - var repository = "https://maven-central.storage-download.googleapis.com/maven2"; - - try { - var field = MavenLibraryResolver.class.getDeclaredField("MAVEN_CENTRAL_DEFAULT_MIRROR"); - repository = (String) field.get(null); - } catch (Throwable e) {} - - var resolver = new MavenLibraryResolver(); - resolver.addRepository(new RemoteRepository.Builder("central", "default", repository).build()); - plugin.getStringList("libraries").forEach(library -> resolver.addDependency(new Dependency(new DefaultArtifact(library), null))); - builder.addLibrary(resolver); - } -} diff --git a/core/src/main/java/com/volmit/iris/Iris.java b/core/src/main/java/com/volmit/iris/Iris.java index 7904a6f20..7b9c53f4c 100644 --- a/core/src/main/java/com/volmit/iris/Iris.java +++ b/core/src/main/java/com/volmit/iris/Iris.java @@ -30,7 +30,6 @@ import com.volmit.iris.core.loader.IrisData; import com.volmit.iris.core.nms.INMS; import com.volmit.iris.core.nms.v1X.NMSBinding1X; import com.volmit.iris.core.pregenerator.LazyPregenerator; -import com.volmit.iris.core.safeguard.ServerBootSFG; import com.volmit.iris.core.service.StudioSVC; import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.engine.EnginePanic; @@ -39,11 +38,9 @@ import com.volmit.iris.engine.object.IrisDimension; import com.volmit.iris.engine.object.IrisWorld; import com.volmit.iris.engine.platform.BukkitChunkGenerator; import com.volmit.iris.core.safeguard.IrisSafeguard; -import com.volmit.iris.core.safeguard.UtilsSFG; 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.context.IrisContext; import com.volmit.iris.util.exceptions.IrisException; import com.volmit.iris.util.format.C; import com.volmit.iris.util.format.Form; @@ -52,30 +49,19 @@ import com.volmit.iris.util.io.FileWatcher; import com.volmit.iris.util.io.IO; import com.volmit.iris.util.io.InstanceState; import com.volmit.iris.util.io.JarScanner; -import com.volmit.iris.util.json.JSONException; import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.RNG; +import com.volmit.iris.util.misc.Bindings; import com.volmit.iris.util.misc.getHardware; import com.volmit.iris.util.parallel.MultiBurst; import com.volmit.iris.util.plugin.IrisService; import com.volmit.iris.util.plugin.VolmitPlugin; import com.volmit.iris.util.plugin.VolmitSender; -import com.volmit.iris.util.reflect.ShadeFix; import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.Queue; import com.volmit.iris.util.scheduling.ShurikenQueue; -import com.volmit.iris.util.sentry.Attachments; -import com.volmit.iris.util.sentry.IrisLogger; -import com.volmit.iris.util.sentry.ServerID; -import io.papermc.lib.PaperLib; -import io.sentry.Sentry; +import io.github.slimjar.app.builder.ApplicationBuilder; import lombok.NonNull; -import net.kyori.adventure.platform.bukkit.BukkitAudiences; -import net.kyori.adventure.text.serializer.ComponentSerializer; -import org.bstats.bukkit.Metrics; -import org.bstats.charts.DrilldownPie; -import org.bstats.charts.SimplePie; -import org.bstats.charts.SingleLineChart; import org.bukkit.*; import org.bukkit.block.data.BlockData; import org.bukkit.command.Command; @@ -91,17 +77,13 @@ import org.bukkit.plugin.IllegalPluginAccessException; import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import oshi.SystemInfo; import java.io.*; import java.lang.annotation.Annotation; -import java.math.RoundingMode; import java.net.URL; -import java.text.NumberFormat; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Collectors; import static com.volmit.iris.core.safeguard.IrisSafeguard.*; import static com.volmit.iris.core.safeguard.ServerBootSFG.passedserversoftware; @@ -111,7 +93,7 @@ public class Iris extends VolmitPlugin implements Listener { private static final Queue syncJobs = new ShurikenQueue<>(); public static Iris instance; - public static BukkitAudiences audiences; + public static Bindings.Adventure audiences; public static MultiverseCoreLink linkMultiverseCore; public static MythicMobsLink linkMythicMobs; public static IrisCompat compat; @@ -120,7 +102,6 @@ public class Iris extends VolmitPlugin implements Listener { static { try { - fixShading(); InstanceState.updateInstanceId(); } catch (Throwable ignored) { @@ -397,7 +378,7 @@ public class Iris extends VolmitPlugin implements Listener { } public static void reportError(Throwable e) { - Sentry.captureException(e); + Bindings.capture(e); if (IrisSettings.get().getGeneral().isDebug()) { String n = e.getClass().getCanonicalName() + "-" + e.getStackTrace()[0].getClassName() + "-" + e.getStackTrace()[0].getLineNumber(); @@ -455,14 +436,21 @@ public class Iris extends VolmitPlugin implements Listener { EnginePanic.add(s, v); } - private static void fixShading() { - ShadeFix.fix(ComponentSerializer.class); + public Iris() { + ApplicationBuilder.appending("Iris") + .downloadDirectoryPath(getDataFolder("cache", "libraries").toPath()) + .logger((message, args) -> { + if (!message.startsWith("Loaded library ")) return; + getLogger().info(message.formatted(args)); + }) + .build(); } + private void enable() { instance = this; services = new KMap<>(); setupAudience(); - setupSentry(); + Bindings.setupSentry(); initialize("com.volmit.iris.core.service").forEach((i) -> services.put((Class) i.getClass(), (IrisService) i)); IO.delete(new File("iris")); compat = IrisCompat.configured(getDataFile("compat.json")); @@ -476,7 +464,7 @@ public class Iris extends VolmitPlugin implements Listener { services.values().forEach(IrisService::onEnable); services.values().forEach(this::registerListener); J.s(() -> { - J.a(() -> PaperLib.suggestPaper(this)); + J.a(IrisSafeguard::suggestPaper); J.a(() -> IO.delete(getTemp())); J.a(LazyPregenerator::loadLazyGenerators, 100); J.a(this::bstats); @@ -556,7 +544,7 @@ public class Iris extends VolmitPlugin implements Listener { private void setupAudience() { try { - audiences = BukkitAudiences.create(this); + audiences = new Bindings.Adventure(this); } catch (Throwable e) { e.printStackTrace(); IrisSettings.get().getGeneral().setUseConsoleCustomColors(false); @@ -689,50 +677,7 @@ public class Iris extends VolmitPlugin implements Listener { private void bstats() { if (IrisSettings.get().getGeneral().isPluginMetrics()) { - J.s(() -> { - var metrics = new Metrics(Iris.instance, 24220); - metrics.addCustomChart(new SingleLineChart("custom_dimensions", () -> Bukkit.getWorlds() - .stream() - .filter(IrisToolbelt::isIrisWorld) - .mapToInt(w -> 1) - .sum())); - - metrics.addCustomChart(new DrilldownPie("used_packs", () -> Bukkit.getWorlds().stream() - .map(IrisToolbelt::access) - .filter(Objects::nonNull) - .map(PlatformChunkGenerator::getEngine) - .collect(Collectors.toMap(engine -> engine.getDimension().getLoadKey(), engine -> { - var hash32 = engine.getHash32().getNow(null); - if (hash32 == null) return Map.of(); - int version = engine.getDimension().getVersion(); - String checksum = Long.toHexString(hash32); - - return Map.of("v" + version + " (" + checksum + ")", 1); - }, (a, b) -> { - Map merged = new HashMap<>(a); - b.forEach((k, v) -> merged.merge(k, v, Integer::sum)); - return merged; - })))); - - - var info = new SystemInfo().getHardware(); - var cpu = info.getProcessor().getProcessorIdentifier(); - var mem = info.getMemory(); - metrics.addCustomChart(new SimplePie("cpu_model", cpu::getName)); - - var nf = NumberFormat.getInstance(Locale.ENGLISH); - nf.setMinimumFractionDigits(0); - nf.setMaximumFractionDigits(2); - nf.setRoundingMode(RoundingMode.HALF_UP); - - metrics.addCustomChart(new DrilldownPie("memory", () -> { - double total = mem.getTotal() * 1E-9; - double alloc = Math.min(total, Runtime.getRuntime().maxMemory() * 1E-9); - return Map.of(nf.format(alloc), Map.of(nf.format(total), 1)); - })); - - postShutdown.add(metrics::shutdown); - }); + Bindings.setupBstats(this); } } @@ -937,43 +882,4 @@ public class Iris extends VolmitPlugin implements Listener { return -1; } } - - private static boolean suppress(Throwable e) { - return (e instanceof IllegalStateException ex && "zip file closed".equals(ex.getMessage())) || e instanceof JSONException; - } - - private static void setupSentry() { - var settings = IrisSettings.get().getSentry(); - if (settings.disableAutoReporting || Sentry.isEnabled() || Boolean.getBoolean("iris.suppressReporting")) return; - Iris.info("Enabling Sentry for anonymous error reporting. You can disable this in the settings."); - Iris.info("Your server ID is: " + ServerID.ID); - Sentry.init(options -> { - options.setDsn("https://b16ecc222e9c1e0c48faecacb906fd89@o4509451052646400.ingest.de.sentry.io/4509452722765904"); - if (settings.debug) { - options.setLogger(new IrisLogger()); - options.setDebug(true); - } - - options.setAttachServerName(false); - options.setEnableUncaughtExceptionHandler(false); - options.setRelease(Iris.instance.getDescription().getVersion()); - options.setBeforeSend((event, hint) -> { - if (suppress(event.getThrowable())) return null; - event.setTag("iris.safeguard", IrisSafeguard.mode()); - event.setTag("iris.nms", INMS.get().getClass().getCanonicalName()); - var context = IrisContext.get(); - if (context != null) event.getContexts().set("engine", context.asContext()); - event.getContexts().set("safeguard", IrisSafeguard.asContext()); - return event; - }); - }); - Sentry.configureScope(scope -> { - if (settings.includeServerId) scope.setUser(ServerID.asUser()); - scope.addAttachment(Attachments.PLUGINS); - scope.setTag("server", Bukkit.getVersion()); - scope.setTag("server.type", Bukkit.getName()); - scope.setTag("server.api", Bukkit.getBukkitVersion()); - }); - Runtime.getRuntime().addShutdownHook(new Thread(Sentry::close)); - } } diff --git a/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java b/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java index 7a4ca9b5c..bef5f165a 100644 --- a/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java +++ b/core/src/main/java/com/volmit/iris/core/safeguard/IrisSafeguard.java @@ -4,6 +4,7 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; +import io.papermc.lib.PaperLib; import java.util.concurrent.atomic.AtomicBoolean; @@ -38,6 +39,10 @@ public class IrisSafeguard { } } + public static void suggestPaper() { + PaperLib.suggestPaper(Iris.instance); + } + public static KMap asContext() { KMap m = new KMap<>(); m.put("diskSpace", !ServerBootSFG.hasEnoughDiskSpace); diff --git a/core/src/main/java/com/volmit/iris/util/misc/Bindings.java b/core/src/main/java/com/volmit/iris/util/misc/Bindings.java new file mode 100644 index 000000000..308d3d235 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/util/misc/Bindings.java @@ -0,0 +1,146 @@ +package com.volmit.iris.util.misc; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.IrisSettings; +import com.volmit.iris.core.nms.INMS; +import com.volmit.iris.core.safeguard.IrisSafeguard; +import com.volmit.iris.core.tools.IrisToolbelt; +import com.volmit.iris.engine.platform.PlatformChunkGenerator; +import com.volmit.iris.util.context.IrisContext; +import com.volmit.iris.util.json.JSONException; +import com.volmit.iris.util.reflect.ShadeFix; +import com.volmit.iris.util.scheduling.J; +import com.volmit.iris.util.sentry.Attachments; +import com.volmit.iris.util.sentry.IrisLogger; +import com.volmit.iris.util.sentry.ServerID; +import io.sentry.Sentry; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; +import net.kyori.adventure.text.serializer.ComponentSerializer; +import org.bstats.bukkit.Metrics; +import org.bstats.charts.DrilldownPie; +import org.bstats.charts.SimplePie; +import org.bstats.charts.SingleLineChart; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import oshi.SystemInfo; + +import java.math.RoundingMode; +import java.text.NumberFormat; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +public class Bindings { + + public static void capture(Throwable throwable) { + Sentry.captureException(throwable); + } + + public static void setupSentry() { + var settings = IrisSettings.get().getSentry(); + if (settings.disableAutoReporting || Sentry.isEnabled() || Boolean.getBoolean("iris.suppressReporting")) return; + Iris.info("Enabling Sentry for anonymous error reporting. You can disable this in the settings."); + Iris.info("Your server ID is: " + ServerID.ID); + Sentry.init(options -> { + options.setDsn("https://b16ecc222e9c1e0c48faecacb906fd89@o4509451052646400.ingest.de.sentry.io/4509452722765904"); + if (settings.debug) { + options.setLogger(new IrisLogger()); + options.setDebug(true); + } + + options.setAttachServerName(false); + options.setEnableUncaughtExceptionHandler(false); + options.setRelease(Iris.instance.getDescription().getVersion()); + options.setBeforeSend((event, hint) -> { + if (suppress(event.getThrowable())) return null; + event.setTag("iris.safeguard", IrisSafeguard.mode()); + event.setTag("iris.nms", INMS.get().getClass().getCanonicalName()); + var context = IrisContext.get(); + if (context != null) event.getContexts().set("engine", context.asContext()); + event.getContexts().set("safeguard", IrisSafeguard.asContext()); + return event; + }); + }); + Sentry.configureScope(scope -> { + if (settings.includeServerId) scope.setUser(ServerID.asUser()); + scope.addAttachment(Attachments.PLUGINS); + scope.setTag("server", Bukkit.getVersion()); + scope.setTag("server.type", Bukkit.getName()); + scope.setTag("server.api", Bukkit.getBukkitVersion()); + }); + Runtime.getRuntime().addShutdownHook(new Thread(Sentry::close)); + } + + private static boolean suppress(Throwable e) { + return (e instanceof IllegalStateException ex && "zip file closed".equals(ex.getMessage())) || e instanceof JSONException; + } + + + public static void setupBstats(Iris plugin) { + J.s(() -> { + var metrics = new Metrics(plugin, 24220); + metrics.addCustomChart(new SingleLineChart("custom_dimensions", () -> Bukkit.getWorlds() + .stream() + .filter(IrisToolbelt::isIrisWorld) + .mapToInt(w -> 1) + .sum())); + + metrics.addCustomChart(new DrilldownPie("used_packs", () -> Bukkit.getWorlds().stream() + .map(IrisToolbelt::access) + .filter(Objects::nonNull) + .map(PlatformChunkGenerator::getEngine) + .collect(Collectors.toMap(engine -> engine.getDimension().getLoadKey(), engine -> { + var hash32 = engine.getHash32().getNow(null); + if (hash32 == null) return Map.of(); + int version = engine.getDimension().getVersion(); + String checksum = Long.toHexString(hash32); + + return Map.of("v" + version + " (" + checksum + ")", 1); + }, (a, b) -> { + Map merged = new HashMap<>(a); + b.forEach((k, v) -> merged.merge(k, v, Integer::sum)); + return merged; + })))); + + + var info = new SystemInfo().getHardware(); + var cpu = info.getProcessor().getProcessorIdentifier(); + var mem = info.getMemory(); + metrics.addCustomChart(new SimplePie("cpu_model", cpu::getName)); + + var nf = NumberFormat.getInstance(Locale.ENGLISH); + nf.setMinimumFractionDigits(0); + nf.setMaximumFractionDigits(2); + nf.setRoundingMode(RoundingMode.HALF_UP); + + metrics.addCustomChart(new DrilldownPie("memory", () -> { + double total = mem.getTotal() * 1E-9; + double alloc = Math.min(total, Runtime.getRuntime().maxMemory() * 1E-9); + return Map.of(nf.format(alloc), Map.of(nf.format(total), 1)); + })); + + plugin.postShutdown(metrics::shutdown); + }); + } + + public static class Adventure { + private final BukkitAudiences audiences; + + public Adventure(Iris plugin) { + ShadeFix.fix(ComponentSerializer.class); + this.audiences = BukkitAudiences.create(plugin); + } + + public Audience player(Player player) { + return audiences.player(player); + } + + public Audience sender(CommandSender sender) { + return audiences.sender(sender); + } + } +} diff --git a/core/src/main/resources/plugin.yml b/core/src/main/resources/plugin.yml index 5b6fc940c..99fa326be 100644 --- a/core/src/main/resources/plugin.yml +++ b/core/src/main/resources/plugin.yml @@ -5,12 +5,7 @@ load: STARTUP authors: [ cyberpwn, NextdoorPsycho, Vatuu ] website: volmit.com description: More than a Dimension! -libraries: ${libraries} commands: iris: aliases: [ ir, irs ] -api-version: '${apiVersion}' -hotload-dependencies: false - -paper-plugin-loader: ${loader} -paper-skip-libraries: true \ No newline at end of file +api-version: '${apiVersion}' \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 138a3c25c..18cbee3fe 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -21,7 +21,7 @@ plugins { rootProject.name = "Iris" -include(":core", ":core:agent", ":core:paper-loader") +include(":core", ":core:agent") include( ":nms:v1_21_R5", ":nms:v1_21_R4", From 03c5998c02dd4d83c9a567f6f7d0af20e3cf3372 Mon Sep 17 00:00:00 2001 From: Julian Krings Date: Tue, 8 Jul 2025 19:08:12 +0200 Subject: [PATCH 3/6] generate a dummy region for standalone focus biomes --- .../java/com/volmit/iris/engine/IrisComplex.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/engine/IrisComplex.java b/core/src/main/java/com/volmit/iris/engine/IrisComplex.java index 652b728ca..70422c6a1 100644 --- a/core/src/main/java/com/volmit/iris/engine/IrisComplex.java +++ b/core/src/main/java/com/volmit/iris/engine/IrisComplex.java @@ -42,6 +42,7 @@ import org.bukkit.Material; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; +import java.io.File; import java.util.UUID; @Data @@ -110,8 +111,6 @@ public class IrisComplex implements DataProvider { //@builder if (focusRegion != null) { focusRegion.getAllBiomes(this).forEach(this::registerGenerators); - } else if (focusBiome != null) { - registerGenerators(focusBiome); } else { engine.getDimension() .getRegions() @@ -252,7 +251,15 @@ public class IrisComplex implements DataProvider { } } - return null; + String key = UUID.randomUUID().toString(); + IrisRegion region = new IrisRegion(); + region.getLandBiomes().add(focus.getLoadKey()); + region.getSeaBiomes().add(focus.getLoadKey()); + region.getShoreBiomes().add(focus.getLoadKey()); + region.setLoadKey(key); + region.setLoader(data); + region.setLoadFile(new File(data.getDataFolder(), data.getRegionLoader().getFolderName() + "/" + key + ".json")); + return region; } private IrisDecorator decorateFor(IrisBiome b, double x, double z, IrisDecorationPart part) { From 0b1af51227e40a76f185f3bad8e4275426896ec9 Mon Sep 17 00:00:00 2001 From: Julian Krings Date: Tue, 8 Jul 2025 19:52:09 +0200 Subject: [PATCH 4/6] add option to disable specific mantle components for testing --- .../iris/core/project/SchemaBuilder.java | 20 ++++++++++ .../volmit/iris/engine/IrisEngineMantle.java | 14 ++++++- .../iris/engine/mantle/ComponentFlag.java | 14 +++++++ .../iris/engine/mantle/EngineMantle.java | 6 ++- .../engine/mantle/IrisMantleComponent.java | 1 + .../iris/engine/mantle/MantleComponent.java | 4 ++ .../components/MantleCarvingComponent.java | 2 + .../components/MantleFluidBodyComponent.java | 2 + .../components/MantleJigsawComponent.java | 2 + .../components/MantleObjectComponent.java | 2 + .../iris/engine/object/IrisDimension.java | 6 +++ .../functions/ComponentFlagFunction.java | 37 +++++++++++++++++++ 12 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 core/src/main/java/com/volmit/iris/engine/mantle/ComponentFlag.java create mode 100644 core/src/main/java/com/volmit/iris/engine/object/annotations/functions/ComponentFlagFunction.java diff --git a/core/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java b/core/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java index 2e133f944..d856d2b8e 100644 --- a/core/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java +++ b/core/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java @@ -466,6 +466,26 @@ public class SchemaBuilder { items.put("$ref", "#/definitions/" + key); prop.put("items", items); description.add(SYMBOL_TYPE__N + " Must be a valid Enchantment Type (use ctrl+space for auto complete!)"); + } else if (k.isAnnotationPresent(RegistryListFunction.class)) { + var functionClass = k.getDeclaredAnnotation(RegistryListFunction.class).value(); + try { + var instance = functionClass.getDeclaredConstructor().newInstance(); + String key = instance.key(); + fancyType = instance.fancyName(); + + if (!definitions.containsKey(key)) { + JSONObject j = new JSONObject(); + j.put("enum", instance.apply(data)); + definitions.put(key, j); + } + + JSONObject items = new JSONObject(); + items.put("$ref", "#/definitions/" + key); + prop.put("items", items); + description.add(SYMBOL_TYPE__N + " Must be a valid " + fancyType + " (use ctrl+space for auto complete!)"); + } catch (Throwable e) { + Iris.error("Could not execute apply method in " + functionClass.getName()); + } } else if (t.type().equals(PotionEffectType.class)) { fancyType = "List of Potion Effect Types"; String key = "enum-potion-effect-type"; 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 c3b385361..e58324ad7 100644 --- a/core/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java +++ b/core/src/main/java/com/volmit/iris/engine/IrisEngineMantle.java @@ -29,7 +29,9 @@ import com.volmit.iris.engine.mantle.components.MantleJigsawComponent; import com.volmit.iris.engine.mantle.components.MantleObjectComponent; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; +import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.mantle.Mantle; +import com.volmit.iris.util.mantle.MantleFlag; import lombok.*; import java.io.File; @@ -44,7 +46,7 @@ public class IrisEngineMantle implements EngineMantle { @Getter(AccessLevel.NONE) private final KMap> components; private final AtomicCache, Integer>>> componentsCache = new AtomicCache<>(); - private final AtomicCache radCache = new AtomicCache<>(); + private final AtomicCache> disabledFlags = new AtomicCache<>(); private final MantleObjectComponent object; private final MantleJigsawComponent jigsaw; @@ -101,10 +103,20 @@ public class IrisEngineMantle implements EngineMantle { @Override public void registerComponent(MantleComponent c) { + c.setEnabled(!getDimension().getDisabledComponents().contains(c.getFlag())); components.computeIfAbsent(c.getPriority(), k -> new KList<>()).add(c); componentsCache.reset(); } + @Override + public KList getComponentFlags() { + return components.values() + .stream() + .flatMap(KList::stream) + .map(MantleComponent::getFlag) + .collect(KList.collector()); + } + @Override public MantleJigsawComponent getJigsawComponent() { return jigsaw; diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/ComponentFlag.java b/core/src/main/java/com/volmit/iris/engine/mantle/ComponentFlag.java new file mode 100644 index 000000000..1c7fe20b2 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/engine/mantle/ComponentFlag.java @@ -0,0 +1,14 @@ +package com.volmit.iris.engine.mantle; + +import com.volmit.iris.util.mantle.MantleFlag; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface ComponentFlag { + MantleFlag value(); +} 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 ba0759c83..d37814e0c 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 @@ -65,6 +65,8 @@ public interface EngineMantle extends IObjectPlacer { void registerComponent(MantleComponent c); + KList getComponentFlags(); + default int getHighest(int x, int z) { return getHighest(x, z, getData()); } @@ -227,7 +229,9 @@ public interface EngineMantle extends IObjectPlacer { } default void generateMantleComponent(MantleWriter writer, int x, int z, MantleComponent c, MantleChunk mc, ChunkContext context) { - mc.raiseFlag(c.getFlag(), () -> c.generateLayer(writer, x, z, context)); + mc.raiseFlag(c.getFlag(), () -> { + if (c.isEnabled()) c.generateLayer(writer, x, z, context); + }); } @ChunkCoordinates diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/IrisMantleComponent.java b/core/src/main/java/com/volmit/iris/engine/mantle/IrisMantleComponent.java index 388518c0d..cfe72ae39 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/IrisMantleComponent.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/IrisMantleComponent.java @@ -30,4 +30,5 @@ public abstract class IrisMantleComponent implements MantleComponent { private final EngineMantle engineMantle; private final MantleFlag flag; private final int priority; + private boolean enabled = true; } diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/MantleComponent.java b/core/src/main/java/com/volmit/iris/engine/mantle/MantleComponent.java index 3c9c78dc5..64c69d5c6 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/MantleComponent.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/MantleComponent.java @@ -61,6 +61,10 @@ public interface MantleComponent extends Comparable { MantleFlag getFlag(); + boolean isEnabled(); + + void setEnabled(boolean b); + @ChunkCoordinates void generateLayer(MantleWriter writer, int x, int z, ChunkContext context); diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleCarvingComponent.java b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleCarvingComponent.java index 8d067abfd..eca862c79 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleCarvingComponent.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleCarvingComponent.java @@ -19,6 +19,7 @@ package com.volmit.iris.engine.mantle.components; import com.volmit.iris.engine.data.cache.Cache; +import com.volmit.iris.engine.mantle.ComponentFlag; import com.volmit.iris.engine.mantle.EngineMantle; import com.volmit.iris.engine.mantle.IrisMantleComponent; import com.volmit.iris.engine.mantle.MantleWriter; @@ -32,6 +33,7 @@ import com.volmit.iris.util.math.RNG; import lombok.Getter; @Getter +@ComponentFlag(MantleFlag.CARVED) public class MantleCarvingComponent extends IrisMantleComponent { private final int radius = computeRadius(); diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleFluidBodyComponent.java b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleFluidBodyComponent.java index bd45353c2..15389715e 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleFluidBodyComponent.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleFluidBodyComponent.java @@ -19,6 +19,7 @@ package com.volmit.iris.engine.mantle.components; import com.volmit.iris.engine.data.cache.Cache; +import com.volmit.iris.engine.mantle.ComponentFlag; import com.volmit.iris.engine.mantle.EngineMantle; import com.volmit.iris.engine.mantle.IrisMantleComponent; import com.volmit.iris.engine.mantle.MantleWriter; @@ -32,6 +33,7 @@ import com.volmit.iris.util.math.RNG; import lombok.Getter; @Getter +@ComponentFlag(MantleFlag.FLUID_BODIES) public class MantleFluidBodyComponent extends IrisMantleComponent { private final int radius = computeRadius(); diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java index 6ba27c542..e5f551872 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleJigsawComponent.java @@ -19,6 +19,7 @@ package com.volmit.iris.engine.mantle.components; import com.volmit.iris.engine.jigsaw.PlannedStructure; +import com.volmit.iris.engine.mantle.ComponentFlag; import com.volmit.iris.engine.mantle.EngineMantle; import com.volmit.iris.engine.mantle.IrisMantleComponent; import com.volmit.iris.engine.mantle.MantleWriter; @@ -39,6 +40,7 @@ import org.jetbrains.annotations.Nullable; import java.util.List; +@ComponentFlag(MantleFlag.JIGSAW) public class MantleJigsawComponent extends IrisMantleComponent { @Getter private final int radius = computeRadius(); diff --git a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleObjectComponent.java b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleObjectComponent.java index b8d4f9fd8..a4ca6dd7a 100644 --- a/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleObjectComponent.java +++ b/core/src/main/java/com/volmit/iris/engine/mantle/components/MantleObjectComponent.java @@ -20,6 +20,7 @@ package com.volmit.iris.engine.mantle.components; import com.volmit.iris.Iris; import com.volmit.iris.engine.data.cache.Cache; +import com.volmit.iris.engine.mantle.ComponentFlag; import com.volmit.iris.engine.mantle.EngineMantle; import com.volmit.iris.engine.mantle.IrisMantleComponent; import com.volmit.iris.engine.mantle.MantleWriter; @@ -47,6 +48,7 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; @Getter +@ComponentFlag(MantleFlag.OBJECT) public class MantleObjectComponent extends IrisMantleComponent { private final int radius = computeRadius(); diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisDimension.java b/core/src/main/java/com/volmit/iris/engine/object/IrisDimension.java index 6ff0fa44f..ef76eac9f 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisDimension.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisDimension.java @@ -28,11 +28,13 @@ import com.volmit.iris.core.nms.datapack.IDataFixer; import com.volmit.iris.core.nms.datapack.IDataFixer.Dimension; import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.object.annotations.*; +import com.volmit.iris.engine.object.annotations.functions.ComponentFlagFunction; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.data.DataProvider; import com.volmit.iris.util.io.IO; import com.volmit.iris.util.json.JSONObject; +import com.volmit.iris.util.mantle.MantleFlag; import com.volmit.iris.util.math.Position2; import com.volmit.iris.util.math.RNG; import com.volmit.iris.util.noise.CNG; @@ -238,6 +240,10 @@ public class IrisDimension extends IrisRegistrant { @MaxNumber(318) @Desc("The Subterrain Fluid Layer Height") private int caveLavaHeight = 8; + @RegistryListFunction(ComponentFlagFunction.class) + @ArrayType(type = MantleFlag.class) + @Desc("Collection of disabled components") + private KList disabledComponents = new KList<>(); public int getMaxHeight() { return (int) getDimensionHeight().getMax(); diff --git a/core/src/main/java/com/volmit/iris/engine/object/annotations/functions/ComponentFlagFunction.java b/core/src/main/java/com/volmit/iris/engine/object/annotations/functions/ComponentFlagFunction.java new file mode 100644 index 000000000..7a0c01755 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/engine/object/annotations/functions/ComponentFlagFunction.java @@ -0,0 +1,37 @@ +package com.volmit.iris.engine.object.annotations.functions; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.loader.IrisData; +import com.volmit.iris.engine.framework.ListFunction; +import com.volmit.iris.engine.mantle.ComponentFlag; +import com.volmit.iris.engine.mantle.MantleComponent; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.mantle.MantleFlag; + +import java.util.Objects; + +public class ComponentFlagFunction implements ListFunction> { + @Override + public String key() { + return "component-flag"; + } + + @Override + public String fancyName() { + return "Component Flag"; + } + + @Override + public KList apply(IrisData data) { + var engine = data.getEngine(); + if (engine != null) return engine.getMantle().getComponentFlags().toStringList(); + return Iris.getClasses("com.volmit.iris.engine.mantle.components", ComponentFlag.class) + .stream() + .filter(MantleComponent.class::isAssignableFrom) + .map(c -> c.getDeclaredAnnotation(ComponentFlag.class)) + .filter(Objects::nonNull) + .map(ComponentFlag::value) + .map(MantleFlag::toString) + .collect(KList.collector()); + } +} From a0543bbbf203545d01cbeaab246a90ff7e9dde72 Mon Sep 17 00:00:00 2001 From: Julian Krings Date: Tue, 8 Jul 2025 19:59:45 +0200 Subject: [PATCH 5/6] relocate slimjar --- core/build.gradle.kts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 9aa0f57a2..be3b51086 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -30,6 +30,7 @@ plugins { val apiVersion = "1.19" val main = "com.volmit.iris.Iris" +val libs = "com.volmit.iris.util" /** * Dependencies. @@ -112,7 +113,6 @@ slimJar { URI.create("https://repo.maven.apache.org/maven2/").toURL() )) - val libs = "com.volmit.iris.util" relocate("com.dfsek.paralithic", "$libs.paralithic") relocate("io.papermc.lib", "$libs.paper") relocate("net.kyori", "$libs.kyori") @@ -147,6 +147,7 @@ tasks { shadowJar { mergeServiceFiles() //minimize() + relocate("io.github.slimjar", "$libs.slimjar") } } From 0edaeeec99ea07857d15efe74de0b17d25216a47 Mon Sep 17 00:00:00 2001 From: Julian Krings Date: Tue, 8 Jul 2025 23:40:10 +0200 Subject: [PATCH 6/6] massive cleanup of maven repos and update dependencies --- build.gradle.kts | 33 ++++++------ core/build.gradle.kts | 91 +++++++++++++++++----------------- gradle/libs.versions.toml | 102 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 162 insertions(+), 64 deletions(-) create mode 100644 gradle/libs.versions.toml diff --git a/build.gradle.kts b/build.gradle.kts index 44ef145a6..fd1f9e400 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -30,10 +30,10 @@ buildscript { plugins { java `java-library` - id("com.gradleup.shadow") version "9.0.0-rc1" - id("de.undercouch.download") version "5.0.1" - id("xyz.jpenilla.run-paper") version "2.3.1" - id("io.sentry.jvm.gradle") version "5.7.0" + alias(libs.plugins.shadow) + alias(libs.plugins.sentry) + alias(libs.plugins.download) + alias(libs.plugins.runPaper) } group = "com.volmit" @@ -93,8 +93,8 @@ nmsBindings.forEach { key, value -> dependencies { compileOnly(project(":core")) - compileOnly("org.jetbrains:annotations:26.0.2") - compileOnly("net.bytebuddy:byte-buddy:1.17.5") + compileOnly(rootProject.libs.annotations) + compileOnly(rootProject.libs.byteBuddy.core) } } @@ -187,23 +187,20 @@ allprojects { mavenCentral() maven("https://repo.papermc.io/repository/maven-public/") maven("https://repo.codemc.org/repository/maven-public/") - maven("https://mvn.lumine.io/repository/maven-public/") - maven("https://jitpack.io") - maven("https://s01.oss.sonatype.org/content/repositories/snapshots") - maven("https://mvn.lumine.io/repository/maven/") - maven("https://repo.triumphteam.dev/snapshots") - maven("https://repo.mineinabyss.com/releases") - maven("https://hub.jeff-media.com/nexus/repository/jeff-media-public/") - maven("https://repo.nexomc.com/releases/") - maven("https://nexus.phoenixdevt.fr/repository/maven-public/") - maven("https://repo.onarandombox.com/content/groups/public/") + maven("https://jitpack.io") // EcoItems, score + maven("https://repo.nexomc.com/releases/") // nexo + maven("https://maven.devs.beer/") // itemsadder + maven("https://repo.extendedclip.com/releases/") // placeholderapi + maven("https://mvn.lumine.io/repository/maven-public/") // mythic + maven("https://nexus.phoenixdevt.fr/repository/maven-public/") //MMOItems + maven("https://repo.onarandombox.com/content/groups/public/") //Multiverse Core } dependencies { // Provided or Classpath - compileOnly("org.projectlombok:lombok:1.18.36") - annotationProcessor("org.projectlombok:lombok:1.18.36") + compileOnly(rootProject.libs.lombok) + annotationProcessor(rootProject.libs.lombok) } /** diff --git a/core/build.gradle.kts b/core/build.gradle.kts index be3b51086..ef7cc7168 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -23,14 +23,14 @@ import java.net.URI plugins { java `java-library` - id("com.gradleup.shadow") - id("io.sentry.jvm.gradle") - id("de.crazydev22.slimjar") version "2.0.6" + alias(libs.plugins.shadow) + alias(libs.plugins.sentry) + alias(libs.plugins.slimjar) } val apiVersion = "1.19" val main = "com.volmit.iris.Iris" -val libs = "com.volmit.iris.util" +val lib = "com.volmit.iris.util" /** * Dependencies. @@ -46,52 +46,51 @@ val libs = "com.volmit.iris.util" */ dependencies { // Provided or Classpath - compileOnly("org.spigotmc:spigot-api:1.20.1-R0.1-SNAPSHOT") - compileOnly("org.apache.logging.log4j:log4j-api:2.19.0") - compileOnly("org.apache.logging.log4j:log4j-core:2.19.0") + compileOnly(libs.spigot) + compileOnly(libs.log4j.api) + compileOnly(libs.log4j.core) // Third Party Integrations - compileOnly("com.nexomc:nexo:1.6.0") - compileOnly("com.github.LoneDev6:api-itemsadder:3.4.1-r4") - compileOnly("com.github.PlaceholderAPI:placeholderapi:2.11.3") - compileOnly("com.github.Ssomar-Developement:SCore:4.23.10.8") - compileOnly("net.Indyuce:MMOItems-API:6.9.5-SNAPSHOT") - compileOnly("com.willfp:EcoItems:5.44.0") - compileOnly("io.lumine:Mythic-Dist:5.2.1") - compileOnly("io.lumine:MythicCrucible-Dist:2.0.0") - compileOnly("me.kryniowesegryderiusz:kgenerators-core:7.3") { + compileOnly(libs.nexo) + compileOnly(libs.itemsadder) + compileOnly(libs.placeholderApi) + compileOnly(libs.score) + compileOnly(libs.mmoitems) + compileOnly(libs.ecoitems) + compileOnly(libs.mythic) + compileOnly(libs.mythicChrucible) + compileOnly(libs.kgenerators) { isTransitive = false } - compileOnly("org.mvplugins.multiverse.core:multiverse-core:5.1.0") - //implementation files("libs/CustomItems.jar") + compileOnly(libs.multiverseCore) // Shaded implementation(slimjar()) // Dynamically Loaded - slim("com.dfsek:paralithic:0.8.1") - slim("io.papermc:paperlib:1.0.5") - slim("net.kyori:adventure-text-minimessage:4.17.0") - slim("net.kyori:adventure-platform-bukkit:4.3.4") - slim("net.kyori:adventure-api:4.17.0") - slim("org.bstats:bstats-bukkit:3.1.0") - slim("io.sentry:sentry:8.12.0") + slim(libs.paralithic) + slim(libs.paperlib) + slim(libs.adventure.api) + slim(libs.adventure.minimessage) + slim(libs.adventure.platform) + slim(libs.bstats) + slim(libs.sentry) - slim("commons-io:commons-io:2.13.0") - slim("commons-lang:commons-lang:2.6") - slim("com.github.oshi:oshi-core:6.6.5") - slim("org.lz4:lz4-java:1.8.0") - slim("it.unimi.dsi:fastutil:8.5.8") - slim("com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-lru:1.4.2") - slim("org.zeroturnaround:zt-zip:1.14") - slim("com.google.code.gson:gson:2.10.1") - slim("org.ow2.asm:asm:9.8") - slim("bsf:bsf:2.4.0") - slim("rhino:js:1.7R2") - slim("com.github.ben-manes.caffeine:caffeine:3.0.6") - slim("org.apache.commons:commons-lang3:3.12.0") - slim("net.bytebuddy:byte-buddy:1.17.5") - slim("net.bytebuddy:byte-buddy-agent:1.17.5") + slim(libs.commons.io) + slim(libs.commons.lang) + slim(libs.commons.lang3) + slim(libs.oshi) + slim(libs.lz4) + slim(libs.fastutil) + slim(libs.lru) + slim(libs.zip) + slim(libs.gson) + slim(libs.asm) + slim(libs.bsf) + slim(libs.rhino) + slim(libs.caffeine) + slim(libs.byteBuddy.core) + slim(libs.byteBuddy.agent) } java { @@ -113,11 +112,11 @@ slimJar { URI.create("https://repo.maven.apache.org/maven2/").toURL() )) - relocate("com.dfsek.paralithic", "$libs.paralithic") - relocate("io.papermc.lib", "$libs.paper") - relocate("net.kyori", "$libs.kyori") - relocate("org.bstats", "$libs.metrics") - relocate("io.sentry", "$libs.sentry") + relocate("com.dfsek.paralithic", "$lib.paralithic") + relocate("io.papermc.lib", "$lib.paper") + relocate("net.kyori", "$lib.kyori") + relocate("org.bstats", "$lib.metrics") + relocate("io.sentry", "$lib.sentry") } tasks { @@ -147,7 +146,7 @@ tasks { shadowJar { mergeServiceFiles() //minimize() - relocate("io.github.slimjar", "$libs.slimjar") + relocate("io.github.slimjar", "$lib.slimjar") } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 000000000..81d36c3ee --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,102 @@ +# Version catalog is a central place for you to declare and version dependencies +# https://docs.gradle.org/current/userguide/platforms.html#sub:version-catalog +# https://docs.gradle.org/current/userguide/platforms.html#sub::toml-dependencies-format + +[versions] +# Plugins +shadow = "9.0.0-rc1" # https://plugins.gradle.org/plugin/com.gradleup.shadow +slimjar = "2.0.6" # https://plugins.gradle.org/plugin/de.crazydev22.slimjar +download = "5.6.0" # https://plugins.gradle.org/plugin/de.undercouch.download +runPaper = "2.3.1" # https://plugins.gradle.org/plugin/xyz.jpenilla.run-paper +sentryPlugin = "5.8.0" # https://github.com/getsentry/sentry-android-gradle-plugin + +# Core Libraries +lombok = "1.18.38" +spigot = "1.20.1-R0.1-SNAPSHOT" # https://hub.spigotmc.org/nexus/repository/snapshots/org/spigotmc/spigot-api/maven-metadata.xml +log4j = "2.19.0" # https://central.sonatype.com/artifact/org.apache.logging.log4j/log4j-api +adventure-api = "4.23.0" # https://github.com/KyoriPowered/adventure +adventure-platform = "4.4.0" # https://github.com/KyoriPowered/adventure-platform + +annotations = "26.0.2" # https://central.sonatype.com/artifact/org.jetbrains/annotations +paralithic = "0.8.1" # https://github.com/PolyhedralDev/Paralithic/ +paperlib = "1.0.8" # https://github.com/PaperMC/PaperLib/ +bstats = "3.1.0" # https://github.com/Bastian/bstats-metrics/tree/master +sentry = "8.14.0" # https://github.com/getsentry/sentry-java +commons-io = "2.19.0" # https://central.sonatype.com/artifact/commons-io/commons-io +commons-lang = "2.6" # https://central.sonatype.com/artifact/commons-lang/commons-lang +commons-lang3 = "3.17.0" # https://central.sonatype.com/artifact/org.apache.commons/commons-lang3 +oshi = "6.8.2" # https://central.sonatype.com/artifact/com.github.oshi/oshi-core +fastutil = "8.5.16" # https://central.sonatype.com/artifact/it.unimi.dsi/fastutil +lz4 = "1.8.0" # https://central.sonatype.com/artifact/org.lz4/lz4-java +lru = "1.4.2" # https://central.sonatype.com/artifact/com.googlecode.concurrentlinkedhashmap/concurrentlinkedhashmap-lru +zip = "1.17" # https://central.sonatype.com/artifact/org.zeroturnaround/zt-zip +gson = "2.13.1" # https://central.sonatype.com/artifact/com.google.code.gson/gson +asm = "9.8" # https://central.sonatype.com/artifact/org.ow2.asm/asm +bsf = "2.4.0" # https://central.sonatype.com/artifact/bsf/bsf +rhino = "1.7R2" # https://central.sonatype.com/artifact/rhino/js +caffeine = "3.2.1" # https://central.sonatype.com/artifact/com.github.ben-manes.caffeine/caffeine +byte-buddy = "1.17.6" # https://central.sonatype.com/artifact/net.bytebuddy/byte-buddy + +# Third Party Integrations +nexo = "1.8.0" # https://repo.nexomc.com/#/releases/com/nexomc/nexo +itemsadder = "4.0.10" # https://github.com/LoneDev6/API-ItemsAdder +placeholderApi = "2.11.6" # https://repo.extendedclip.com/#/releases/me/clip/placeholderapi +score = "5.25.3.9" # https://github.com/Ssomar-Developement/SCore +mmoitems = "6.9.5-SNAPSHOT" # https://nexus.phoenixdevt.fr/repository/maven-public/net/Indyuce/MMOItems-API/maven-metadata.xml +ecoitems = "5.63.1" # https://github.com/Auxilor/EcoItems/tags +mythic = "5.9.5" +mythic-chrucible = "2.1.0" +kgenerators = "7.3" # https://repo.codemc.io/repository/maven-public/me/kryniowesegryderiusz/kgenerators-core/maven-metadata.xml +multiverseCore = "5.1.0" + +[libraries] +# Core Libraries +lombok = { module = "org.projectlombok:lombok", version.ref ="lombok" } +spigot = { module = "org.spigotmc:spigot-api", version.ref = "spigot" } +log4j-api = { module = "org.apache.logging.log4j:log4j-api", version.ref = "log4j" } +log4j-core = { module = "org.apache.logging.log4j:log4j-core", version.ref = "log4j" } +annotations = { module = "org.jetbrains:annotations", version.ref = "annotations" } + +# Dynamically Loaded +adventure-api = { module = "net.kyori:adventure-api", version.ref = "adventure-api" } +adventure-minimessage = { module = "net.kyori:adventure-text-minimessage", version.ref = "adventure-api" } +adventure-platform = { module = "net.kyori:adventure-platform-bukkit", version.ref = "adventure-platform" } + +paralithic = { module = "com.dfsek:paralithic", version.ref = "paralithic" } +paperlib = { module = "io.papermc:paperlib", version.ref = "paperlib" } +bstats = { module = "org.bstats:bstats-bukkit", version.ref = "bstats" } +sentry = { module = "io.sentry:sentry", version.ref = "sentry" } +commons-io = { module = "commons-io:commons-io", version.ref = "commons-io" } +commons-lang = { module = "commons-lang:commons-lang", version.ref = "commons-lang" } +commons-lang3 = { module = "org.apache.commons:commons-lang3", version.ref = "commons-lang3" } +oshi = { module = "com.github.oshi:oshi-core", version.ref = "oshi" } +lz4 = { module = "org.lz4:lz4-java", version.ref = "lz4" } +fastutil = { module = "it.unimi.dsi:fastutil", version.ref = "fastutil" } +lru = { module = "com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-lru", version.ref = "lru" } +zip = { module = "org.zeroturnaround:zt-zip", version.ref = "zip" } +gson = { module = "com.google.code.gson:gson", version.ref = "gson" } +asm = { module = "org.ow2.asm:asm", version.ref = "asm" } +bsf = { module = "bsf:bsf", version.ref = "bsf" } +rhino = { module = "rhino:js", version.ref = "rhino" } +caffeine = { module = "com.github.ben-manes.caffeine:caffeine", version.ref = "caffeine" } +byteBuddy-core = { module = "net.bytebuddy:byte-buddy", version.ref = "byte-buddy" } +byteBuddy-agent = { module = "net.bytebuddy:byte-buddy-agent", version.ref = "byte-buddy" } + +# Third Party Integrations +nexo = { module = "com.nexomc:nexo", version.ref = "nexo" } +itemsadder = { module = "dev.lone:api-itemsadder", version.ref = "itemsadder" } +placeholderApi = { module = "me.clip:placeholderapi", version.ref = "placeholderApi" } +score = { module = "com.github.Ssomar-Developement:SCore", version.ref = "score" } +mmoitems = { module = "net.Indyuce:MMOItems-API", version.ref = "mmoitems" } +ecoitems = { module = "com.willfp:EcoItems", version.ref = "ecoitems" } +mythic = { module = "io.lumine:Mythic-Dist", version.ref = "mythic" } +mythicChrucible = { module = "io.lumine:MythicCrucible-Dist", version.ref = "mythic-chrucible" } +kgenerators = { module = "me.kryniowesegryderiusz:kgenerators-core", version.ref = "kgenerators" } +multiverseCore = { module = "org.mvplugins.multiverse.core:multiverse-core", version.ref = "multiverseCore" } + +[plugins] +shadow = { id = "com.gradleup.shadow", version.ref = "shadow" } +slimjar = { id = "de.crazydev22.slimjar", version.ref = "slimjar" } +download = { id = "de.undercouch.download", version.ref = "download" } +runPaper = { id = "xyz.jpenilla.run-paper", version.ref = "runPaper" } +sentry = { id = "io.sentry.jvm.gradle", version.ref = "sentryPlugin" }