forked from Clones/Controlify
expose YACL option gen to bindings
This commit is contained in:
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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());
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user