diff --git a/README.md b/README.md index ab68221..7ed99d7 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ Slyde allow setting values for options that were not intended by mojang (for example: ridiculous fov effects, gamma, render distance) -This will (obviously) break things if you are not careful (for example: changing the target resolution outside its slider will cause a crash) \ No newline at end of file +This will (obviously) break things if you are not careful (for example: changing the target resolution outside its slider will cause a crash) + +To achieve this result, Slyde not only modifies the widgets, but also the relevant options code using a solution based on [FiveOneFourOneEight by apple502j](https://github.com/apple502j/FiveOneFourOneEight) \ No newline at end of file diff --git a/build.gradle b/build.gradle index 671f258..f307c9c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,21 +1,21 @@ apply from: "https://jfmods.gitlab.io/scripts/jfmod.gradle" +loom { + accessWidenerPath = file("src/main/resources/slyde.accesswidener") +} + repositories { maven { url 'https://api.modrinth.com/maven' } } dependencies { // For testing in dev environment - modRuntimeOnly "net.fabricmc.fabric-api:fabric-api:0.47.8+1.18.2" + modRuntimeOnly "net.fabricmc.fabric-api:fabric-api:0.55.1+1.19" - modRuntimeOnly modCompileOnly("maven.modrinth:sodium:mc1.18.2-0.4.1") + modCompileOnly("maven.modrinth:sodium:mc1.19-0.4.2") - include modImplementation("io.gitlab.jfronny.libjf:libjf-config-v0:${project.jfapi_version}") - include("io.gitlab.jfronny.libjf:libjf-unsafe-v0:${project.jfapi_version}") - include("io.gitlab.jfronny.libjf:libjf-base:${project.jfapi_version}") + modImplementation("io.gitlab.jfronny.libjf:libjf-config-v0:${project.jfapi_version}") modRuntimeOnly("io.gitlab.jfronny.libjf:libjf-devutil-v0:${project.jfapi_version}") - modImplementation "com.terraformersmc:modmenu:3.1.0" - - include modRuntimeOnly('io.gitlab.jfronny:gson:2.9.0.2022.4.2.19.45.43') // Dependency of LibJF 2.7.0 + modImplementation "com.terraformersmc:modmenu:4.0.0-beta.4" } diff --git a/gradle.properties b/gradle.properties index 90cae43..38d3448 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,13 +1,15 @@ # https://fabricmc.net/develop/ -minecraft_version=1.18.2 -yarn_mappings=build.2 -loader_version=0.13.3 +minecraft_version=1.19 +yarn_mappings=build.1 +loader_version=0.14.6 maven_group=io.gitlab.jfronny archives_base_name=Slyde -jfapi_version=2.7.1 +jfapi_version=2.9.1 modrinth_id=diCZrsch +modrinth_required_dependencies=WKwQAwke modrinth_optional_dependencies=mOgUt4GM curseforge_id=411386 +curseforge_required_dependencies=libjf curseforge_optional_dependencies=modmenu diff --git a/src/main/java/io/gitlab/jfronny/slyde/mixin/DoubleOptionMixin.java b/src/main/java/io/gitlab/jfronny/slyde/mixin/DoubleOptionMixin.java deleted file mode 100644 index 7b603a7..0000000 --- a/src/main/java/io/gitlab/jfronny/slyde/mixin/DoubleOptionMixin.java +++ /dev/null @@ -1,24 +0,0 @@ -package io.gitlab.jfronny.slyde.mixin; - -import net.minecraft.client.option.DoubleOption; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -@Mixin(DoubleOption.class) -public class DoubleOptionMixin { - @Redirect(method = "getRatio(D)D", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/MathHelper;clamp(DDD)D")) - private double getRatioClamp(double value, double min, double max) { - return value; - } - - @Redirect(method = "getValue(D)D", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/MathHelper;clamp(DDD)D")) - private double getValueClamp(double value, double min, double max) { - return value; - } - - @Redirect(method = "adjust(D)D", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/MathHelper;clamp(DDD)D")) - private double adjustClamp(double value, double min, double max) { - return value; - } -} diff --git a/src/main/java/io/gitlab/jfronny/slyde/mixin/DoubleSliderCallbacksMixin.java b/src/main/java/io/gitlab/jfronny/slyde/mixin/DoubleSliderCallbacksMixin.java new file mode 100644 index 0000000..60a3d3a --- /dev/null +++ b/src/main/java/io/gitlab/jfronny/slyde/mixin/DoubleSliderCallbacksMixin.java @@ -0,0 +1,22 @@ +package io.gitlab.jfronny.slyde.mixin; + +import com.mojang.serialization.*; +import net.minecraft.client.option.*; +import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.callback.*; + +import java.util.*; + +@Mixin(SimpleOption.DoubleSliderCallbacks.class) +public class DoubleSliderCallbacksMixin { + @Redirect(method = "codec", at = @At(value = "INVOKE", target = "Lcom/mojang/serialization/Codec;doubleRange(DD)Lcom/mojang/serialization/Codec;", remap = false)) + private Codec slyde$returnRangelessCodec(double minInclusive, double maxInclusive) { + return Codec.DOUBLE; + } + + @Inject(method = "validate(Ljava/lang/Double;)Ljava/util/Optional;", at = @At("HEAD"), cancellable = true) + private void slyde$skipValidate(Double double_, CallbackInfoReturnable> cir) { + cir.setReturnValue(Optional.of(double_)); + } +} diff --git a/src/main/java/io/gitlab/jfronny/slyde/mixin/GameOptionsMixin.java b/src/main/java/io/gitlab/jfronny/slyde/mixin/GameOptionsMixin.java new file mode 100644 index 0000000..a9f6f44 --- /dev/null +++ b/src/main/java/io/gitlab/jfronny/slyde/mixin/GameOptionsMixin.java @@ -0,0 +1,30 @@ +package io.gitlab.jfronny.slyde.mixin; + +import net.minecraft.client.*; +import net.minecraft.client.option.*; +import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.injection.*; + +import java.util.*; +import java.util.function.*; + +@Mixin(targets = "net.minecraft.client.option.GameOptions$2") +public class GameOptionsMixin { + @Redirect(method = "accept", at = @At(value = "INVOKE", target = "Ljava/util/Optional;ifPresent(Ljava/util/function/Consumer;)V", ordinal = 1)) + private void slyde$replaceSetter(Optional value, Consumer originalSetter, String key, SimpleOption option) { + value.ifPresent((realValue) -> { + if (option.getCallbacks() instanceof SimpleOption.SliderCallbacks) { + if (!MinecraftClient.getInstance().isRunning()) { + option.value = realValue; + return; + } + if (!Objects.equals(option.getValue(), realValue)) { + option.value = realValue; + option.changeCallback.accept(realValue); + } + return; + } + originalSetter.accept(realValue); + }); + } +} diff --git a/src/main/java/io/gitlab/jfronny/slyde/mixin/SliderWidgetMixin.java b/src/main/java/io/gitlab/jfronny/slyde/mixin/SliderWidgetMixin.java index 304ba91..436e788 100644 --- a/src/main/java/io/gitlab/jfronny/slyde/mixin/SliderWidgetMixin.java +++ b/src/main/java/io/gitlab/jfronny/slyde/mixin/SliderWidgetMixin.java @@ -10,7 +10,7 @@ import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(SliderWidget.class) public abstract class SliderWidgetMixin { @Redirect(method = "setValue(D)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/MathHelper;clamp(DDD)D")) - private double adjustClamp(double value, double min, double max) { + private double slyde$adjustClamp(double value, double min, double max) { return Slyde.isActive() ? value : MathHelper.clamp(value, min, max); } } diff --git a/src/main/java/io/gitlab/jfronny/slyde/mixin/SodiumSliderControlMixin.java b/src/main/java/io/gitlab/jfronny/slyde/mixin/SodiumSliderControlMixin.java index 62bee66..b6db584 100644 --- a/src/main/java/io/gitlab/jfronny/slyde/mixin/SodiumSliderControlMixin.java +++ b/src/main/java/io/gitlab/jfronny/slyde/mixin/SodiumSliderControlMixin.java @@ -9,7 +9,7 @@ import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(targets = "me.jellysquid.mods.sodium.client.gui.options.control.SliderControl$Button") public abstract class SodiumSliderControlMixin { @Redirect(method = "setValue(D)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/MathHelper;clamp(DDD)D")) - private double adjustClamp(double value, double min, double max) { + private double slyde$adjustClamp(double value, double min, double max) { return Slyde.isActive() ? value : MathHelper.clamp(value, min, max); } } diff --git a/src/main/java/io/gitlab/jfronny/slyde/mixin/ValidatingIntSliderCallbacksMixin.java b/src/main/java/io/gitlab/jfronny/slyde/mixin/ValidatingIntSliderCallbacksMixin.java new file mode 100644 index 0000000..a66e4d4 --- /dev/null +++ b/src/main/java/io/gitlab/jfronny/slyde/mixin/ValidatingIntSliderCallbacksMixin.java @@ -0,0 +1,22 @@ +package io.gitlab.jfronny.slyde.mixin; + +import com.mojang.serialization.*; +import net.minecraft.client.option.*; +import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.callback.*; + +import java.util.*; + +@Mixin(SimpleOption.ValidatingIntSliderCallbacks.class) +public class ValidatingIntSliderCallbacksMixin { + @Inject(method = "codec()Lcom/mojang/serialization/Codec;", at = @At("HEAD"), cancellable = true) + private void slyde$returnRangelessCodec(CallbackInfoReturnable> cir) { + cir.setReturnValue(Codec.INT); + } + + @Inject(method = "validate(Ljava/lang/Integer;)Ljava/util/Optional;", at = @At("HEAD"), cancellable = true) + private void slyde$skipValidate(Integer integer, CallbackInfoReturnable> cir) { + cir.setReturnValue(Optional.of(integer)); + } +} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index a2c9608..7ed59b8 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -15,13 +15,12 @@ "license": "MIT", "environment": "*", "entrypoints": { - "libjf:config": [ - "io.gitlab.jfronny.slyde.Cfg" - ] + "libjf:config": ["io.gitlab.jfronny.slyde.Cfg"] }, "mixins": [ "slyde.mixins.json" ], + "accessWidener": "slyde.accesswidener", "depends": { "fabricloader": ">=0.12.0", "minecraft": "*", diff --git a/src/main/resources/slyde.accesswidener b/src/main/resources/slyde.accesswidener new file mode 100644 index 0000000..ff762eb --- /dev/null +++ b/src/main/resources/slyde.accesswidener @@ -0,0 +1,6 @@ +accessWidener v2 named + +accessible class net/minecraft/client/option/SimpleOption$SliderCallbacks + +accessible field net/minecraft/client/option/SimpleOption value Ljava/lang/Object; +accessible field net/minecraft/client/option/SimpleOption changeCallback Ljava/util/function/Consumer; \ No newline at end of file diff --git a/src/main/resources/slyde.mixins.json b/src/main/resources/slyde.mixins.json index 2d02e37..5a714c4 100644 --- a/src/main/resources/slyde.mixins.json +++ b/src/main/resources/slyde.mixins.json @@ -2,14 +2,14 @@ "required": true, "minVersion": "0.8", "package": "io.gitlab.jfronny.slyde.mixin", - "compatibilityLevel": "JAVA_14", + "compatibilityLevel": "JAVA_17", "plugin": "io.gitlab.jfronny.slyde.Plugin", - "mixins": [ - ], "client": [ - "DoubleOptionMixin", + "DoubleSliderCallbacksMixin", + "GameOptionsMixin", "SliderWidgetMixin", - "SodiumSliderControlMixin" + "SodiumSliderControlMixin", + "ValidatingIntSliderCallbacksMixin" ], "injectors": { "defaultRequire": 1