From 0d5307ba4319e857b6095430485b5335557fe438 Mon Sep 17 00:00:00 2001 From: isXander Date: Mon, 27 Feb 2023 18:08:40 +0000 Subject: [PATCH] separate API from impl --- .../dev/isxander/controlify/Controlify.java | 33 ++++++++++++------- .../controlify/api/ControlifyApi.java | 27 +++++++++++++++ .../api/bind/ControlifyBindingsApi.java | 32 ++++++++++++++++++ .../api/buttonguide/ActionLocation.java | 8 +++++ .../api/buttonguide/ActionPriority.java | 12 +++++++ .../api/buttonguide/ButtonGuideRegistry.java | 29 ++++++++++++++++ .../buttonguide/GuideActionNameSupplier.java | 25 ++++++++++++++ .../event/ControlifyEvents.java} | 18 ++++++++-- .../api/vmousesnapping/ISnapBehaviour.java | 10 ++++++ .../api/vmousesnapping/SnapPoint.java | 16 +++++++++ .../bindings/ControllerBindings.java | 25 ++++++++------ .../controlify/ingame/InGameInputHandler.java | 4 +-- .../ingame/guide/ActionLocation.java | 5 --- .../ingame/guide/ActionPriority.java | 9 ----- .../ingame/guide/ButtonGuideRegistry.java | 7 ---- .../controlify/ingame/guide/GuideAction.java | 2 ++ .../ingame/guide/GuideActionNameSupplier.java | 15 --------- .../ingame/guide/InGameButtonGuide.java | 19 ++++++++--- .../mixins/core/KeyboardHandlerMixin.java | 2 +- .../mixins/core/MouseHandlerMixin.java | 6 ++-- .../AbstractContainerScreenMixin.java | 4 +-- .../CreativeModeInventoryScreenMixin.java | 2 +- .../virtualmouse/snapping/ScreenMixin.java | 4 +-- .../controlify/screenop/ScreenProcessor.java | 4 +-- .../AbstractSliderComponentProcessor.java | 4 +++ .../virtualmouse/ISnapBehaviour.java | 7 ---- .../controlify/virtualmouse/SnapPoint.java | 6 ---- .../virtualmouse/VirtualMouseHandler.java | 10 +++--- 28 files changed, 250 insertions(+), 95 deletions(-) create mode 100644 src/main/java/dev/isxander/controlify/api/ControlifyApi.java create mode 100644 src/main/java/dev/isxander/controlify/api/bind/ControlifyBindingsApi.java create mode 100644 src/main/java/dev/isxander/controlify/api/buttonguide/ActionLocation.java create mode 100644 src/main/java/dev/isxander/controlify/api/buttonguide/ActionPriority.java create mode 100644 src/main/java/dev/isxander/controlify/api/buttonguide/ButtonGuideRegistry.java create mode 100644 src/main/java/dev/isxander/controlify/api/buttonguide/GuideActionNameSupplier.java rename src/main/java/dev/isxander/controlify/{event/ControlifyClientEvents.java => api/event/ControlifyEvents.java} (78%) create mode 100644 src/main/java/dev/isxander/controlify/api/vmousesnapping/ISnapBehaviour.java create mode 100644 src/main/java/dev/isxander/controlify/api/vmousesnapping/SnapPoint.java delete mode 100644 src/main/java/dev/isxander/controlify/ingame/guide/ActionLocation.java delete mode 100644 src/main/java/dev/isxander/controlify/ingame/guide/ActionPriority.java delete mode 100644 src/main/java/dev/isxander/controlify/ingame/guide/ButtonGuideRegistry.java delete mode 100644 src/main/java/dev/isxander/controlify/ingame/guide/GuideActionNameSupplier.java delete mode 100644 src/main/java/dev/isxander/controlify/virtualmouse/ISnapBehaviour.java delete mode 100644 src/main/java/dev/isxander/controlify/virtualmouse/SnapPoint.java diff --git a/src/main/java/dev/isxander/controlify/Controlify.java b/src/main/java/dev/isxander/controlify/Controlify.java index 597dc8d..d8a6bce 100644 --- a/src/main/java/dev/isxander/controlify/Controlify.java +++ b/src/main/java/dev/isxander/controlify/Controlify.java @@ -2,13 +2,16 @@ package dev.isxander.controlify; import com.mojang.blaze3d.Blaze3D; import com.mojang.logging.LogUtils; +import dev.isxander.controlify.api.ControlifyApi; +import dev.isxander.controlify.api.bind.ControlifyBindingsApi; +import dev.isxander.controlify.bindings.ControllerBindings; import dev.isxander.controlify.controller.Controller; import dev.isxander.controlify.controller.ControllerState; 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.ControlifyClientEvents; +import dev.isxander.controlify.api.event.ControlifyEvents; import dev.isxander.controlify.ingame.guide.InGameButtonGuide; import dev.isxander.controlify.ingame.InGameInputHandler; import dev.isxander.controlify.mixins.feature.virtualmouse.MouseHandlerAccessor; @@ -18,13 +21,14 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.toasts.SystemToast; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; +import org.jetbrains.annotations.NotNull; import org.lwjgl.glfw.GLFW; import org.slf4j.Logger; import java.util.ArrayDeque; import java.util.Queue; -public class Controlify { +public class Controlify implements ControlifyApi { public static final Logger LOGGER = LogUtils.getLogger(); private static Controlify instance = null; @@ -87,7 +91,7 @@ public class Controlify { if (firstController) { this.setCurrentController(controller); - this.setCurrentInputMode(InputMode.CONTROLLER); + this.setInputMode(InputMode.CONTROLLER); } if (!config().loadOrCreateControllerData(currentController)) { @@ -106,7 +110,7 @@ public class Controlify { if (controller != null) { setCurrentController(Controller.CONTROLLERS.values().stream().findFirst().orElse(null)); LOGGER.info("Controller disconnected: " + controller.name()); - this.setCurrentInputMode(currentController == null ? InputMode.KEYBOARD_MOUSE : InputMode.CONTROLLER); + this.setInputMode(currentController == null ? InputMode.KEYBOARD_MOUSE : InputMode.CONTROLLER); minecraft.getToasts().addToast(SystemToast.multiline( minecraft, @@ -154,7 +158,7 @@ public class Controlify { state = ControllerState.EMPTY; if (state.hasAnyInput()) - this.setCurrentInputMode(InputMode.CONTROLLER); + this.setInputMode(InputMode.CONTROLLER); if (consecutiveInputSwitches > 20) { LOGGER.warn("Controlify detected current controller to be constantly giving input and has been disabled."); @@ -169,7 +173,7 @@ public class Controlify { } if (currentController == null) { - this.setCurrentInputMode(InputMode.KEYBOARD_MOUSE); + this.setInputMode(InputMode.KEYBOARD_MOUSE); return; } @@ -181,14 +185,15 @@ public class Controlify { } this.virtualMouseHandler().handleControllerInput(currentController); - ControlifyClientEvents.CONTROLLER_STATE_UPDATED.invoker().onControllerStateUpdate(currentController); + ControlifyEvents.CONTROLLER_STATE_UPDATED.invoker().onControllerStateUpdate(currentController); } public ControlifyConfig config() { return config; } - public Controller currentController() { + @Override + public @NotNull Controller currentController() { if (currentController == null) return Controller.DUMMY; @@ -230,11 +235,12 @@ public class Controlify { return controllerHIDService; } - public InputMode currentInputMode() { + public @NotNull InputMode currentInputMode() { return currentInputMode; } - public void setCurrentInputMode(InputMode currentInputMode) { + @Override + public void setInputMode(@NotNull InputMode currentInputMode) { if (this.currentInputMode == currentInputMode) return; this.currentInputMode = currentInputMode; @@ -258,7 +264,7 @@ public class Controlify { } lastInputSwitchTime = Blaze3D.getTime(); - ControlifyClientEvents.INPUT_MODE_CHANGED.invoker().onInputModeChanged(currentInputMode); + ControlifyEvents.INPUT_MODE_CHANGED.invoker().onInputModeChanged(currentInputMode); } public void hideMouse(boolean hide, boolean moveMouse) { @@ -284,4 +290,9 @@ public class Controlify { if (instance == null) instance = new Controlify(); return instance; } + + @Override + public @NotNull ControlifyBindingsApi bindingsApi() { + return ControllerBindings.Api.INSTANCE; + } } diff --git a/src/main/java/dev/isxander/controlify/api/ControlifyApi.java b/src/main/java/dev/isxander/controlify/api/ControlifyApi.java new file mode 100644 index 0000000..360135e --- /dev/null +++ b/src/main/java/dev/isxander/controlify/api/ControlifyApi.java @@ -0,0 +1,27 @@ +package dev.isxander.controlify.api; + +import dev.isxander.controlify.Controlify; +import dev.isxander.controlify.InputMode; +import dev.isxander.controlify.api.bind.ControlifyBindingsApi; +import dev.isxander.controlify.controller.Controller; +import org.jetbrains.annotations.NotNull; + +/** + * Interface with Controlify in a manner where you don't need to worry about updates + * breaking! This is the recommended way to interact with Controlify. + */ +public interface ControlifyApi { + /** + * @return the controller currently in use. If disabled, this will return {@link Controller#DUMMY} + */ + @NotNull Controller currentController(); + + @NotNull InputMode currentInputMode(); + void setInputMode(@NotNull InputMode mode); + + @NotNull ControlifyBindingsApi bindingsApi(); + + static ControlifyApi get() { + return Controlify.instance(); + } +} diff --git a/src/main/java/dev/isxander/controlify/api/bind/ControlifyBindingsApi.java b/src/main/java/dev/isxander/controlify/api/bind/ControlifyBindingsApi.java new file mode 100644 index 0000000..ab6f800 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/api/bind/ControlifyBindingsApi.java @@ -0,0 +1,32 @@ +package dev.isxander.controlify.api.bind; + +import dev.isxander.controlify.bindings.BindingSupplier; +import dev.isxander.controlify.bindings.GamepadBinds; +import net.minecraft.client.KeyMapping; +import net.minecraft.resources.ResourceLocation; + +import java.util.function.BooleanSupplier; + +public interface ControlifyBindingsApi { + /** + * Registers a custom binding for all available controllers. + * If the controller is not a gamepad, the binding with be empty by default. + * + * @param bind the default gamepad bind + * @param id the identifier for the binding, the namespace should be your modid. + * @return the binding supplier to fetch the binding for a specific controller. + */ + BindingSupplier registerBind(GamepadBinds bind, ResourceLocation id); + + /** + * Registers a custom binding for all available controllers. + * If the controller is not a gamepad, the binding with be empty by default. + * + * @param bind the default gamepad bind + * @param id the identifier for the binding, the namespace should be your modid. + * @param override the minecraft keybind to imitate. + * @param toggleOverride a supplier that returns true if the vanilla keybind should be treated as a {@link net.minecraft.client.ToggleKeyMapping} + * @return the binding supplier to fetch the binding for a specific controller. + */ + BindingSupplier registerBind(GamepadBinds bind, ResourceLocation id, KeyMapping override, BooleanSupplier toggleOverride); +} diff --git a/src/main/java/dev/isxander/controlify/api/buttonguide/ActionLocation.java b/src/main/java/dev/isxander/controlify/api/buttonguide/ActionLocation.java new file mode 100644 index 0000000..11d8b34 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/api/buttonguide/ActionLocation.java @@ -0,0 +1,8 @@ +package dev.isxander.controlify.api.buttonguide; + +/** + * Whether the action should be on the left or right list. + */ +public enum ActionLocation { + LEFT, RIGHT +} diff --git a/src/main/java/dev/isxander/controlify/api/buttonguide/ActionPriority.java b/src/main/java/dev/isxander/controlify/api/buttonguide/ActionPriority.java new file mode 100644 index 0000000..ea05914 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/api/buttonguide/ActionPriority.java @@ -0,0 +1,12 @@ +package dev.isxander.controlify.api.buttonguide; + +/** + * Defines how the action is sorted in the list. All default Controlify actions are {@link #NORMAL}. + */ +public enum ActionPriority { + LOWEST, + LOW, + NORMAL, + HIGH, + HIGHEST +} diff --git a/src/main/java/dev/isxander/controlify/api/buttonguide/ButtonGuideRegistry.java b/src/main/java/dev/isxander/controlify/api/buttonguide/ButtonGuideRegistry.java new file mode 100644 index 0000000..4c3e94b --- /dev/null +++ b/src/main/java/dev/isxander/controlify/api/buttonguide/ButtonGuideRegistry.java @@ -0,0 +1,29 @@ +package dev.isxander.controlify.api.buttonguide; + +import dev.isxander.controlify.bindings.ControllerBinding; + +/** + * Allows you to register your own actions to the button guide. + * This should be called through {@link dev.isxander.controlify.api.event.ControlifyEvents#BUTTON_GUIDE_REGISTRY} as + * these should be called every time the guide is initialised. + */ +public interface ButtonGuideRegistry { + /** + * Registers a new action to the button guide. + * + * @param binding the binding for the action, if unbound, the action is hidden. + * @param location the location of the action, left or right. + * @param priority the priority of the action, used to sort the list. + * @param supplier the supplier for the name of the action. can be empty to hide the action. + */ + void registerGuideAction(ControllerBinding binding, ActionLocation location, ActionPriority priority, GuideActionNameSupplier supplier); + + /** + * Registers a new action to the button guide. + * + * @param binding the binding for the action, if unbound, the action is hidden. + * @param location the location of the action, left or right. + * @param supplier the supplier for the name of the action. can be empty to hide the action. + */ + void registerGuideAction(ControllerBinding binding, ActionLocation location, GuideActionNameSupplier supplier); +} diff --git a/src/main/java/dev/isxander/controlify/api/buttonguide/GuideActionNameSupplier.java b/src/main/java/dev/isxander/controlify/api/buttonguide/GuideActionNameSupplier.java new file mode 100644 index 0000000..2f14a34 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/api/buttonguide/GuideActionNameSupplier.java @@ -0,0 +1,25 @@ +package dev.isxander.controlify.api.buttonguide; + +import dev.isxander.controlify.controller.Controller; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.network.chat.Component; +import net.minecraft.world.phys.HitResult; + +import java.util.Optional; + +/** + * Supplies the text to display for a guide action based on the current context. + * If return is empty, the action will not be displayed. + */ +@FunctionalInterface +public interface GuideActionNameSupplier { + Optional supply( + Minecraft client, + LocalPlayer player, + ClientLevel level, + HitResult hitResult, + Controller controller + ); +} diff --git a/src/main/java/dev/isxander/controlify/event/ControlifyClientEvents.java b/src/main/java/dev/isxander/controlify/api/event/ControlifyEvents.java similarity index 78% rename from src/main/java/dev/isxander/controlify/event/ControlifyClientEvents.java rename to src/main/java/dev/isxander/controlify/api/event/ControlifyEvents.java index c3f399f..b56eef4 100644 --- a/src/main/java/dev/isxander/controlify/event/ControlifyClientEvents.java +++ b/src/main/java/dev/isxander/controlify/api/event/ControlifyEvents.java @@ -1,31 +1,43 @@ -package dev.isxander.controlify.event; +package dev.isxander.controlify.api.event; import dev.isxander.controlify.InputMode; import dev.isxander.controlify.bindings.ControllerBindings; import dev.isxander.controlify.controller.Controller; -import dev.isxander.controlify.ingame.guide.ButtonGuideRegistry; +import dev.isxander.controlify.api.buttonguide.ButtonGuideRegistry; import net.fabricmc.fabric.api.event.Event; import net.fabricmc.fabric.api.event.EventFactory; -public class ControlifyClientEvents { +public final class ControlifyEvents { + /** + * Triggers when the input mode is changed from keyboard to controller or vice versa. + */ public static final Event INPUT_MODE_CHANGED = EventFactory.createArrayBacked(InputModeChanged.class, callbacks -> mode -> { for (InputModeChanged callback : callbacks) { callback.onInputModeChanged(mode); } }); + /** + * Triggers every tick when the current controller state has been updated. + */ public static final Event CONTROLLER_STATE_UPDATED = EventFactory.createArrayBacked(ControllerStateUpdate.class, callbacks -> controller -> { for (ControllerStateUpdate callback : callbacks) { callback.onControllerStateUpdate(controller); } }); + /** + * Triggers when the button guide entries are being populated, so you can add more of your own. + */ public static final Event BUTTON_GUIDE_REGISTRY = EventFactory.createArrayBacked(ButtonGuideRegistryEvent.class, callbacks -> (bindings, registry) -> { for (ButtonGuideRegistryEvent callback : callbacks) { callback.onRegisterButtonGuide(bindings, registry); } }); + /** + * Triggers in a GUI when the virtual mouse is toggled on or off. + */ public static final Event VIRTUAL_MOUSE_TOGGLED = EventFactory.createArrayBacked(VirtualMouseToggled.class, callbacks -> enabled -> { for (VirtualMouseToggled callback : callbacks) { callback.onVirtualMouseToggled(enabled); diff --git a/src/main/java/dev/isxander/controlify/api/vmousesnapping/ISnapBehaviour.java b/src/main/java/dev/isxander/controlify/api/vmousesnapping/ISnapBehaviour.java new file mode 100644 index 0000000..ac803b6 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/api/vmousesnapping/ISnapBehaviour.java @@ -0,0 +1,10 @@ +package dev.isxander.controlify.api.vmousesnapping; + +import java.util.Set; + +/** + * An interface to implement by gui components to define snap points for virtual mouse snapping. + */ +public interface ISnapBehaviour { + Set getSnapPoints(); +} diff --git a/src/main/java/dev/isxander/controlify/api/vmousesnapping/SnapPoint.java b/src/main/java/dev/isxander/controlify/api/vmousesnapping/SnapPoint.java new file mode 100644 index 0000000..e8cc536 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/api/vmousesnapping/SnapPoint.java @@ -0,0 +1,16 @@ +package dev.isxander.controlify.api.vmousesnapping; + +import org.joml.Vector2i; +import org.joml.Vector2ic; + +/** + * Defines a point on the screen that the virtual mouse can snap to. + * + * @param position the position on the screen where the cursor will snap to + * @param range how far away from the snap point the cursor can be and still snap to it + */ +public record SnapPoint(Vector2ic position, int range) { + public SnapPoint(int x, int y, int range) { + this(new Vector2i(x, y), range); + } +} diff --git a/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java b/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java index 19d72af..58a4a2c 100644 --- a/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java +++ b/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java @@ -3,9 +3,10 @@ package dev.isxander.controlify.bindings; import com.google.gson.JsonObject; import dev.isxander.controlify.Controlify; import dev.isxander.controlify.InputMode; +import dev.isxander.controlify.api.bind.ControlifyBindingsApi; import dev.isxander.controlify.controller.Controller; import dev.isxander.controlify.controller.ControllerState; -import dev.isxander.controlify.event.ControlifyClientEvents; +import dev.isxander.controlify.api.event.ControlifyEvents; import dev.isxander.controlify.mixins.feature.bind.KeyMappingAccessor; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; @@ -102,8 +103,8 @@ public class ControllerBindings { register((ControllerBinding) constructor.apply(this)); } - ControlifyClientEvents.CONTROLLER_STATE_UPDATED.register(this::onControllerUpdate); - ControlifyClientEvents.INPUT_MODE_CHANGED.register(mode -> KeyMapping.releaseAll()); + ControlifyEvents.CONTROLLER_STATE_UPDATED.register(this::onControllerUpdate); + ControlifyEvents.INPUT_MODE_CHANGED.register(mode -> KeyMapping.releaseAll()); } public ControllerBinding register(ControllerBinding binding) { @@ -179,13 +180,17 @@ public class ControllerBindings { } } - 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 final class Api implements ControlifyBindingsApi { + public static final Api INSTANCE = new Api(); - 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); + public BindingSupplier registerBind(GamepadBinds bind, ResourceLocation id) { + CUSTOM_BINDS.put(id, bindings -> bindings.create(bind, id)); + return controller -> controller.bindings().get(id); + } + + public 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/ingame/InGameInputHandler.java b/src/main/java/dev/isxander/controlify/ingame/InGameInputHandler.java index c3de46f..21c6f59 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.ControlifyClientEvents; +import dev.isxander.controlify.api.event.ControlifyEvents; 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(); - ControlifyClientEvents.INPUT_MODE_CHANGED.register(mode -> { + ControlifyEvents.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/ActionLocation.java b/src/main/java/dev/isxander/controlify/ingame/guide/ActionLocation.java deleted file mode 100644 index 522e34d..0000000 --- a/src/main/java/dev/isxander/controlify/ingame/guide/ActionLocation.java +++ /dev/null @@ -1,5 +0,0 @@ -package dev.isxander.controlify.ingame.guide; - -public enum ActionLocation { - LEFT, RIGHT -} diff --git a/src/main/java/dev/isxander/controlify/ingame/guide/ActionPriority.java b/src/main/java/dev/isxander/controlify/ingame/guide/ActionPriority.java deleted file mode 100644 index 51e7da9..0000000 --- a/src/main/java/dev/isxander/controlify/ingame/guide/ActionPriority.java +++ /dev/null @@ -1,9 +0,0 @@ -package dev.isxander.controlify.ingame.guide; - -public enum ActionPriority { - LOWEST, - LOW, - NORMAL, - HIGH, - HIGHEST -} diff --git a/src/main/java/dev/isxander/controlify/ingame/guide/ButtonGuideRegistry.java b/src/main/java/dev/isxander/controlify/ingame/guide/ButtonGuideRegistry.java deleted file mode 100644 index 14dcecd..0000000 --- a/src/main/java/dev/isxander/controlify/ingame/guide/ButtonGuideRegistry.java +++ /dev/null @@ -1,7 +0,0 @@ -package dev.isxander.controlify.ingame.guide; - -import dev.isxander.controlify.bindings.ControllerBinding; - -public interface ButtonGuideRegistry { - void registerGuideAction(ControllerBinding binding, ActionLocation location, GuideActionNameSupplier supplier); -} diff --git a/src/main/java/dev/isxander/controlify/ingame/guide/GuideAction.java b/src/main/java/dev/isxander/controlify/ingame/guide/GuideAction.java index 3c56c2a..520d8f6 100644 --- a/src/main/java/dev/isxander/controlify/ingame/guide/GuideAction.java +++ b/src/main/java/dev/isxander/controlify/ingame/guide/GuideAction.java @@ -1,5 +1,7 @@ package dev.isxander.controlify.ingame.guide; +import dev.isxander.controlify.api.buttonguide.ActionLocation; +import dev.isxander.controlify.api.buttonguide.ActionPriority; import dev.isxander.controlify.bindings.ControllerBinding; import net.minecraft.network.chat.Component; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/dev/isxander/controlify/ingame/guide/GuideActionNameSupplier.java b/src/main/java/dev/isxander/controlify/ingame/guide/GuideActionNameSupplier.java deleted file mode 100644 index dcc08ba..0000000 --- a/src/main/java/dev/isxander/controlify/ingame/guide/GuideActionNameSupplier.java +++ /dev/null @@ -1,15 +0,0 @@ -package dev.isxander.controlify.ingame.guide; - -import dev.isxander.controlify.controller.Controller; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.player.LocalPlayer; -import net.minecraft.network.chat.Component; -import net.minecraft.world.phys.HitResult; - -import java.util.Optional; - -@FunctionalInterface -public interface GuideActionNameSupplier { - Optional supply(Minecraft client, LocalPlayer player, ClientLevel level, HitResult hitResult, Controller controller); -} 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 1cc9378..9fac8c7 100644 --- a/src/main/java/dev/isxander/controlify/ingame/guide/InGameButtonGuide.java +++ b/src/main/java/dev/isxander/controlify/ingame/guide/InGameButtonGuide.java @@ -1,9 +1,13 @@ package dev.isxander.controlify.ingame.guide; import com.mojang.blaze3d.vertex.PoseStack; +import dev.isxander.controlify.api.buttonguide.ActionLocation; +import dev.isxander.controlify.api.buttonguide.ActionPriority; +import dev.isxander.controlify.api.buttonguide.ButtonGuideRegistry; +import dev.isxander.controlify.api.buttonguide.GuideActionNameSupplier; import dev.isxander.controlify.bindings.ControllerBinding; import dev.isxander.controlify.controller.Controller; -import dev.isxander.controlify.event.ControlifyClientEvents; +import dev.isxander.controlify.api.event.ControlifyEvents; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiComponent; import net.minecraft.client.multiplayer.ClientLevel; @@ -33,7 +37,7 @@ public class InGameButtonGuide implements ButtonGuideRegistry { this.player = localPlayer; registerDefaultActions(); - ControlifyClientEvents.BUTTON_GUIDE_REGISTRY.invoker().onRegisterButtonGuide(controller.bindings(), this); + ControlifyEvents.BUTTON_GUIDE_REGISTRY.invoker().onRegisterButtonGuide(controller.bindings(), this); } public void renderHud(PoseStack poseStack, float tickDelta, int width, int height) { @@ -112,7 +116,12 @@ public class InGameButtonGuide implements ButtonGuideRegistry { @Override public void registerGuideAction(ControllerBinding binding, ActionLocation location, GuideActionNameSupplier supplier) { - guidePredicates.add(new GuideActionSupplier(binding, location, supplier)); + this.registerGuideAction(binding, location, ActionPriority.NORMAL, supplier); + } + + @Override + public void registerGuideAction(ControllerBinding binding, ActionLocation location, ActionPriority priority, GuideActionNameSupplier supplier) { + guidePredicates.add(new GuideActionSupplier(binding, location, priority, supplier)); } private void registerDefaultActions() { @@ -232,10 +241,10 @@ public class InGameButtonGuide implements ButtonGuideRegistry { } } - private record GuideActionSupplier(ControllerBinding binding, ActionLocation location, GuideActionNameSupplier nameSupplier) { + private record GuideActionSupplier(ControllerBinding binding, ActionLocation location, ActionPriority priority, GuideActionNameSupplier nameSupplier) { public Optional supply(Minecraft client, LocalPlayer player, ClientLevel level, HitResult hitResult, Controller controller) { return nameSupplier.supply(client, player, level, hitResult, controller) - .map(name -> new GuideAction(binding, name, location)); + .map(name -> new GuideAction(binding, name, location, priority)); } } } diff --git a/src/main/java/dev/isxander/controlify/mixins/core/KeyboardHandlerMixin.java b/src/main/java/dev/isxander/controlify/mixins/core/KeyboardHandlerMixin.java index 6639360..e54c020 100644 --- a/src/main/java/dev/isxander/controlify/mixins/core/KeyboardHandlerMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/core/KeyboardHandlerMixin.java @@ -19,6 +19,6 @@ public class KeyboardHandlerMixin { @Inject(method = "m_unngxkoe", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/KeyboardHandler;keyPress(JIIII)V")) private void onKeyboardInput(long window, int i, int j, int k, int m, CallbackInfo ci) { if (window == minecraft.getWindow().getWindow()) - Controlify.instance().setCurrentInputMode(InputMode.KEYBOARD_MOUSE); + Controlify.instance().setInputMode(InputMode.KEYBOARD_MOUSE); } } diff --git a/src/main/java/dev/isxander/controlify/mixins/core/MouseHandlerMixin.java b/src/main/java/dev/isxander/controlify/mixins/core/MouseHandlerMixin.java index 2b74afc..a4d5749 100644 --- a/src/main/java/dev/isxander/controlify/mixins/core/MouseHandlerMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/core/MouseHandlerMixin.java @@ -19,20 +19,20 @@ public class MouseHandlerMixin { @Inject(method = "m_sljgmtqm", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MouseHandler;onPress(JIII)V")) private void onMouseClickInput(long window, int button, int action, int modifiers, CallbackInfo ci) { if (window == minecraft.getWindow().getWindow()) - Controlify.instance().setCurrentInputMode(InputMode.KEYBOARD_MOUSE); + Controlify.instance().setInputMode(InputMode.KEYBOARD_MOUSE); } // m_swhlgdws is lambda for GLFW mouse move hook - do it outside of the `onMove` method due to fake inputs @Inject(method = "m_swhlgdws", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MouseHandler;onMove(JDD)V")) private void onMouseMoveInput(long window, double x, double y, CallbackInfo ci) { if (window == minecraft.getWindow().getWindow()) - Controlify.instance().setCurrentInputMode(InputMode.KEYBOARD_MOUSE); + Controlify.instance().setInputMode(InputMode.KEYBOARD_MOUSE); } // m_qoshpwkl is lambda for GLFW mouse scroll hook - do it outside of the `onScroll` method due to fake inputs @Inject(method = "m_qoshpwkl", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MouseHandler;onScroll(JDD)V")) private void onMouseScrollInput(long window, double scrollDeltaX, double scrollDeltaY, CallbackInfo ci) { if (window == minecraft.getWindow().getWindow()) - Controlify.instance().setCurrentInputMode(InputMode.KEYBOARD_MOUSE); + Controlify.instance().setInputMode(InputMode.KEYBOARD_MOUSE); } } diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/AbstractContainerScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/AbstractContainerScreenMixin.java index cc8f9c7..5f0a06c 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/AbstractContainerScreenMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/AbstractContainerScreenMixin.java @@ -1,7 +1,7 @@ package dev.isxander.controlify.mixins.feature.virtualmouse.snapping; -import dev.isxander.controlify.virtualmouse.ISnapBehaviour; -import dev.isxander.controlify.virtualmouse.SnapPoint; +import dev.isxander.controlify.api.vmousesnapping.ISnapBehaviour; +import dev.isxander.controlify.api.vmousesnapping.SnapPoint; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.network.chat.Component; diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/CreativeModeInventoryScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/CreativeModeInventoryScreenMixin.java index 20ce045..c006c5c 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/CreativeModeInventoryScreenMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/CreativeModeInventoryScreenMixin.java @@ -1,6 +1,6 @@ package dev.isxander.controlify.mixins.feature.virtualmouse.snapping; -import dev.isxander.controlify.virtualmouse.SnapPoint; +import dev.isxander.controlify.api.vmousesnapping.SnapPoint; import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen; import net.minecraft.network.chat.Component; diff --git a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/ScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/ScreenMixin.java index b4cbadc..8c2caa4 100644 --- a/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/ScreenMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/ScreenMixin.java @@ -1,7 +1,7 @@ package dev.isxander.controlify.mixins.feature.virtualmouse.snapping; -import dev.isxander.controlify.virtualmouse.ISnapBehaviour; -import dev.isxander.controlify.virtualmouse.SnapPoint; +import dev.isxander.controlify.api.vmousesnapping.ISnapBehaviour; +import dev.isxander.controlify.api.vmousesnapping.SnapPoint; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.Screen; diff --git a/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java b/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java index e76c3fa..d110bf8 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.ControlifyClientEvents; +import dev.isxander.controlify.api.event.ControlifyEvents; 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; - ControlifyClientEvents.VIRTUAL_MOUSE_TOGGLED.register(this::onVirtualMouseToggled); + ControlifyEvents.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 index b8861e2..422b1fb 100644 --- a/src/main/java/dev/isxander/controlify/screenop/compat/AbstractSliderComponentProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/compat/AbstractSliderComponentProcessor.java @@ -4,6 +4,10 @@ import dev.isxander.controlify.controller.Controller; import dev.isxander.controlify.screenop.ComponentProcessor; import dev.isxander.controlify.screenop.ScreenProcessor; +/** + * A component processor that handles incrementing and decrementing a slider. + * This uses {@link dev.isxander.controlify.bindings.ControllerBindings#CYCLE_OPT_FORWARD} and {@link dev.isxander.controlify.bindings.ControllerBindings#CYCLE_OPT_BACKWARD} to increment and decrement the slider. + */ public abstract class AbstractSliderComponentProcessor implements ComponentProcessor { private int ticksSinceIncrement = 0; private boolean prevLeft, prevRight; diff --git a/src/main/java/dev/isxander/controlify/virtualmouse/ISnapBehaviour.java b/src/main/java/dev/isxander/controlify/virtualmouse/ISnapBehaviour.java deleted file mode 100644 index 210b418..0000000 --- a/src/main/java/dev/isxander/controlify/virtualmouse/ISnapBehaviour.java +++ /dev/null @@ -1,7 +0,0 @@ -package dev.isxander.controlify.virtualmouse; - -import java.util.Set; - -public interface ISnapBehaviour { - Set getSnapPoints(); -} diff --git a/src/main/java/dev/isxander/controlify/virtualmouse/SnapPoint.java b/src/main/java/dev/isxander/controlify/virtualmouse/SnapPoint.java deleted file mode 100644 index 87acda2..0000000 --- a/src/main/java/dev/isxander/controlify/virtualmouse/SnapPoint.java +++ /dev/null @@ -1,6 +0,0 @@ -package dev.isxander.controlify.virtualmouse; - -import org.joml.Vector2ic; - -public record SnapPoint(Vector2ic position, int range) { -} diff --git a/src/main/java/dev/isxander/controlify/virtualmouse/VirtualMouseHandler.java b/src/main/java/dev/isxander/controlify/virtualmouse/VirtualMouseHandler.java index 7398a8d..f2e0b7c 100644 --- a/src/main/java/dev/isxander/controlify/virtualmouse/VirtualMouseHandler.java +++ b/src/main/java/dev/isxander/controlify/virtualmouse/VirtualMouseHandler.java @@ -5,10 +5,12 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.datafixers.util.Pair; import dev.isxander.controlify.Controlify; import dev.isxander.controlify.InputMode; +import dev.isxander.controlify.api.vmousesnapping.ISnapBehaviour; +import dev.isxander.controlify.api.vmousesnapping.SnapPoint; import dev.isxander.controlify.controller.Controller; import dev.isxander.controlify.debug.DebugProperties; import dev.isxander.controlify.screenop.ScreenProcessorProvider; -import dev.isxander.controlify.event.ControlifyClientEvents; +import dev.isxander.controlify.api.event.ControlifyEvents; import dev.isxander.controlify.mixins.feature.virtualmouse.KeyboardHandlerAccessor; import dev.isxander.controlify.mixins.feature.virtualmouse.MouseHandlerAccessor; import net.minecraft.client.Minecraft; @@ -48,7 +50,7 @@ public class VirtualMouseHandler { else snapPoints = Set.of(); - ControlifyClientEvents.INPUT_MODE_CHANGED.register(this::onInputModeChanged); + ControlifyEvents.INPUT_MODE_CHANGED.register(this::onInputModeChanged); } public void handleControllerInput(Controller controller) { @@ -240,7 +242,7 @@ public class VirtualMouseHandler { } setMousePosition(); - ControlifyClientEvents.VIRTUAL_MOUSE_TOGGLED.invoker().onVirtualMouseToggled(true); + ControlifyEvents.VIRTUAL_MOUSE_TOGGLED.invoker().onVirtualMouseToggled(true); } public void disableVirtualMouse() { @@ -256,7 +258,7 @@ public class VirtualMouseHandler { targetX = currentX = minecraft.mouseHandler.xpos(); targetY = currentY = minecraft.mouseHandler.ypos(); - ControlifyClientEvents.VIRTUAL_MOUSE_TOGGLED.invoker().onVirtualMouseToggled(false); + ControlifyEvents.VIRTUAL_MOUSE_TOGGLED.invoker().onVirtualMouseToggled(false); } private void setMousePosition() {