From 7e7213f19fb3540d04bd786828c6b0acb4b41038 Mon Sep 17 00:00:00 2001 From: Ennui Langeweile <85590273+EnnuiL@users.noreply.github.com> Date: Sun, 9 Jun 2024 23:07:26 -0300 Subject: [PATCH] Port to Fabric 1.20.6+ --- build.gradle | 11 ++-- gradle/libs.versions.toml | 12 ++-- .../config/JsonSerializer.java | 4 +- .../config/ModConfigManager.java | 63 ++++++++++--------- .../events/LoadConfigEvent.java | 19 ++++-- .../mixin/GameRulesMixin.java | 14 ++--- .../client/EditGameRulesScreenMixin.java | 30 ++++++--- .../screen/EditDefaultGameRulesScreen.java | 12 ++-- .../wrench_wrapper/WrenchWrapper.java | 49 +++++++++++++++ .../wrench_wrapper/fabric/FabricWrapper.java | 26 ++++++++ .../wrench_wrapper/quilt/QuiltWrapper.java | 23 +++++++ .../boring_default_game_rules.accesswidener | 7 ++- src/main/resources/fabric.mod.json | 35 +++++++++++ src/main/resources/quilt.mod.json | 49 --------------- 14 files changed, 232 insertions(+), 122 deletions(-) create mode 100644 src/main/java/io/github/ennuil/boring_default_game_rules/wrench_wrapper/WrenchWrapper.java create mode 100644 src/main/java/io/github/ennuil/boring_default_game_rules/wrench_wrapper/fabric/FabricWrapper.java create mode 100644 src/main/java/io/github/ennuil/boring_default_game_rules/wrench_wrapper/quilt/QuiltWrapper.java create mode 100644 src/main/resources/fabric.mod.json delete mode 100644 src/main/resources/quilt.mod.json diff --git a/build.gradle b/build.gradle index 574552e..53680d7 100644 --- a/build.gradle +++ b/build.gradle @@ -10,6 +10,7 @@ group = project.maven_group repositories { maven { url 'https://maven.terraformersmc.com/releases/' } + maven { url 'https://www.jitpack.io' } } loom { @@ -37,25 +38,27 @@ dependencies { modImplementation(libs.mod.menu) { transitive = false } + modImplementation libs.wrench.wrapper implementation libs.quilt.parsers.json shadow(libs.quilt.parsers.json) { transitive = false } + + include libs.wrench.wrapper } processResources { inputs.property 'version', version - filesMatching('quilt.mod.json') { + filesMatching('fabric.mod.json') { expand 'version': version } } tasks.withType(JavaCompile).configureEach { - it.options.encoding = 'UTF-8' - // Minecraft 1.18 (1.18-pre2) upwards uses Java 17. - it.options.release = 17 + // Minecraft 1.20.6 (24w14a) upwards uses Java 21. + it.options.release.set(21) } java { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4cf3385..411f35b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,24 +1,26 @@ # The latest versions are available at https://quiltmc.org/en/usage/latest-versions [versions] -minecraft = "1.20.1" -quilt_mappings = "1.20.1+build.23" +minecraft = "1.20.6" +quilt_mappings = "1.20.6+build.6" quilt_loom = "1.6.8" quilt_loader = "0.26.0" shadow = "8.1.7" -quilted_fabric_api = "7.5.0+0.91.0-1.20.1" -mod_menu = "7.2.2" +fabric_api = "0.100.0+1.20.6" +mod_menu = "10.0.0-beta.1" quilt_parsers_json = "0.3.0" +wrench_wrapper = "a29721e25d" # 0.1.0+1.20.4 [libraries] minecraft = { module = "com.mojang:minecraft", version.ref = "minecraft" } quilt_mappings = { module = "org.quiltmc:quilt-mappings", version.ref = "quilt_mappings" } quilt_loader = { module = "org.quiltmc:quilt-loader", version.ref = "quilt_loader" } -quilted_fabric_api = { module = "org.quiltmc.quilted-fabric-api:quilted-fabric-api", version.ref = "quilted_fabric_api" } +quilted_fabric_api = { module = "net.fabricmc.fabric-api:fabric-api", version.ref = "fabric_api" } mod_menu = { module = "com.terraformersmc:modmenu", version.ref = "mod_menu" } quilt_parsers_json = { module = "org.quiltmc.parsers:json", version.ref = "quilt_parsers_json" } +wrench_wrapper = { module = "com.github.Up-Mods:wrench_wrapper", version.ref = "wrench_wrapper" } [plugins] quilt_loom = { id = "org.quiltmc.loom", version.ref = "quilt_loom" } diff --git a/src/main/java/io/github/ennuil/boring_default_game_rules/config/JsonSerializer.java b/src/main/java/io/github/ennuil/boring_default_game_rules/config/JsonSerializer.java index 4e4f05d..319755c 100644 --- a/src/main/java/io/github/ennuil/boring_default_game_rules/config/JsonSerializer.java +++ b/src/main/java/io/github/ennuil/boring_default_game_rules/config/JsonSerializer.java @@ -38,7 +38,9 @@ // A JSONfied version of Quilt Config's Json5Serializer // TODO - Contribute something to upstream! public final class JsonSerializer implements Serializer { - public JsonSerializer() {} + public static final JsonSerializer INSTANCE = new JsonSerializer(); + + private JsonSerializer() {} @Override public String getFileExtension() { diff --git a/src/main/java/io/github/ennuil/boring_default_game_rules/config/ModConfigManager.java b/src/main/java/io/github/ennuil/boring_default_game_rules/config/ModConfigManager.java index de13298..9bb2dae 100644 --- a/src/main/java/io/github/ennuil/boring_default_game_rules/config/ModConfigManager.java +++ b/src/main/java/io/github/ennuil/boring_default_game_rules/config/ModConfigManager.java @@ -5,10 +5,12 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import com.mojang.brigadier.arguments.IntegerArgumentType; import io.github.ennuil.boring_default_game_rules.mixin.BoundedIntRuleAccessor; import io.github.ennuil.boring_default_game_rules.mixin.DoubleRuleAccessor; import io.github.ennuil.boring_default_game_rules.mixin.EnumRuleAccessor; import io.github.ennuil.boring_default_game_rules.utils.LoggingUtils; +import io.github.ennuil.boring_default_game_rules.wrench_wrapper.WrenchWrapper; import net.fabricmc.fabric.api.gamerule.v1.FabricGameRuleVisitor; import net.fabricmc.fabric.api.gamerule.v1.rule.DoubleRule; import net.fabricmc.fabric.api.gamerule.v1.rule.EnumRule; @@ -19,8 +21,6 @@ import net.minecraft.util.Language; import net.minecraft.world.GameRules; import org.jetbrains.annotations.Nullable; -import org.quiltmc.loader.api.QuiltLoader; -import org.quiltmc.loader.api.config.v2.QuiltConfig; import java.io.IOException; import java.io.Reader; @@ -34,11 +34,11 @@ public class ModConfigManager { public static final String GENERATE_ME = "GENERATE_ME"; public static final String GENERATE_ME_MAYBE = "GENERATE_ME_MAYBE"; - public static final Path SCHEMA_DIRECTORY_PATH = QuiltLoader.getConfigDir().resolve("boring_default_game_rules"); + public static final Path SCHEMA_DIRECTORY_PATH = WrenchWrapper.getConfigDir().resolve("boring_default_game_rules"); public static final Path SCHEMA_PATH = SCHEMA_DIRECTORY_PATH.resolve("config.schema.json"); private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); - public static final ModConfig CONFIG = QuiltConfig.create("boring_default_game_rules", "config", ModConfig.class); + public static final ModConfig CONFIG = WrenchWrapper.create("boring_default_game_rules", "config", ModConfig.class); private static JsonObject defaultGameRulesProperties; private static String newSchemaHash = ""; @@ -118,16 +118,16 @@ public static void updateConfig(GameRules newGameRules) { if (newGameRules != null) { GameRules.accept(new FabricGameRuleVisitor() { @Override - public void visitBoolean(GameRules.Key key, GameRules.Type type) { - if (newGameRules.get(key).get() != defaultGameRules.get(key).get()) { - CONFIG.defaultGameRules.value().put(key.getName(), newGameRules.get(key).get()); + public void visitBooleanGameRule(GameRules.Key key, GameRules.Type type) { + if (newGameRules.get(key).getValue() != defaultGameRules.get(key).getValue()) { + CONFIG.defaultGameRules.value().put(key.getName(), newGameRules.get(key).getValue()); } } @Override - public void visitInt(GameRules.Key key, GameRules.Type type) { - if (newGameRules.get(key).get() != defaultGameRules.get(key).get()) { - CONFIG.defaultGameRules.value().put(key.getName(), newGameRules.get(key).get()); + public void visitIntGameRule(GameRules.Key key, GameRules.Type type) { + if (newGameRules.get(key).getValue() != defaultGameRules.get(key).getValue()) { + CONFIG.defaultGameRules.value().put(key.getName(), newGameRules.get(key).getValue()); } } @@ -154,19 +154,20 @@ private static void generateGameRulePropertiesOnClient() { defaultGameRulesProperties = new JsonObject(); GameRules.accept(new FabricGameRuleVisitor() { @Override - public void visitBoolean(GameRules.Key key, GameRules.Type type) { + public void visitBooleanGameRule(GameRules.Key key, GameRules.Type type) { addBooleanGameRule( key.getName(), I18n.translate(key.getTranslationKey()), I18n.hasTranslation(key.getTranslationKey() + ".description") ? Text.translatable(key.getTranslationKey() + ".description").getString() : null, - type.createRule().get()); + type.createGameRule().getValue()); } @Override - public void visitInt(GameRules.Key key, GameRules.Type type) { - if (type.createRule() instanceof BoundedIntRule boundedType) { + public void visitIntGameRule(GameRules.Key key, GameRules.Type type) { + var gameRule = type.createGameRule(); + if (gameRule instanceof BoundedIntRule boundedType) { int minimum = ((BoundedIntRuleAccessor) (Object) boundedType).getMinimumValue(); int maximum = ((BoundedIntRuleAccessor) (Object) boundedType).getMaximumValue(); addIntegerGameRule( @@ -175,7 +176,7 @@ public void visitInt(GameRules.Key key, GameRules.Type key, GameRules.Type key, GameRules.Type type) { - DoubleRule doubleRule = type.createRule(); + var doubleRule = type.createGameRule(); double maximum = ((DoubleRuleAccessor) (Object) doubleRule).getMaximumValue(); double minimum = ((DoubleRuleAccessor) (Object) doubleRule).getMinimumValue(); addDoubleGameRule( @@ -210,7 +211,7 @@ public void visitDouble(GameRules.Key key, GameRules.Type> void visitEnum(GameRules.Key> key, GameRules.Type> type) { - EnumRule enumRule = type.createRule(); + var enumRule = type.createGameRule(); addEnumGameRule( key.getName(), I18n.translate(key.getTranslationKey()), @@ -229,19 +230,19 @@ private static void generateGameRulePropertiesOnServer() { final Language language = Language.getInstance(); @Override - public void visitBoolean(GameRules.Key key, GameRules.Type type) { + public void visitBooleanGameRule(GameRules.Key key, GameRules.Type type) { addBooleanGameRule( key.getName(), language.get(key.getTranslationKey()), language.hasTranslation(key.getTranslationKey() + ".description") ? language.get(key.getTranslationKey() + ".description") : null, - type.createRule().get()); + type.createGameRule().getValue()); } @Override - public void visitInt(GameRules.Key key, GameRules.Type type) { - if (type.createRule() instanceof BoundedIntRule boundedType) { + public void visitIntGameRule(GameRules.Key key, GameRules.Type type) { + if (type.createGameRule() instanceof BoundedIntRule boundedType) { int minimum = ((BoundedIntRuleAccessor) (Object) boundedType).getMinimumValue(); int maximum = ((BoundedIntRuleAccessor) (Object) boundedType).getMaximumValue(); addIntegerGameRule( @@ -250,7 +251,7 @@ public void visitInt(GameRules.Key key, GameRules.Type key, GameRules.Type key, GameRules.Type type) { - DoubleRule doubleRule = type.createRule(); + DoubleRule doubleRule = type.createGameRule(); double maximum = ((DoubleRuleAccessor) (Object) doubleRule).getMaximumValue(); double minimum = ((DoubleRuleAccessor) (Object) doubleRule).getMinimumValue(); addDoubleGameRule( @@ -284,7 +285,7 @@ public void visitDouble(GameRules.Key key, GameRules.Type> void visitEnum(GameRules.Key> key, GameRules.Type> type) { - EnumRule enumRule = type.createRule(); + EnumRule enumRule = type.createGameRule(); addEnumGameRule( key.getName(), language.get(key.getTranslationKey()), @@ -411,7 +412,7 @@ private static > void addEnumGameRule(String name, String visu } public static void generateGameRulesHash() { - GameRules.RULE_TYPES.keySet().forEach(key -> newSchemaHash += key.getName()); + GameRules.GAME_RULE_TYPES.keySet().forEach(key -> newSchemaHash += key.getName()); newSchemaHash = Hashing.sha256().hashString(newSchemaHash, StandardCharsets.UTF_8).toString(); } } diff --git a/src/main/java/io/github/ennuil/boring_default_game_rules/events/LoadConfigEvent.java b/src/main/java/io/github/ennuil/boring_default_game_rules/events/LoadConfigEvent.java index 0d959ef..7771dff 100644 --- a/src/main/java/io/github/ennuil/boring_default_game_rules/events/LoadConfigEvent.java +++ b/src/main/java/io/github/ennuil/boring_default_game_rules/events/LoadConfigEvent.java @@ -1,19 +1,26 @@ package io.github.ennuil.boring_default_game_rules.events; -import org.quiltmc.loader.api.ModContainer; -import org.quiltmc.qsl.base.api.entrypoint.client.ClientModInitializer; -import org.quiltmc.qsl.base.api.entrypoint.server.DedicatedServerModInitializer; +import io.github.ennuil.boring_default_game_rules.config.JsonSerializer; +import io.github.ennuil.boring_default_game_rules.wrench_wrapper.WrenchWrapper; +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.api.DedicatedServerModInitializer; import io.github.ennuil.boring_default_game_rules.config.ModConfigManager; +import net.fabricmc.api.ModInitializer; -public class LoadConfigEvent implements ClientModInitializer, DedicatedServerModInitializer { +public class LoadConfigEvent implements ModInitializer, ClientModInitializer, DedicatedServerModInitializer { @Override - public void onInitializeClient(ModContainer mod) { + public void onInitialize() { + WrenchWrapper.getConfigEnvironment().registerSerializer(JsonSerializer.INSTANCE); + } + + @Override + public void onInitializeClient() { ModConfigManager.init(true); } @Override - public void onInitializeServer(ModContainer mod) { + public void onInitializeServer() { ModConfigManager.init(false); } } diff --git a/src/main/java/io/github/ennuil/boring_default_game_rules/mixin/GameRulesMixin.java b/src/main/java/io/github/ennuil/boring_default_game_rules/mixin/GameRulesMixin.java index d6b7c33..bb20c31 100644 --- a/src/main/java/io/github/ennuil/boring_default_game_rules/mixin/GameRulesMixin.java +++ b/src/main/java/io/github/ennuil/boring_default_game_rules/mixin/GameRulesMixin.java @@ -4,8 +4,6 @@ import net.fabricmc.fabric.api.gamerule.v1.rule.DoubleRule; import net.fabricmc.fabric.api.gamerule.v1.rule.EnumRule; import net.minecraft.world.GameRules; -import net.minecraft.world.GameRules.BooleanRule; -import net.minecraft.world.GameRules.IntRule; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -20,7 +18,7 @@ public class GameRulesMixin { @Shadow @Final - private Map, GameRules.Rule> rules; + private Map, GameRules.AbstractGameRule> gameRules; @Inject(method = "()V", at = @At("TAIL")) private > void overrideDefaults(CallbackInfo info) { @@ -28,12 +26,12 @@ private > void overrideDefaults(CallbackInfo info) { if (ModConfigManager.CONFIG.defaultGameRules.value().isEmpty()) return; - this.rules.forEach((key, rule) -> ModConfigManager.CONFIG.defaultGameRules.value().forEach((defaultKey, defaultValue) -> { + this.gameRules.forEach((key, rule) -> ModConfigManager.CONFIG.defaultGameRules.value().forEach((defaultKey, defaultValue) -> { if (key.getName().equals(defaultKey)) { - if (rule instanceof IntRule intRule) { - intRule.set(((Number) defaultValue).intValue(), null); - } else if (rule instanceof BooleanRule booleanRule) { - booleanRule.set((Boolean) defaultValue, null); + if (rule instanceof GameRules.IntGameRule intRule) { + intRule.setValue(((Number) defaultValue).intValue(), null); + } else if (rule instanceof GameRules.BooleanGameRule booleanRule) { + booleanRule.setValue((Boolean) defaultValue, null); } else if (rule instanceof DoubleRule doubleRule) { ((DoubleRuleAccessor) (Object) doubleRule).setValue(((Number) defaultValue).doubleValue()); doubleRule.changed(null); diff --git a/src/main/java/io/github/ennuil/boring_default_game_rules/mixin/client/EditGameRulesScreenMixin.java b/src/main/java/io/github/ennuil/boring_default_game_rules/mixin/client/EditGameRulesScreenMixin.java index a3b0dc3..484e707 100644 --- a/src/main/java/io/github/ennuil/boring_default_game_rules/mixin/client/EditGameRulesScreenMixin.java +++ b/src/main/java/io/github/ennuil/boring_default_game_rules/mixin/client/EditGameRulesScreenMixin.java @@ -7,17 +7,20 @@ import net.minecraft.client.gui.Selectable; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.world.EditGameRulesScreen; -import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.ClickableWidget; +import net.minecraft.client.gui.widget.button.ButtonWidget; import net.minecraft.text.Text; import net.minecraft.world.GameRules; import org.spongepowered.asm.mixin.*; 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.ArrayList; import java.util.List; +import java.util.Optional; +import java.util.function.Consumer; @Mixin(EditGameRulesScreen.class) public abstract class EditGameRulesScreenMixin extends Screen { @@ -26,24 +29,33 @@ private EditGameRulesScreenMixin(Text text) { } @Shadow - private EditGameRulesScreen.RuleListWidget ruleListWidget; + private EditGameRulesScreen.GameRuleElementListWidget field_49903; @Shadow @Final @Mutable private GameRules gameRules; + @Shadow + @Final + private Consumer> ruleSaver; + @Inject(method = "init()V", at = @At("TAIL")) private void addEditDefaultsButton(CallbackInfo ci) { // Don't let the button appear on screens that extends this screen if (((EditGameRulesScreen) (Object) this).getClass() == EditGameRulesScreen.class) { - this.ruleListWidget.children().add(new EditDefaultsButtonWidget()); + this.field_49903.children().add(new EditDefaultsButtonWidget()); } } + @ModifyArg(method = "init()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/layout/HeaderFooterLayoutWidget;method_57726(Lnet/minecraft/text/Text;Lnet/minecraft/client/font/TextRenderer;)V")) + private Text modifyTitle(Text original) { + return this.title; + } + @SuppressWarnings("all") @Unique - public class EditDefaultsButtonWidget extends EditGameRulesScreen.AbstractRuleWidget { + public class EditDefaultsButtonWidget extends EditGameRulesScreen.AbstractEntry { private final ButtonWidget editButton; private final List widgets = new ArrayList<>(); @@ -54,11 +66,11 @@ public EditDefaultsButtonWidget() { )); this.editButton = ButtonWidget.builder(Text.translatable("boring_default_game_rules.game_rules.edit_default_game_rules"), button -> { EditGameRulesScreenMixin.this.client.setScreen(new EditDefaultGameRulesScreen(new GameRules(), gameRulesWrapper -> { - EditGameRulesScreenMixin.this.client.setScreen(EditGameRulesScreenMixin.this); - gameRulesWrapper.ifPresent(gameRules -> ModConfigManager.updateConfig(gameRules)); - EditGameRulesScreenMixin.this.gameRules = new GameRules(); - EditGameRulesScreenMixin.this.clearChildren(); - EditGameRulesScreenMixin.this.init(); + gameRulesWrapper.ifPresentOrElse(gameRules -> { + ModConfigManager.updateConfig(gameRules); + EditGameRulesScreenMixin.this.ruleSaver.accept(Optional.of(gameRules)); + EditGameRulesScreenMixin.this.client.setScreen(new EditGameRulesScreen(gameRules, EditGameRulesScreenMixin.this.ruleSaver)); + }, () -> EditGameRulesScreenMixin.this.client.setScreen(EditGameRulesScreenMixin.this)); })); }) .position(10, 5) diff --git a/src/main/java/io/github/ennuil/boring_default_game_rules/screen/EditDefaultGameRulesScreen.java b/src/main/java/io/github/ennuil/boring_default_game_rules/screen/EditDefaultGameRulesScreen.java index 8fc7eec..a63804e 100644 --- a/src/main/java/io/github/ennuil/boring_default_game_rules/screen/EditDefaultGameRulesScreen.java +++ b/src/main/java/io/github/ennuil/boring_default_game_rules/screen/EditDefaultGameRulesScreen.java @@ -5,8 +5,8 @@ import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.Selectable; import net.minecraft.client.gui.screen.world.EditGameRulesScreen; -import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.ClickableWidget; +import net.minecraft.client.gui.widget.button.ButtonWidget; import net.minecraft.text.Text; import net.minecraft.world.GameRules; @@ -26,10 +26,10 @@ public EditDefaultGameRulesScreen(GameRules gameRules, Consumer widgets = new ArrayList<>(); @@ -38,11 +38,11 @@ public ResetButtonWidget() { this.resetButton = ButtonWidget.builder( Text.translatable("boring_default_game_rules.edit_default_game_rules.reset_defaults"), button -> { - double scrollAmount = EditDefaultGameRulesScreen.this.ruleListWidget.getScrollAmount(); + double scrollAmount = EditDefaultGameRulesScreen.this.field_49903.getScrollAmount(); ModConfigManager.resetDefaults(); EditDefaultGameRulesScreen.this.gameRules = new GameRules(); - EditDefaultGameRulesScreen.this.clearAndInit(); - EditDefaultGameRulesScreen.this.ruleListWidget.setScrollAmount(scrollAmount); + EditDefaultGameRulesScreen.this.repositionElements(); + EditDefaultGameRulesScreen.this.field_49903.setScrollAmount(scrollAmount); } ).position(10, 5) .size(150, 20) diff --git a/src/main/java/io/github/ennuil/boring_default_game_rules/wrench_wrapper/WrenchWrapper.java b/src/main/java/io/github/ennuil/boring_default_game_rules/wrench_wrapper/WrenchWrapper.java new file mode 100644 index 0000000..b096474 --- /dev/null +++ b/src/main/java/io/github/ennuil/boring_default_game_rules/wrench_wrapper/WrenchWrapper.java @@ -0,0 +1,49 @@ +package io.github.ennuil.boring_default_game_rules.wrench_wrapper; + +import io.github.ennuil.boring_default_game_rules.wrench_wrapper.fabric.FabricWrapper; +import io.github.ennuil.boring_default_game_rules.wrench_wrapper.quilt.QuiltWrapper; +import org.quiltmc.config.api.ReflectiveConfig; +import org.quiltmc.config.implementor_api.ConfigEnvironment; + +import java.nio.file.Path; + +public class WrenchWrapper { + public static C create(String family, String id, Class configCreatorClass) { + if (WrenchWrapper.classExists("org.quiltmc.loader.api.QuiltLoader")) { + return QuiltWrapper.create(family, id, configCreatorClass); + } else if (WrenchWrapper.classExists("net.fabricmc.loader.FabricLoader")) { + return FabricWrapper.create(family, id, configCreatorClass); + } else { + return null; + } + } + + public static ConfigEnvironment getConfigEnvironment() { + if (WrenchWrapper.classExists("org.quiltmc.loader.api.QuiltLoader")) { + return QuiltWrapper.getConfigEnvironment(); + } else if (WrenchWrapper.classExists("net.fabricmc.loader.FabricLoader")) { + return FabricWrapper.getConfigEnvironment(); + } else { + return null; + } + } + + public static Path getConfigDir() { + if (WrenchWrapper.classExists("org.quiltmc.loader.api.QuiltLoader")) { + return QuiltWrapper.getConfigDir(); + } else if (WrenchWrapper.classExists("net.fabricmc.loader.FabricLoader")) { + return FabricWrapper.getConfigDir(); + } else { + return null; + } + } + + public static boolean classExists(String className) { + try { + var clazz = Class.forName(className); + return true; + } catch (ClassNotFoundException e) { + return false; + } + } +} diff --git a/src/main/java/io/github/ennuil/boring_default_game_rules/wrench_wrapper/fabric/FabricWrapper.java b/src/main/java/io/github/ennuil/boring_default_game_rules/wrench_wrapper/fabric/FabricWrapper.java new file mode 100644 index 0000000..0cb20ea --- /dev/null +++ b/src/main/java/io/github/ennuil/boring_default_game_rules/wrench_wrapper/fabric/FabricWrapper.java @@ -0,0 +1,26 @@ +package io.github.ennuil.boring_default_game_rules.wrench_wrapper.fabric; + +import net.fabricmc.loader.api.FabricLoader; +import org.quiltmc.config.api.ReflectiveConfig; +import org.quiltmc.config.api.serializers.TomlSerializer; +import org.quiltmc.config.implementor_api.ConfigEnvironment; +import org.quiltmc.config.implementor_api.ConfigFactory; + +import java.nio.file.Path; + +public class FabricWrapper { + @SuppressWarnings("deprecation") + private static final ConfigEnvironment CONFIG_ENVIRONMENT = new ConfigEnvironment(FabricLoader.getInstance().getConfigDir(), TomlSerializer.INSTANCE, TomlSerializer.INSTANCE); + + public static C create(String family, String id, Class configCreatorClass) { + return ConfigFactory.create(CONFIG_ENVIRONMENT, family, id, configCreatorClass); + } + + public static ConfigEnvironment getConfigEnvironment() { + return CONFIG_ENVIRONMENT; + } + + public static Path getConfigDir() { + return FabricLoader.getInstance().getConfigDir(); + } +} diff --git a/src/main/java/io/github/ennuil/boring_default_game_rules/wrench_wrapper/quilt/QuiltWrapper.java b/src/main/java/io/github/ennuil/boring_default_game_rules/wrench_wrapper/quilt/QuiltWrapper.java new file mode 100644 index 0000000..8eadf09 --- /dev/null +++ b/src/main/java/io/github/ennuil/boring_default_game_rules/wrench_wrapper/quilt/QuiltWrapper.java @@ -0,0 +1,23 @@ +package io.github.ennuil.boring_default_game_rules.wrench_wrapper.quilt; + +import org.quiltmc.config.api.ReflectiveConfig; +import org.quiltmc.config.implementor_api.ConfigEnvironment; +import org.quiltmc.loader.api.QuiltLoader; +import org.quiltmc.loader.api.config.v2.QuiltConfig; +import org.quiltmc.loader.impl.config.QuiltConfigImpl; + +import java.nio.file.Path; + +public class QuiltWrapper { + public static C create(String family, String id, Class configCreatorClass) { + return QuiltConfig.create(family, id, configCreatorClass); + } + + public static ConfigEnvironment getConfigEnvironment() { + return QuiltConfigImpl.getConfigEnvironment(); + } + + public static Path getConfigDir() { + return QuiltLoader.getConfigDir(); + } +} diff --git a/src/main/resources/boring_default_game_rules.accesswidener b/src/main/resources/boring_default_game_rules.accesswidener index a9fbddc..90ef5a6 100644 --- a/src/main/resources/boring_default_game_rules.accesswidener +++ b/src/main/resources/boring_default_game_rules.accesswidener @@ -1,10 +1,11 @@ accessWidener v2 named -accessible field net/minecraft/client/gui/screen/world/EditGameRulesScreen ruleListWidget Lnet/minecraft/client/gui/screen/world/EditGameRulesScreen$RuleListWidget; +accessible field net/minecraft/client/gui/screen/world/EditGameRulesScreen field_49903 Lnet/minecraft/client/gui/screen/world/EditGameRulesScreen$GameRuleElementListWidget; accessible field net/minecraft/client/gui/screen/world/EditGameRulesScreen gameRules Lnet/minecraft/world/GameRules; accessible field net/minecraft/client/gui/screen/Screen title Lnet/minecraft/text/Text; -accessible field net/minecraft/world/GameRules RULE_TYPES Ljava/util/Map; -accessible method net/minecraft/world/GameRules$Rule changed (Lnet/minecraft/server/MinecraftServer;)V +accessible field net/minecraft/world/GameRules GAME_RULE_TYPES Ljava/util/Map; +accessible field net/minecraft/world/GameRules$Type argumentType Ljava/util/function/Supplier; +accessible method net/minecraft/world/GameRules$AbstractGameRule changed (Lnet/minecraft/server/MinecraftServer;)V mutable field net/minecraft/client/gui/screen/world/EditGameRulesScreen gameRules Lnet/minecraft/world/GameRules; mutable field net/minecraft/client/gui/screen/Screen title Lnet/minecraft/text/Text; diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json new file mode 100644 index 0000000..852e3b7 --- /dev/null +++ b/src/main/resources/fabric.mod.json @@ -0,0 +1,35 @@ +{ + "schemaVersion": 1, + "id": "boring_default_game_rules", + "version": "${version}", + "name": "Boring Default Game Rules", + "description": "A mod that lets you override the default game rule values. You can configure it by either the new \"Edit Default Game Rules\" button on the bottom of the Game Rules list, through the Mod Menu config screen, or if outside the game, by editing the config file (located at .minecraft/config/boring_default_game_rules/config.json), which is simple and painless thanks to JSON Schemas!", + "authors": [ + "Ennui Langeweile", + "Up" + ], + "contact": { + "homepage": "https://modrinth.com/mod/boring-default-game-rules", + "issues": "https://github.com/EnnuiL/BoringDefaultGameRules/issues", + "sources": "https://github.com/EnnuiL/BoringDefaultGameRules" + }, + "license": "MIT", + "icon": { + "64": "assets/boring_default_game_rules/icon_64x.png", + "128": "assets/boring_default_game_rules/icon_128x.png" + }, + "environment": "*", + "entrypoints": { + "main": ["io.github.ennuil.boring_default_game_rules.events.LoadConfigEvent"], + "client": ["io.github.ennuil.boring_default_game_rules.events.LoadConfigEvent"], + "server": ["io.github.ennuil.boring_default_game_rules.events.LoadConfigEvent"], + "modmenu": ["io.github.ennuil.boring_default_game_rules.modmenu.ModMenuEntry"] + }, + "mixins": ["boring_default_game_rules.mixins.json"], + "accessWidener": "boring_default_game_rules.accesswidener", + "depends": { + "fabricloader": ">=0.15.10", + "minecraft": ">=1.20.5", + "fabric-api": ">=0.100.0" + } +} diff --git a/src/main/resources/quilt.mod.json b/src/main/resources/quilt.mod.json deleted file mode 100644 index ed9734c..0000000 --- a/src/main/resources/quilt.mod.json +++ /dev/null @@ -1,49 +0,0 @@ -{ - "schema_version": 1, - "quilt_loader": { - "group": "io.github.ennuil", - "id": "boring_default_game_rules", - "version": "${version}", - "metadata": { - "name": "Boring Default Game Rules", - "description": "A mod that lets you override the default game rule values. You can configure it by either the new \"Edit Default Game Rules\" button on the bottom of the Game Rules list, through the Mod Menu config screen, or if outside the game, by editing the config file (located at .minecraft/config/boring_default_game_rules/config.json), which is simple and painless thanks to JSON Schemas!", - "contributors": { - "Ennui Langeweile": "Owner", - "Up": "Developer" - }, - "contact": { - "homepage": "https://modrinth.com/mod/boring-default-game-rules", - "issues": "https://github.com/EnnuiL/BoringDefaultGameRules/issues", - "sources": "https://github.com/EnnuiL/BoringDefaultGameRules" - }, - "icon": { - "64": "assets/boring_default_game_rules/icon_64x.png", - "128": "assets/boring_default_game_rules/icon_128x.png" - }, - "license": "MIT" - }, - "intermediate_mappings": "net.fabricmc:intermediary", - "entrypoints": { - "config_serializer": "io.github.ennuil.boring_default_game_rules.config.JsonSerializer", - "client_init": "io.github.ennuil.boring_default_game_rules.events.LoadConfigEvent", - "server_init": "io.github.ennuil.boring_default_game_rules.events.LoadConfigEvent", - "modmenu": "io.github.ennuil.boring_default_game_rules.modmenu.ModMenuEntry" - }, - "depends": [ - { - "id": "quilt_loader", - "versions": ">=0.26.0" - }, - { - "id": "quilted_fabric_api", - "versions": ">=7.0.0-" - }, - { - "id": "minecraft", - "versions": ">=1.20-" - } - ] - }, - "mixin": "boring_default_game_rules.mixins.json", - "access_widener": "boring_default_game_rules.accesswidener" -}