diff --git a/build_logic/src/main/kotlin/lgbt/greenhouse/config_extensions/gradle/Properties.kt b/build_logic/src/main/kotlin/lgbt/greenhouse/config_extensions/gradle/Properties.kt index d2b95e3..c0e9a9e 100644 --- a/build_logic/src/main/kotlin/lgbt/greenhouse/config_extensions/gradle/Properties.kt +++ b/build_logic/src/main/kotlin/lgbt/greenhouse/config_extensions/gradle/Properties.kt @@ -15,8 +15,8 @@ object Properties { const val FABRIC_API_VERSION_RANGE = "*" const val FABRIC_MINECRAFT_VERSION_RANGE = "~26.2" - const val NEOFORGE_LOADER_VERSION_RANGE = "[4,)" - const val NEOFORGE_VERSION_RANGE = "[26.2,26.3)" + const val NEOFORGE_LOADER_VERSION_RANGE = "[11,)" + const val NEOFORGE_VERSION_RANGE = "[26.2.0.15-beta,26.3)" const val NEOFORGE_MINECRAFT_VERSION_RANGE = "[26.2,26.3)" const val MODRINTH_PAGE = "https://modrinth.com/project/greenhouse-config-extensions" diff --git a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/client/Accessor_AbstractGameRulesScreenRuleList.java b/gamerules/fabric/src/main/java/lgbt/greenhouse/config_extensions/gamerules/fabric/impl/mixin/Accessor_AbstractGameRulesScreenRuleList.java similarity index 67% rename from gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/client/Accessor_AbstractGameRulesScreenRuleList.java rename to gamerules/fabric/src/main/java/lgbt/greenhouse/config_extensions/gamerules/fabric/impl/mixin/Accessor_AbstractGameRulesScreenRuleList.java index 2b2c1c8..40a5cb7 100644 --- a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/client/Accessor_AbstractGameRulesScreenRuleList.java +++ b/gamerules/fabric/src/main/java/lgbt/greenhouse/config_extensions/gamerules/fabric/impl/mixin/Accessor_AbstractGameRulesScreenRuleList.java @@ -1,4 +1,4 @@ -package lgbt.greenhouse.config_extensions.gamerules.impl.mixin.client; +package lgbt.greenhouse.config_extensions.gamerules.fabric.impl.mixin; import net.minecraft.client.gui.screens.worldselection.AbstractGameRulesScreen; import org.spongepowered.asm.mixin.Mixin; @@ -7,5 +7,5 @@ import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(AbstractGameRulesScreen.RuleList.class) public interface Accessor_AbstractGameRulesScreenRuleList { @Accessor("this$0") - AbstractGameRulesScreen greenhouse_config$getThis(); + AbstractGameRulesScreen greenhouse_config_extensions_gamerules$getThis(); } diff --git a/gamerules/fabric/src/main/java/lgbt/greenhouse/config_extensions/gamerules/fabric/impl/mixin/Mixin_AbstractGameRulesScreenRuleList1.java b/gamerules/fabric/src/main/java/lgbt/greenhouse/config_extensions/gamerules/fabric/impl/mixin/Mixin_AbstractGameRulesScreenRuleList1.java new file mode 100644 index 0000000..3a98666 --- /dev/null +++ b/gamerules/fabric/src/main/java/lgbt/greenhouse/config_extensions/gamerules/fabric/impl/mixin/Mixin_AbstractGameRulesScreenRuleList1.java @@ -0,0 +1,65 @@ +package lgbt.greenhouse.config_extensions.gamerules.fabric.impl.mixin; + +import com.llamalad7.mixinextras.sugar.Local; +import lgbt.greenhouse.config_extensions.gamerules.api.v1.gamerule.ViaConfigGameRule; +import lgbt.greenhouse.config_extensions.gamerules.impl.client.GreenhouseConfigExtensionsGameRulesClient; +import lgbt.greenhouse.config_extensions.gamerules.impl.client.screen.gamerule.ViaConfigGameRuleEntry; +import lgbt.greenhouse.config_extensions.gamerules.impl.duck.Duck_ViaConfigGameRuleTypeVisitor; +import net.minecraft.client.gui.screens.worldselection.AbstractGameRulesScreen; +import net.minecraft.client.gui.screens.worldselection.WorldCreationGameRulesScreen; +import net.minecraft.network.chat.Component; +import net.minecraft.util.FormattedCharSequence; +import net.minecraft.util.Unit; +import net.minecraft.world.level.gamerules.GameRule; +import net.minecraft.world.level.gamerules.GameRuleTypeVisitor; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.List; + +@Mixin(targets = "net/minecraft/client/gui/screens/worldselection/AbstractGameRulesScreen$RuleList$1") +public abstract class Mixin_AbstractGameRulesScreenRuleList1 implements Duck_ViaConfigGameRuleTypeVisitor { + @Final + @Shadow + private WorldCreationGameRulesScreen.RuleList this$1; + + @Shadow + abstract void addEntry(final GameRule gameRule, final AbstractGameRulesScreen.EntryFactory factory); + + @Unique + private AbstractGameRulesScreen.RuleEntry greenhouse_config_extensions_gamerules$innerEntry; + + @Inject(method = "addEntry(Lnet/minecraft/world/level/gamerules/GameRule;Lnet/minecraft/client/gui/screens/worldselection/AbstractGameRulesScreen$EntryFactory;)V", at = @At(value = "INVOKE", target = "java/util/Map.computeIfAbsent (Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;"), cancellable = true) + private void greenhouse_config_extensions_gamerules$collectInnerEntry(final GameRule gameRule, + final AbstractGameRulesScreen.EntryFactory factory, + CallbackInfo ci, + @Local(ordinal = 0) Component readableName, + @Local List tooltip, + @Local(ordinal = 1) String narration) { + if (GreenhouseConfigExtensionsGameRulesClient.OBTAIN_INNER_VALUE.isBound()) { + greenhouse_config_extensions_gamerules$innerEntry = factory.create(readableName, tooltip, narration, gameRule); + ci.cancel(); + } + } + + @Override + public void greenhouse_config_extensions_gamerules$visitConfigBacked(final ViaConfigGameRule gameRule) { + addEntry(gameRule, (_, _, _, _) -> { + ScopedValue.where(GreenhouseConfigExtensionsGameRulesClient.OBTAIN_INNER_VALUE, Unit.INSTANCE) + .run(() -> gameRule.innerVisitorCaller().call((GameRuleTypeVisitor) this, gameRule)); + + ViaConfigGameRuleEntry entry = new ViaConfigGameRuleEntry<>( + ((Accessor_AbstractGameRulesScreenRuleList)this$1).greenhouse_config_extensions_gamerules$getThis(), + greenhouse_config_extensions_gamerules$innerEntry, + gameRule + ); + greenhouse_config_extensions_gamerules$innerEntry = null; + return entry; + }); + } +} diff --git a/gamerules/fabric/src/main/resources/greenhouse_config_extensions_gamerules.fabric.mixins.json b/gamerules/fabric/src/main/resources/greenhouse_config_extensions_gamerules.fabric.mixins.json index fc3c5eb..4c9c5d6 100644 --- a/gamerules/fabric/src/main/resources/greenhouse_config_extensions_gamerules.fabric.mixins.json +++ b/gamerules/fabric/src/main/resources/greenhouse_config_extensions_gamerules.fabric.mixins.json @@ -4,6 +4,8 @@ "package": "lgbt.greenhouse.config_extensions.gamerules.fabric.impl.mixin", "compatibilityLevel": "JAVA_25", "mixins": [ + "Accessor_AbstractGameRulesScreenRuleList", + "Mixin_AbstractGameRulesScreenRuleList1", "Mixin_GameRuleType" ], "injectors": { diff --git a/gamerules/neoforge/src/main/java/lgbt/greenhouse/config_extensions/gamerules/neoforge/impl/GreenhouseConfigExtensionsGameRulesNeoForge.java b/gamerules/neoforge/src/main/java/lgbt/greenhouse/config_extensions/gamerules/neoforge/impl/GreenhouseConfigExtensionsGameRulesNeoForge.java index 5ce6123..5966914 100644 --- a/gamerules/neoforge/src/main/java/lgbt/greenhouse/config_extensions/gamerules/neoforge/impl/GreenhouseConfigExtensionsGameRulesNeoForge.java +++ b/gamerules/neoforge/src/main/java/lgbt/greenhouse/config_extensions/gamerules/neoforge/impl/GreenhouseConfigExtensionsGameRulesNeoForge.java @@ -6,20 +6,25 @@ import lgbt.greenhouse.config_extensions.gamerules.impl.command.ViaConfigArgumen import lgbt.greenhouse.config_extensions.gamerules.impl.network.GreenhouseConfigExtensionsGameRulesServerboundPacketHandlers; import lgbt.greenhouse.config_extensions.gamerules.impl.network.clientbound.SendViaConfigValueGameRulesClientboundPacket; import lgbt.greenhouse.config_extensions.gamerules.impl.network.serverbound.SendViaConfigValueGameRulesServerboundPacket; +import lgbt.greenhouse.config_extensions.gamerules.neoforge.impl.client.GreenhouseConfigExtensionsGameRulesClientNeoForge; import net.minecraft.commands.synchronization.ArgumentTypeInfos; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.gamerules.GameRuleTypeVisitor; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.common.Mod; import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; import net.neoforged.neoforge.registries.RegisterEvent; +import org.jspecify.annotations.Nullable; @Mod(GreenhouseConfigExtensionsGameRules.MOD_ID) @EventBusSubscriber(modid = GreenhouseConfigExtensionsGameRules.MOD_ID) public class GreenhouseConfigExtensionsGameRulesNeoForge { + public static final ScopedValue TYPE_VISITOR = ScopedValue.newInstance(); + @SubscribeEvent public static void commonSetup(FMLCommonSetupEvent event) { var argumentType = BuiltInRegistries.COMMAND_ARGUMENT_TYPE.getValue(GreenhouseConfigExtensionsGameRules.id("via_config")); @@ -33,7 +38,6 @@ public class GreenhouseConfigExtensionsGameRulesNeoForge { event.register(Registries.COMMAND_ARGUMENT_TYPE, GreenhouseConfigExtensionsGameRules.id("via_config"), ViaConfigArgumentTypeInfo::new); } - @SubscribeEvent public static void registerPayloadHandlers(RegisterPayloadHandlersEvent event) { event.registrar("3.0.0") diff --git a/gamerules/neoforge/src/main/java/lgbt/greenhouse/config_extensions/gamerules/neoforge/impl/client/GreenhouseConfigExtensionsGameRulesClientNeoForge.java b/gamerules/neoforge/src/main/java/lgbt/greenhouse/config_extensions/gamerules/neoforge/impl/client/GreenhouseConfigExtensionsGameRulesClientNeoForge.java index 69288d9..3602a32 100644 --- a/gamerules/neoforge/src/main/java/lgbt/greenhouse/config_extensions/gamerules/neoforge/impl/client/GreenhouseConfigExtensionsGameRulesClientNeoForge.java +++ b/gamerules/neoforge/src/main/java/lgbt/greenhouse/config_extensions/gamerules/neoforge/impl/client/GreenhouseConfigExtensionsGameRulesClientNeoForge.java @@ -1,18 +1,90 @@ package lgbt.greenhouse.config_extensions.gamerules.neoforge.impl.client; +import lgbt.greenhouse.config_extensions.gamerules.api.v1.gamerule.ViaConfigGameRule; import lgbt.greenhouse.config_extensions.gamerules.impl.GreenhouseConfigExtensionsGameRules; +import lgbt.greenhouse.config_extensions.gamerules.impl.client.GreenhouseConfigExtensionsGameRulesClient; import lgbt.greenhouse.config_extensions.gamerules.impl.client.network.GreenhouseConfigClientboundPacketHandlers; +import lgbt.greenhouse.config_extensions.gamerules.impl.client.screen.gamerule.ViaConfigGameRuleEntry; import lgbt.greenhouse.config_extensions.gamerules.impl.network.clientbound.SendViaConfigValueGameRulesClientboundPacket; +import lgbt.greenhouse.config_extensions.gamerules.neoforge.impl.GreenhouseConfigExtensionsGameRulesNeoForge; +import lgbt.greenhouse.config_extensions.gamerules.neoforge.impl.mixin.client.Accessor_GameRuleEntryFactoryManager; +import net.minecraft.client.gui.screens.worldselection.AbstractGameRulesScreen; +import net.minecraft.util.Unit; +import net.minecraft.world.level.gamerules.GameRuleType; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.client.gamerules.GameRuleEntryFactory; +import net.neoforged.neoforge.client.gamerules.GameRuleEntryFactoryManager; +import net.neoforged.neoforge.client.gamerules.GenericGameRuleEntry; +import net.neoforged.neoforge.client.gamerules.RegisterGameRuleEntryFactoryEvent; import net.neoforged.neoforge.client.network.event.RegisterClientPayloadHandlersEvent; +import org.apache.commons.lang3.mutable.Mutable; +import org.apache.commons.lang3.mutable.MutableObject; + +import java.util.Objects; @Mod(GreenhouseConfigExtensionsGameRules.MOD_ID) @EventBusSubscriber(modid = GreenhouseConfigExtensionsGameRules.MOD_ID) public class GreenhouseConfigExtensionsGameRulesClientNeoForge { + private static final ThreadLocal INNER_RULE_ENTRY = new ThreadLocal<>(); + @SubscribeEvent public static void registerPayloadHandlers(RegisterClientPayloadHandlersEvent event) { event.register(SendViaConfigValueGameRulesClientboundPacket.TYPE, (packet, ctx) -> GreenhouseConfigClientboundPacketHandlers.handleSentGameRules(packet)); } + + @SubscribeEvent + public static void registerGameRuleEntryFactory(RegisterGameRuleEntryFactoryEvent event) { + event.register( + GreenhouseConfigExtensionsGameRules.VIA_CONFIG_GAME_RULE_TYPE, + (screen, component, tooltip, narration, gameRule) -> { + if (!(gameRule instanceof ViaConfigGameRule viaConfigRule)) { + throw new IllegalStateException("Game rule is not an instance of ViaConfigGameRule."); + } + + ScopedValue.where(GreenhouseConfigExtensionsGameRulesClient.OBTAIN_INNER_VALUE, Unit.INSTANCE) + .call(() -> { + Mutable ruleEntry = new MutableObject<>(); + + //noinspection UnstableApiUsage + GameRuleEntryFactoryManager.appendGameRuleEntry( + screen, + viaConfigRule, + (rule, _) -> { + GameRuleType ruleType = viaConfigRule.innerGameRuleType(); + + if (ruleType == GameRuleType.BOOL || ruleType == GameRuleType.INT) + return; + + GameRuleEntryFactory factory = (GameRuleEntryFactory) Accessor_GameRuleEntryFactoryManager.greenhouse_config_extensions_gamerules$getFACTORIES() + .getOrDefault(ruleType, GenericGameRuleEntry::new); + + ruleEntry.setValue(factory.create(screen, component, tooltip, narration, rule)); + } + ); + if (ruleEntry.get() == null) { + viaConfigRule.innerVisitorCaller().call(GreenhouseConfigExtensionsGameRulesNeoForge.TYPE_VISITOR.get(), gameRule); + ruleEntry.setValue(INNER_RULE_ENTRY.get()); + } + + return ruleEntry.get(); + }); + + ViaConfigGameRuleEntry entry = new ViaConfigGameRuleEntry<>( + screen, + INNER_RULE_ENTRY.get(), + viaConfigRule + ); + + INNER_RULE_ENTRY.remove(); + + return entry; + } + ); + } + + public static void setInnerRuleEntry(AbstractGameRulesScreen.RuleEntry innerRuleEntry) { + GreenhouseConfigExtensionsGameRulesClientNeoForge.INNER_RULE_ENTRY.set(innerRuleEntry); + } } diff --git a/gamerules/neoforge/src/main/java/lgbt/greenhouse/config_extensions/gamerules/neoforge/impl/mixin/client/Accessor_GameRuleEntryFactoryManager.java b/gamerules/neoforge/src/main/java/lgbt/greenhouse/config_extensions/gamerules/neoforge/impl/mixin/client/Accessor_GameRuleEntryFactoryManager.java new file mode 100644 index 0000000..7a1cdc0 --- /dev/null +++ b/gamerules/neoforge/src/main/java/lgbt/greenhouse/config_extensions/gamerules/neoforge/impl/mixin/client/Accessor_GameRuleEntryFactoryManager.java @@ -0,0 +1,17 @@ +package lgbt.greenhouse.config_extensions.gamerules.neoforge.impl.mixin.client; + +import net.minecraft.world.level.gamerules.GameRuleType; +import net.neoforged.neoforge.client.gamerules.GameRuleEntryFactory; +import net.neoforged.neoforge.client.gamerules.GameRuleEntryFactoryManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.Map; + +@Mixin(GameRuleEntryFactoryManager.class) +public interface Accessor_GameRuleEntryFactoryManager { + @Accessor("FACTORIES") + static Map> greenhouse_config_extensions_gamerules$getFACTORIES() { + throw new AssertionError("Implemented via mixin."); + } +} diff --git a/gamerules/neoforge/src/main/java/lgbt/greenhouse/config_extensions/gamerules/neoforge/impl/mixin/client/Mixin_AbstractGameRulesScreenRuleList.java b/gamerules/neoforge/src/main/java/lgbt/greenhouse/config_extensions/gamerules/neoforge/impl/mixin/client/Mixin_AbstractGameRulesScreenRuleList.java new file mode 100644 index 0000000..1957f3b --- /dev/null +++ b/gamerules/neoforge/src/main/java/lgbt/greenhouse/config_extensions/gamerules/neoforge/impl/mixin/client/Mixin_AbstractGameRulesScreenRuleList.java @@ -0,0 +1,19 @@ +package lgbt.greenhouse.config_extensions.gamerules.neoforge.impl.mixin.client; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import lgbt.greenhouse.config_extensions.gamerules.neoforge.impl.GreenhouseConfigExtensionsGameRulesNeoForge; +import net.minecraft.client.gui.screens.worldselection.AbstractGameRulesScreen; +import net.minecraft.world.level.gamerules.GameRuleTypeVisitor; +import net.minecraft.world.level.gamerules.GameRules; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(AbstractGameRulesScreen.RuleList.class) +public class Mixin_AbstractGameRulesScreenRuleList { + @WrapOperation(method = "populateChildren", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/gamerules/GameRules;visitGameRuleTypes(Lnet/minecraft/world/level/gamerules/GameRuleTypeVisitor;)V")) + private void greenhouse_config_extensions_gamerules$captureTypeVisitor(GameRules instance, GameRuleTypeVisitor visitor, Operation original) { + ScopedValue.where(GreenhouseConfigExtensionsGameRulesNeoForge.TYPE_VISITOR, visitor) + .run(() -> original.call(instance, visitor)); + } +} diff --git a/gamerules/neoforge/src/main/java/lgbt/greenhouse/config_extensions/gamerules/neoforge/impl/mixin/client/Mixin_AbstractGameRulesScreenRuleList1.java b/gamerules/neoforge/src/main/java/lgbt/greenhouse/config_extensions/gamerules/neoforge/impl/mixin/client/Mixin_AbstractGameRulesScreenRuleList1.java new file mode 100644 index 0000000..fbafb1b --- /dev/null +++ b/gamerules/neoforge/src/main/java/lgbt/greenhouse/config_extensions/gamerules/neoforge/impl/mixin/client/Mixin_AbstractGameRulesScreenRuleList1.java @@ -0,0 +1,32 @@ +package lgbt.greenhouse.config_extensions.gamerules.neoforge.impl.mixin.client; + +import com.llamalad7.mixinextras.sugar.Local; +import lgbt.greenhouse.config_extensions.gamerules.impl.client.GreenhouseConfigExtensionsGameRulesClient; +import lgbt.greenhouse.config_extensions.gamerules.neoforge.impl.client.GreenhouseConfigExtensionsGameRulesClientNeoForge; +import net.minecraft.client.gui.screens.worldselection.AbstractGameRulesScreen; +import net.minecraft.network.chat.Component; +import net.minecraft.util.FormattedCharSequence; +import net.minecraft.world.level.gamerules.GameRule; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.List; + +@Mixin(targets = "net/minecraft/client/gui/screens/worldselection/AbstractGameRulesScreen$RuleList$1") +public abstract class Mixin_AbstractGameRulesScreenRuleList1 { + @Inject(method = "addEntry(Lnet/minecraft/world/level/gamerules/GameRule;Lnet/minecraft/client/gui/screens/worldselection/AbstractGameRulesScreen$EntryFactory;)V", at = @At(value = "INVOKE", target = "java/util/Map.computeIfAbsent (Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;"), cancellable = true) + private void greenhouse_config_extensions_gamerules$collectInnerEntry(final GameRule gameRule, + final AbstractGameRulesScreen.EntryFactory factory, + CallbackInfo ci, + @Local(ordinal = 0) Component readableName, + @Local List tooltip, + @Local(ordinal = 1) String narration) { + // Still necessary for BOOL/INT gamerules. + if (GreenhouseConfigExtensionsGameRulesClient.OBTAIN_INNER_VALUE.isBound()) { + GreenhouseConfigExtensionsGameRulesClientNeoForge.setInnerRuleEntry(factory.create(readableName, tooltip, narration, gameRule)); + ci.cancel(); + } + } +} diff --git a/gamerules/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/gamerules/neoforge/src/main/resources/META-INF/neoforge.mods.toml index 133dd5a..819e88f 100644 --- a/gamerules/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/gamerules/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -17,6 +17,9 @@ enumExtensions = "${mod_id}_extensions.json" [[mixins]] config = "${mod_id}.mixins.json" +[[mixins]] +config = "${mod_id}.neoforge.mixins.json" + [[accessTransformers]] file = "${mod_id}.cfg" diff --git a/gamerules/neoforge/src/main/resources/greenhouse_config_extensions_gamerules.neoforge.mixins.json b/gamerules/neoforge/src/main/resources/greenhouse_config_extensions_gamerules.neoforge.mixins.json index 3386d86..1655ebd 100644 --- a/gamerules/neoforge/src/main/resources/greenhouse_config_extensions_gamerules.neoforge.mixins.json +++ b/gamerules/neoforge/src/main/resources/greenhouse_config_extensions_gamerules.neoforge.mixins.json @@ -1,10 +1,12 @@ { "required": true, "minVersion": "0.8", - "package": "lgbt.greenhouse.config_extensions.impl.neoforge.mixin", + "package": "lgbt.greenhouse.config_extensions.gamerules.neoforge.impl.mixin", "compatibilityLevel": "JAVA_25", "mixins": [ - "Mixin_RegisterGameRuleEntryFactoryEvent" + "client.Mixin_AbstractGameRulesScreenRuleList", + "client.Mixin_AbstractGameRulesScreenRuleList1", + "client.Accessor_GameRuleEntryFactoryManager" ], "client": [ ], diff --git a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/api/v1/gamerule/ViaConfigGameRule.java b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/api/v1/gamerule/ViaConfigGameRule.java index d8adc0a..f450cfd 100644 --- a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/api/v1/gamerule/ViaConfigGameRule.java +++ b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/api/v1/gamerule/ViaConfigGameRule.java @@ -6,9 +6,9 @@ import lgbt.greenhouse.config_extensions.gamerules.impl.NullableCodec; import lgbt.greenhouse.config_extensions.gamerules.impl.command.ViaConfigArgumentType; import lgbt.greenhouse.config_extensions.gamerules.impl.duck.Duck_ViaConfigGameRuleTypeVisitor; import lgbt.greenhouse.config_extensions.gamerules.impl.mixin.Accessor_GameRule; +import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.gamerules.*; import org.jetbrains.annotations.ApiStatus; -import org.jspecify.annotations.NonNull; import org.jspecify.annotations.Nullable; /// A game rule that has its default value set to a matching config value. @@ -36,18 +36,22 @@ public class ViaConfigGameRule extends GameRule { super( gameRule.category(), GreenhouseConfigExtensionsGameRules.VIA_CONFIG_GAME_RULE_TYPE, - new ViaConfigArgumentType<>(gameRule.argument()), + gameRule.argument(), ViaConfigGameRule::visit, NullableCodec.nullable(gameRule.valueCodec()), gameRule::getCommandResult, fromConfig.getValue(config), gameRule.requiredFeatures() ); + + //noinspection unchecked + ((Accessor_GameRule)this).greenhouse_config_extensions_gamerules$setArgument(new ViaConfigArgumentType<>(gameRule.argument(), this)); + this.config = config; this.fromConfig = fromConfig; //noinspection unchecked this.innerVisitorCaller = (visitor, innerRule) -> ((Accessor_GameRule) gameRule) - .greenhouse_config$getVisitorCaller() + .greenhouse_config_extensions_gamerules$getVisitorCaller() .call(visitor, innerRule); this.innerGameRuleType = gameRule.gameRuleType(); } @@ -68,7 +72,7 @@ public class ViaConfigGameRule extends GameRule { @Override @ApiStatus.Internal - public @NonNull String serialize(@Nullable T value) { + public String serialize(@Nullable T value) { if (value == null) { return super.serialize(configValue()); } @@ -77,12 +81,12 @@ public class ViaConfigGameRule extends GameRule { @Override @ApiStatus.Internal - public @NonNull DataResult deserialize(@NonNull String value) { + public DataResult deserialize(String value) { return super.deserialize(value); } @ApiStatus.Internal - public @NonNull T configValue() { + public T configValue() { return fromConfig.getValue(config); } @@ -110,7 +114,7 @@ public class ViaConfigGameRule extends GameRule { visitor instanceof Duck_ViaConfigGameRuleTypeVisitor configBackedVisitor && gameRule instanceof ViaConfigGameRule viaConfigGameRule ) { - configBackedVisitor.greenhouse_config$visitConfigBacked(viaConfigGameRule); + configBackedVisitor.greenhouse_config_extensions_gamerules$visitConfigBacked(viaConfigGameRule); } } } 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 38b8c9b..4f56c7d 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 @@ -3,8 +3,10 @@ package lgbt.greenhouse.config_extensions.gamerules.impl; import lgbt.greenhouse.config_extensions.gamerules.impl.platform.GreenhouseConfigExtensionsGameRulesPlatformHelper; import lgbt.greenhouse.config_extensions.gamerules.impl.platform.GreenhouseConfigExtensionsGameRulesHelperLoaders; import net.minecraft.resources.Identifier; +import net.minecraft.util.Unit; import net.minecraft.world.level.gamerules.GameRuleType; import net.minecraft.world.level.gamerules.GameRules; +import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -13,9 +15,11 @@ public class GreenhouseConfigExtensionsGameRules { public static final String MOD_NAME = "Greenhouse Config Extensions - Game Rules"; public static final Logger LOG = LoggerFactory.getLogger(MOD_NAME); - public static ScopedValue GAME_RULES_SCOPED_VALUE = ScopedValue.newInstance(); public static final GameRuleType VIA_CONFIG_GAME_RULE_TYPE = GameRuleType.valueOf("GREENHOUSE_CONFIG_EXTENSIONS_GAMERULES_VIA_CONFIG"); + public static final ScopedValue GAME_RULES = ScopedValue.newInstance(); + + @Nullable private static GreenhouseConfigExtensionsGameRulesPlatformHelper platformHelper; public static GreenhouseConfigExtensionsGameRulesPlatformHelper getPlatformHelper() { diff --git a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/client/GreenhouseConfigExtensionsGameRulesClient.java b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/client/GreenhouseConfigExtensionsGameRulesClient.java index 1baa868..04b8ef7 100644 --- a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/client/GreenhouseConfigExtensionsGameRulesClient.java +++ b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/client/GreenhouseConfigExtensionsGameRulesClient.java @@ -3,5 +3,5 @@ package lgbt.greenhouse.config_extensions.gamerules.impl.client; import net.minecraft.util.Unit; public class GreenhouseConfigExtensionsGameRulesClient { - public static ScopedValue IS_INNER_VALUE_SCOPED_VALUE = ScopedValue.newInstance(); + public static ScopedValue OBTAIN_INNER_VALUE = ScopedValue.newInstance(); } diff --git a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/client/network/GreenhouseConfigClientboundPacketHandlers.java b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/client/network/GreenhouseConfigClientboundPacketHandlers.java index 0438139..2b802d1 100644 --- a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/client/network/GreenhouseConfigClientboundPacketHandlers.java +++ b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/client/network/GreenhouseConfigClientboundPacketHandlers.java @@ -21,9 +21,9 @@ public class GreenhouseConfigClientboundPacketHandlers { continue; } - ((Accessor_InWorldGameRulesScreen) inWorldGameRulesScreen).greenhouse_config$getServerProvidedRules().add(gameRule); - ((Accessor_InWorldGameRulesScreen) inWorldGameRulesScreen).greenhouse_config$getInitialValues().set(gameRule, null); - ((Accessor_AbstractGameRulesScreen) inWorldGameRulesScreen).greenhouse_config$getGameRules().set(gameRule, null, null); + ((Accessor_InWorldGameRulesScreen) inWorldGameRulesScreen).greenhouse_config_extensions_gamerules$getServerProvidedRules().add(gameRule); + ((Accessor_InWorldGameRulesScreen) inWorldGameRulesScreen).greenhouse_config_extensions_gamerules$getInitialValues().set(gameRule, null); + ((Accessor_AbstractGameRulesScreen) inWorldGameRulesScreen).greenhouse_config_extensions_gamerules$getGameRules().set(gameRule, null, null); } } diff --git a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/client/screen/gamerule/ViaConfigGameRuleEntry.java b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/client/screen/gamerule/ViaConfigGameRuleEntry.java index 9d3fa5f..5750c80 100644 --- a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/client/screen/gamerule/ViaConfigGameRuleEntry.java +++ b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/client/screen/gamerule/ViaConfigGameRuleEntry.java @@ -38,7 +38,7 @@ public class ViaConfigGameRuleEntry extends AbstractGameRulesScreen.GameRuleE ViaConfigGameRule gameRule) { screen.super(Collections.emptyList(), Component.empty()); - GameRules gameRules = ((Accessor_AbstractGameRulesScreen)screen).greenhouse_config$getGameRules(); + GameRules gameRules = ((Accessor_AbstractGameRulesScreen)screen).greenhouse_config_extensions_gamerules$getGameRules(); this.inner = inner; configValueSetter = v -> { @@ -51,7 +51,7 @@ public class ViaConfigGameRuleEntry extends AbstractGameRulesScreen.GameRuleE setInnerActive(); }; - isConfigDefault = ((Duck_ViaConfigGameRules)gameRules).greenhouse_config$isUsingConfig(gameRule); + isConfigDefault = ((Duck_ViaConfigGameRules)gameRules).greenhouse_config_extensions_gamerules$isUsingConfig(gameRule); checkbox = CycleButton.onOffBuilder(isConfigDefault) .displayOnlyValue() .withSprite((button, bool) -> SPRITES.get(bool, button.isHoveredOrFocused())) diff --git a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/command/ViaConfigArgumentType.java b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/command/ViaConfigArgumentType.java index 8f7b4b7..d33750b 100644 --- a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/command/ViaConfigArgumentType.java +++ b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/command/ViaConfigArgumentType.java @@ -7,13 +7,17 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.brigadier.suggestion.Suggestion; import com.mojang.brigadier.suggestion.Suggestions; import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import lgbt.greenhouse.config_extensions.gamerules.api.v1.gamerule.ViaConfigGameRule; +import net.minecraft.util.Unit; +import org.jspecify.annotations.Nullable; import java.util.Collection; import java.util.concurrent.CompletableFuture; import java.util.stream.Stream; -public record ViaConfigArgumentType(ArgumentType inner) implements ArgumentType { +public record ViaConfigArgumentType(ArgumentType inner, ViaConfigGameRule gameRule) implements ArgumentType { public static final String CONFIG_DEFAULT = "config_default"; + public static final ThreadLocal<@Nullable Unit> SET_TO_NULL = new ThreadLocal<>(); public static Class clazz() { //noinspection unchecked @@ -23,7 +27,8 @@ public record ViaConfigArgumentType(ArgumentType inner) implements Argumen @Override public T parse(StringReader reader) throws CommandSyntaxException { if (parseConfigDefault(reader) && reader.readString().equals(CONFIG_DEFAULT)) { - return null; + SET_TO_NULL.set(Unit.INSTANCE); + return gameRule.configValue(); } return inner.parse(reader); } @@ -31,7 +36,8 @@ public record ViaConfigArgumentType(ArgumentType inner) implements Argumen @Override public T parse(StringReader reader, S source) throws CommandSyntaxException { if (parseConfigDefault(reader) && reader.readString().equals(CONFIG_DEFAULT)) { - return null; + SET_TO_NULL.set(Unit.INSTANCE); + return gameRule.configValue(); } return inner.parse(reader, source); } diff --git a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/command/ViaConfigArgumentTypeInfo.java b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/command/ViaConfigArgumentTypeInfo.java index e0e0c3d..25503a9 100644 --- a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/command/ViaConfigArgumentTypeInfo.java +++ b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/command/ViaConfigArgumentTypeInfo.java @@ -2,26 +2,34 @@ package lgbt.greenhouse.config_extensions.gamerules.impl.command; import com.google.gson.JsonObject; import com.mojang.brigadier.arguments.ArgumentType; +import lgbt.greenhouse.config_extensions.gamerules.api.v1.gamerule.ViaConfigGameRule; import net.minecraft.commands.CommandBuildContext; import net.minecraft.commands.synchronization.ArgumentTypeInfo; import net.minecraft.commands.synchronization.ArgumentTypeInfos; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.Identifier; +import net.minecraft.world.level.gamerules.GameRule; import org.jspecify.annotations.NonNull; public class ViaConfigArgumentTypeInfo implements ArgumentTypeInfo, ViaConfigArgumentTypeInfo.Template> { @Override - public void serializeToNetwork(ViaConfigArgumentTypeInfo.Template template, @NonNull FriendlyByteBuf out) { + public void serializeToNetwork(ViaConfigArgumentTypeInfo.Template template, FriendlyByteBuf out) { //noinspection unchecked ArgumentTypeInfo, ArgumentTypeInfo.Template>> type = (ArgumentTypeInfo, ArgumentTypeInfo.Template>>) template.template.type(); //noinspection DataFlowIssue Identifier.STREAM_CODEC.encode(out, BuiltInRegistries.COMMAND_ARGUMENT_TYPE.getKey(type)); type.serializeToNetwork(template.template, out); + + Identifier gameRuleId = BuiltInRegistries.GAME_RULE.getKey(template.gameRule); + if (gameRuleId == null) { + throw new IllegalStateException("Non-existent gamerule associated with ViaConfigArgumentType."); + } + Identifier.STREAM_CODEC.encode(out, gameRuleId); } @Override - public @NonNull Template deserializeFromNetwork(@NonNull FriendlyByteBuf in) { + public Template deserializeFromNetwork(FriendlyByteBuf in) { Identifier typeId = Identifier.STREAM_CODEC.decode(in); //noinspection unchecked @@ -30,8 +38,14 @@ public class ViaConfigArgumentTypeInfo implements ArgumentTypeInfo> inner = (ArgumentTypeInfo.Template>) type.deserializeFromNetwork(in); - return new Template(inner); + GameRule gameRule = BuiltInRegistries.GAME_RULE.getValue(Identifier.STREAM_CODEC.decode(in)); + + if (gameRule instanceof ViaConfigGameRule) { + //noinspection unchecked + return new Template(inner, (ViaConfigGameRule) gameRule); + } } + throw new IllegalStateException("Could not obtain config backed argument type from ID '" + typeId + "'"); } @@ -50,23 +64,25 @@ public class ViaConfigArgumentTypeInfo implements ArgumentTypeInfo, ?> info = ArgumentTypeInfos.byClass(inner); ArgumentTypeInfo.Template> template = info.unpack(inner); - return new Template(template); + return new Template(template, argument.gameRule()); } public class Template implements ArgumentTypeInfo.Template> { private final ArgumentTypeInfo.Template> template; + private final ViaConfigGameRule gameRule; - public Template(ArgumentTypeInfo.Template> template) { + public Template(ArgumentTypeInfo.Template> template, ViaConfigGameRule gameRule) { this.template = template; + this.gameRule = gameRule; } @Override - public @NonNull ViaConfigArgumentType instantiate(@NonNull CommandBuildContext context) { - return new ViaConfigArgumentType<>(template.instantiate(context)); + public ViaConfigArgumentType instantiate(@NonNull CommandBuildContext context) { + return new ViaConfigArgumentType<>(template.instantiate(context), gameRule); } @Override - public @NonNull ArgumentTypeInfo, ?> type() { + public ArgumentTypeInfo, ?> type() { return ViaConfigArgumentTypeInfo.this; } } diff --git a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/duck/Duck_NullableCommandContext.java b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/duck/Duck_NullableCommandContext.java deleted file mode 100644 index 79c207f..0000000 --- a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/duck/Duck_NullableCommandContext.java +++ /dev/null @@ -1,6 +0,0 @@ -package lgbt.greenhouse.config_extensions.gamerules.impl.duck; - - -public interface Duck_NullableCommandContext { - V greenhouse_config$getNullableArgument(final String name, final Class clazz); -} diff --git a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/duck/Duck_ViaConfigGameRuleTypeVisitor.java b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/duck/Duck_ViaConfigGameRuleTypeVisitor.java index a4700b8..9b2ba9f 100644 --- a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/duck/Duck_ViaConfigGameRuleTypeVisitor.java +++ b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/duck/Duck_ViaConfigGameRuleTypeVisitor.java @@ -3,5 +3,5 @@ package lgbt.greenhouse.config_extensions.gamerules.impl.duck; import lgbt.greenhouse.config_extensions.gamerules.api.v1.gamerule.ViaConfigGameRule; public interface Duck_ViaConfigGameRuleTypeVisitor { - void greenhouse_config$visitConfigBacked(final ViaConfigGameRule viaConfigGameRule); + void greenhouse_config_extensions_gamerules$visitConfigBacked(final ViaConfigGameRule viaConfigGameRule); } diff --git a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/duck/Duck_ViaConfigGameRules.java b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/duck/Duck_ViaConfigGameRules.java index d94c25e..6d4ae36 100644 --- a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/duck/Duck_ViaConfigGameRules.java +++ b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/duck/Duck_ViaConfigGameRules.java @@ -3,5 +3,5 @@ package lgbt.greenhouse.config_extensions.gamerules.impl.duck; import net.minecraft.world.level.gamerules.GameRule; public interface Duck_ViaConfigGameRules { - boolean greenhouse_config$isUsingConfig(GameRule gameRule); + boolean greenhouse_config_extensions_gamerules$isUsingConfig(GameRule gameRule); } diff --git a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/Accessor_GameRule.java b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/Accessor_GameRule.java index b7abf3d..00225e3 100644 --- a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/Accessor_GameRule.java +++ b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/Accessor_GameRule.java @@ -1,12 +1,20 @@ package lgbt.greenhouse.config_extensions.gamerules.impl.mixin; +import com.mojang.brigadier.arguments.ArgumentType; import net.minecraft.world.level.gamerules.GameRule; import net.minecraft.world.level.gamerules.GameRules; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(GameRule.class) public interface Accessor_GameRule { @Accessor("visitorCaller") - GameRules.VisitorCaller greenhouse_config$getVisitorCaller(); + GameRules.VisitorCaller greenhouse_config_extensions_gamerules$getVisitorCaller(); + + @Accessor("argument") + @Final + @Mutable + void greenhouse_config_extensions_gamerules$setArgument(ArgumentType value); } diff --git a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/Mixin_CommandContext.java b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/Mixin_CommandContext.java deleted file mode 100644 index 7b362bd..0000000 --- a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/Mixin_CommandContext.java +++ /dev/null @@ -1,39 +0,0 @@ -package lgbt.greenhouse.config_extensions.gamerules.impl.mixin; - -import com.mojang.brigadier.context.CommandContext; -import com.mojang.brigadier.context.ParsedArgument; -import lgbt.greenhouse.config_extensions.gamerules.impl.duck.Duck_NullableCommandContext; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; - -import java.util.Map; - -@Mixin(CommandContext.class) -public class Mixin_CommandContext implements Duck_NullableCommandContext { - - @Shadow - @Final - private Map> arguments; - - @Shadow - @Final - private static Map, Class> PRIMITIVE_TO_WRAPPER; - - @Override - public V greenhouse_config$getNullableArgument(String name, Class clazz) { - final ParsedArgument argument = arguments.get(name); - - if (argument == null) { - throw new IllegalArgumentException("No such argument '" + name + "' exists on this command"); - } - - final Object result = argument.getResult(); - if (result == null || PRIMITIVE_TO_WRAPPER.getOrDefault(clazz, clazz).isAssignableFrom(result.getClass())) { - //noinspection unchecked - return (V) result; - } - - throw new IllegalArgumentException("Argument '" + name + "' is defined as " + result.getClass().getSimpleName() + ", not " + clazz); - } -} diff --git a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/Mixin_GameRuleCommand.java b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/Mixin_GameRuleCommand.java index 15850ea..d29c11a 100644 --- a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/Mixin_GameRuleCommand.java +++ b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/Mixin_GameRuleCommand.java @@ -6,7 +6,7 @@ import com.llamalad7.mixinextras.sugar.Local; import com.mojang.brigadier.context.CommandContext; import lgbt.greenhouse.config_extensions.gamerules.api.v1.gamerule.ViaConfigGameRule; import lgbt.greenhouse.config_extensions.gamerules.impl.GreenhouseConfigExtensionsGameRules; -import lgbt.greenhouse.config_extensions.gamerules.impl.duck.Duck_NullableCommandContext; +import lgbt.greenhouse.config_extensions.gamerules.impl.command.ViaConfigArgumentType; import lgbt.greenhouse.config_extensions.gamerules.impl.duck.Duck_ViaConfigGameRules; import net.minecraft.commands.CommandSourceStack; import net.minecraft.network.chat.Component; @@ -21,25 +21,30 @@ import java.util.function.Supplier; @Mixin(GameRuleCommand.class) public class Mixin_GameRuleCommand { @WrapOperation(method = "setRule", at = @At(value = "INVOKE", target = "Lcom/mojang/brigadier/context/CommandContext;getArgument(Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object;")) - private static V greenhouse_config$nullableValueForSetRule(CommandContext instance, String name, Class clazz, Operation original, @Local(argsOnly = true) GameRule gameRule) { - if (gameRule instanceof ViaConfigGameRule) { - return ((Duck_NullableCommandContext)instance).greenhouse_config$getNullableArgument(name, clazz); + private static V greenhouse_config_extensions_gamerules$nullableValueForSetRule(CommandContext instance, String name, Class clazz, Operation original, @Local(argsOnly = true) GameRule gameRule) { + V value = original.call(instance, name, clazz); + + // A hack bc NeoForge does not allow for mixins to internal Minecraft libraries + // meaning we can't just resolve null. + if (gameRule instanceof ViaConfigGameRule && ViaConfigArgumentType.SET_TO_NULL.get() != null) { + ViaConfigArgumentType.SET_TO_NULL.remove(); + return null; } - return original.call(instance, name, clazz); + return value; } @WrapOperation(method = "setRule", at = @At(value = "INVOKE", target = "Lnet/minecraft/commands/CommandSourceStack;sendSuccess(Ljava/util/function/Supplier;Z)V")) - private static void greenhouse_config$scopeCommandSourceForSet(CommandSourceStack instance, Supplier messageSupplier, boolean broadcast, Operation original) { - ScopedValue.where(GreenhouseConfigExtensionsGameRules.GAME_RULES_SCOPED_VALUE, instance.getLevel().getGameRules()) + private static void greenhouse_config_extensions_gamerules$scopeCommandSourceForSet(CommandSourceStack instance, Supplier messageSupplier, boolean broadcast, Operation original) { + ScopedValue.where(GreenhouseConfigExtensionsGameRules.GAME_RULES, instance.getLevel().getGameRules()) .run(() -> original.call(instance, messageSupplier, broadcast)); } @ModifyArg(method = "lambda$setRule$0", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/chat/Component;translatable(Ljava/lang/String;[Ljava/lang/Object;)Lnet/minecraft/network/chat/MutableComponent;"), index = 1) - private static Object[] greenhouse_config$setWithConfigValue(Object[] args, @Local(argsOnly = true) GameRule gameRule) { + private static Object[] greenhouse_config_extensions_gamerules$setWithConfigValue(Object[] args, @Local(argsOnly = true) GameRule gameRule) { if ( - GreenhouseConfigExtensionsGameRules.GAME_RULES_SCOPED_VALUE.isBound() - && ((Duck_ViaConfigGameRules) GreenhouseConfigExtensionsGameRules.GAME_RULES_SCOPED_VALUE.get()).greenhouse_config$isUsingConfig(gameRule) + GreenhouseConfigExtensionsGameRules.GAME_RULES.isBound() + && ((Duck_ViaConfigGameRules) GreenhouseConfigExtensionsGameRules.GAME_RULES.get()).greenhouse_config_extensions_gamerules$isUsingConfig(gameRule) && gameRule instanceof ViaConfigGameRule viaConfigGameRule ) { args[1] = Component.translatable("editGamerule.greenhouse_config_extensions_gamerules.via_config", gameRule.serialize(viaConfigGameRule.configValue())); @@ -48,16 +53,16 @@ public class Mixin_GameRuleCommand { } @WrapOperation(method = "queryRule", at = @At(value = "INVOKE", target = "Lnet/minecraft/commands/CommandSourceStack;sendSuccess(Ljava/util/function/Supplier;Z)V")) - private static void greenhouse_config$scopeCommandSourceForQuery(CommandSourceStack instance, Supplier messageSupplier, boolean broadcast, Operation original) { - ScopedValue.where(GreenhouseConfigExtensionsGameRules.GAME_RULES_SCOPED_VALUE, instance.getLevel().getGameRules()) + private static void greenhouse_config_extensions_gamerules$scopeCommandSourceForQuery(CommandSourceStack instance, Supplier messageSupplier, boolean broadcast, Operation original) { + ScopedValue.where(GreenhouseConfigExtensionsGameRules.GAME_RULES, instance.getLevel().getGameRules()) .run(() -> original.call(instance, messageSupplier, broadcast)); } @ModifyArg(method = "lambda$queryRule$0", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/chat/Component;translatable(Ljava/lang/String;[Ljava/lang/Object;)Lnet/minecraft/network/chat/MutableComponent;"), index = 1) - private static Object[] greenhouse_config$queryWithConfigValue(Object[] args, @Local(argsOnly = true) GameRule gameRule) { + private static Object[] greenhouse_config_extensions_gamerules$queryWithConfigValue(Object[] args, @Local(argsOnly = true) GameRule gameRule) { if ( - GreenhouseConfigExtensionsGameRules.GAME_RULES_SCOPED_VALUE.isBound() - && ((Duck_ViaConfigGameRules) GreenhouseConfigExtensionsGameRules.GAME_RULES_SCOPED_VALUE.get()).greenhouse_config$isUsingConfig(gameRule) + GreenhouseConfigExtensionsGameRules.GAME_RULES.isBound() + && ((Duck_ViaConfigGameRules) GreenhouseConfigExtensionsGameRules.GAME_RULES.get()).greenhouse_config_extensions_gamerules$isUsingConfig(gameRule) ) { args[1] = Component.translatable("editGamerule.greenhouse_config_extensions_gamerules.via_config", args[1]); } diff --git a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/Mixin_GameRules.java b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/Mixin_GameRules.java index 57badda..ae35dfa 100644 --- a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/Mixin_GameRules.java +++ b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/Mixin_GameRules.java @@ -25,7 +25,7 @@ public class Mixin_GameRules implements Duck_ViaConfigGameRules { @Definition(id = "get", method = "Lnet/minecraft/world/level/gamerules/GameRuleMap;get(Lnet/minecraft/world/level/gamerules/GameRule;)Ljava/lang/Object;") @Expression("? = ?.get(?)") @ModifyVariable(method = "get", at = @At(value = "MIXINEXTRAS:EXPRESSION", shift = At.Shift.AFTER), name = "value") - private T greenhouse_config$configValueWhenNull(T value, GameRule gameRule) { + private T greenhouse_config_extensions_gamerules$configValueWhenNull(T value, GameRule gameRule) { if ( gameRule instanceof ViaConfigGameRule viaConfigGameRule && rules.has(gameRule) @@ -38,8 +38,8 @@ public class Mixin_GameRules implements Duck_ViaConfigGameRules { } @WrapOperation(method = "setFromOther", at = @At(value = "INVOKE", target = "Ljava/util/Objects;requireNonNull(Ljava/lang/Object;)Ljava/lang/Object;")) - private T greenhouse_config$dontRequireNonNull(T obj, Operation original, @Local(argsOnly = true) GameRule gameRule) { - if (greenhouse_config$isUsingConfig(gameRule)) { + private T greenhouse_config_extensions_gamerules$dontRequireNonNull(T obj, Operation original, @Local(argsOnly = true) GameRule gameRule) { + if (greenhouse_config_extensions_gamerules$isUsingConfig(gameRule)) { // I'm null, and that's non-null. I will never be non-null but that's not null. There's no one I'd rather be than me. return obj; } @@ -48,7 +48,7 @@ public class Mixin_GameRules implements Duck_ViaConfigGameRules { } @Override - public boolean greenhouse_config$isUsingConfig(GameRule gameRule) { + public boolean greenhouse_config_extensions_gamerules$isUsingConfig(GameRule gameRule) { return gameRule instanceof ViaConfigGameRule && rules.has(gameRule) && rules.get(gameRule) == null; diff --git a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/Mixin_ServerGamePacketListenerImpl.java b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/Mixin_ServerGamePacketListenerImpl.java index 48a19ab..8e2e280 100644 --- a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/Mixin_ServerGamePacketListenerImpl.java +++ b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/Mixin_ServerGamePacketListenerImpl.java @@ -27,10 +27,10 @@ public class Mixin_ServerGamePacketListenerImpl { public ServerPlayer player; @Inject(method = "sendGameRuleValues", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/network/ServerGamePacketListenerImpl;send(Lnet/minecraft/network/protocol/Packet;)V")) - private void greenhouse_config$sendGameRules(CallbackInfo ci, @Local(name = "gameRules") GameRules gameRules) { + private void greenhouse_config_extensions_gamerules$sendGameRules(CallbackInfo ci, @Local(name = "gameRules") GameRules gameRules) { Set>> toSend = new HashSet<>(); gameRules.availableRules() - .filter(gameRule -> ((Duck_ViaConfigGameRules) gameRules).greenhouse_config$isUsingConfig(gameRule)) + .filter(gameRule -> ((Duck_ViaConfigGameRules) gameRules).greenhouse_config_extensions_gamerules$isUsingConfig(gameRule)) .forEach(gameRule -> toSend.add(BuiltInRegistries.GAME_RULE.getResourceKey(gameRule).orElseThrow())); if (!toSend.isEmpty()) { GreenhouseConfigExtensionsGameRules.getPlatformHelper().sendViaConfigValueGameRulesClientbound(toSend, player); @@ -38,8 +38,8 @@ public class Mixin_ServerGamePacketListenerImpl { } @WrapOperation(method = "lambda$addGameRuleValue$0", at = @At(value = "INVOKE", target = "Ljava/util/Map;put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;")) - private static V greenhouse_config$cancelSendingConfigValueGameRules(Map instance, K k, V v, Operation original, @Local(argsOnly = true) GameRules gameRules, @Local(argsOnly = true) GameRule rule) { - if (((Duck_ViaConfigGameRules)gameRules).greenhouse_config$isUsingConfig(rule)) { + private static V greenhouse_config_extensions_gamerules$cancelSendingConfigValueGameRules(Map instance, K k, V v, Operation original, @Local(argsOnly = true) GameRules gameRules, @Local(argsOnly = true) GameRule rule) { + if (((Duck_ViaConfigGameRules)gameRules).greenhouse_config_extensions_gamerules$isUsingConfig(rule)) { return null; } diff --git a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/client/Accessor_AbstractGameRulesScreen.java b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/client/Accessor_AbstractGameRulesScreen.java index c9ddbda..684f3b1 100644 --- a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/client/Accessor_AbstractGameRulesScreen.java +++ b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/client/Accessor_AbstractGameRulesScreen.java @@ -8,5 +8,5 @@ import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(AbstractGameRulesScreen.class) public interface Accessor_AbstractGameRulesScreen { @Accessor("gameRules") - GameRules greenhouse_config$getGameRules(); + GameRules greenhouse_config_extensions_gamerules$getGameRules(); } diff --git a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/client/Accessor_InWorldGameRulesScreen.java b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/client/Accessor_InWorldGameRulesScreen.java index 1655e4c..e8e63dd 100644 --- a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/client/Accessor_InWorldGameRulesScreen.java +++ b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/client/Accessor_InWorldGameRulesScreen.java @@ -11,8 +11,8 @@ import java.util.List; @Mixin(InWorldGameRulesScreen.class) public interface Accessor_InWorldGameRulesScreen { @Accessor("initialValues") - GameRuleMap greenhouse_config$getInitialValues(); + GameRuleMap greenhouse_config_extensions_gamerules$getInitialValues(); @Accessor("serverProvidedRules") - List> greenhouse_config$getServerProvidedRules(); + List> greenhouse_config_extensions_gamerules$getServerProvidedRules(); } diff --git a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/client/Mixin_AbstractGameRulesScreenRuleList1.java b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/client/Mixin_AbstractGameRulesScreenRuleList1.java index 33f015a..f417d1c 100644 --- a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/client/Mixin_AbstractGameRulesScreenRuleList1.java +++ b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/client/Mixin_AbstractGameRulesScreenRuleList1.java @@ -2,75 +2,20 @@ package lgbt.greenhouse.config_extensions.gamerules.impl.mixin.client; import com.llamalad7.mixinextras.sugar.Local; import lgbt.greenhouse.config_extensions.gamerules.api.v1.gamerule.ViaConfigGameRule; -import lgbt.greenhouse.config_extensions.gamerules.impl.client.GreenhouseConfigExtensionsGameRulesClient; -import lgbt.greenhouse.config_extensions.gamerules.impl.client.screen.gamerule.ViaConfigGameRuleEntry; -import lgbt.greenhouse.config_extensions.gamerules.impl.duck.Duck_ViaConfigGameRuleTypeVisitor; -import net.minecraft.client.gui.screens.worldselection.AbstractGameRulesScreen; -import net.minecraft.client.gui.screens.worldselection.WorldCreationGameRulesScreen; import net.minecraft.network.chat.Component; -import net.minecraft.util.FormattedCharSequence; -import net.minecraft.util.Unit; import net.minecraft.world.level.gamerules.GameRule; -import net.minecraft.world.level.gamerules.GameRuleTypeVisitor; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyArg; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.List; @Mixin(targets = "net/minecraft/client/gui/screens/worldselection/AbstractGameRulesScreen$RuleList$1") -public abstract class Mixin_AbstractGameRulesScreenRuleList1 implements Duck_ViaConfigGameRuleTypeVisitor { - @Final - @Shadow - private WorldCreationGameRulesScreen.RuleList this$1; - - @Shadow - abstract void addEntry(final GameRule gameRule, final AbstractGameRulesScreen.EntryFactory factory); - - @Unique - private AbstractGameRulesScreen.RuleEntry greenhouse_config$innerEntry; - +public abstract class Mixin_AbstractGameRulesScreenRuleList1 { @ModifyArg(method = "addEntry(Lnet/minecraft/world/level/gamerules/GameRule;Lnet/minecraft/client/gui/screens/worldselection/AbstractGameRulesScreen$EntryFactory;)V", at = @At(value = "INVOKE", target = "net/minecraft/network/chat/Component.translatable(Ljava/lang/String;[Ljava/lang/Object;)Lnet/minecraft/network/chat/MutableComponent;"), index = 1) - private Object[] greenhouse_config$useConfigDefaultForTranslation(Object[] args, @Local(argsOnly = true) GameRule gameRule) { + private Object[] greenhouse_config_extensions_gamerules$useConfigDefaultForTranslation(Object[] args, @Local(argsOnly = true) GameRule gameRule) { if (gameRule instanceof ViaConfigGameRule configBacked) { - args[0] = Component.translatable( "editGamerule.greenhouse_config.via_config", configBacked.serialize(configBacked.configValue())); + args[0] = Component.translatable( "editGamerule.greenhouse_config_extensions_gamerules.via_config", configBacked.serialize(configBacked.configValue())); } return args; } - - @Inject(method = "addEntry(Lnet/minecraft/world/level/gamerules/GameRule;Lnet/minecraft/client/gui/screens/worldselection/AbstractGameRulesScreen$EntryFactory;)V", at = @At(value = "INVOKE", target = "java/util/Map.computeIfAbsent (Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;"), cancellable = true) - private void greenhouse_config$collectInnerEntry(final GameRule gameRule, - final AbstractGameRulesScreen.EntryFactory factory, - CallbackInfo ci, - @Local(ordinal = 0) Component readableName, - @Local List tooltip, - @Local(ordinal = 1) String narration) { - if (GreenhouseConfigExtensionsGameRulesClient.IS_INNER_VALUE_SCOPED_VALUE.isBound()) { - greenhouse_config$innerEntry = factory.create(readableName, tooltip, narration, gameRule); - ci.cancel(); - } - } - - @Override - public void greenhouse_config$visitConfigBacked(final ViaConfigGameRule gameRule) { - addEntry(gameRule, (_, _, _, _) -> { - // TODO: Additionally use NeoForge specific hook after they fix 'https://github.com/neoforged/NeoForge/issues/3296'. - ScopedValue.where(GreenhouseConfigExtensionsGameRulesClient.IS_INNER_VALUE_SCOPED_VALUE, Unit.INSTANCE) - .run(() -> gameRule.innerVisitorCaller().call((GameRuleTypeVisitor) this, gameRule)); - - ViaConfigGameRuleEntry entry = new ViaConfigGameRuleEntry<>( - ((Accessor_AbstractGameRulesScreenRuleList)this$1).greenhouse_config$getThis(), - greenhouse_config$innerEntry, - gameRule - ); - greenhouse_config$innerEntry = null; - return entry; - }); - } } diff --git a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/client/Mixin_InWorldGameRulesScreen.java b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/client/Mixin_InWorldGameRulesScreen.java index 6ee0602..27bded5 100644 --- a/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/client/Mixin_InWorldGameRulesScreen.java +++ b/gamerules/xplat/src/main/java/lgbt/greenhouse/config_extensions/gamerules/impl/mixin/client/Mixin_InWorldGameRulesScreen.java @@ -41,10 +41,10 @@ public abstract class Mixin_InWorldGameRulesScreen extends AbstractGameRulesScre } @Inject(method = "onDone", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screens/options/InWorldGameRulesScreen;closeAndApplyChanges()V")) - private void greenhouse_config$sendGameRulesBackToServer(CallbackInfo ci) { + private void greenhouse_config_extensions_gamerules$sendGameRulesBackToServer(CallbackInfo ci) { Set>> toSend = new HashSet<>(); gameRules.availableRules() - .filter(gameRule -> hasGameRuleChanged(gameRule) && ((Duck_ViaConfigGameRules) gameRules).greenhouse_config$isUsingConfig(gameRule)) + .filter(gameRule -> hasGameRuleChanged(gameRule) && ((Duck_ViaConfigGameRules) gameRules).greenhouse_config_extensions_gamerules$isUsingConfig(gameRule)) .forEach(gameRule -> toSend.add(BuiltInRegistries.GAME_RULE.getResourceKey(gameRule).orElseThrow())); if (!toSend.isEmpty()) { GreenhouseConfigExtensionsGameRules.getPlatformHelper().sendViaConfigValueGameRulesServerbound(toSend); @@ -52,17 +52,17 @@ public abstract class Mixin_InWorldGameRulesScreen extends AbstractGameRulesScre } @ModifyReturnValue(method = "hasGameRuleChanged", at = @At("RETURN")) - private boolean greenhouse_config$setGameRuleChanged(boolean original, @Local(argsOnly = true) GameRule rule) { + private boolean greenhouse_config_extensions_gamerules$setGameRuleChanged(boolean original, @Local(argsOnly = true) GameRule rule) { if (rule instanceof ViaConfigGameRule) { - return ((Duck_ViaConfigGameRules)gameRules).greenhouse_config$isUsingConfig(rule) ^ (initialValues.get(rule) == null) - || !((Duck_ViaConfigGameRules)gameRules).greenhouse_config$isUsingConfig(rule) && original; + return ((Duck_ViaConfigGameRules)gameRules).greenhouse_config_extensions_gamerules$isUsingConfig(rule) ^ (initialValues.get(rule) == null) + || !((Duck_ViaConfigGameRules)gameRules).greenhouse_config_extensions_gamerules$isUsingConfig(rule) && original; } return original; } @WrapOperation(method = "collectChangedGameRule", at = @At(value = "INVOKE", target = "Lnet/minecraft/core/Registry;getResourceKey(Ljava/lang/Object;)Ljava/util/Optional;")) - private Optional> greenhouse_config$cancelSendingConfigValueGameRules(Registry instance, T t, Operation>> original, @Local(argsOnly = true) GameRule rule) { - if (((Duck_ViaConfigGameRules)gameRules).greenhouse_config$isUsingConfig(rule)) { + private Optional> greenhouse_config_extensions_gamerules$cancelSendingConfigValueGameRules(Registry instance, T t, Operation>> original, @Local(argsOnly = true) GameRule rule) { + if (((Duck_ViaConfigGameRules)gameRules).greenhouse_config_extensions_gamerules$isUsingConfig(rule)) { return Optional.empty(); } diff --git a/gamerules/xplat/src/main/resources/greenhouse_config_extensions_gamerules.mixins.json b/gamerules/xplat/src/main/resources/greenhouse_config_extensions_gamerules.mixins.json index fe5c16f..7bb262e 100644 --- a/gamerules/xplat/src/main/resources/greenhouse_config_extensions_gamerules.mixins.json +++ b/gamerules/xplat/src/main/resources/greenhouse_config_extensions_gamerules.mixins.json @@ -5,14 +5,12 @@ "compatibilityLevel": "JAVA_25", "mixins": [ "Accessor_GameRule", - "Mixin_CommandContext", "Mixin_GameRuleCommand", "Mixin_GameRules", "Mixin_ServerGamePacketListenerImpl" ], "client": [ "client.Accessor_AbstractGameRulesScreen", - "client.Accessor_AbstractGameRulesScreenRuleList", "client.Accessor_InWorldGameRulesScreen", "client.Mixin_AbstractGameRulesScreenRuleList1", "client.Mixin_InWorldGameRulesScreen" 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 4d9985a..8965612 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,13 +1,23 @@ 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_extensions.gamerules.api.v1.gamerule.ViaConfigGameRule; 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.core.registries.Registries; import net.minecraft.resources.Identifier; +import net.minecraft.resources.ResourceKey; +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; public class GreenhouseConfigExtensionsGameRulesTestmod { public static final String MOD_ID = "greenhouse_config_extensions_gamerules_testmod"; @@ -29,6 +39,41 @@ public class GreenhouseConfigExtensionsGameRulesTestmod { return platformHelper; } + public static ViaConfigGameRule registerIntGameRule(Config config, ViaConfigGameRule.Getter getter) { + return new ViaConfigGameRule<>( + new GameRule<>( + GameRuleCategory.MISC, + GameRuleType.INT, + IntegerArgumentType.integer(), + GameRuleTypeVisitor::visitInteger, + Codec.INT, + integer -> integer, + 1, // Tbh, it doesn't really matter what the default value is, really. + FeatureFlagSet.of() + ), + config, + getter + ); + } + + + public static ViaConfigGameRule registerBoolGameRule(Config config, ViaConfigGameRule.Getter getter) { + return new ViaConfigGameRule<>( + new GameRule<>( + GameRuleCategory.MISC, + GameRuleType.BOOL, + BoolArgumentType.bool(), + GameRuleTypeVisitor::visitBoolean, + Codec.BOOL, + bool -> bool ? 1 : 0, + false, // Tbh, it doesn't really matter what the default value is, really. + FeatureFlagSet.of() + ), + config, + getter + ); + } + public static Identifier id(String path) { return Identifier.fromNamespaceAndPath(MOD_ID, path); } 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 index 805a4b6..8653717 100644 --- 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 @@ -1,18 +1,12 @@ 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 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; @@ -51,17 +45,7 @@ public class GreenhouseConfigImpl { 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() - ), + () -> GreenhouseConfigExtensionsGameRulesTestmod.registerIntGameRule( GREENHOUSE_GAME_RULE_CONFIG, holder -> holder.get().intGamerule() ) @@ -69,17 +53,7 @@ public class GreenhouseConfigImpl { 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() - ), + () -> GreenhouseConfigExtensionsGameRulesTestmod.registerBoolGameRule( GREENHOUSE_GAME_RULE_CONFIG, holder -> holder.get().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 index 3208704..694f716 100644 --- 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 @@ -1,16 +1,7 @@ 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; @@ -26,17 +17,7 @@ public class KaleidoConfigImpl { 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() - ), + () -> GreenhouseConfigExtensionsGameRulesTestmod.registerIntGameRule( KALEIDO_GAME_RULE_CONFIG, config -> config.intGamerule ) @@ -44,17 +25,7 @@ public class KaleidoConfigImpl { 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() - ), + () -> GreenhouseConfigExtensionsGameRulesTestmod.registerBoolGameRule( KALEIDO_GAME_RULE_CONFIG, config -> config.boolGamerule ) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c521ef7..aa724bf 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -11,7 +11,7 @@ fabric_api = "0.154.2+26.2" mod_menu = "20.0.1" # NeoForge -neoforge = "26.2.0.8-beta" +neoforge = "26.2.0.15-beta" # Config Libraries (Used for Testing) greenhouse_config = "3.0.1+26.2.x"