From 5c288a4e019e20a3a7aa4a1f0767aedd7283e272 Mon Sep 17 00:00:00 2001 From: Yao Chung Hu <30311066+FlashyReese@users.noreply.github.com> Date: Tue, 6 Jun 2023 22:12:16 +0800 Subject: [PATCH] change: Replace IrisApi using methodhandles Previously, we transitioned from using reflection to the `IrisApi` interface for accessing Iris functionality. However, since `IrisApi` is not available separately and can only be used after the release day as a major version, we have decided to switch back to using reflection. Relying on the availability of `IrisApi` has introduced significant delays and dependencies on Iris. Until `IrisApi` becomes available separately, we will continue using reflection for accessing the required functionality. This commit reverts the changes made to utilize `IrisApi` and restores the original reflection-based approach. Please note that this revert will not be backported to previous versions. --- build.gradle | 2 +- gradle.properties | 8 +-- .../client/gui/SodiumVideoOptionsScreen.java | 13 +++-- .../compat/IrisCompat.java | 55 +++++++++++++++++++ 4 files changed, 69 insertions(+), 9 deletions(-) create mode 100644 src/main/java/me/flashyreese/mods/reeses_sodium_options/compat/IrisCompat.java diff --git a/build.gradle b/build.gradle index a1b4d39..02bd18d 100644 --- a/build.gradle +++ b/build.gradle @@ -35,7 +35,7 @@ dependencies { modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - modImplementation "me.jellysquid.mods:sodium-fabric:0.4.10+build.214" + modImplementation "me.jellysquid.mods:sodium-fabric:0.4.10+build.219" //modImplementation "maven.modrinth:sodium:${project.sodium_version}" //modImplementation "maven.modrinth:iris:${project.iris_version}" diff --git a/gradle.properties b/gradle.properties index 8dd8204..5010dd7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,9 +2,9 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://modmuss50.me/fabric.html - minecraft_version=23w17a - yarn_mappings=23w17a+build.10 - loader_version=0.14.19 + minecraft_version=1.20-rc1 + yarn_mappings=1.20-rc1+build.2 + loader_version=0.14.21 # Mod Properties mod_version=1.5.0 maven_group=me.flashyreese.mods @@ -15,4 +15,4 @@ org.gradle.jvmargs=-Xmx1G iris_version=1.5.2+1.19.4 #Fabric api - fabric_version=0.79.2+1.20 + fabric_version=0.83.0+1.20 diff --git a/src/main/java/me/flashyreese/mods/reeses_sodium_options/client/gui/SodiumVideoOptionsScreen.java b/src/main/java/me/flashyreese/mods/reeses_sodium_options/client/gui/SodiumVideoOptionsScreen.java index a0d6c32..0c9dd2c 100644 --- a/src/main/java/me/flashyreese/mods/reeses_sodium_options/client/gui/SodiumVideoOptionsScreen.java +++ b/src/main/java/me/flashyreese/mods/reeses_sodium_options/client/gui/SodiumVideoOptionsScreen.java @@ -4,6 +4,7 @@ import me.flashyreese.mods.reeses_sodium_options.client.gui.frame.BasicFrame; import me.flashyreese.mods.reeses_sodium_options.client.gui.frame.tab.Tab; import me.flashyreese.mods.reeses_sodium_options.client.gui.frame.tab.TabFrame; +import me.flashyreese.mods.reeses_sodium_options.compat.IrisCompat; import me.jellysquid.mods.sodium.client.SodiumClientMod; import me.jellysquid.mods.sodium.client.gui.SodiumGameOptions; import me.jellysquid.mods.sodium.client.gui.options.Option; @@ -12,6 +13,7 @@ import me.jellysquid.mods.sodium.client.gui.options.storage.OptionStorage; import me.jellysquid.mods.sodium.client.gui.widgets.FlatButtonWidget; import me.jellysquid.mods.sodium.client.util.Dim2i; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; @@ -88,17 +90,20 @@ protected BasicFrame.Builder parentFrameBuilder() { basicFrameBuilder = this.parentBasicFrameBuilder(basicFrameDim, tabFrameDim); - /*if (FabricLoader.getInstance().isModLoaded("iris")) { - int size = this.client.textRenderer.getWidth(Text.translatable(IrisApi.getInstance().getMainScreenLanguageKey())); + if (IrisCompat.isIrisPresent()) { // FabricLoader.getInstance().isModLoaded("iris")) { + //int size = this.client.textRenderer.getWidth(Text.translatable(IrisApi.getInstance().getMainScreenLanguageKey())); + int size = this.client.textRenderer.getWidth(Text.translatable(IrisCompat.getIrisShaderPacksScreenLanguageKey())); Dim2i shaderPackButtonDim; if (!SodiumClientMod.options().notifications.hideDonationButton) { shaderPackButtonDim = new Dim2i(donateButtonDim.x() - 12 - size, tabFrameDim.y() - 26, 10 + size, 20); } else { shaderPackButtonDim = new Dim2i(tabFrameDim.getLimitX() - size - 10, tabFrameDim.y() - 26, 10 + size, 20); } - FlatButtonWidget shaderPackButton = new FlatButtonWidget(shaderPackButtonDim, Text.translatable(IrisApi.getInstance().getMainScreenLanguageKey()), () -> this.client.setScreen((Screen) IrisApi.getInstance().openMainIrisScreenObj(this))); + + //FlatButtonWidget shaderPackButton = new FlatButtonWidget(shaderPackButtonDim, Text.translatable(IrisApi.getInstance().getMainScreenLanguageKey()), () -> this.client.setScreen((Screen) IrisApi.getInstance().openMainIrisScreenObj(this))); + FlatButtonWidget shaderPackButton = new FlatButtonWidget(shaderPackButtonDim, Text.translatable(IrisCompat.getIrisShaderPacksScreenLanguageKey()), () -> this.client.setScreen(IrisCompat.getIrisShaderPacksScreen(this))); basicFrameBuilder.addChild(dim -> shaderPackButton); - }*/ + } return basicFrameBuilder; } diff --git a/src/main/java/me/flashyreese/mods/reeses_sodium_options/compat/IrisCompat.java b/src/main/java/me/flashyreese/mods/reeses_sodium_options/compat/IrisCompat.java new file mode 100644 index 0000000..0cd7110 --- /dev/null +++ b/src/main/java/me/flashyreese/mods/reeses_sodium_options/compat/IrisCompat.java @@ -0,0 +1,55 @@ +package me.flashyreese.mods.reeses_sodium_options.compat; + +import net.minecraft.client.gui.screen.Screen; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.lang.reflect.InvocationTargetException; + +public class IrisCompat { + private static boolean irisPresent; + private static MethodHandle handleScreen; + private static MethodHandle handleTranslationKey; + private static Object apiInstance; + + static { + try { + Class api = Class.forName("net.irisshaders.iris.api.v0.IrisApi"); + apiInstance = api.cast(api.getDeclaredMethod("getInstance").invoke(null)); + handleScreen = MethodHandles.lookup().findVirtual(api, "openMainIrisScreenObj", MethodType.methodType(Object.class, Object.class)); + handleTranslationKey = MethodHandles.lookup().findVirtual(api, "getMainScreenLanguageKey", MethodType.methodType(String.class)); + irisPresent = true; + } catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + irisPresent = false; + } + } + + public static Screen getIrisShaderPacksScreen(Screen parent) { + if (irisPresent) { + try { + return (Screen) handleScreen.invokeWithArguments(apiInstance, parent); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } + + return null; + } + + public static String getIrisShaderPacksScreenLanguageKey() { + if (irisPresent) { + try { + return (String) handleTranslationKey.invoke(apiInstance); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } + + return null; + } + + public static boolean isIrisPresent() { + return irisPresent; + } +} \ No newline at end of file