From bb6d541897291d54777728fc1e422b32c5455e76 Mon Sep 17 00:00:00 2001 From: isXander Date: Wed, 28 Dec 2022 20:56:31 +0000 Subject: [PATCH] 1.1.0 (read changelog for deets) --- build.gradle.kts | 27 ++-- changelogs/1.1.0.md | 7 + gradle.properties | 4 +- .../java/dev/isxander/xso/ModEntrypoint.java | 11 ++ .../isxander/xso/XandersSodiumOptions.java | 140 ++++++++++++------ .../xso/compat/EntityViewDistanceCompat.java | 23 +-- .../dev/isxander/xso/compat/IrisCompat.java | 10 +- .../xso/compat/MoreCullingCompat.java | 10 +- .../xso/config/ModMenuEntrypoint.java | 17 +++ .../dev/isxander/xso/config/XsoConfig.java | 49 ++++++ .../xso/mixins/MinecraftClientMixin.java | 22 +++ .../xso/mixins/OptionImplBuilderMixin.java | 2 +- .../isxander/xso/mixins/OptionImplMixin.java | 2 +- .../xso/mixins/SodiumOptionsGUIMixin.java | 31 ---- .../MoreCullingOptionImplBuilderMixin.java | 6 +- .../MoreCullingOptionImplMixin.java | 6 +- ... MoreCullingSodiumOptionImplAccessor.java} | 6 +- .../SodiumExtraGameOptionsMixins.java | 2 +- .../xanders-sodium-options/lang/en_us.json | 10 +- src/main/resources/fabric.mod.json | 10 +- .../xanders-sodium-options.mixins.json | 6 +- 21 files changed, 268 insertions(+), 133 deletions(-) create mode 100644 changelogs/1.1.0.md create mode 100644 src/main/java/dev/isxander/xso/ModEntrypoint.java create mode 100644 src/main/java/dev/isxander/xso/config/ModMenuEntrypoint.java create mode 100644 src/main/java/dev/isxander/xso/config/XsoConfig.java create mode 100644 src/main/java/dev/isxander/xso/mixins/MinecraftClientMixin.java delete mode 100644 src/main/java/dev/isxander/xso/mixins/SodiumOptionsGUIMixin.java rename src/main/java/dev/isxander/xso/mixins/compat/moreculling/{MoreCullingOptionImplAccessor.java => MoreCullingSodiumOptionImplAccessor.java} (65%) diff --git a/build.gradle.kts b/build.gradle.kts index 5bae5c0..9917e3a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,9 +2,9 @@ plugins { java id("fabric-loom") version "1.0.+" - id("io.github.juuxel.loom-quiltflower") version "1.7.+" + id("io.github.juuxel.loom-quiltflower") version "1.8.+" - id("com.modrinth.minotaur") version "2.4.+" + id("com.modrinth.minotaur") version "2.5.+" id("me.hypherionmc.cursegradle") version "2.+" id("com.github.breadmoirai.github-release") version "2.+" id("io.github.p03w.machete") version "1.+" @@ -12,7 +12,7 @@ plugins { } group = "dev.isxander" -version = "1.0.2" +version = "1.1.0" repositories { mavenCentral() @@ -23,6 +23,7 @@ repositories { maven("https://maven.shedaniel.me") maven("https://maven.terraformersmc.com") maven("https://jitpack.io") + maven("https://maven.gegy.dev") maven("https://api.modrinth.com/maven") { content { includeGroup("maven.modrinth") @@ -38,23 +39,23 @@ dependencies { mappings("net.fabricmc:yarn:$minecraftVersion+build.+:v2") modImplementation("net.fabricmc:fabric-loader:$fabricLoaderVersion") - modImplementation("dev.isxander:yet-another-config-lib:1.5.0") - modImplementation("maven.modrinth:sodium:mc1.19.2-0.4.4") + modImplementation("dev.isxander:yet-another-config-lib:2.2.0") + modImplementation("maven.modrinth:sodium:mc1.19.3-0.4.6") + modImplementation("com.terraformersmc:modmenu:5.0.2") // sodium extra better options compat - modImplementation("me.flashyreese.mods:sodium-extra-fabric:0.4.10+mc1.19.2-build.64") { - exclude(module = "reeses-sodium-options") - } + modImplementation("maven.modrinth:sodium-extra:mc1.19.3-0.4.15") // moreculling category placement - modImplementation("maven.modrinth:moreculling:v0.10.0") + modImplementation("maven.modrinth:moreculling:v0.12.3") // iris category placement - modImplementation("maven.modrinth:iris:1.19.x-v1.3.1") + modImplementation("maven.modrinth:iris:1.19.3-v1.4.6") // entityviewdistance button option compat - modImplementation("maven.modrinth:entity-view-distance:1.0.2+1.19") + modImplementation("maven.modrinth:entity-view-distance:1.1.0+1.19.3") - modRuntimeOnly("me.shedaniel.cloth:cloth-config-fabric:8.2.88") + modRuntimeOnly("me.shedaniel.cloth:cloth-config-fabric:9.0.+") + modRuntimeOnly("dev.lambdaurora:spruceui:4.1.0+1.19.3") - modImplementation(include("com.github.llamalad7:mixinextras:0.0.12")!!) + implementation(include(annotationProcessor("com.github.llamalad7:mixinextras:0.1.1")!!)!!) } tasks { diff --git a/changelogs/1.1.0.md b/changelogs/1.1.0.md new file mode 100644 index 0000000..0bb93ff --- /dev/null +++ b/changelogs/1.1.0.md @@ -0,0 +1,7 @@ +- Update to 1.19.3 +- Add options category to sodium options & new modmenu config. +- New option: Lenient options: (previously default behaviour) replaces broken options with placeholder option +- New option: Hard crash: (previously default on) Crashes the game to generate crash report instead of a nice warning and the ability to just display actual Sodium +- Add warning screen to proceed to default sodium gui upon failure +- Fix moreculling 0.12+ compatibility +- Handle errors a lot nicer in stacktrace diff --git a/gradle.properties b/gradle.properties index 8de7170..56bf896 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ org.gradle.jvmargs=-Xmx3G -minecraftVersion=1.19.2 -fabricLoaderVersion=0.14.9 +minecraftVersion=1.19.3 +fabricLoaderVersion=0.14.12 modId=xanders-sodium-options modName=Xander's Sodium Options diff --git a/src/main/java/dev/isxander/xso/ModEntrypoint.java b/src/main/java/dev/isxander/xso/ModEntrypoint.java new file mode 100644 index 0000000..0bd2605 --- /dev/null +++ b/src/main/java/dev/isxander/xso/ModEntrypoint.java @@ -0,0 +1,11 @@ +package dev.isxander.xso; + +import dev.isxander.xso.config.XsoConfig; +import net.fabricmc.api.ClientModInitializer; + +public class ModEntrypoint implements ClientModInitializer { + @Override + public void onInitializeClient() { + XsoConfig.INSTANCE.load(); + } +} diff --git a/src/main/java/dev/isxander/xso/XandersSodiumOptions.java b/src/main/java/dev/isxander/xso/XandersSodiumOptions.java index c78ff0a..5d03e61 100644 --- a/src/main/java/dev/isxander/xso/XandersSodiumOptions.java +++ b/src/main/java/dev/isxander/xso/XandersSodiumOptions.java @@ -1,13 +1,14 @@ package dev.isxander.xso; import dev.isxander.xso.compat.*; +import dev.isxander.xso.config.XsoConfig; import dev.isxander.xso.mixins.CyclingControlAccessor; import dev.isxander.xso.mixins.SliderControlAccessor; import dev.isxander.xso.utils.ClassCapture; import dev.isxander.yacl.api.*; import dev.isxander.yacl.gui.controllers.ActionController; -import dev.isxander.yacl.gui.controllers.EnumController; import dev.isxander.yacl.gui.controllers.TickBoxController; +import dev.isxander.yacl.gui.controllers.cycling.EnumController; import dev.isxander.yacl.gui.controllers.slider.IntegerSliderController; import me.jellysquid.mods.sodium.client.gui.SodiumOptionsGUI; import me.jellysquid.mods.sodium.client.gui.options.OptionPage; @@ -16,37 +17,72 @@ import me.jellysquid.mods.sodium.client.gui.options.control.SliderControl; import me.jellysquid.mods.sodium.client.gui.options.control.TickBoxControl; import me.jellysquid.mods.sodium.client.gui.options.storage.OptionStorage; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.NoticeScreen; import net.minecraft.client.gui.screen.Screen; +import net.minecraft.screen.ScreenTexts; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.TranslatableOption; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; public class XandersSodiumOptions { + private static boolean errorOccured = false; + public static Screen wrapSodiumScreen(SodiumOptionsGUI sodiumOptionsGUI, List pages, Screen prevScreen) { - YetAnotherConfigLib.Builder builder = YetAnotherConfigLib.createBuilder() - .title(Text.translatable("Sodium Options")); + try { + YetAnotherConfigLib.Builder builder = YetAnotherConfigLib.createBuilder() + .title(Text.translatable("Sodium Options")); + + for (OptionPage page : pages) { + builder.category(convertCategory(page, sodiumOptionsGUI)); + } + + builder.category(XsoConfig.getConfigCategory()); + + builder.save(() -> { + Set> storages = new HashSet<>(); + pages.stream().flatMap(s -> s.getOptions().stream()).forEach(opt -> storages.add(opt.getStorage())); + storages.forEach(OptionStorage::save); + + XsoConfig.INSTANCE.save(); + }); + + return builder.build().generateScreen(prevScreen); + } catch (Exception e) { + var exception = new IllegalStateException("Failed to convert Sodium option screen to YACL with XSO!", e); - for (OptionPage page : pages) { + if (XsoConfig.INSTANCE.getConfig().hardCrash) { + throw exception; + } else { + exception.printStackTrace(); + + return new NoticeScreen(() -> { + errorOccured = true; + MinecraftClient.getInstance().setScreen(sodiumOptionsGUI); + errorOccured = false; + }, Text.literal("Xander's Sodium Options failed"), Text.literal("Whilst trying to convert Sodium's GUI to YACL with XSO mod, an error occured which prevented the conversion. This is most likely due to a third-party mod adding its own settings to Sodium's screen. XSO will now display the original GUI.\n\nThe error has been logged to latest.log file."), ScreenTexts.PROCEED, true); + } + } + } + + private static ConfigCategory convertCategory(OptionPage page, SodiumOptionsGUI sodiumOptionsGUI) { + try { if (Compat.IRIS) { - ConfigCategory shaderPackPage = IrisCompat.replaceShaderPackPage(sodiumOptionsGUI, page); - if (shaderPackPage != null) { - builder.category(shaderPackPage); - continue; + Optional shaderPackPage = IrisCompat.replaceShaderPackPage(sodiumOptionsGUI, page); + if (shaderPackPage.isPresent()) { + return shaderPackPage.get(); } } ConfigCategory.Builder categoryBuilder = ConfigCategory.createBuilder() .name(page.getName()); - for (me.jellysquid.mods.sodium.client.gui.options.OptionGroup group : page.getGroups()) { + for (var group : page.getGroups()) { OptionGroup.Builder groupBuilder = OptionGroup.createBuilder(); - for (me.jellysquid.mods.sodium.client.gui.options.Option option : group.getOptions()) { + for (var option : group.getOptions()) { groupBuilder.option(convertOption(option)); } @@ -56,50 +92,52 @@ public static Screen wrapSodiumScreen(SodiumOptionsGUI sodiumOptionsGUI, List { - Set> storages = new HashSet<>(); - pages.stream().flatMap(s -> s.getOptions().stream()).forEach(opt -> storages.add(opt.getStorage())); - storages.forEach(OptionStorage::save); - }); - - return builder.build().generateScreen(prevScreen); } private static Option convertOption(me.jellysquid.mods.sodium.client.gui.options.Option sodiumOption) { - if (Compat.ENTITY_VIEW_DIST && EntityViewDistanceCompat.isFakeOption(sodiumOption)) { - return EntityViewDistanceCompat.convertFakeOption(sodiumOption); - } + try { + if (Compat.ENTITY_VIEW_DIST) { + Optional> fakeOption = EntityViewDistanceCompat.convertFakeOption(sodiumOption); + if (fakeOption.isPresent()) return fakeOption.get(); + } - if (!(sodiumOption instanceof ClassCapture)) { - // incompatible - some custom option impl - return ButtonOption.createBuilder() + if (!(sodiumOption instanceof ClassCapture)) { + throw new IllegalStateException("Failed to capture class of sodium option! Likely due to custom Option implementation."); + } + + Option.Builder builder = Option.createBuilder(((ClassCapture) sodiumOption).getCapturedClass()) .name(sodiumOption.getName()) - .tooltip(sodiumOption.getTooltip(), Text.translatable("xso.incompatible.tooltip").formatted(Formatting.RED)) - .available(false) - .controller(opt -> new ActionController(opt, Text.translatable("xso.incompatible.button").formatted(Formatting.RED))) - .action((screen, opt) -> {}) - .build(); - } + .tooltip(sodiumOption.getTooltip()) + .flags(convertFlags(sodiumOption)) + .binding(Compat.MORE_CULLING ? MoreCullingCompat.getBinding(sodiumOption) : new SodiumBinding<>(sodiumOption)) + .available(sodiumOption.isAvailable()); - Option.Builder builder = Option.createBuilder(((ClassCapture) sodiumOption).getCapturedClass()) - .name(sodiumOption.getName()) - .tooltip(sodiumOption.getTooltip()) - .flags(convertFlags(sodiumOption)) - .binding(Compat.MORE_CULLING ? MoreCullingCompat.getBinding(sodiumOption) : new SodiumBinding<>(sodiumOption)) - .available(sodiumOption.isAvailable()); + if (sodiumOption.getImpact() != null) { + builder.tooltip(Text.translatable("sodium.options.performance_impact_string", sodiumOption.getImpact().getLocalizedName()).formatted(Formatting.GRAY)); + } - if (sodiumOption.getImpact() != null) { - builder.tooltip(Text.translatable("sodium.options.performance_impact_string", sodiumOption.getImpact().getLocalizedName()).formatted(Formatting.GRAY)); + addController(builder, sodiumOption); + + Option built = builder.build(); + if (Compat.MORE_CULLING) MoreCullingCompat.addAvailableCheck(built, sodiumOption); + return built; + } catch (Exception e) { + if (XsoConfig.INSTANCE.getConfig().lenientOptions) { + return ButtonOption.createBuilder() + .name(sodiumOption.getName()) + .tooltip(sodiumOption.getTooltip(), Text.translatable("xso.incompatible.tooltip").formatted(Formatting.RED)) + .available(false) + .controller(opt -> new ActionController(opt, Text.translatable("xso.incompatible.button").formatted(Formatting.RED))) + .action((screen, opt) -> {}) + .build(); + } else { + throw new IllegalStateException("Failed to convert Sodium option named '" + sodiumOption.getName().getString() + "' to a YACL option!", e); + } } - - addController(builder, sodiumOption); - - Option built = builder.build(); - if (Compat.MORE_CULLING) MoreCullingCompat.addAvailableCheck(built, sodiumOption); - return built; } // nasty, nasty raw types to make the compiler not commit die @@ -156,4 +194,8 @@ private static List convertFlags(me.jellysquid.mods.sodium.client.gu return flags; } + + public static boolean shouldConvertGui() { + return XsoConfig.INSTANCE.getConfig().enabled && !errorOccured; + } } diff --git a/src/main/java/dev/isxander/xso/compat/EntityViewDistanceCompat.java b/src/main/java/dev/isxander/xso/compat/EntityViewDistanceCompat.java index 3eae142..745a5bc 100644 --- a/src/main/java/dev/isxander/xso/compat/EntityViewDistanceCompat.java +++ b/src/main/java/dev/isxander/xso/compat/EntityViewDistanceCompat.java @@ -5,18 +5,19 @@ import eu.pb4.entityviewdistance.modcompat.SodiumCompat; import me.jellysquid.mods.sodium.client.gui.options.Option; +import java.util.Optional; + public class EntityViewDistanceCompat { - public static boolean isFakeOption(Option sodiumOption) { - return sodiumOption instanceof SodiumCompat.FakeOptionImpl; - } + public static Optional> convertFakeOption(Option sodiumOption) { + if (sodiumOption instanceof SodiumCompat.FakeOptionImpl fakeOption) { + return Optional.of(ButtonOption.createBuilder() + .name(sodiumOption.getName()) + .tooltip(sodiumOption.getTooltip()) + .controller(ActionController::new) + .action(((yaclScreen, buttonOption) -> fakeOption.setValue(SodiumCompat.Void.VOID))) + .build()); + } - public static ButtonOption convertFakeOption(Option sodiumOption) { - SodiumCompat.FakeOptionImpl fakeOption = (SodiumCompat.FakeOptionImpl) sodiumOption; - return ButtonOption.createBuilder() - .name(sodiumOption.getName()) - .tooltip(sodiumOption.getTooltip()) - .controller(ActionController::new) - .action(((yaclScreen, buttonOption) -> fakeOption.setValue(SodiumCompat.Void.VOID))) - .build(); + return Optional.empty(); } } diff --git a/src/main/java/dev/isxander/xso/compat/IrisCompat.java b/src/main/java/dev/isxander/xso/compat/IrisCompat.java index 2b05f91..c4008ec 100644 --- a/src/main/java/dev/isxander/xso/compat/IrisCompat.java +++ b/src/main/java/dev/isxander/xso/compat/IrisCompat.java @@ -6,17 +6,19 @@ import me.jellysquid.mods.sodium.client.gui.options.OptionPage; import net.coderbot.iris.gui.screen.ShaderPackScreen; +import java.util.Optional; + public class IrisCompat { - public static ConfigCategory replaceShaderPackPage(SodiumOptionsGUI optionsGUI, OptionPage page) { + public static Optional replaceShaderPackPage(SodiumOptionsGUI optionsGUI, OptionPage page) { ShaderPageHolder shaderPageHolder = (ShaderPageHolder) optionsGUI; if (shaderPageHolder.getShaderPage() == page) { - return PlaceholderCategory.createBuilder() + return Optional.of(PlaceholderCategory.createBuilder() .name(page.getName()) .screen((client, parent) -> new ShaderPackScreen(parent)) - .build(); + .build()); } - return null; + return Optional.empty(); } public interface ShaderPageHolder { diff --git a/src/main/java/dev/isxander/xso/compat/MoreCullingCompat.java b/src/main/java/dev/isxander/xso/compat/MoreCullingCompat.java index 1b5c72a..9db8939 100644 --- a/src/main/java/dev/isxander/xso/compat/MoreCullingCompat.java +++ b/src/main/java/dev/isxander/xso/compat/MoreCullingCompat.java @@ -2,12 +2,12 @@ import ca.fxco.moreculling.config.sodium.FloatSliderControl; import ca.fxco.moreculling.config.sodium.IntSliderControl; -import ca.fxco.moreculling.config.sodium.MoreCullingOptionImpl; +import ca.fxco.moreculling.config.sodium.MoreCullingSodiumOptionImpl; import ca.fxco.moreculling.utils.CacheUtils; import dev.isxander.xso.SodiumBinding; import dev.isxander.xso.mixins.compat.moreculling.FloatSliderControlAccessor; import dev.isxander.xso.mixins.compat.moreculling.IntSliderControlAccessor; -import dev.isxander.xso.mixins.compat.moreculling.MoreCullingOptionImplAccessor; +import dev.isxander.xso.mixins.compat.moreculling.MoreCullingSodiumOptionImplAccessor; import dev.isxander.yacl.api.ButtonOption; import dev.isxander.yacl.api.ConfigCategory; import dev.isxander.yacl.gui.controllers.ActionController; @@ -21,8 +21,8 @@ public class MoreCullingCompat { public static SodiumBinding getBinding(Option option) { - if (option instanceof MoreCullingOptionImpl moreCullingOption) { - return new SodiumBinding<>(((MoreCullingOptionImplAccessor) moreCullingOption).getBinding(), (OptionStorage) moreCullingOption.getStorage()); + if (option instanceof MoreCullingSodiumOptionImpl moreCullingOption) { + return new SodiumBinding<>(((MoreCullingSodiumOptionImplAccessor) moreCullingOption).getBinding(), (OptionStorage) moreCullingOption.getStorage()); } else { return new SodiumBinding<>(option); } @@ -30,7 +30,7 @@ public static SodiumBinding getBinding(Option option) { @SuppressWarnings({"unchecked"}) public static void addAvailableCheck(dev.isxander.yacl.api.Option yaclOption, Option sodiumOption) { - if (!(sodiumOption instanceof MoreCullingOptionImpl)) + if (!(sodiumOption instanceof MoreCullingSodiumOptionImpl)) return; ((OptionHolder) sodiumOption).holdOption(yaclOption); diff --git a/src/main/java/dev/isxander/xso/config/ModMenuEntrypoint.java b/src/main/java/dev/isxander/xso/config/ModMenuEntrypoint.java new file mode 100644 index 0000000..53c2bca --- /dev/null +++ b/src/main/java/dev/isxander/xso/config/ModMenuEntrypoint.java @@ -0,0 +1,17 @@ +package dev.isxander.xso.config; + +import com.terraformersmc.modmenu.api.ConfigScreenFactory; +import com.terraformersmc.modmenu.api.ModMenuApi; +import dev.isxander.yacl.api.YetAnotherConfigLib; +import net.minecraft.text.Text; + +public class ModMenuEntrypoint implements ModMenuApi { + @Override + public ConfigScreenFactory getModConfigScreenFactory() { + return parent -> YetAnotherConfigLib.createBuilder() + .title(Text.translatable("xso.title")) + .category(XsoConfig.getConfigCategory()) + .save(XsoConfig.INSTANCE::save) + .build().generateScreen(parent); + } +} diff --git a/src/main/java/dev/isxander/xso/config/XsoConfig.java b/src/main/java/dev/isxander/xso/config/XsoConfig.java new file mode 100644 index 0000000..4b502f1 --- /dev/null +++ b/src/main/java/dev/isxander/xso/config/XsoConfig.java @@ -0,0 +1,49 @@ +package dev.isxander.xso.config; + +import dev.isxander.yacl.api.ConfigCategory; +import dev.isxander.yacl.api.Option; +import dev.isxander.yacl.config.ConfigEntry; +import dev.isxander.yacl.config.ConfigInstance; +import dev.isxander.yacl.config.GsonConfigInstance; +import dev.isxander.yacl.gui.controllers.BooleanController; +import dev.isxander.yacl.gui.controllers.TickBoxController; +import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.text.Text; + +public class XsoConfig { + public static final ConfigInstance INSTANCE = new GsonConfigInstance<>( + XsoConfig.class, + FabricLoader.getInstance().getConfigDir().resolve("xanders-sodium-options.json") + ); + + @ConfigEntry public boolean enabled = true; + @ConfigEntry public boolean lenientOptions = true; + @ConfigEntry public boolean hardCrash = false; + + public static ConfigCategory getConfigCategory() { + XsoConfig config = INSTANCE.getConfig(); + XsoConfig defaults = INSTANCE.getDefaults(); + + return ConfigCategory.createBuilder() + .name(Text.translatable("xso.title")) + .option(Option.createBuilder(boolean.class) + .name(Text.translatable("xso.cfg.enabled")) + .tooltip(Text.translatable("xso.cfg.enabled.tooltip")) + .binding(defaults.enabled, () -> config.enabled, val -> config.enabled = val) + .controller(BooleanController::new) + .build()) + .option(Option.createBuilder(boolean.class) + .name(Text.translatable("xso.cfg.lenient_opts")) + .tooltip(Text.translatable("xso.cfg.lenient_opts.tooltip")) + .binding(defaults.lenientOptions, () -> config.lenientOptions, val -> config.lenientOptions = val) + .controller(opt -> new BooleanController(opt, BooleanController.YES_NO_FORMATTER, false)) + .build()) + .option(Option.createBuilder(boolean.class) + .name(Text.translatable("xso.cfg.hard_crash")) + .tooltip(Text.translatable("xso.cfg.hard_crash.tooltip")) + .binding(defaults.hardCrash, () -> config.hardCrash, val -> config.hardCrash = val) + .controller(opt -> new BooleanController(opt, BooleanController.YES_NO_FORMATTER, false)) + .build()) + .build(); + } +} diff --git a/src/main/java/dev/isxander/xso/mixins/MinecraftClientMixin.java b/src/main/java/dev/isxander/xso/mixins/MinecraftClientMixin.java new file mode 100644 index 0000000..e8f2c56 --- /dev/null +++ b/src/main/java/dev/isxander/xso/mixins/MinecraftClientMixin.java @@ -0,0 +1,22 @@ +package dev.isxander.xso.mixins; + +import dev.isxander.xso.XandersSodiumOptions; +import me.jellysquid.mods.sodium.client.gui.SodiumOptionsGUI; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.Screen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +@Mixin(MinecraftClient.class) +public class MinecraftClientMixin { + @ModifyVariable(method = "setScreen", at = @At("HEAD"), argsOnly = true) + private Screen modifyScreen(Screen screen) { + if (XandersSodiumOptions.shouldConvertGui() && screen instanceof SodiumOptionsGUI sodiumOptionsGUI) { + var accessor = (SodiumOptionsGUIAccessor) sodiumOptionsGUI; + return XandersSodiumOptions.wrapSodiumScreen(sodiumOptionsGUI, accessor.getPages(), accessor.getPrevScreen()); + } + + return screen; + } +} diff --git a/src/main/java/dev/isxander/xso/mixins/OptionImplBuilderMixin.java b/src/main/java/dev/isxander/xso/mixins/OptionImplBuilderMixin.java index 90f9414..4057307 100644 --- a/src/main/java/dev/isxander/xso/mixins/OptionImplBuilderMixin.java +++ b/src/main/java/dev/isxander/xso/mixins/OptionImplBuilderMixin.java @@ -7,7 +7,7 @@ import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; -@Mixin(OptionImpl.Builder.class) +@Mixin(value = OptionImpl.Builder.class, remap = false) public class OptionImplBuilderMixin implements ClassCapture { @Unique private Class xso$capturedClass = null; diff --git a/src/main/java/dev/isxander/xso/mixins/OptionImplMixin.java b/src/main/java/dev/isxander/xso/mixins/OptionImplMixin.java index 73ae280..5167821 100644 --- a/src/main/java/dev/isxander/xso/mixins/OptionImplMixin.java +++ b/src/main/java/dev/isxander/xso/mixins/OptionImplMixin.java @@ -8,7 +8,7 @@ import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; -@Mixin(OptionImpl.class) +@Mixin(value = OptionImpl.class, remap = false) public class OptionImplMixin implements ClassCapture { @Unique private Class xso$capturedClass = null; diff --git a/src/main/java/dev/isxander/xso/mixins/SodiumOptionsGUIMixin.java b/src/main/java/dev/isxander/xso/mixins/SodiumOptionsGUIMixin.java deleted file mode 100644 index 2dbca70..0000000 --- a/src/main/java/dev/isxander/xso/mixins/SodiumOptionsGUIMixin.java +++ /dev/null @@ -1,31 +0,0 @@ -package dev.isxander.xso.mixins; - -import dev.isxander.xso.XandersSodiumOptions; -import me.jellysquid.mods.sodium.client.gui.SodiumOptionsGUI; -import me.jellysquid.mods.sodium.client.gui.options.OptionPage; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.text.Text; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -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(SodiumOptionsGUI.class) -public abstract class SodiumOptionsGUIMixin extends Screen { - @Shadow @Final private List pages; - - @Shadow @Final private Screen prevScreen; - - protected SodiumOptionsGUIMixin(Text title) { - super(title); - } - - @Inject(method = "init", at = @At("TAIL")) - private void redirectToYACL(CallbackInfo ci) { - client.setScreen(XandersSodiumOptions.wrapSodiumScreen((SodiumOptionsGUI) (Object) this, pages, prevScreen)); - } -} diff --git a/src/main/java/dev/isxander/xso/mixins/compat/moreculling/MoreCullingOptionImplBuilderMixin.java b/src/main/java/dev/isxander/xso/mixins/compat/moreculling/MoreCullingOptionImplBuilderMixin.java index d01d2e6..8a7f0ef 100644 --- a/src/main/java/dev/isxander/xso/mixins/compat/moreculling/MoreCullingOptionImplBuilderMixin.java +++ b/src/main/java/dev/isxander/xso/mixins/compat/moreculling/MoreCullingOptionImplBuilderMixin.java @@ -1,6 +1,6 @@ package dev.isxander.xso.mixins.compat.moreculling; -import ca.fxco.moreculling.config.sodium.MoreCullingOptionImpl; +import ca.fxco.moreculling.config.sodium.MoreCullingSodiumOptionImpl; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import dev.isxander.xso.utils.ClassCapture; import org.spongepowered.asm.mixin.Mixin; @@ -9,13 +9,13 @@ import org.spongepowered.asm.mixin.injection.At; @Pseudo -@Mixin(MoreCullingOptionImpl.Builder.class) +@Mixin(value = MoreCullingSodiumOptionImpl.Builder.class, remap = false) public class MoreCullingOptionImplBuilderMixin implements ClassCapture { @Unique private Class xso$capturedClass = null; @ModifyReturnValue(method = "build", at = @At("RETURN")) - private MoreCullingOptionImpl captureBuiltClass(MoreCullingOptionImpl result) { + private MoreCullingSodiumOptionImpl captureBuiltClass(MoreCullingSodiumOptionImpl result) { ((ClassCapture) result).setCapturedClass(getCapturedClass()); return result; } diff --git a/src/main/java/dev/isxander/xso/mixins/compat/moreculling/MoreCullingOptionImplMixin.java b/src/main/java/dev/isxander/xso/mixins/compat/moreculling/MoreCullingOptionImplMixin.java index d7804b2..8def73b 100644 --- a/src/main/java/dev/isxander/xso/mixins/compat/moreculling/MoreCullingOptionImplMixin.java +++ b/src/main/java/dev/isxander/xso/mixins/compat/moreculling/MoreCullingOptionImplMixin.java @@ -1,6 +1,6 @@ package dev.isxander.xso.mixins.compat.moreculling; -import ca.fxco.moreculling.config.sodium.MoreCullingOptionImpl; +import ca.fxco.moreculling.config.sodium.MoreCullingSodiumOptionImpl; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import dev.isxander.xso.compat.MoreCullingCompat; import dev.isxander.xso.utils.ClassCapture; @@ -14,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Pseudo -@Mixin(value = MoreCullingOptionImpl.class, remap = false) +@Mixin(value = MoreCullingSodiumOptionImpl.class, remap = false) public abstract class MoreCullingOptionImplMixin implements ClassCapture, MoreCullingCompat.OptionHolder { @Unique private Class xso$capturedClass = null; @@ -23,7 +23,7 @@ public abstract class MoreCullingOptionImplMixin implements ClassCapture xso$heldOption = null; @ModifyReturnValue(method = "createBuilder", at = @At("RETURN")) - private static MoreCullingOptionImpl.Builder passClassToBuilder(MoreCullingOptionImpl.Builder builder, Class type, OptionStorage storage) { + private static MoreCullingSodiumOptionImpl.Builder passClassToBuilder(MoreCullingSodiumOptionImpl.Builder builder, Class type, OptionStorage storage) { ((ClassCapture) builder).setCapturedClass(type); return builder; } diff --git a/src/main/java/dev/isxander/xso/mixins/compat/moreculling/MoreCullingOptionImplAccessor.java b/src/main/java/dev/isxander/xso/mixins/compat/moreculling/MoreCullingSodiumOptionImplAccessor.java similarity index 65% rename from src/main/java/dev/isxander/xso/mixins/compat/moreculling/MoreCullingOptionImplAccessor.java rename to src/main/java/dev/isxander/xso/mixins/compat/moreculling/MoreCullingSodiumOptionImplAccessor.java index 0b54880..6ac7ffd 100644 --- a/src/main/java/dev/isxander/xso/mixins/compat/moreculling/MoreCullingOptionImplAccessor.java +++ b/src/main/java/dev/isxander/xso/mixins/compat/moreculling/MoreCullingSodiumOptionImplAccessor.java @@ -1,14 +1,14 @@ package dev.isxander.xso.mixins.compat.moreculling; -import ca.fxco.moreculling.config.sodium.MoreCullingOptionImpl; +import ca.fxco.moreculling.config.sodium.MoreCullingSodiumOptionImpl; import me.jellysquid.mods.sodium.client.gui.options.binding.OptionBinding; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Pseudo; import org.spongepowered.asm.mixin.gen.Accessor; @Pseudo -@Mixin(MoreCullingOptionImpl.class) -public interface MoreCullingOptionImplAccessor { +@Mixin(MoreCullingSodiumOptionImpl.class) +public interface MoreCullingSodiumOptionImplAccessor { @Accessor OptionBinding getBinding(); } diff --git a/src/main/java/dev/isxander/xso/mixins/compat/sodiumextra/SodiumExtraGameOptionsMixins.java b/src/main/java/dev/isxander/xso/mixins/compat/sodiumextra/SodiumExtraGameOptionsMixins.java index cb88e9d..18f9974 100644 --- a/src/main/java/dev/isxander/xso/mixins/compat/sodiumextra/SodiumExtraGameOptionsMixins.java +++ b/src/main/java/dev/isxander/xso/mixins/compat/sodiumextra/SodiumExtraGameOptionsMixins.java @@ -7,7 +7,7 @@ import org.spongepowered.asm.mixin.injection.At; @Pseudo -@Mixin(SodiumExtraGameOptions.class) +@Mixin(value = SodiumExtraGameOptions.class, remap = false) public class SodiumExtraGameOptionsMixins { @ModifyReturnValue(method = "hasSuggestedRSO", at = @At("RETURN")) private boolean dontShowRSOScreen(boolean hasSuggested) { diff --git a/src/main/resources/assets/xanders-sodium-options/lang/en_us.json b/src/main/resources/assets/xanders-sodium-options/lang/en_us.json index 8aaf878..59e8598 100644 --- a/src/main/resources/assets/xanders-sodium-options/lang/en_us.json +++ b/src/main/resources/assets/xanders-sodium-options/lang/en_us.json @@ -1,4 +1,12 @@ { - "xso.incompatible.button": "Incompatible", + "xso.title": "Xander's Sodium Options", + "xso.cfg.enabled": "XSO", + "xso.cfg.enabled.tooltip": "Configures whether XSO should override Sodium's options. When disabled, you can configure this mod through mod menu.", + "xso.cfg.lenient_opts": "Lenient Options", + "xso.cfg.lenient_opts.tooltip": "If XSO fails to convert an option, instead of failing to create the whole GUI, it adds a placeholder option in place of the broken option so you can continue to use XSO with an incompatible mod.", + "xso.cfg.hard_crash": "Hard Crash", + "xso.cfg.hard_crash.tooltip": "If XSO cannot convert the Sodium GUI for whatever reason, enabling this makes Minecraft crash completely, rather than displaying the warning and giving you the original Sodium GUI. This can be beneficial as it makes Minecraft generate a crash report whereas it only prints to latest.log with this option off.", + + "xso.incompatible.button": "Option Incompatible", "xso.incompatible.tooltip": "This option is currently incompatible with XSO. Please make an issue to get support!" } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 355ff6f..d519023 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -16,8 +16,14 @@ "license": "LGPL-3.0-or-later", "environment": "client", "entrypoints": { + "client": [ + "dev.isxander.xso.ModEntrypoint" + ], "preLaunch": [ "com.llamalad7.mixinextras.MixinExtrasBootstrap::init" + ], + "modmenu": [ + "dev.isxander.xso.config.ModMenuEntrypoint" ] }, "mixins": [ @@ -25,10 +31,10 @@ ], "depends": { "fabricloader": ">=0.14.0", - "minecraft": "1.19.x", + "minecraft": "~1.19.3", "java": ">=17", "sodium": "<0.5.0", - "yet-another-config-lib": ">=1.5.0" + "yet-another-config-lib": ">=2.1.1" }, "breaks": { "reeses-sodium-options": "*" diff --git a/src/main/resources/xanders-sodium-options.mixins.json b/src/main/resources/xanders-sodium-options.mixins.json index 9ce8ddd..b6afe7e 100644 --- a/src/main/resources/xanders-sodium-options.mixins.json +++ b/src/main/resources/xanders-sodium-options.mixins.json @@ -4,19 +4,19 @@ "minVersion": "0.8", "compatibilityLevel": "JAVA_17", "client": [ + "CyclingControlAccessor", + "MinecraftClientMixin", "OptionImplAccessor", "OptionImplBuilderMixin", "OptionImplMixin", "SliderControlAccessor", "SodiumOptionsGUIAccessor", - "SodiumOptionsGUIMixin", - "CyclingControlAccessor", "compat.iris.SodiumOptionsGUIMixin", "compat.moreculling.FloatSliderControlAccessor", "compat.moreculling.IntSliderControlAccessor", - "compat.moreculling.MoreCullingOptionImplAccessor", "compat.moreculling.MoreCullingOptionImplBuilderMixin", "compat.moreculling.MoreCullingOptionImplMixin", + "compat.moreculling.MoreCullingSodiumOptionImplAccessor", "compat.moreculling.SodiumOptionsGUIMixin", "compat.sodiumextra.SliderControlExtAccessor", "compat.sodiumextra.SodiumExtraGameOptionsMixins"