From 360d29f680770cf707701462225e821b00b623e6 Mon Sep 17 00:00:00 2001 From: XyperCode Date: Fri, 24 Jan 2025 08:47:42 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=A6=20Added=20ClientStoppedEvent=20and?= =?UTF-8?q?=20fixed=20deps(=3F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/groovy/multiloader-common.gradle | 12 ++ common/build.gradle | 5 +- .../ultreon/mods/xinexlib/JsonException.java | 9 ++ .../client/event/ClientStoppedEvent.java | 47 ++++++++ ...derTickEvent.java => ClientTickEvent.java} | 10 +- .../mods/xinexlib/mixin/MixinMinecraft.java | 9 +- .../mods/xinexlib/platform/XinexPlatform.java | 5 + .../xinexlib/platform/services/Platform.java | 3 + fabric/build.gradle | 5 +- .../xinexlib/platform/FabricPlatform.java | 6 + forge/build.gradle | 5 +- .../mods/xinexlib/platform/ForgePlatform.java | 7 ++ neoforge/build.gradle | 17 ++- .../xinexlib/platform/NeoForgePlatform.java | 7 ++ quilt/build.gradle | 111 ++++++++++++++++++ 15 files changed, 241 insertions(+), 17 deletions(-) create mode 100644 common/src/main/java/dev/ultreon/mods/xinexlib/JsonException.java create mode 100644 common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientStoppedEvent.java rename common/src/main/java/dev/ultreon/mods/xinexlib/client/event/{ClientRenderTickEvent.java => ClientTickEvent.java} (75%) create mode 100644 quilt/build.gradle diff --git a/buildSrc/src/main/groovy/multiloader-common.gradle b/buildSrc/src/main/groovy/multiloader-common.gradle index d0097ce..e0817eb 100644 --- a/buildSrc/src/main/groovy/multiloader-common.gradle +++ b/buildSrc/src/main/groovy/multiloader-common.gradle @@ -7,6 +7,18 @@ if (project.hasProperty('ci') && project.ci.toBoolean() && project.hasProperty(' version += '-SNAPSHOT' } +configurations { + library { + extendsFrom api + } + + compileClasspath.extendsFrom library + apiElements.extendsFrom library + runtimeElements.extendsFrom library + sourcesElements.extendsFrom library + javadocElements.extendsFrom library +} + base { archivesName = "${mod_id}-${project.name}-${minecraft_version}" } diff --git a/common/build.gradle b/common/build.gradle index 8ec0d25..27913d9 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -22,8 +22,9 @@ dependencies { compileOnlyApi group: 'io.github.llamalad7', name: 'mixinextras-common', version: '0.4.1' annotationProcessor group: 'io.github.llamalad7', name: 'mixinextras-common', version: '0.4.1' - // Project Reactor - api group: 'io.projectreactor', name: 'reactor-core', version: '3.5.5' + // Extra dependencies + library("io.projectreactor:reactor-core:3.5.5") + library("org.hjson:hjson:3.1.0") } configurations { diff --git a/common/src/main/java/dev/ultreon/mods/xinexlib/JsonException.java b/common/src/main/java/dev/ultreon/mods/xinexlib/JsonException.java new file mode 100644 index 0000000..42587b7 --- /dev/null +++ b/common/src/main/java/dev/ultreon/mods/xinexlib/JsonException.java @@ -0,0 +1,9 @@ +package dev.ultreon.mods.xinexlib; + +import java.io.IOException; + +public class JsonException extends IOException { + public JsonException(String message) { + super(message); + } +} diff --git a/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientStoppedEvent.java b/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientStoppedEvent.java new file mode 100644 index 0000000..941de58 --- /dev/null +++ b/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientStoppedEvent.java @@ -0,0 +1,47 @@ +package dev.ultreon.mods.xinexlib.client.event; + +import dev.ultreon.mods.xinexlib.event.system.Cancelable; +import net.minecraft.client.Minecraft; + +import java.util.Objects; + +public final class ClientStoppedEvent implements Cancelable { + private final Minecraft client; + private boolean canceled; + + public ClientStoppedEvent(Minecraft client) { + this.client = client; + } + + public Minecraft getClient() { + return client; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) return true; + if (obj == null || obj.getClass() != this.getClass()) return false; + var that = (ClientStoppedEvent) obj; + return Objects.equals(this.client, that.client); + } + + @Override + public int hashCode() { + return Objects.hash(client); + } + + @Override + public String toString() { + return "ClientStoppingEvent[" + "client=" + client + ']'; + } + + @Override + public boolean isCanceled() { + return canceled; + } + + @Override + public void cancel() { + this.canceled = true; + } +} diff --git a/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientRenderTickEvent.java b/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientTickEvent.java similarity index 75% rename from common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientRenderTickEvent.java rename to common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientTickEvent.java index d746274..fb9f444 100644 --- a/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientRenderTickEvent.java +++ b/common/src/main/java/dev/ultreon/mods/xinexlib/client/event/ClientTickEvent.java @@ -4,10 +4,10 @@ import java.util.Objects; -public abstract class ClientRenderTickEvent implements ClientEvent { +public abstract class ClientTickEvent implements ClientEvent { private final Minecraft client; - public ClientRenderTickEvent(Minecraft client) { + public ClientTickEvent(Minecraft client) { this.client = client; } @@ -25,7 +25,7 @@ public String toString() { public boolean equals(Object obj) { if (obj == this) return true; if (obj == null || obj.getClass() != this.getClass()) return false; - var that = (ClientRenderTickEvent) obj; + var that = (ClientTickEvent) obj; return Objects.equals(this.client, that.client); } @@ -34,13 +34,13 @@ public int hashCode() { return Objects.hash(client); } - public static class Pre extends ClientRenderTickEvent { + public static class Pre extends ClientTickEvent { public Pre(Minecraft minecraft) { super(minecraft); } } - public static class Post extends ClientRenderTickEvent { + public static class Post extends ClientTickEvent { public Post(Minecraft minecraft) { super(minecraft); } diff --git a/common/src/main/java/dev/ultreon/mods/xinexlib/mixin/MixinMinecraft.java b/common/src/main/java/dev/ultreon/mods/xinexlib/mixin/MixinMinecraft.java index d9c737c..58bc1f7 100644 --- a/common/src/main/java/dev/ultreon/mods/xinexlib/mixin/MixinMinecraft.java +++ b/common/src/main/java/dev/ultreon/mods/xinexlib/mixin/MixinMinecraft.java @@ -1,8 +1,9 @@ package dev.ultreon.mods.xinexlib.mixin; import com.mojang.blaze3d.platform.Window; -import dev.ultreon.mods.xinexlib.client.event.ClientRenderTickEvent; +import dev.ultreon.mods.xinexlib.client.event.ClientTickEvent; import dev.ultreon.mods.xinexlib.client.event.ClientStartedEvent; +import dev.ultreon.mods.xinexlib.client.event.ClientStoppedEvent; import dev.ultreon.mods.xinexlib.client.event.ClientStoppingEvent; import dev.ultreon.mods.xinexlib.event.system.EventSystem; import net.minecraft.client.Minecraft; @@ -32,16 +33,18 @@ private void shutdown(CallbackInfo ci) { if (event.isCanceled()) { GLFW.glfwSetWindowShouldClose(window.getWindow(), false); ci.cancel(); + } else { + EventSystem.MAIN.publish(new ClientStoppedEvent((Minecraft) (Object) this)); } } @Inject(at = @At("HEAD"), method = "runTick") private void runTick$head(CallbackInfo ci) { - EventSystem.MAIN.publish(new ClientRenderTickEvent.Pre((Minecraft) (Object) this)); + EventSystem.MAIN.publish(new ClientTickEvent.Pre((Minecraft) (Object) this)); } @Inject(at = @At("RETURN"), method = "runTick") private void runTick$return(CallbackInfo ci) { - EventSystem.MAIN.publish(new ClientRenderTickEvent.Post((Minecraft) (Object) this)); + EventSystem.MAIN.publish(new ClientTickEvent.Post((Minecraft) (Object) this)); } } diff --git a/common/src/main/java/dev/ultreon/mods/xinexlib/platform/XinexPlatform.java b/common/src/main/java/dev/ultreon/mods/xinexlib/platform/XinexPlatform.java index 9a27cf9..2f7b612 100644 --- a/common/src/main/java/dev/ultreon/mods/xinexlib/platform/XinexPlatform.java +++ b/common/src/main/java/dev/ultreon/mods/xinexlib/platform/XinexPlatform.java @@ -10,6 +10,7 @@ import dev.ultreon.mods.xinexlib.registrar.RegistrarManager; import dev.ultreon.mods.xinexlib.tabs.CreativeModeTabBuilder; +import java.nio.file.Path; import java.util.Optional; import java.util.ServiceLoader; import java.util.function.Consumer; @@ -90,4 +91,8 @@ public static void registerCommand(CommandRegistrant registrant) { public static ClientPlatform client() { return PLATFORM.client(); } + + public static Path getConfigDir() { + return PLATFORM.getConfigDir(); + } } diff --git a/common/src/main/java/dev/ultreon/mods/xinexlib/platform/services/Platform.java b/common/src/main/java/dev/ultreon/mods/xinexlib/platform/services/Platform.java index 9016e1e..742094f 100644 --- a/common/src/main/java/dev/ultreon/mods/xinexlib/platform/services/Platform.java +++ b/common/src/main/java/dev/ultreon/mods/xinexlib/platform/services/Platform.java @@ -13,6 +13,7 @@ import dev.ultreon.mods.xinexlib.tabs.CreativeModeTabBuilder; import net.minecraft.world.item.CreativeModeTab; +import java.nio.file.Path; import java.util.Optional; import java.util.function.Consumer; @@ -87,4 +88,6 @@ default String getEnvironmentName() { /// @param modId The mod id /// @return The mod information or an empty optional Optional getMod(String modId); + + Path getConfigDir(); } diff --git a/fabric/build.gradle b/fabric/build.gradle index 20953bb..47504a7 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -13,8 +13,9 @@ dependencies { modImplementation "maven.modrinth:modmenu:${modmenu_version}" - include api('io.projectreactor:reactor-core:3.5.5') - include api('org.reactivestreams:reactive-streams:1.0.4') + include library('io.projectreactor:reactor-core:3.5.5') + include library('org.reactivestreams:reactive-streams:1.0.4') + include library('org.hjson:hjson:3.1.0') } loom { diff --git a/fabric/src/main/java/dev/ultreon/mods/xinexlib/platform/FabricPlatform.java b/fabric/src/main/java/dev/ultreon/mods/xinexlib/platform/FabricPlatform.java index e20347d..24263e3 100644 --- a/fabric/src/main/java/dev/ultreon/mods/xinexlib/platform/FabricPlatform.java +++ b/fabric/src/main/java/dev/ultreon/mods/xinexlib/platform/FabricPlatform.java @@ -21,6 +21,7 @@ import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; +import java.nio.file.Path; import java.util.*; import java.util.function.Consumer; @@ -104,6 +105,11 @@ public Optional getMod(String modId) { return FabricLoader.getInstance().getModContainer(modId).map(FabricMod::new); } + @Override + public Path getConfigDir() { + return FabricLoader.getInstance().getConfigDir(); + } + private void register(CommandDispatcher dispatcher, CommandBuildContext registryAccess, Commands.CommandSelection environment) { for (CommandRegistrant registrant : commandRegistrants) { registrant.register(dispatcher, registryAccess, environment); diff --git a/forge/build.gradle b/forge/build.gradle index a5c53fa..24fb016 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -84,8 +84,9 @@ dependencies { api(fg.deobf('io.github.llamalad7:mixinextras-forge:0.4.1') { version { strictly '0.4.1' } }) annotationProcessor(group: 'io.github.llamalad7', name: 'mixinextras-forge', version: '0.4.1') { version { strictly '0.4.1' } } - jarJar minecraftLibrary('io.projectreactor:reactor-core:3.5.5') - jarJar minecraftLibrary('org.reactivestreams:reactive-streams:1.0.4') + jarJar minecraftLibrary(library('io.projectreactor:reactor-core:3.5.5')) + jarJar minecraftLibrary(library('org.reactivestreams:reactive-streams:1.0.4')) + jarJar minecraftLibrary(library('org.hjson:hjson:3.1.0')) } publishing { diff --git a/forge/src/main/java/dev/ultreon/mods/xinexlib/platform/ForgePlatform.java b/forge/src/main/java/dev/ultreon/mods/xinexlib/platform/ForgePlatform.java index 2e0b2f9..520ea5c 100644 --- a/forge/src/main/java/dev/ultreon/mods/xinexlib/platform/ForgePlatform.java +++ b/forge/src/main/java/dev/ultreon/mods/xinexlib/platform/ForgePlatform.java @@ -20,7 +20,9 @@ import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.loading.FMLEnvironment; import net.minecraftforge.fml.loading.FMLLoader; +import net.minecraftforge.fml.loading.FMLPaths; +import java.nio.file.Path; import java.util.*; import java.util.function.Consumer; @@ -108,4 +110,9 @@ public ClientPlatform client() { public Optional getMod(String modId) { return ModList.get().getModContainerById(modId).map(ForgeMod::new); } + + @Override + public Path getConfigDir() { + return FMLPaths.CONFIGDIR.get(); + } } diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 1eec7ba..5ea52d6 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -37,6 +37,16 @@ neoForge { } } +configurations { + additionalClasspath { + extendsFrom api + } + + clientAdditionalRuntimeClasspath.extendsFrom additionalClasspath + serverAdditionalRuntimeClasspath.extendsFrom additionalClasspath + dataAdditionalRuntimeClasspath.extendsFrom additionalClasspath +} + dependencies { jarJar(api(group: 'io.projectreactor', name: 'reactor-core', version: '3.5.5')) { version { @@ -56,9 +66,10 @@ dependencies { prefer '1.0.4' // The version actually used in your dev workspace } } - clientAdditionalRuntimeClasspath group: 'io.projectreactor', name: 'reactor-core', version: '3.5.5' - serverAdditionalRuntimeClasspath group: 'io.projectreactor', name: 'reactor-core', version: '3.5.5' - dataAdditionalRuntimeClasspath group: 'io.projectreactor', name: 'reactor-core', version: '3.5.5' + additionalClasspath group: 'io.projectreactor', name: 'reactor-core', version: '3.5.5' + + jarJar(implementation(api("org.hjson:hjson:3.1.0"))) + additionalClasspath("org.hjson:hjson:3.1.0") api group: "io.github.llamalad7", name: 'mixinextras-neoforge', version: '0.4.1' annotationProcessor group: "io.github.llamalad7", name: 'mixinextras-neoforge', version: '0.4.1' diff --git a/neoforge/src/main/java/dev/ultreon/mods/xinexlib/platform/NeoForgePlatform.java b/neoforge/src/main/java/dev/ultreon/mods/xinexlib/platform/NeoForgePlatform.java index 03158a7..abc74b9 100644 --- a/neoforge/src/main/java/dev/ultreon/mods/xinexlib/platform/NeoForgePlatform.java +++ b/neoforge/src/main/java/dev/ultreon/mods/xinexlib/platform/NeoForgePlatform.java @@ -18,9 +18,11 @@ import net.neoforged.fml.ModList; import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.fml.loading.FMLLoader; +import net.neoforged.fml.loading.FMLPaths; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.RegisterCommandsEvent; +import java.nio.file.Path; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -118,6 +120,11 @@ public Optional getMod(String modId) { return ModList.get().getModContainerById(modId).map(NeoForgeMod::new); } + @Override + public Path getConfigDir() { + return FMLPaths.CONFIGDIR.get(); + } + public void registerMod(String modId, IEventBus modEventBus) { this.modEventBus = modEventBus; this.registrars.put(modId, new NeoForgeRegistrarManager(modId, modEventBus)); diff --git a/quilt/build.gradle b/quilt/build.gradle new file mode 100644 index 0000000..baf7951 --- /dev/null +++ b/quilt/build.gradle @@ -0,0 +1,111 @@ +buildscript { + repositories { + exclusiveContent { + forRepository { + maven { + name = 'Quilt' + url = uri('https://maven.quiltmc.org/repository/release') + } + } + filter { + includeGroupAndSubgroups('org.quiltmc') + } + } + } +} + +plugins { + id 'multiloader-loader' + id 'java' + alias(libs.plugins.quilt.loom) +} + +dependencies { + modImplementation "org.quiltmc:quilt-loader:$rootProject.quilt_loader_version" + modImplementation "org.quiltmc:quilt-json5:1.0.4+final" + modImplementation "org.quiltmc:quilt-config:1.3.2" + modImplementation "org.quiltmc:qsl:10.0.0-alpha.3+1.21.1" + + // Quilt Standard Libraries and QSL. + modImplementation "org.quiltmc.quilted-fabric-api:quilted-fabric-api:$rootProject.quilted_fabric_api_version", { + exclude group: "net.fabricmc", module: "fabric-loader" + } + + minecraft "com.mojang:minecraft:${minecraft_version}" + mappings loom.layered { + mappings "org.quiltmc:quilt-mappings:1.21+build.18:intermediary-v2" + officialMojangMappings() + parchment("org.parchmentmc.data:parchment-${parchment_minecraft}:${parchment_version}@zip") + } + + // Mixin + modImplementation "net.fabricmc:sponge-mixin:0.15.2+mixin.0.8.7" + + // ASM + modImplementation "org.ow2.asm:asm:9.5" + modImplementation "org.ow2.asm:asm-tree:9.5" + modImplementation "org.ow2.asm:asm-commons:9.5" + modImplementation "org.ow2.asm:asm-util:9.5" + modImplementation "org.ow2.asm:asm-analysis:9.5" + + modImplementation "maven.modrinth:modmenu:${modmenu_version}" + + implementation(group: 'io.projectreactor', name: 'reactor-core', version: '3.5.5') + implementation('com.github.Nuix:jnode-fs:v1.0.1') + + modImplementation "fuzs.forgeconfigapiport:forgeconfigapiport-fabric:21.1.0", { + exclude group: "net.fabricmc", module: "fabric-loader" + } + + modImplementation "dev.ultreon.mods:xinexlib-fabric-1.21.1:0.1.0-SNAPSHOT", { + exclude group: "net.fabricmc", module: "fabric-loader" + } +} + +jar { + doLast { + copy { + from "build/devlibs/devices-quilt-${minecraft_version}-${version}-dev.jar" + into "build/libs/" + + rename { String fileName -> "devices-quilt-${minecraft_version}-${version}-dev.jar" } + } + } +} + +loom { + def aw = project(':common').file("src/main/resources/${mod_id}.accesswidener") + if (aw.exists()) { + accessWidenerPath.set(aw) + } + mixin { + defaultRefmapName.set("${mod_id}.refmap.json") + } + runs { + client { + setConfigName('Quilt Client') + setIdeConfigGenerated(true) + vmArgs("-Dxinexlib.dev=true") + } + server { + setConfigName('Quilt Server') + setIdeConfigGenerated(true) + vmArgs("-Dxinexlib.dev=true") + } + } + + // Loom and Loader both use this block in order to gather more information about your mod. + mods { + // This should match your mod id. + register("devices") { + // Tell Loom about each source set used by your mod here. This ensures that your mod's classes are properly transformed by Loader. + sourceSet("main", project) + sourceSet("main", project(":common")) + // If you shade (directly include classes, not JiJ) a dependency into your mod, include it here using one of these methods: + // dependency("com.example.shadowedmod:1.2.3") + // configuration("exampleShadedConfigurationName") + } + } +} + +processIncludeJars.enabled = false