diff --git a/build.gradle.kts b/build.gradle.kts index 8b872d3..57db546 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -69,6 +69,10 @@ dependencies { // sodium compat modImplementation(libs.sodium) + // iris compat + modImplementation(files("libs/iris-5d0efad3.jar")) + modRuntimeOnly("org.anarres:jcpp:1.4.14") + modRuntimeOnly("io.github.douira:glsl-transformer:2.0.0-pre9") } tasks { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7a8d4f4..8ce5d03 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -9,7 +9,7 @@ grgit = "5.0.+" minecraft = "1.19.4-pre1" quilt_mappings = "1" -fabric_loader = "0.14.15" +fabric_loader = "0.14.16" fabric_api = "0.74.1+1.19.4" mixin_extras = "0.2.0-beta.1" yet_another_config_lib = "2.3.0+beta.2+update.1.19.4-SNAPSHOT" @@ -30,6 +30,8 @@ hid4java = { module = "org.hid4java:hid4java", version.ref = "hid4java" } quilt_json5 = { module = "org.quiltmc:quilt-json5", version.ref = "quilt_json5" } sodium = { module = "me.jellysquid.mods:sodium-fabric", version.ref = "sodium" } +test_fabric_loader = { module = "net.fabricmc:fabric-loader-junit", version.ref = "fabric_loader" } + [plugins] loom = { id = "fabric-loom", version.ref = "loom" } loom_quiltflower = { id = "io.github.juuxel.loom-quiltflower", version.ref = "loom_quiltflower" } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 41d9927..943f0cb 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f42e62f..6ec1567 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.1-all.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 1b6c787..65dcd68 100755 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,10 +80,10 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' @@ -143,12 +143,16 @@ fi if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -205,6 +209,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/gradlew.bat b/gradlew.bat index ac1b06f..6689b85 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/libs/iris-5d0efad3.jar b/libs/iris-5d0efad3.jar new file mode 100644 index 0000000..7aeadd4 Binary files /dev/null and b/libs/iris-5d0efad3.jar differ diff --git a/src/main/java/dev/isxander/controlify/Controlify.java b/src/main/java/dev/isxander/controlify/Controlify.java index 73ee122..597dc8d 100644 --- a/src/main/java/dev/isxander/controlify/Controlify.java +++ b/src/main/java/dev/isxander/controlify/Controlify.java @@ -8,7 +8,7 @@ import dev.isxander.controlify.gui.screen.ControllerDeadzoneCalibrationScreen; import dev.isxander.controlify.screenop.ScreenProcessorProvider; import dev.isxander.controlify.config.ControlifyConfig; import dev.isxander.controlify.controller.hid.ControllerHIDService; -import dev.isxander.controlify.event.ControlifyEvents; +import dev.isxander.controlify.event.ControlifyClientEvents; import dev.isxander.controlify.ingame.guide.InGameButtonGuide; import dev.isxander.controlify.ingame.InGameInputHandler; import dev.isxander.controlify.mixins.feature.virtualmouse.MouseHandlerAccessor; @@ -175,12 +175,13 @@ public class Controlify { if (client.screen != null) { ScreenProcessorProvider.provide(client.screen).onControllerUpdate(currentController); - } else { + } + if (client.level != null) { this.inGameInputHandler().inputTick(); } this.virtualMouseHandler().handleControllerInput(currentController); - ControlifyEvents.CONTROLLER_STATE_UPDATED.invoker().onControllerStateUpdate(currentController); + ControlifyClientEvents.CONTROLLER_STATE_UPDATED.invoker().onControllerStateUpdate(currentController); } public ControlifyConfig config() { @@ -257,7 +258,7 @@ public class Controlify { } lastInputSwitchTime = Blaze3D.getTime(); - ControlifyEvents.INPUT_MODE_CHANGED.invoker().onInputModeChanged(currentInputMode); + ControlifyClientEvents.INPUT_MODE_CHANGED.invoker().onInputModeChanged(currentInputMode); } public void hideMouse(boolean hide, boolean moveMouse) { diff --git a/src/main/java/dev/isxander/controlify/bindings/BindingSupplier.java b/src/main/java/dev/isxander/controlify/bindings/BindingSupplier.java index 73e7436..e328ff2 100644 --- a/src/main/java/dev/isxander/controlify/bindings/BindingSupplier.java +++ b/src/main/java/dev/isxander/controlify/bindings/BindingSupplier.java @@ -1,9 +1,8 @@ package dev.isxander.controlify.bindings; import dev.isxander.controlify.controller.Controller; -import dev.isxander.controlify.controller.ControllerState; @FunctionalInterface -public interface BindingSupplier { - ControllerBinding get(Controller controller); +public interface BindingSupplier { + ControllerBinding get(Controller controller); } diff --git a/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java b/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java index e2cee7c..19d72af 100644 --- a/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java +++ b/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java @@ -5,15 +5,19 @@ import dev.isxander.controlify.Controlify; import dev.isxander.controlify.InputMode; import dev.isxander.controlify.controller.Controller; import dev.isxander.controlify.controller.ControllerState; -import dev.isxander.controlify.event.ControlifyEvents; +import dev.isxander.controlify.event.ControlifyClientEvents; import dev.isxander.controlify.mixins.feature.bind.KeyMappingAccessor; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; import java.util.*; +import java.util.function.BooleanSupplier; +import java.util.function.Function; public class ControllerBindings { + private static final Map, ControllerBinding>> CUSTOM_BINDS = new LinkedHashMap<>(); + public final ControllerBinding WALK_FORWARD, WALK_BACKWARD, WALK_LEFT, WALK_RIGHT, LOOK_UP, LOOK_DOWN, LOOK_LEFT, LOOK_RIGHT, @@ -41,7 +45,6 @@ public class ControllerBindings { CYCLE_OPT_FORWARD, CYCLE_OPT_BACKWARD; private final Map> registry = new LinkedHashMap<>(); - private final Controller controller; public ControllerBindings(Controller controller) { @@ -95,15 +98,25 @@ public class ControllerBindings { register(CYCLE_OPT_FORWARD = new ControllerBinding<>(controller, GamepadBinds.RIGHT_STICK_RIGHT, new ResourceLocation("controlify", "cycle_opt_forward"))); register(CYCLE_OPT_BACKWARD = new ControllerBinding<>(controller, GamepadBinds.RIGHT_STICK_LEFT, new ResourceLocation("controlify", "cycle_opt_backward"))); - ControlifyEvents.CONTROLLER_BIND_REGISTRY.invoker().onRegisterControllerBinds(this, controller); + for (var constructor : CUSTOM_BINDS.values()) { + register((ControllerBinding) constructor.apply(this)); + } - ControlifyEvents.CONTROLLER_STATE_UPDATED.register(this::onControllerUpdate); - ControlifyEvents.INPUT_MODE_CHANGED.register(mode -> KeyMapping.releaseAll()); + ControlifyClientEvents.CONTROLLER_STATE_UPDATED.register(this::onControllerUpdate); + ControlifyClientEvents.INPUT_MODE_CHANGED.register(mode -> KeyMapping.releaseAll()); } - public BindingSupplier register(ControllerBinding binding) { + public ControllerBinding register(ControllerBinding binding) { registry.put(binding.id(), binding); - return controller -> controller.bindings().get(binding.id()); + return binding; + } + + private ControllerBinding create(GamepadBinds bind, ResourceLocation id) { + return new ControllerBinding<>(controller, bind, id); + } + + private ControllerBinding create(GamepadBinds bind, ResourceLocation id, KeyMapping override, BooleanSupplier toggleOverride) { + return new ControllerBinding<>(controller, bind, id, override, toggleOverride); } public ControllerBinding get(ResourceLocation id) { @@ -165,4 +178,14 @@ public class ControllerBindings { if (binding.justPressed()) KeyMapping.click(vanillaKeyCode); } } + + public static BindingSupplier registerBind(GamepadBinds bind, ResourceLocation id) { + CUSTOM_BINDS.put(id, bindings -> bindings.create(bind, id)); + return controller -> controller.bindings().get(id); + } + + public static BindingSupplier registerBind(GamepadBinds bind, ResourceLocation id, KeyMapping override, BooleanSupplier toggleOverride) { + CUSTOM_BINDS.put(id, bindings -> bindings.create(bind, id, override, toggleOverride)); + return controller -> controller.bindings().get(id); + } } diff --git a/src/main/java/dev/isxander/controlify/bindings/GamepadBind.java b/src/main/java/dev/isxander/controlify/bindings/GamepadBind.java index 9c7660a..b6d38a4 100644 --- a/src/main/java/dev/isxander/controlify/bindings/GamepadBind.java +++ b/src/main/java/dev/isxander/controlify/bindings/GamepadBind.java @@ -5,7 +5,6 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import dev.isxander.controlify.controller.Controller; import dev.isxander.controlify.controller.gamepad.BuiltinGamepadTheme; -import dev.isxander.controlify.controller.gamepad.GamepadConfig; import dev.isxander.controlify.controller.gamepad.GamepadController; import dev.isxander.controlify.controller.gamepad.GamepadState; import dev.isxander.controlify.gui.DrawSize; diff --git a/src/main/java/dev/isxander/controlify/bindings/IBind.java b/src/main/java/dev/isxander/controlify/bindings/IBind.java index a1f12fb..716a900 100644 --- a/src/main/java/dev/isxander/controlify/bindings/IBind.java +++ b/src/main/java/dev/isxander/controlify/bindings/IBind.java @@ -2,7 +2,6 @@ package dev.isxander.controlify.bindings; import com.google.gson.JsonObject; import com.mojang.blaze3d.vertex.PoseStack; -import dev.isxander.controlify.Controlify; import dev.isxander.controlify.controller.*; import dev.isxander.controlify.controller.gamepad.GamepadController; import dev.isxander.controlify.controller.joystick.JoystickController; diff --git a/src/main/java/dev/isxander/controlify/bindings/JoystickAxisBind.java b/src/main/java/dev/isxander/controlify/bindings/JoystickAxisBind.java index 03f5119..da10b76 100644 --- a/src/main/java/dev/isxander/controlify/bindings/JoystickAxisBind.java +++ b/src/main/java/dev/isxander/controlify/bindings/JoystickAxisBind.java @@ -11,7 +11,6 @@ import dev.isxander.controlify.controller.joystick.mapping.UnmappedJoystickMappi import dev.isxander.controlify.gui.DrawSize; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiComponent; -import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import java.util.Objects; diff --git a/src/main/java/dev/isxander/controlify/bindings/JoystickButtonBind.java b/src/main/java/dev/isxander/controlify/bindings/JoystickButtonBind.java index f40c4c0..a73abdb 100644 --- a/src/main/java/dev/isxander/controlify/bindings/JoystickButtonBind.java +++ b/src/main/java/dev/isxander/controlify/bindings/JoystickButtonBind.java @@ -9,7 +9,6 @@ import dev.isxander.controlify.controller.joystick.JoystickState; import dev.isxander.controlify.gui.DrawSize; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiComponent; -import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import java.util.Objects; diff --git a/src/main/java/dev/isxander/controlify/bindings/JoystickHatBind.java b/src/main/java/dev/isxander/controlify/bindings/JoystickHatBind.java index 5467be6..e94565e 100644 --- a/src/main/java/dev/isxander/controlify/bindings/JoystickHatBind.java +++ b/src/main/java/dev/isxander/controlify/bindings/JoystickHatBind.java @@ -9,7 +9,6 @@ import dev.isxander.controlify.controller.joystick.JoystickState; import dev.isxander.controlify.gui.DrawSize; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiComponent; -import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import java.util.Objects; diff --git a/src/main/java/dev/isxander/controlify/compatibility/iris/BaseOptionElementComponentProcessor.java b/src/main/java/dev/isxander/controlify/compatibility/iris/BaseOptionElementComponentProcessor.java new file mode 100644 index 0000000..388bea2 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/compatibility/iris/BaseOptionElementComponentProcessor.java @@ -0,0 +1,18 @@ +package dev.isxander.controlify.compatibility.iris; + +import dev.isxander.controlify.screenop.compat.AbstractSliderComponentProcessor; + +import java.util.function.Consumer; + +public class BaseOptionElementComponentProcessor extends AbstractSliderComponentProcessor { + private final Consumer cycleMethod; + + public BaseOptionElementComponentProcessor(Consumer cycleMethod) { + this.cycleMethod = cycleMethod; + } + + @Override + protected void incrementSlider(boolean reverse) { + this.cycleMethod.accept(reverse); + } +} diff --git a/src/main/java/dev/isxander/controlify/compatibility/sodium/SliderControlProcessor.java b/src/main/java/dev/isxander/controlify/compatibility/sodium/SliderControlProcessor.java index 4618e05..c352b24 100644 --- a/src/main/java/dev/isxander/controlify/compatibility/sodium/SliderControlProcessor.java +++ b/src/main/java/dev/isxander/controlify/compatibility/sodium/SliderControlProcessor.java @@ -1,40 +1,18 @@ package dev.isxander.controlify.compatibility.sodium; -import dev.isxander.controlify.controller.Controller; -import dev.isxander.controlify.screenop.ComponentProcessor; -import dev.isxander.controlify.screenop.ScreenProcessor; +import dev.isxander.controlify.screenop.compat.AbstractSliderComponentProcessor; import java.util.function.Consumer; -public class SliderControlProcessor implements ComponentProcessor { +public class SliderControlProcessor extends AbstractSliderComponentProcessor { private final Consumer cycleMethod; - private int ticksSinceIncrement = 0; - private boolean prevLeft, prevRight; public SliderControlProcessor(Consumer cycleMethod) { this.cycleMethod = cycleMethod; } @Override - public boolean overrideControllerButtons(ScreenProcessor screen, Controller controller) { - ticksSinceIncrement++; - - var left = controller.bindings().CYCLE_OPT_BACKWARD.held(); - var right = controller.bindings().CYCLE_OPT_FORWARD.held(); - - if (left || right) { - if (ticksSinceIncrement > controller.config().screenRepeatNavigationDelay || left != prevLeft || right != prevRight) { - cycleMethod.accept(left); - ticksSinceIncrement = 0; - prevLeft = left; - prevRight = right; - return true; - } - } else { - this.prevLeft = false; - this.prevRight = false; - } - - return false; + protected void incrementSlider(boolean reverse) { + cycleMethod.accept(reverse); } } diff --git a/src/main/java/dev/isxander/controlify/config/GlobalSettings.java b/src/main/java/dev/isxander/controlify/config/GlobalSettings.java index 4622dde..693fbfd 100644 --- a/src/main/java/dev/isxander/controlify/config/GlobalSettings.java +++ b/src/main/java/dev/isxander/controlify/config/GlobalSettings.java @@ -1,7 +1,6 @@ package dev.isxander.controlify.config; import com.google.common.collect.Lists; -import dev.isxander.controlify.Controlify; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import java.util.List; diff --git a/src/main/java/dev/isxander/controlify/config/gui/GamepadBindController.java b/src/main/java/dev/isxander/controlify/config/gui/GamepadBindController.java index 5625289..b0c340a 100644 --- a/src/main/java/dev/isxander/controlify/config/gui/GamepadBindController.java +++ b/src/main/java/dev/isxander/controlify/config/gui/GamepadBindController.java @@ -8,7 +8,6 @@ import dev.isxander.controlify.controller.gamepad.GamepadController; import dev.isxander.controlify.controller.gamepad.GamepadState; import dev.isxander.controlify.screenop.ScreenProcessor; import dev.isxander.controlify.screenop.ComponentProcessor; -import dev.isxander.controlify.screenop.ComponentProcessorProvider; import dev.isxander.yacl.api.Controller; import dev.isxander.yacl.api.Option; import dev.isxander.yacl.api.utils.Dimension; @@ -43,7 +42,7 @@ public class GamepadBindController implements Controller> { return new BindButtonWidget(this, yaclScreen, dimension); } - public static class BindButtonWidget extends ControllerWidget implements ComponentProcessorProvider, ComponentProcessor { + public static class BindButtonWidget extends ControllerWidget implements ComponentProcessor { private boolean awaitingControllerInput = false; private final Component awaitingText = Component.translatable("controlify.gui.bind_input_awaiting").withStyle(ChatFormatting.ITALIC); @@ -81,11 +80,6 @@ public class GamepadBindController implements Controller> { return false; } - @Override - public ComponentProcessor componentProcessor() { - return this; - } - @Override public boolean overrideControllerButtons(ScreenProcessor screen, dev.isxander.controlify.controller.Controller controller) { if (controller != control.controller) return true; diff --git a/src/main/java/dev/isxander/controlify/config/gui/JoystickBindController.java b/src/main/java/dev/isxander/controlify/config/gui/JoystickBindController.java index 3c87c80..de30d2b 100644 --- a/src/main/java/dev/isxander/controlify/config/gui/JoystickBindController.java +++ b/src/main/java/dev/isxander/controlify/config/gui/JoystickBindController.java @@ -2,12 +2,9 @@ package dev.isxander.controlify.config.gui; import com.mojang.blaze3d.vertex.PoseStack; import dev.isxander.controlify.bindings.*; -import dev.isxander.controlify.controller.gamepad.GamepadController; -import dev.isxander.controlify.controller.gamepad.GamepadState; import dev.isxander.controlify.controller.joystick.JoystickController; import dev.isxander.controlify.controller.joystick.JoystickState; import dev.isxander.controlify.screenop.ComponentProcessor; -import dev.isxander.controlify.screenop.ComponentProcessorProvider; import dev.isxander.controlify.screenop.ScreenProcessor; import dev.isxander.yacl.api.Controller; import dev.isxander.yacl.api.Option; @@ -19,8 +16,6 @@ import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import org.lwjgl.glfw.GLFW; -import java.util.ArrayList; - public class JoystickBindController implements Controller> { private final Option> option; private final JoystickController controller; @@ -45,7 +40,7 @@ public class JoystickBindController implements Controller> return new BindButtonWidget(this, yaclScreen, dimension); } - public static class BindButtonWidget extends ControllerWidget implements ComponentProcessorProvider, ComponentProcessor { + public static class BindButtonWidget extends ControllerWidget implements ComponentProcessor { private boolean awaitingControllerInput = false; private final Component awaitingText = Component.translatable("controlify.gui.bind_input_awaiting").withStyle(ChatFormatting.ITALIC); @@ -83,11 +78,6 @@ public class JoystickBindController implements Controller> return false; } - @Override - public ComponentProcessor componentProcessor() { - return this; - } - @Override public boolean overrideControllerButtons(ScreenProcessor screen, dev.isxander.controlify.controller.Controller controller) { if (controller != control.controller) return true; diff --git a/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java b/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java index 007995b..7cd584f 100644 --- a/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java +++ b/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java @@ -10,7 +10,6 @@ import dev.isxander.controlify.controller.gamepad.GamepadState; import dev.isxander.controlify.controller.gamepad.BuiltinGamepadTheme; import dev.isxander.controlify.controller.joystick.JoystickController; import dev.isxander.controlify.controller.joystick.JoystickState; -import dev.isxander.controlify.controller.joystick.mapping.UnmappedJoystickMapping; import dev.isxander.controlify.gui.screen.ControllerDeadzoneCalibrationScreen; import dev.isxander.yacl.api.*; import dev.isxander.yacl.gui.controllers.ActionController; @@ -24,7 +23,6 @@ import dev.isxander.yacl.gui.controllers.string.StringController; import net.minecraft.ChatFormatting; import net.minecraft.Util; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.AlertScreen; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; diff --git a/src/main/java/dev/isxander/controlify/controller/AbstractController.java b/src/main/java/dev/isxander/controlify/controller/AbstractController.java index 31d160f..3120fef 100644 --- a/src/main/java/dev/isxander/controlify/controller/AbstractController.java +++ b/src/main/java/dev/isxander/controlify/controller/AbstractController.java @@ -56,7 +56,7 @@ public abstract class AbstractController axes(); diff --git a/src/main/java/dev/isxander/controlify/controller/gamepad/GamepadState.java b/src/main/java/dev/isxander/controlify/controller/gamepad/GamepadState.java index 6ff3043..86fefb4 100644 --- a/src/main/java/dev/isxander/controlify/controller/gamepad/GamepadState.java +++ b/src/main/java/dev/isxander/controlify/controller/gamepad/GamepadState.java @@ -6,7 +6,6 @@ import org.lwjgl.glfw.GLFW; import java.util.List; import java.util.Objects; -import java.util.Set; public final class GamepadState implements ControllerState { public static final GamepadState EMPTY = new GamepadState(AxesState.EMPTY, AxesState.EMPTY, ButtonState.EMPTY); diff --git a/src/main/java/dev/isxander/controlify/event/ControlifyEvents.java b/src/main/java/dev/isxander/controlify/event/ControlifyClientEvents.java similarity index 79% rename from src/main/java/dev/isxander/controlify/event/ControlifyEvents.java rename to src/main/java/dev/isxander/controlify/event/ControlifyClientEvents.java index d28e194..c3f399f 100644 --- a/src/main/java/dev/isxander/controlify/event/ControlifyEvents.java +++ b/src/main/java/dev/isxander/controlify/event/ControlifyClientEvents.java @@ -7,7 +7,7 @@ import dev.isxander.controlify.ingame.guide.ButtonGuideRegistry; import net.fabricmc.fabric.api.event.Event; import net.fabricmc.fabric.api.event.EventFactory; -public class ControlifyEvents { +public class ControlifyClientEvents { public static final Event INPUT_MODE_CHANGED = EventFactory.createArrayBacked(InputModeChanged.class, callbacks -> mode -> { for (InputModeChanged callback : callbacks) { callback.onInputModeChanged(mode); @@ -20,12 +20,6 @@ public class ControlifyEvents { } }); - public static final Event CONTROLLER_BIND_REGISTRY = EventFactory.createArrayBacked(ControllerBindRegistry.class, callbacks -> (bindings, controller) -> { - for (ControllerBindRegistry callback : callbacks) { - callback.onRegisterControllerBinds(bindings, controller); - } - }); - public static final Event BUTTON_GUIDE_REGISTRY = EventFactory.createArrayBacked(ButtonGuideRegistryEvent.class, callbacks -> (bindings, registry) -> { for (ButtonGuideRegistryEvent callback : callbacks) { callback.onRegisterButtonGuide(bindings, registry); @@ -48,11 +42,6 @@ public class ControlifyEvents { void onControllerStateUpdate(Controller controller); } - @FunctionalInterface - public interface ControllerBindRegistry { - void onRegisterControllerBinds(ControllerBindings bindings, Controller controller); - } - @FunctionalInterface public interface ButtonGuideRegistryEvent { void onRegisterButtonGuide(ControllerBindings bindings, ButtonGuideRegistry registry); diff --git a/src/main/java/dev/isxander/controlify/gui/screen/BetaNoticeScreen.java b/src/main/java/dev/isxander/controlify/gui/screen/BetaNoticeScreen.java index 2783783..573256a 100644 --- a/src/main/java/dev/isxander/controlify/gui/screen/BetaNoticeScreen.java +++ b/src/main/java/dev/isxander/controlify/gui/screen/BetaNoticeScreen.java @@ -10,7 +10,6 @@ import net.minecraft.client.gui.layouts.FrameLayout; import net.minecraft.client.gui.layouts.GridLayout; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.TitleScreen; -import net.minecraft.network.chat.ClickEvent; import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; diff --git a/src/main/java/dev/isxander/controlify/ingame/InGameInputHandler.java b/src/main/java/dev/isxander/controlify/ingame/InGameInputHandler.java index 0637320..c3de46f 100644 --- a/src/main/java/dev/isxander/controlify/ingame/InGameInputHandler.java +++ b/src/main/java/dev/isxander/controlify/ingame/InGameInputHandler.java @@ -2,7 +2,7 @@ package dev.isxander.controlify.ingame; import dev.isxander.controlify.InputMode; import dev.isxander.controlify.controller.Controller; -import dev.isxander.controlify.event.ControlifyEvents; +import dev.isxander.controlify.event.ControlifyClientEvents; import net.minecraft.client.Minecraft; import net.minecraft.client.player.KeyboardInput; @@ -16,7 +16,7 @@ public class InGameInputHandler { this.controller = controller; this.minecraft = Minecraft.getInstance(); - ControlifyEvents.INPUT_MODE_CHANGED.register(mode -> { + ControlifyClientEvents.INPUT_MODE_CHANGED.register(mode -> { if (minecraft.player != null) { minecraft.player.input = mode == InputMode.CONTROLLER ? new ControllerPlayerMovement(controller, minecraft.player) diff --git a/src/main/java/dev/isxander/controlify/ingame/guide/InGameButtonGuide.java b/src/main/java/dev/isxander/controlify/ingame/guide/InGameButtonGuide.java index e9a497e..1cc9378 100644 --- a/src/main/java/dev/isxander/controlify/ingame/guide/InGameButtonGuide.java +++ b/src/main/java/dev/isxander/controlify/ingame/guide/InGameButtonGuide.java @@ -3,7 +3,7 @@ package dev.isxander.controlify.ingame.guide; import com.mojang.blaze3d.vertex.PoseStack; import dev.isxander.controlify.bindings.ControllerBinding; import dev.isxander.controlify.controller.Controller; -import dev.isxander.controlify.event.ControlifyEvents; +import dev.isxander.controlify.event.ControlifyClientEvents; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiComponent; import net.minecraft.client.multiplayer.ClientLevel; @@ -33,7 +33,7 @@ public class InGameButtonGuide implements ButtonGuideRegistry { this.player = localPlayer; registerDefaultActions(); - ControlifyEvents.BUTTON_GUIDE_REGISTRY.invoker().onRegisterButtonGuide(controller.bindings(), this); + ControlifyClientEvents.BUTTON_GUIDE_REGISTRY.invoker().onRegisterButtonGuide(controller.bindings(), this); } public void renderHud(PoseStack poseStack, float tickDelta, int width, int height) { diff --git a/src/main/java/dev/isxander/controlify/mixins/compat/iris/BaseOptionElementWidgetMixin.java b/src/main/java/dev/isxander/controlify/mixins/compat/iris/BaseOptionElementWidgetMixin.java new file mode 100644 index 0000000..b66c72a --- /dev/null +++ b/src/main/java/dev/isxander/controlify/mixins/compat/iris/BaseOptionElementWidgetMixin.java @@ -0,0 +1,32 @@ +package dev.isxander.controlify.mixins.compat.iris; + +import dev.isxander.controlify.compatibility.iris.BaseOptionElementComponentProcessor; +import dev.isxander.controlify.screenop.ComponentProcessor; +import dev.isxander.controlify.screenop.ComponentProcessorProvider; +import net.coderbot.iris.gui.NavigationController; +import net.coderbot.iris.gui.element.widget.BaseOptionElementWidget; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; + +@Mixin(BaseOptionElementWidget.class) +public abstract class BaseOptionElementWidgetMixin implements ComponentProcessorProvider { + @Shadow public abstract boolean applyPreviousValue(); + @Shadow public abstract boolean applyNextValue(); + + @Shadow protected NavigationController navigation; + @Unique private final BaseOptionElementComponentProcessor processor + = new BaseOptionElementComponentProcessor(this::cycle); + + @Override + public ComponentProcessor componentProcessor() { + return processor; + } + + private void cycle(boolean reverse) { + boolean needsUpdate = reverse ? applyPreviousValue() : applyNextValue(); + if (needsUpdate) { + navigation.refresh(); + } + } +} diff --git a/src/main/java/dev/isxander/controlify/mixins/compat/sodium/SliderControlElementMixin.java b/src/main/java/dev/isxander/controlify/mixins/compat/sodium/SliderControlElementMixin.java index 017fd74..75d428e 100644 --- a/src/main/java/dev/isxander/controlify/mixins/compat/sodium/SliderControlElementMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/compat/sodium/SliderControlElementMixin.java @@ -1,6 +1,5 @@ package dev.isxander.controlify.mixins.compat.sodium; -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import dev.isxander.controlify.compatibility.sodium.SliderControlProcessor; import dev.isxander.controlify.screenop.ComponentProcessor; import dev.isxander.controlify.screenop.ComponentProcessorProvider; @@ -8,9 +7,7 @@ import me.jellysquid.mods.sodium.client.gui.options.Option; import me.jellysquid.mods.sodium.client.gui.options.control.ControlElement; import me.jellysquid.mods.sodium.client.util.Dim2i; import net.minecraft.util.Mth; -import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.injection.At; @Pseudo @Mixin(targets = "me.jellysquid.mods.sodium.client.gui.options.control.SliderControl$Button", remap = false) diff --git a/src/main/java/dev/isxander/controlify/mixins/core/GLXMixin.java b/src/main/java/dev/isxander/controlify/mixins/core/GLXMixin.java index 4d88553..b168231 100644 --- a/src/main/java/dev/isxander/controlify/mixins/core/GLXMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/core/GLXMixin.java @@ -13,6 +13,7 @@ import java.util.function.LongSupplier; public class GLXMixin { @Inject(method = "_initGlfw", at = @At(value = "INVOKE", target = "Lorg/lwjgl/glfw/GLFW;glfwInit()Z", shift = At.Shift.BEFORE)) private static void addInitHints(CallbackInfoReturnable cir) { + // stops GLFW adding hats to button list (backward compat) GLFW.glfwInitHint(GLFW.GLFW_JOYSTICK_HAT_BUTTONS, GLFW.GLFW_FALSE); } } diff --git a/src/main/java/dev/isxander/controlify/screenop/ComponentProcessor.java b/src/main/java/dev/isxander/controlify/screenop/ComponentProcessor.java index 5bdff1b..c34745e 100644 --- a/src/main/java/dev/isxander/controlify/screenop/ComponentProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/ComponentProcessor.java @@ -2,7 +2,7 @@ package dev.isxander.controlify.screenop; import dev.isxander.controlify.controller.Controller; -public interface ComponentProcessor { +public interface ComponentProcessor extends ComponentProcessorProvider { ComponentProcessor EMPTY = new ComponentProcessor(){}; default boolean overrideControllerNavigation(ScreenProcessor screen, Controller controller) { @@ -15,4 +15,9 @@ public interface ComponentProcessor { default void onFocusGained(ScreenProcessor screen, Controller controller) { } + + @Override + default ComponentProcessor componentProcessor() { + return this; + } } diff --git a/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java b/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java index 7f11ad7..e76c3fa 100644 --- a/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java @@ -3,7 +3,7 @@ package dev.isxander.controlify.screenop; import dev.isxander.controlify.Controlify; import dev.isxander.controlify.InputMode; import dev.isxander.controlify.controller.Controller; -import dev.isxander.controlify.event.ControlifyEvents; +import dev.isxander.controlify.event.ControlifyClientEvents; import dev.isxander.controlify.mixins.feature.screenop.vanilla.ScreenAccessor; import net.minecraft.client.gui.ComponentPath; import net.minecraft.client.gui.components.events.GuiEventListener; @@ -20,7 +20,7 @@ public class ScreenProcessor { public ScreenProcessor(T screen) { this.screen = screen; - ControlifyEvents.VIRTUAL_MOUSE_TOGGLED.register(this::onVirtualMouseToggled); + ControlifyClientEvents.VIRTUAL_MOUSE_TOGGLED.register(this::onVirtualMouseToggled); } public void onControllerUpdate(Controller controller) { diff --git a/src/main/java/dev/isxander/controlify/screenop/compat/AbstractSliderComponentProcessor.java b/src/main/java/dev/isxander/controlify/screenop/compat/AbstractSliderComponentProcessor.java new file mode 100644 index 0000000..b8861e2 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/screenop/compat/AbstractSliderComponentProcessor.java @@ -0,0 +1,35 @@ +package dev.isxander.controlify.screenop.compat; + +import dev.isxander.controlify.controller.Controller; +import dev.isxander.controlify.screenop.ComponentProcessor; +import dev.isxander.controlify.screenop.ScreenProcessor; + +public abstract class AbstractSliderComponentProcessor implements ComponentProcessor { + private int ticksSinceIncrement = 0; + private boolean prevLeft, prevRight; + + @Override + public boolean overrideControllerNavigation(ScreenProcessor screen, Controller controller) { + ticksSinceIncrement++; + + var left = controller.bindings().CYCLE_OPT_BACKWARD.held(); + var right = controller.bindings().CYCLE_OPT_FORWARD.held(); + + if (left || right) { + if (ticksSinceIncrement > controller.config().screenRepeatNavigationDelay || left != prevLeft || right != prevRight) { + incrementSlider(left); + ticksSinceIncrement = 0; + prevLeft = left; + prevRight = right; + return true; + } + } else { + this.prevLeft = false; + this.prevRight = false; + } + + return false; + } + + protected abstract void incrementSlider(boolean reverse); +} diff --git a/src/main/java/dev/isxander/controlify/virtualmouse/VirtualMouseHandler.java b/src/main/java/dev/isxander/controlify/virtualmouse/VirtualMouseHandler.java index d71d686..7398a8d 100644 --- a/src/main/java/dev/isxander/controlify/virtualmouse/VirtualMouseHandler.java +++ b/src/main/java/dev/isxander/controlify/virtualmouse/VirtualMouseHandler.java @@ -8,10 +8,9 @@ import dev.isxander.controlify.InputMode; import dev.isxander.controlify.controller.Controller; import dev.isxander.controlify.debug.DebugProperties; import dev.isxander.controlify.screenop.ScreenProcessorProvider; -import dev.isxander.controlify.event.ControlifyEvents; +import dev.isxander.controlify.event.ControlifyClientEvents; import dev.isxander.controlify.mixins.feature.virtualmouse.KeyboardHandlerAccessor; import dev.isxander.controlify.mixins.feature.virtualmouse.MouseHandlerAccessor; -import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiComponent; import net.minecraft.client.gui.components.toasts.SystemToast; @@ -49,7 +48,7 @@ public class VirtualMouseHandler { else snapPoints = Set.of(); - ControlifyEvents.INPUT_MODE_CHANGED.register(this::onInputModeChanged); + ControlifyClientEvents.INPUT_MODE_CHANGED.register(this::onInputModeChanged); } public void handleControllerInput(Controller controller) { @@ -241,7 +240,7 @@ public class VirtualMouseHandler { } setMousePosition(); - ControlifyEvents.VIRTUAL_MOUSE_TOGGLED.invoker().onVirtualMouseToggled(true); + ControlifyClientEvents.VIRTUAL_MOUSE_TOGGLED.invoker().onVirtualMouseToggled(true); } public void disableVirtualMouse() { @@ -257,7 +256,7 @@ public class VirtualMouseHandler { targetX = currentX = minecraft.mouseHandler.xpos(); targetY = currentY = minecraft.mouseHandler.ypos(); - ControlifyEvents.VIRTUAL_MOUSE_TOGGLED.invoker().onVirtualMouseToggled(false); + ControlifyClientEvents.VIRTUAL_MOUSE_TOGGLED.invoker().onVirtualMouseToggled(false); } private void setMousePosition() { diff --git a/src/main/resources/controlify.mixins.json b/src/main/resources/controlify.mixins.json index a17efa9..002cd8d 100644 --- a/src/main/resources/controlify.mixins.json +++ b/src/main/resources/controlify.mixins.json @@ -4,6 +4,7 @@ "minVersion": "0.8", "compatibilityLevel": "JAVA_17", "mixins": [ + "compat.iris.BaseOptionElementWidgetMixin", "compat.sodium.CycleControlElementMixin", "compat.sodium.SliderControlElementMixin", "compat.sodium.TickBoxControlElementMixin",