1
0
forked from Clones/Controlify

expose YACL option gen to bindings

This commit is contained in:
isXander
2023-04-14 20:28:57 +01:00
parent abe6b27cef
commit 9d7d8a9ff3
3 changed files with 29 additions and 27 deletions

View File

@ -1,6 +1,7 @@
package dev.isxander.controlify.api.bind; package dev.isxander.controlify.api.bind;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import dev.isxander.yacl.api.Option;
import net.minecraft.client.KeyMapping; import net.minecraft.client.KeyMapping;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
@ -30,6 +31,8 @@ public interface ControllerBinding {
BindRenderer renderer(); BindRenderer renderer();
Option<?> generateYACLOption();
JsonObject toJson(); JsonObject toJson();
record KeyMappingOverride(KeyMapping keyMapping, BooleanSupplier toggleable) { record KeyMappingOverride(KeyMapping keyMapping, BooleanSupplier toggleable) {

View File

@ -6,10 +6,16 @@ import dev.isxander.controlify.Controlify;
import dev.isxander.controlify.api.bind.BindRenderer; import dev.isxander.controlify.api.bind.BindRenderer;
import dev.isxander.controlify.api.bind.ControllerBinding; import dev.isxander.controlify.api.bind.ControllerBinding;
import dev.isxander.controlify.api.bind.ControllerBindingBuilder; 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.Controller;
import dev.isxander.controlify.controller.ControllerState; import dev.isxander.controlify.controller.ControllerState;
import dev.isxander.controlify.controller.gamepad.GamepadController; 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.controlify.gui.DrawSize;
import dev.isxander.yacl.api.Option;
import net.minecraft.client.KeyMapping; import net.minecraft.client.KeyMapping;
import net.minecraft.locale.Language; import net.minecraft.locale.Language;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
@ -147,6 +153,22 @@ public class ControllerBindingImpl<T extends ControllerState> implements Control
return renderer; return renderer;
} }
@Override
public Option<?> generateYACLOption() {
Option.Builder<IBind<T>> option = Option.createBuilder((Class<IBind<T>>) (Class<?>) IBind.class)
.name(name())
.binding(defaultBind(), this::currentBind, this::setCurrentBind)
.tooltip(this.description());
if (controller instanceof GamepadController gamepad) {
((Option.Builder<IBind<GamepadState>>) (Object) option).controller(opt -> new GamepadBindController(opt, gamepad));
} else if (controller instanceof JoystickController<?> joystick) {
((Option.Builder<IBind<JoystickState>>) (Object) option).controller(opt -> new JoystickBindController(opt, joystick));
}
return option.build();
}
// FIXME: very hack solution please remove me // FIXME: very hack solution please remove me
public static void clearPressedBinds(Controller<?, ?> controller) { public static void clearPressedBinds(Controller<?, ?> controller) {

View File

@ -384,33 +384,10 @@ public class YACLHelper {
var controlsGroup = OptionGroup.createBuilder() var controlsGroup = OptionGroup.createBuilder()
.name(Component.translatable("controlify.gui.group.controls")); .name(Component.translatable("controlify.gui.group.controls"));
if (controller instanceof GamepadController gamepad) { groupBindings(controller.bindings().registry().values()).forEach((categoryName, bindGroup) -> {
groupBindings(gamepad.bindings().registry().values()).forEach((categoryName, bindGroup) -> {
controlsGroup.option(LabelOption.create(categoryName)); controlsGroup.option(LabelOption.create(categoryName));
for (var binding : bindGroup) { controlsGroup.options(bindGroup.stream().map(ControllerBinding::generateYACLOption).toList());
ControllerBindingImpl<GamepadState> bindingImpl = (ControllerBindingImpl<GamepadState>) binding;
controlsGroup.option(Option.createBuilder((Class<IBind<GamepadState>>) (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<JoystickState> bindingImpl = (ControllerBindingImpl<JoystickState>) binding;
controlsGroup.option(Option.createBuilder((Class<IBind<JoystickState>>) (Class<?>) IBind.class)
.name(binding.name())
.binding(bindingImpl.defaultBind(), bindingImpl::currentBind, bindingImpl::setCurrentBind)
.controller(opt -> new JoystickBindController(opt, joystick))
.tooltip(binding.description())
.build());
}
});
}
category.group(controlsGroup.build()); category.group(controlsGroup.build());