forked from Clones/Controlify
fix binding api not working with generics and iris compat
This commit is contained in:
@ -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) {
|
||||
|
@ -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<T extends ControllerState> {
|
||||
ControllerBinding<T> get(Controller<T, ?> controller);
|
||||
public interface BindingSupplier {
|
||||
ControllerBinding<?> get(Controller<?, ?> controller);
|
||||
}
|
||||
|
@ -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<T extends ControllerState> {
|
||||
private static final Map<ResourceLocation, Function<ControllerBindings<?>, ControllerBinding<?>>> CUSTOM_BINDS = new LinkedHashMap<>();
|
||||
|
||||
public final ControllerBinding<T>
|
||||
WALK_FORWARD, WALK_BACKWARD, WALK_LEFT, WALK_RIGHT,
|
||||
LOOK_UP, LOOK_DOWN, LOOK_LEFT, LOOK_RIGHT,
|
||||
@ -41,7 +45,6 @@ public class ControllerBindings<T extends ControllerState> {
|
||||
CYCLE_OPT_FORWARD, CYCLE_OPT_BACKWARD;
|
||||
|
||||
private final Map<ResourceLocation, ControllerBinding<T>> registry = new LinkedHashMap<>();
|
||||
|
||||
private final Controller<T, ?> controller;
|
||||
|
||||
public ControllerBindings(Controller<T, ?> controller) {
|
||||
@ -95,15 +98,25 @@ public class ControllerBindings<T extends ControllerState> {
|
||||
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<T>) 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<T> register(ControllerBinding<T> binding) {
|
||||
public ControllerBinding<T> register(ControllerBinding<T> 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<T> get(ResourceLocation id) {
|
||||
@ -165,4 +178,14 @@ public class ControllerBindings<T extends ControllerState> {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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<Boolean> cycleMethod;
|
||||
|
||||
public BaseOptionElementComponentProcessor(Consumer<Boolean> cycleMethod) {
|
||||
this.cycleMethod = cycleMethod;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void incrementSlider(boolean reverse) {
|
||||
this.cycleMethod.accept(reverse);
|
||||
}
|
||||
}
|
@ -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<Boolean> cycleMethod;
|
||||
private int ticksSinceIncrement = 0;
|
||||
private boolean prevLeft, prevRight;
|
||||
|
||||
public SliderControlProcessor(Consumer<Boolean> 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);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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<IBind<GamepadState>> {
|
||||
return new BindButtonWidget(this, yaclScreen, dimension);
|
||||
}
|
||||
|
||||
public static class BindButtonWidget extends ControllerWidget<GamepadBindController> implements ComponentProcessorProvider, ComponentProcessor {
|
||||
public static class BindButtonWidget extends ControllerWidget<GamepadBindController> 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<IBind<GamepadState>> {
|
||||
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;
|
||||
|
@ -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<IBind<JoystickState>> {
|
||||
private final Option<IBind<JoystickState>> option;
|
||||
private final JoystickController controller;
|
||||
@ -45,7 +40,7 @@ public class JoystickBindController implements Controller<IBind<JoystickState>>
|
||||
return new BindButtonWidget(this, yaclScreen, dimension);
|
||||
}
|
||||
|
||||
public static class BindButtonWidget extends ControllerWidget<JoystickBindController> implements ComponentProcessorProvider, ComponentProcessor {
|
||||
public static class BindButtonWidget extends ControllerWidget<JoystickBindController> 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<IBind<JoystickState>>
|
||||
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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -56,7 +56,7 @@ public abstract class AbstractController<S extends ControllerState, C extends Co
|
||||
protected void setName(String name) {
|
||||
String uniqueName = name;
|
||||
int i = 0;
|
||||
while (Controller.CONTROLLERS.values().stream().map(Controller::name).anyMatch(name::equalsIgnoreCase)) {
|
||||
while (CONTROLLERS.values().stream().map(Controller::name).anyMatch(name::equalsIgnoreCase)) {
|
||||
uniqueName = name + " (" + i++ + ")";
|
||||
}
|
||||
this.name = uniqueName;
|
||||
|
@ -1,7 +1,6 @@
|
||||
package dev.isxander.controlify.controller;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public interface ControllerState {
|
||||
List<Float> axes();
|
||||
|
@ -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);
|
||||
|
@ -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<InputModeChanged> 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<ControllerBindRegistry> CONTROLLER_BIND_REGISTRY = EventFactory.createArrayBacked(ControllerBindRegistry.class, callbacks -> (bindings, controller) -> {
|
||||
for (ControllerBindRegistry callback : callbacks) {
|
||||
callback.onRegisterControllerBinds(bindings, controller);
|
||||
}
|
||||
});
|
||||
|
||||
public static final Event<ButtonGuideRegistryEvent> 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);
|
@ -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;
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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) {
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
@ -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)
|
||||
|
@ -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<LongSupplier> cir) {
|
||||
// stops GLFW adding hats to button list (backward compat)
|
||||
GLFW.glfwInitHint(GLFW.GLFW_JOYSTICK_HAT_BUTTONS, GLFW.GLFW_FALSE);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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<T extends Screen> {
|
||||
|
||||
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) {
|
||||
|
@ -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);
|
||||
}
|
@ -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() {
|
||||
|
@ -4,6 +4,7 @@
|
||||
"minVersion": "0.8",
|
||||
"compatibilityLevel": "JAVA_17",
|
||||
"mixins": [
|
||||
"compat.iris.BaseOptionElementWidgetMixin",
|
||||
"compat.sodium.CycleControlElementMixin",
|
||||
"compat.sodium.SliderControlElementMixin",
|
||||
"compat.sodium.TickBoxControlElementMixin",
|
||||
|
Reference in New Issue
Block a user