From 5e89e8cd4878dda3da6deaedf5ae89496b996f38 Mon Sep 17 00:00:00 2001 From: Chrys Chrysanthemum Date: Tue, 14 Jul 2026 22:28:28 +1000 Subject: [PATCH] feat: Implement Kaleido Config implementation within testmod. --- .../gradle/platform/fabric.gradle.kts | 9 +- .../gradle/platform/loader.gradle.kts | 2 - .../gradle/platform/neoforge.gradle.kts | 9 +- .../gradle/platform/xplat.gradle.kts | 10 +- .../gradle/test/dependencies.gradle.kts | 20 ---- ...sGameRulesTestmodPlatformHelperFabric.java | 21 +++++ ...ameRulesTestmodPlatformHelperNeoForge.java | 21 +++++ .../GreenhouseConfigExtensionsGameRules.java | 4 +- ...nfigExtensionsGameRulesHelperLoaders.java} | 9 +- ...houseConfigExtensionsGameRulesTestmod.java | 94 +++---------------- .../testmod/config/GameRuleConfig.java | 5 - .../greenhouse/GreenhouseConfigImpl.java | 91 ++++++++++++++++++ .../greenhouse/GreenhouseGameRuleConfig.java | 5 + .../testmod/kaleido/KaleidoConfigImpl.java | 66 +++++++++++++ .../kaleido/KaleidoGameRuleConfig.java | 16 ++++ ...tensionsGameRulesTestmodHelperLoaders.java | 88 +++++++++++++++++ ...ensionsGameRulesTestmodPlatformHelper.java | 15 +++ .../gamerules/testmod/platform/Platform.java | 14 +++ .../testmod/platform/package-info.java | 14 +++ .../lang/en_us.json | 5 +- 20 files changed, 400 insertions(+), 118 deletions(-) delete mode 100644 build_logic/src/main/kotlin/lgbt/greenhouse/config_extensions/gradle/test/dependencies.gradle.kts create mode 100644 gamerules/fabric/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/fabric/testmod/platform/GreenhouseConfigExtensionsGameRulesTestmodPlatformHelperFabric.java create mode 100644 gamerules/neoforge/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/neoforge/testmod/platform/GreenhouseConfigExtensionsGameRulesTestmodPlatformHelperNeoForge.java rename gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/platform/{GreenhouseConfigServiceLoadersAtHome.java => GreenhouseConfigExtensionsGameRulesHelperLoaders.java} (83%) delete mode 100644 gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/config/GameRuleConfig.java create mode 100644 gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/greenhouse/GreenhouseConfigImpl.java create mode 100644 gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/greenhouse/GreenhouseGameRuleConfig.java create mode 100644 gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/kaleido/KaleidoConfigImpl.java create mode 100644 gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/kaleido/KaleidoGameRuleConfig.java create mode 100644 gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/platform/GreenhouseConfigExtensionsGameRulesTestmodHelperLoaders.java create mode 100644 gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/platform/GreenhouseConfigExtensionsGameRulesTestmodPlatformHelper.java create mode 100644 gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/platform/Platform.java create mode 100644 gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/platform/package-info.java diff --git a/build_logic/src/main/kotlin/lgbt/greenhouse/config_extensions/gradle/platform/fabric.gradle.kts b/build_logic/src/main/kotlin/lgbt/greenhouse/config_extensions/gradle/platform/fabric.gradle.kts index f7cb88e..32b699e 100644 --- a/build_logic/src/main/kotlin/lgbt/greenhouse/config_extensions/gradle/platform/fabric.gradle.kts +++ b/build_logic/src/main/kotlin/lgbt/greenhouse/config_extensions/gradle/platform/fabric.gradle.kts @@ -38,7 +38,14 @@ dependencies { "localRuntime"(libs.mod.menu) - "localRuntime"(libs.greenhouse.config) + val greenhouseModdingApiAttribute = Attribute.of("lgbt.greenhouse.modding.api", String::class.java) + "testmodCompileOnly"(libs.greenhouse.config) { + attributes { + attribute(greenhouseModdingApiAttribute, "") + } + } + "testmodRuntimeOnly"(libs.greenhouse.config) + "testmodImplementation"(libs.kaleido.config) } extensions.configure("loom") { diff --git a/build_logic/src/main/kotlin/lgbt/greenhouse/config_extensions/gradle/platform/loader.gradle.kts b/build_logic/src/main/kotlin/lgbt/greenhouse/config_extensions/gradle/platform/loader.gradle.kts index bd261d2..713fd63 100644 --- a/build_logic/src/main/kotlin/lgbt/greenhouse/config_extensions/gradle/platform/loader.gradle.kts +++ b/build_logic/src/main/kotlin/lgbt/greenhouse/config_extensions/gradle/platform/loader.gradle.kts @@ -6,8 +6,6 @@ import lgbt.greenhouse.config_extensions.gradle.Properties plugins { id("lgbt.greenhouse.config_extensions.gradle.base.java") id("lgbt.greenhouse.config_extensions.gradle.base.repositories") - - id("lgbt.greenhouse.config_extensions.gradle.test.dependencies") } val props = project.ext["props"] as Properties.ModuleProperties diff --git a/build_logic/src/main/kotlin/lgbt/greenhouse/config_extensions/gradle/platform/neoforge.gradle.kts b/build_logic/src/main/kotlin/lgbt/greenhouse/config_extensions/gradle/platform/neoforge.gradle.kts index 90cdf1c..bc17c10 100644 --- a/build_logic/src/main/kotlin/lgbt/greenhouse/config_extensions/gradle/platform/neoforge.gradle.kts +++ b/build_logic/src/main/kotlin/lgbt/greenhouse/config_extensions/gradle/platform/neoforge.gradle.kts @@ -38,7 +38,14 @@ configurations { } dependencies { - "localRuntime"(libs.greenhouse.config) + val greenhouseModdingApiAttribute = Attribute.of("lgbt.greenhouse.modding.api", String::class.java) + "testmodCompileOnly"(libs.greenhouse.config) { + attributes { + attribute(greenhouseModdingApiAttribute, "") + } + } + "testmodRuntimeOnly"(libs.greenhouse.config) + "testmodImplementation"(libs.kaleido.config) } tasks { diff --git a/build_logic/src/main/kotlin/lgbt/greenhouse/config_extensions/gradle/platform/xplat.gradle.kts b/build_logic/src/main/kotlin/lgbt/greenhouse/config_extensions/gradle/platform/xplat.gradle.kts index 0cafe4d..cf61591 100644 --- a/build_logic/src/main/kotlin/lgbt/greenhouse/config_extensions/gradle/platform/xplat.gradle.kts +++ b/build_logic/src/main/kotlin/lgbt/greenhouse/config_extensions/gradle/platform/xplat.gradle.kts @@ -10,8 +10,6 @@ plugins { id("lgbt.greenhouse.config_extensions.gradle.base.merge") id("lgbt.greenhouse.config_extensions.gradle.base.repositories") id("lgbt.greenhouse.config_extensions.gradle.base.publish") - - id("lgbt.greenhouse.config_extensions.gradle.test.dependencies") } val libs = project.ext["libs"] as LibrariesForLibs @@ -58,7 +56,13 @@ dependencies { compileOnly(libs.mixin.extras) annotationProcessor(libs.mixin.extras) - "testmodCompileOnly"(libs.greenhouse.config) + val greenhouseModdingApiAttribute = Attribute.of("lgbt.greenhouse.modding.api", String::class.java) + "testmodCompileOnly"(libs.greenhouse.config) { + attributes { + attribute(greenhouseModdingApiAttribute, "") + } + } + "testmodCompileOnly"(libs.kaleido.config) } extensions.configure("loom") { diff --git a/build_logic/src/main/kotlin/lgbt/greenhouse/config_extensions/gradle/test/dependencies.gradle.kts b/build_logic/src/main/kotlin/lgbt/greenhouse/config_extensions/gradle/test/dependencies.gradle.kts deleted file mode 100644 index 1b4d92a..0000000 --- a/build_logic/src/main/kotlin/lgbt/greenhouse/config_extensions/gradle/test/dependencies.gradle.kts +++ /dev/null @@ -1,20 +0,0 @@ -package lgbt.greenhouse.config_extensions.gradle.test - -import org.gradle.accessors.dm.LibrariesForLibs - -plugins { - id("lgbt.greenhouse.config_extensions.gradle.base.java") - id("lgbt.greenhouse.config_extensions.gradle.base.repositories") -} - -val libs = project.ext["libs"] as LibrariesForLibs -val greenhouseModdingApiAttribute = Attribute.of("lgbt.greenhouse.modding.api", String::class.java) - -dependencies { - "testCompileOnly"(libs.greenhouse.config) { - attributes { - attribute(greenhouseModdingApiAttribute, "") - } - } - "testCompileOnly"(libs.kaleido.config) -} diff --git a/gamerules/fabric/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/fabric/testmod/platform/GreenhouseConfigExtensionsGameRulesTestmodPlatformHelperFabric.java b/gamerules/fabric/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/fabric/testmod/platform/GreenhouseConfigExtensionsGameRulesTestmodPlatformHelperFabric.java new file mode 100644 index 0000000..ede7c63 --- /dev/null +++ b/gamerules/fabric/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/fabric/testmod/platform/GreenhouseConfigExtensionsGameRulesTestmodPlatformHelperFabric.java @@ -0,0 +1,21 @@ +/* + * Copyright © 2026 Greenhouse Modding + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +package lgbt.greenhouse.config_extensions.gamerules.fabric.testmod.platform; + +import lgbt.greenhouse.config_extensions.gamerules.testmod.platform.GreenhouseConfigExtensionsGameRulesTestmodPlatformHelper; +import net.fabricmc.loader.api.FabricLoader; + +import java.nio.file.Path; + +public class GreenhouseConfigExtensionsGameRulesTestmodPlatformHelperFabric implements GreenhouseConfigExtensionsGameRulesTestmodPlatformHelper { + @Override + public Path getConfigDir() { + return FabricLoader.getInstance().getConfigDir(); + } +} diff --git a/gamerules/neoforge/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/neoforge/testmod/platform/GreenhouseConfigExtensionsGameRulesTestmodPlatformHelperNeoForge.java b/gamerules/neoforge/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/neoforge/testmod/platform/GreenhouseConfigExtensionsGameRulesTestmodPlatformHelperNeoForge.java new file mode 100644 index 0000000..18d2c3d --- /dev/null +++ b/gamerules/neoforge/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/neoforge/testmod/platform/GreenhouseConfigExtensionsGameRulesTestmodPlatformHelperNeoForge.java @@ -0,0 +1,21 @@ +/* + * Copyright © 2026 Greenhouse Modding + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +package lgbt.greenhouse.config_extensions.gamerules.neoforge.testmod.platform; + +import lgbt.greenhouse.config_extensions.gamerules.testmod.platform.GreenhouseConfigExtensionsGameRulesTestmodPlatformHelper; +import net.neoforged.fml.loading.FMLPaths; + +import java.nio.file.Path; + +public class GreenhouseConfigExtensionsGameRulesTestmodPlatformHelperNeoForge implements GreenhouseConfigExtensionsGameRulesTestmodPlatformHelper { + @Override + public Path getConfigDir() { + return FMLPaths.CONFIGDIR.get(); + } +} diff --git a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/GreenhouseConfigExtensionsGameRules.java b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/GreenhouseConfigExtensionsGameRules.java index 0d0faeb..38b8c9b 100644 --- a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/GreenhouseConfigExtensionsGameRules.java +++ b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/GreenhouseConfigExtensionsGameRules.java @@ -1,7 +1,7 @@ package lgbt.greenhouse.config_extensions.gamerules.impl; import lgbt.greenhouse.config_extensions.gamerules.impl.platform.GreenhouseConfigExtensionsGameRulesPlatformHelper; -import lgbt.greenhouse.config_extensions.gamerules.impl.platform.GreenhouseConfigServiceLoadersAtHome; +import lgbt.greenhouse.config_extensions.gamerules.impl.platform.GreenhouseConfigExtensionsGameRulesHelperLoaders; import net.minecraft.resources.Identifier; import net.minecraft.world.level.gamerules.GameRuleType; import net.minecraft.world.level.gamerules.GameRules; @@ -20,7 +20,7 @@ public class GreenhouseConfigExtensionsGameRules { public static GreenhouseConfigExtensionsGameRulesPlatformHelper getPlatformHelper() { if (platformHelper == null) { - platformHelper = GreenhouseConfigServiceLoadersAtHome.createPlatformHelper(); + platformHelper = GreenhouseConfigExtensionsGameRulesHelperLoaders.createPlatformHelper(); } return platformHelper; diff --git a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/platform/GreenhouseConfigServiceLoadersAtHome.java b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/platform/GreenhouseConfigExtensionsGameRulesHelperLoaders.java similarity index 83% rename from gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/platform/GreenhouseConfigServiceLoadersAtHome.java rename to gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/platform/GreenhouseConfigExtensionsGameRulesHelperLoaders.java index 7b3cb9d..55dcc66 100644 --- a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/platform/GreenhouseConfigServiceLoadersAtHome.java +++ b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/platform/GreenhouseConfigExtensionsGameRulesHelperLoaders.java @@ -18,11 +18,14 @@ import java.lang.invoke.MethodType; /// We have {@link java.util.ServiceLoader}s at home. @ApiStatus.Internal -public class GreenhouseConfigServiceLoadersAtHome { +public class GreenhouseConfigExtensionsGameRulesHelperLoaders { + private static final String FABRIC_CLASS = "lgbt.greenhouse.config_extensions.gamerules.fabric.impl.platform.GreenhouseConfigExtensionsGameRulesPlatformHelperFabric"; + private static final String NEOFORGE_CLASS = "lgbt.greenhouse.config_extensions.gamerules.neoforge.impl.platform.GreenhouseConfigExtensionsGameRulesPlatformHelperNeoForge"; + @Nullable public static final MethodHandle FABRIC_PLATFORM_HELPER = find(lookup -> { if (isFabric()) { - Class clazz = lookup.findClass("lgbt.greenhouse.config_extensions.gamerules.fabric.impl.platform.GreenhouseConfigExtensionsGameRulesPlatformHelperFabric"); + Class clazz = lookup.findClass(FABRIC_CLASS); return lookup.findConstructor(clazz, MethodType.methodType(void.class)); } return null; @@ -30,7 +33,7 @@ public class GreenhouseConfigServiceLoadersAtHome { @Nullable public static final MethodHandle NEOFORGE_PLATFORM_HELPER = find(lookup -> { if (isNeoForge()) { - Class clazz = lookup.findClass("lgbt.greenhouse.config_extensions.gamerules.neoforge.impl.platform.GreenhouseConfigExtensionsGameRulesPlatformHelperNeoForge"); + Class clazz = lookup.findClass(NEOFORGE_CLASS); return lookup.findConstructor(clazz, MethodType.methodType(void.class)); } return null; diff --git a/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/GreenhouseConfigExtensionsGameRulesTestmod.java b/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/GreenhouseConfigExtensionsGameRulesTestmod.java index adee127..4d9985a 100644 --- a/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/GreenhouseConfigExtensionsGameRulesTestmod.java +++ b/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/GreenhouseConfigExtensionsGameRulesTestmod.java @@ -1,98 +1,32 @@ package lgbt.greenhouse.config_extensions.gamerules.testmod; -import com.mojang.brigadier.arguments.BoolArgumentType; -import com.mojang.brigadier.arguments.IntegerArgumentType; -import com.mojang.serialization.Codec; -import lgbt.greenhouse.config.api.v3.GreenhouseConfigHolder; -import lgbt.greenhouse.config.api.v3.GreenhouseConfigSide; -import lgbt.greenhouse.config.api.v3.lang.GreenhouseConfigJsonCLang; -import lgbt.greenhouse.config_extensions.gamerules.api.v1.gamerule.ViaConfigGameRule; -import lgbt.greenhouse.config_extensions.gamerules.testmod.config.GameRuleConfig; +import lgbt.greenhouse.config_extensions.gamerules.testmod.greenhouse.GreenhouseConfigImpl; +import lgbt.greenhouse.config_extensions.gamerules.testmod.kaleido.KaleidoConfigImpl; +import lgbt.greenhouse.config_extensions.gamerules.testmod.platform.GreenhouseConfigExtensionsGameRulesTestmodHelperLoaders; +import lgbt.greenhouse.config_extensions.gamerules.testmod.platform.GreenhouseConfigExtensionsGameRulesTestmodPlatformHelper; import lgbt.greenhouse.config_extensions.gamerules.testmod.registry.DeferredRegistry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.Identifier; -import net.minecraft.util.ExtraCodecs; -import net.minecraft.world.flag.FeatureFlagSet; import net.minecraft.world.level.gamerules.GameRule; -import net.minecraft.world.level.gamerules.GameRuleCategory; -import net.minecraft.world.level.gamerules.GameRuleType; -import net.minecraft.world.level.gamerules.GameRuleTypeVisitor; - -import java.util.function.Supplier; public class GreenhouseConfigExtensionsGameRulesTestmod { public static final String MOD_ID = "greenhouse_config_extensions_gamerules_testmod"; - public static GreenhouseConfigHolder GREENHOUSE_GAME_RULE_CONFIG = GreenhouseConfigHolder.register( - GameRuleConfig.class, - MOD_ID + "_game_rules", - 1, - GreenhouseConfigJsonCLang.INSTANCE, - GreenhouseConfigSide.COMMON, - builder -> - builder.withValue( - "int_gamerule", - """ - An integer based gamerule. - - Used for the value of 'greenhouse_config_test:int' as a fallback - if a per-world value is not set.""", - ExtraCodecs.intRange(0, 100), - 50, - GameRuleConfig::intGamerule - ).withValue( - "bool_gamerule", - """ - A boolean based gamerule. - - Used for the value of 'greenhouse_config_test:bool' as a fallback - if a per-world value is not set.""", - Codec.BOOL, - false, - GameRuleConfig::boolGamerule - ) - ); - public static final DeferredRegistry> GAME_RULE_REGISTRY = DeferredRegistry.create(BuiltInRegistries.GAME_RULE); - public static final Supplier, Integer>> GREENHOUSE_CONFIG_INT = GAME_RULE_REGISTRY.register( - "greenhouse_config_int", - () -> new ViaConfigGameRule<>( - new GameRule<>( - GameRuleCategory.MISC, - GameRuleType.INT, - IntegerArgumentType.integer(0, 100), - GameRuleTypeVisitor::visitInteger, - ExtraCodecs.intRange(0, 100), - integer -> integer, - 1, // Tbh, it doesn't really matter what the default value is, really. - FeatureFlagSet.of() - ), - GREENHOUSE_GAME_RULE_CONFIG, - holder -> holder.get().intGamerule() - ) - ); - - public static final Supplier, Boolean>> GREENHOUSE_CONFIG_BOOL = GAME_RULE_REGISTRY.register( - "greenhouse_config_bool", - () -> new ViaConfigGameRule<>( - new GameRule<>( - GameRuleCategory.MISC, - GameRuleType.BOOL, - BoolArgumentType.bool(), - GameRuleTypeVisitor::visitBoolean, - Codec.BOOL, - bool -> bool ? 1 : 0, - true, // It doesn't really matter what the default value is, really. - FeatureFlagSet.of() - ), - GREENHOUSE_GAME_RULE_CONFIG, - holder -> holder.get().boolGamerule() - ) - ); + private static GreenhouseConfigExtensionsGameRulesTestmodPlatformHelper platformHelper; public static void init() { + GreenhouseConfigImpl.init(); + KaleidoConfigImpl.init(); + } + + public static GreenhouseConfigExtensionsGameRulesTestmodPlatformHelper getPlatformHelper() { + if (platformHelper == null) { + platformHelper = GreenhouseConfigExtensionsGameRulesTestmodHelperLoaders.createPlatformHelper(); + } + return platformHelper; } public static Identifier id(String path) { diff --git a/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/config/GameRuleConfig.java b/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/config/GameRuleConfig.java deleted file mode 100644 index ee9a73e..0000000 --- a/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/config/GameRuleConfig.java +++ /dev/null @@ -1,5 +0,0 @@ -package lgbt.greenhouse.config_extensions.gamerules.testmod.config; - -public record GameRuleConfig(int intGamerule, - boolean boolGamerule) { -} diff --git a/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/greenhouse/GreenhouseConfigImpl.java b/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/greenhouse/GreenhouseConfigImpl.java new file mode 100644 index 0000000..805a4b6 --- /dev/null +++ b/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/greenhouse/GreenhouseConfigImpl.java @@ -0,0 +1,91 @@ +package lgbt.greenhouse.config_extensions.gamerules.testmod.greenhouse; + +import com.mojang.brigadier.arguments.BoolArgumentType; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.serialization.Codec; +import lgbt.greenhouse.config.api.v3.GreenhouseConfigHolder; +import lgbt.greenhouse.config.api.v3.GreenhouseConfigSide; +import lgbt.greenhouse.config.api.v3.lang.GreenhouseConfigJsonCLang; +import lgbt.greenhouse.config_extensions.gamerules.api.v1.gamerule.ViaConfigGameRule; +import net.minecraft.util.ExtraCodecs; +import net.minecraft.world.flag.FeatureFlagSet; +import net.minecraft.world.level.gamerules.GameRule; +import net.minecraft.world.level.gamerules.GameRuleCategory; +import net.minecraft.world.level.gamerules.GameRuleType; +import net.minecraft.world.level.gamerules.GameRuleTypeVisitor; + +import java.util.function.Supplier; + +import static lgbt.greenhouse.config_extensions.gamerules.testmod.GreenhouseConfigExtensionsGameRulesTestmod.GAME_RULE_REGISTRY; + +public class GreenhouseConfigImpl { + public static final GreenhouseConfigHolder GREENHOUSE_GAME_RULE_CONFIG = GreenhouseConfigHolder.register( + GreenhouseGameRuleConfig.class, + "greenhouse_config_extensions_gamerules_testmod/greenhouse_config", + 1, + GreenhouseConfigJsonCLang.INSTANCE, + GreenhouseConfigSide.COMMON, + builder -> + builder.withValue( + "int_gamerule", + """ + An integer based gamerule. + + Used for the value of 'greenhouse_config_extensions_gamerules_testmod:greenhouse_int' + as a fallback if a per-world value is not set.""", + ExtraCodecs.intRange(0, 100), + 50, + GreenhouseGameRuleConfig::intGamerule + ).withValue( + "bool_gamerule", + """ + A boolean based gamerule. + + Used for the value of 'greenhouse_config_extensions_gamerules_testmod:greenhouse_boolean' + as a fallback if a per-world value is not set.""", + Codec.BOOL, + false, + GreenhouseGameRuleConfig::boolGamerule + ) + ); + + public static final Supplier, Integer>> GREENHOUSE_CONFIG_INT = GAME_RULE_REGISTRY.register( + "greenhouse_config_int", + () -> new ViaConfigGameRule<>( + new GameRule<>( + GameRuleCategory.MISC, + GameRuleType.INT, + IntegerArgumentType.integer(0, 100), + GameRuleTypeVisitor::visitInteger, + ExtraCodecs.intRange(0, 100), + integer -> integer, + 1, // Tbh, it doesn't really matter what the default value is, really. + FeatureFlagSet.of() + ), + GREENHOUSE_GAME_RULE_CONFIG, + holder -> holder.get().intGamerule() + ) + ); + + public static final Supplier, Boolean>> GREENHOUSE_CONFIG_BOOL = GAME_RULE_REGISTRY.register( + "greenhouse_config_boolean", + () -> new ViaConfigGameRule<>( + new GameRule<>( + GameRuleCategory.MISC, + GameRuleType.BOOL, + BoolArgumentType.bool(), + GameRuleTypeVisitor::visitBoolean, + Codec.BOOL, + bool -> bool ? 1 : 0, + true, // It doesn't really matter what the default value is, really. + FeatureFlagSet.of() + ), + GREENHOUSE_GAME_RULE_CONFIG, + holder -> holder.get().boolGamerule() + ) + ); + + public static void init() { + + } +} diff --git a/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/greenhouse/GreenhouseGameRuleConfig.java b/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/greenhouse/GreenhouseGameRuleConfig.java new file mode 100644 index 0000000..dee7804 --- /dev/null +++ b/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/greenhouse/GreenhouseGameRuleConfig.java @@ -0,0 +1,5 @@ +package lgbt.greenhouse.config_extensions.gamerules.testmod.greenhouse; + +public record GreenhouseGameRuleConfig(int intGamerule, + boolean boolGamerule) { +} diff --git a/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/kaleido/KaleidoConfigImpl.java b/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/kaleido/KaleidoConfigImpl.java new file mode 100644 index 0000000..3208704 --- /dev/null +++ b/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/kaleido/KaleidoConfigImpl.java @@ -0,0 +1,66 @@ +package lgbt.greenhouse.config_extensions.gamerules.testmod.kaleido; + +import com.mojang.brigadier.arguments.BoolArgumentType; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.serialization.Codec; +import lgbt.greenhouse.config_extensions.gamerules.api.v1.gamerule.ViaConfigGameRule; +import lgbt.greenhouse.config_extensions.gamerules.testmod.GreenhouseConfigExtensionsGameRulesTestmod; +import net.minecraft.util.ExtraCodecs; +import net.minecraft.world.flag.FeatureFlagSet; +import net.minecraft.world.level.gamerules.GameRule; +import net.minecraft.world.level.gamerules.GameRuleCategory; +import net.minecraft.world.level.gamerules.GameRuleType; +import net.minecraft.world.level.gamerules.GameRuleTypeVisitor; + +import java.util.function.Supplier; + +import static lgbt.greenhouse.config_extensions.gamerules.testmod.GreenhouseConfigExtensionsGameRulesTestmod.GAME_RULE_REGISTRY; + +public class KaleidoConfigImpl { + public static final KaleidoGameRuleConfig KALEIDO_GAME_RULE_CONFIG = KaleidoGameRuleConfig.createToml( + GreenhouseConfigExtensionsGameRulesTestmod.getPlatformHelper().getConfigDir(), + "greenhouse_config_extensions_gamerules_testmod", + "kaleido_config", + KaleidoGameRuleConfig.class + ); + + public static final Supplier> GREENHOUSE_CONFIG_INT = GAME_RULE_REGISTRY.register( + "kaleido_config_int", + () -> new ViaConfigGameRule<>( + new GameRule<>( + GameRuleCategory.MISC, + GameRuleType.INT, + IntegerArgumentType.integer(0, 100), + GameRuleTypeVisitor::visitInteger, + ExtraCodecs.intRange(0, 100), + integer -> integer, + 1, // Tbh, it doesn't really matter what the default value is, really. + FeatureFlagSet.of() + ), + KALEIDO_GAME_RULE_CONFIG, + config -> config.intGamerule + ) + ); + + public static final Supplier> GREENHOUSE_CONFIG_BOOL = GAME_RULE_REGISTRY.register( + "kaleido_config_boolean", + () -> new ViaConfigGameRule<>( + new GameRule<>( + GameRuleCategory.MISC, + GameRuleType.BOOL, + BoolArgumentType.bool(), + GameRuleTypeVisitor::visitBoolean, + Codec.BOOL, + bool -> bool ? 1 : 0, + true, // It doesn't really matter what the default value is, really. + FeatureFlagSet.of() + ), + KALEIDO_GAME_RULE_CONFIG, + config -> config.boolGamerule + ) + ); + + public static void init() { + + } +} diff --git a/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/kaleido/KaleidoGameRuleConfig.java b/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/kaleido/KaleidoGameRuleConfig.java new file mode 100644 index 0000000..68cf6c9 --- /dev/null +++ b/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/kaleido/KaleidoGameRuleConfig.java @@ -0,0 +1,16 @@ +package lgbt.greenhouse.config_extensions.gamerules.testmod.kaleido; + +import folk.sisby.kaleido.api.WrappedConfig; +import folk.sisby.kaleido.lib.quiltconfig.api.annotations.Comment; + +public class KaleidoGameRuleConfig extends WrappedConfig { + @Comment("An integer based gamerule.") + @Comment("Used for the value of 'greenhouse_config_extensions_gamerules_testmod:kaleido_int'") + @Comment("as a fallback if a per-world value is not set.") + public int intGamerule = 0; + + @Comment("An boolean based gamerule.") + @Comment("Used for the value of 'greenhouse_config_extensions_gamerules_testmod:kaleido_boolean'") + @Comment("as a fallback if a per-world value is not set.") + public boolean boolGamerule = false; +} diff --git a/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/platform/GreenhouseConfigExtensionsGameRulesTestmodHelperLoaders.java b/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/platform/GreenhouseConfigExtensionsGameRulesTestmodHelperLoaders.java new file mode 100644 index 0000000..a2c2e9c --- /dev/null +++ b/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/platform/GreenhouseConfigExtensionsGameRulesTestmodHelperLoaders.java @@ -0,0 +1,88 @@ +/* + * Copyright © 2026 Greenhouse Modding + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +package lgbt.greenhouse.config_extensions.gamerules.testmod.platform; + +import lgbt.greenhouse.config_extensions.gamerules.impl.GreenhouseConfigExtensionsGameRules; +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.Nullable; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; + +/// We have {@link java.util.ServiceLoader}s at home. +@ApiStatus.Internal +public class GreenhouseConfigExtensionsGameRulesTestmodHelperLoaders { + private static final String FABRIC_CLASS = "lgbt.greenhouse.config_extensions.gamerules.fabric.testmod.platform.GreenhouseConfigExtensionsGameRulesTestmodPlatformHelperFabric"; + private static final String NEOFORGE_CLASS = "lgbt.greenhouse.config_extensions.gamerules.neoforge.testmod.platform.GreenhouseConfigExtensionsGameRulesTestmodPlatformHelperNeoForge"; + + @Nullable + private static final MethodHandle FABRIC_PLATFORM_HELPER = find(lookup -> { + if (isFabric()) { + Class clazz = lookup.findClass(FABRIC_CLASS); + return lookup.findConstructor(clazz, MethodType.methodType(void.class)); + } + return null; + }); + @Nullable + private static final MethodHandle NEOFORGE_PLATFORM_HELPER = find(lookup -> { + if (isNeoForge()) { + Class clazz = lookup.findClass(NEOFORGE_CLASS); + return lookup.findConstructor(clazz, MethodType.methodType(void.class)); + } + return null; + }); + + public static GreenhouseConfigExtensionsGameRulesTestmodPlatformHelper createPlatformHelper() { + try { + if (NEOFORGE_PLATFORM_HELPER != null) { + return (GreenhouseConfigExtensionsGameRulesTestmodPlatformHelper) NEOFORGE_PLATFORM_HELPER.invoke(); + } + if (FABRIC_PLATFORM_HELPER != null) { + return (GreenhouseConfigExtensionsGameRulesTestmodPlatformHelper) FABRIC_PLATFORM_HELPER.invoke(); + } + } catch (Throwable e) { + GreenhouseConfigExtensionsGameRules.LOG.error("", e); + } + throw new IllegalStateException("No " + GreenhouseConfigExtensionsGameRulesTestmodPlatformHelper.class.getName() + " implementation found"); + } + + private static boolean isFabric() { + try { + // Check for Fabric Loader + Class.forName("net.fabricmc.loader.api.FabricLoader"); + return true; + } catch (ClassNotFoundException ignored) { + return false; + } + } + + private static boolean isNeoForge() { + try { + // Check for FancyModLoader + Class.forName("net.neoforged.fml.loading.FMLLoader"); + return true; + } catch (ClassNotFoundException ignored) { + return false; + } + } + + private interface Finder { + @Nullable MethodHandle find(MethodHandles.Lookup lookup) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException; + } + + @Nullable + private static MethodHandle find(Finder finder) { + try { + return finder.find(MethodHandles.lookup()); + } catch (ReflectiveOperationException e) { + return null; + } + } +} diff --git a/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/platform/GreenhouseConfigExtensionsGameRulesTestmodPlatformHelper.java b/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/platform/GreenhouseConfigExtensionsGameRulesTestmodPlatformHelper.java new file mode 100644 index 0000000..5d44cb5 --- /dev/null +++ b/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/platform/GreenhouseConfigExtensionsGameRulesTestmodPlatformHelper.java @@ -0,0 +1,15 @@ +/* + * Copyright © 2026 Greenhouse Modding + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +package lgbt.greenhouse.config_extensions.gamerules.testmod.platform; + +import java.nio.file.Path; + +public interface GreenhouseConfigExtensionsGameRulesTestmodPlatformHelper { + Path getConfigDir(); +} diff --git a/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/platform/Platform.java b/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/platform/Platform.java new file mode 100644 index 0000000..a6bf2e3 --- /dev/null +++ b/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/platform/Platform.java @@ -0,0 +1,14 @@ +/* + * Copyright © 2026 Greenhouse Modding + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +package lgbt.greenhouse.config_extensions.gamerules.testmod.platform; + +public enum Platform { + FABRIC, + NEOFORGE +} diff --git a/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/platform/package-info.java b/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/platform/package-info.java new file mode 100644 index 0000000..01d2780 --- /dev/null +++ b/gamerules/xplat/src/testmod/java/lgbt/greenhouse/config_extensions/gamerules/testmod/platform/package-info.java @@ -0,0 +1,14 @@ +/* + * Copyright © 2026 Greenhouse Modding + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +@ApiStatus.Internal +@NullMarked +package lgbt.greenhouse.config_extensions.gamerules.testmod.platform; + +import org.jetbrains.annotations.ApiStatus; +import org.jspecify.annotations.NullMarked; diff --git a/gamerules/xplat/src/testmod/resources/assets/greenhouse_config_extensions_gamerules_testmod/lang/en_us.json b/gamerules/xplat/src/testmod/resources/assets/greenhouse_config_extensions_gamerules_testmod/lang/en_us.json index 0b351aa..95c73ed 100644 --- a/gamerules/xplat/src/testmod/resources/assets/greenhouse_config_extensions_gamerules_testmod/lang/en_us.json +++ b/gamerules/xplat/src/testmod/resources/assets/greenhouse_config_extensions_gamerules_testmod/lang/en_us.json @@ -1,6 +1,9 @@ { - "gamerule.greenhouse_config_extensions_gamerules_testmod.greenhouse_config_bool": "[GREENHOUSE CONFIG] Bool", + "gamerule.greenhouse_config_extensions_gamerules_testmod.greenhouse_config_boolean": "[GREENHOUSE CONFIG] Boolean", "gamerule.greenhouse_config_extensions_gamerules_testmod.greenhouse_config_int": "[GREENHOUSE CONFIG] Int", + "gamerule.greenhouse_config_extensions_gamerules_testmod.kaleido_config_boolean": "[KALEIDO CONFIG] Boolean", + "gamerule.greenhouse_config_extensions_gamerules_testmod.kaleido_config_int": "[KALEIDO CONFIG] Int", + "subtitles.greenhouse_config_testmod.sylv_fan": "Sylv's fan whirrs" } -- 2.54.0