diff --git a/src/main/java/dev/isxander/controlify/api/bind/ControllerBinding.java b/src/main/java/dev/isxander/controlify/api/bind/ControllerBinding.java index b7d54d1..1318755 100644 --- a/src/main/java/dev/isxander/controlify/api/bind/ControllerBinding.java +++ b/src/main/java/dev/isxander/controlify/api/bind/ControllerBinding.java @@ -1,6 +1,7 @@ package dev.isxander.controlify.api.bind; import com.google.gson.JsonObject; +import dev.isxander.yacl.api.Option; import net.minecraft.client.KeyMapping; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -30,6 +31,8 @@ public interface ControllerBinding { BindRenderer renderer(); + Option generateYACLOption(); + JsonObject toJson(); record KeyMappingOverride(KeyMapping keyMapping, BooleanSupplier toggleable) { diff --git a/src/main/java/dev/isxander/controlify/bindings/ControllerBindingImpl.java b/src/main/java/dev/isxander/controlify/bindings/ControllerBindingImpl.java index 8ac0d63..d0933d9 100644 --- a/src/main/java/dev/isxander/controlify/bindings/ControllerBindingImpl.java +++ b/src/main/java/dev/isxander/controlify/bindings/ControllerBindingImpl.java @@ -6,10 +6,16 @@ import dev.isxander.controlify.Controlify; import dev.isxander.controlify.api.bind.BindRenderer; import dev.isxander.controlify.api.bind.ControllerBinding; import dev.isxander.controlify.api.bind.ControllerBindingBuilder; +import dev.isxander.controlify.config.gui.GamepadBindController; +import dev.isxander.controlify.config.gui.JoystickBindController; import dev.isxander.controlify.controller.Controller; import dev.isxander.controlify.controller.ControllerState; 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.gui.DrawSize; +import dev.isxander.yacl.api.Option; import net.minecraft.client.KeyMapping; import net.minecraft.locale.Language; import net.minecraft.network.chat.Component; @@ -147,6 +153,22 @@ public class ControllerBindingImpl implements Control return renderer; } + @Override + public Option generateYACLOption() { + Option.Builder> option = Option.createBuilder((Class>) (Class) IBind.class) + .name(name()) + .binding(defaultBind(), this::currentBind, this::setCurrentBind) + .tooltip(this.description()); + + if (controller instanceof GamepadController gamepad) { + ((Option.Builder>) (Object) option).controller(opt -> new GamepadBindController(opt, gamepad)); + } else if (controller instanceof JoystickController joystick) { + ((Option.Builder>) (Object) option).controller(opt -> new JoystickBindController(opt, joystick)); + } + + return option.build(); + } + // FIXME: very hack solution please remove me public static void clearPressedBinds(Controller controller) { 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 00066e3..d63cbcc 100644 --- a/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java +++ b/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java @@ -384,33 +384,10 @@ public class YACLHelper { var controlsGroup = OptionGroup.createBuilder() .name(Component.translatable("controlify.gui.group.controls")); - if (controller instanceof GamepadController gamepad) { - groupBindings(gamepad.bindings().registry().values()).forEach((categoryName, bindGroup) -> { - controlsGroup.option(LabelOption.create(categoryName)); - for (var binding : bindGroup) { - ControllerBindingImpl bindingImpl = (ControllerBindingImpl) binding; - controlsGroup.option(Option.createBuilder((Class>) (Class) IBind.class) - .name(binding.name()) - .binding(bindingImpl.defaultBind(), bindingImpl::currentBind, bindingImpl::setCurrentBind) - .controller(opt -> new GamepadBindController(opt, gamepad)) - .tooltip(binding.description()) - .build()); - } - }); - } else if (controller instanceof JoystickController joystick) { - groupBindings(joystick.bindings().registry().values()).forEach((categoryName, bindGroup) -> { - controlsGroup.option(LabelOption.create(categoryName)); - for (var binding : bindGroup) { - ControllerBindingImpl bindingImpl = (ControllerBindingImpl) binding; - controlsGroup.option(Option.createBuilder((Class>) (Class) IBind.class) - .name(binding.name()) - .binding(bindingImpl.defaultBind(), bindingImpl::currentBind, bindingImpl::setCurrentBind) - .controller(opt -> new JoystickBindController(opt, joystick)) - .tooltip(binding.description()) - .build()); - } - }); - } + groupBindings(controller.bindings().registry().values()).forEach((categoryName, bindGroup) -> { + controlsGroup.option(LabelOption.create(categoryName)); + controlsGroup.options(bindGroup.stream().map(ControllerBinding::generateYACLOption).toList()); + }); category.group(controlsGroup.build());