From 9e0440a7f45e143276ed99428573f4b769405555 Mon Sep 17 00:00:00 2001 From: isXander Date: Fri, 10 Feb 2023 21:00:39 +0000 Subject: [PATCH] vmouse snapping --- .../config/gui/BindButtonController.java | 4 +- .../screenop/vanilla/AbstractButtonMixin.java | 6 +- .../AbstractContainerEventHandlerMixin.java | 4 +- .../vanilla/AbstractSelectionListMixin.java | 2 +- .../vanilla/AbstractSliderButtonMixin.java | 6 +- ...ontainerObjectSelectionListEntryMixin.java | 4 +- .../CreativeModeInventoryScreenAccessor.java | 2 +- .../CreativeModeInventoryScreenMixin.java | 2 +- .../JoinMultiplayerScreenAccessor.java | 2 +- .../vanilla/JoinMultiplayerScreenMixin.java | 2 +- .../LanguageSelectionListEntryMixin.java | 6 +- .../vanilla/OptionsSubScreenAccessor.java | 2 +- .../screenop/vanilla/ScreenAccessor.java | 2 +- .../screenop/vanilla/ScreenMixin.java | 2 +- .../vanilla/SelectWorldScreenAccessor.java | 2 +- .../vanilla/SelectWorldScreenMixin.java | 2 +- .../ServerSelectionListEntryMixin.java | 6 +- .../vanilla/WorldSelectionListEntryMixin.java | 6 +- .../yacl/CyclingControllerElementMixin.java | 6 +- .../yacl/SliderControllerElementMixin.java | 6 +- .../screenop/yacl/YACLScreenMixin.java | 2 +- .../AbstractContainerScreenMixin.java | 37 ++++++++++ .../CreativeModeInventoryScreenMixin.java | 48 +++++++++++++ .../virtualmouse/snapping/ScreenMixin.java | 31 +++++++++ .../{component => }/ComponentProcessor.java | 3 +- .../ComponentProcessorProvider.java | 2 +- .../screenop/{component => }/CustomFocus.java | 2 +- .../controlify/screenop/ScreenProcessor.java | 4 +- .../AbstractButtonComponentProcessor.java | 2 +- .../CreativeModeInventoryScreenProcessor.java | 2 +- ...nguageSelectionListComponentProcessor.java | 4 +- .../vanilla/SelectWorldScreenProcessor.java | 2 +- ...rSelectionListEntryComponentProcessor.java | 4 +- .../vanilla/SliderComponentProcessor.java | 2 +- .../WorldListEntryComponentProcessor.java | 4 +- ...ngControllerElementComponentProcessor.java | 2 +- ...erControllerElementComponentProcessor.java | 2 +- .../virtualmouse/ISnapBehaviour.java | 7 ++ .../controlify/virtualmouse/SnapPoint.java | 6 ++ .../virtualmouse/VirtualMouseHandler.java | 69 ++++++++++++++++++- src/main/resources/controlify.mixins.json | 45 ++++++------ 41 files changed, 274 insertions(+), 80 deletions(-) rename src/main/java/dev/isxander/controlify/mixins/{compat => feature}/screenop/vanilla/AbstractButtonMixin.java (74%) rename src/main/java/dev/isxander/controlify/mixins/{compat => feature}/screenop/vanilla/AbstractContainerEventHandlerMixin.java (81%) rename src/main/java/dev/isxander/controlify/mixins/{compat => feature}/screenop/vanilla/AbstractSelectionListMixin.java (91%) rename src/main/java/dev/isxander/controlify/mixins/{compat => feature}/screenop/vanilla/AbstractSliderButtonMixin.java (88%) rename src/main/java/dev/isxander/controlify/mixins/{compat => feature}/screenop/vanilla/ContainerObjectSelectionListEntryMixin.java (81%) rename src/main/java/dev/isxander/controlify/mixins/{compat => feature}/screenop/vanilla/CreativeModeInventoryScreenAccessor.java (88%) rename src/main/java/dev/isxander/controlify/mixins/{compat => feature}/screenop/vanilla/CreativeModeInventoryScreenMixin.java (92%) rename src/main/java/dev/isxander/controlify/mixins/{compat => feature}/screenop/vanilla/JoinMultiplayerScreenAccessor.java (84%) rename src/main/java/dev/isxander/controlify/mixins/{compat => feature}/screenop/vanilla/JoinMultiplayerScreenMixin.java (93%) rename src/main/java/dev/isxander/controlify/mixins/{compat => feature}/screenop/vanilla/LanguageSelectionListEntryMixin.java (81%) rename src/main/java/dev/isxander/controlify/mixins/{compat => feature}/screenop/vanilla/OptionsSubScreenAccessor.java (83%) rename src/main/java/dev/isxander/controlify/mixins/{compat => feature}/screenop/vanilla/ScreenAccessor.java (89%) rename src/main/java/dev/isxander/controlify/mixins/{compat => feature}/screenop/vanilla/ScreenMixin.java (93%) rename src/main/java/dev/isxander/controlify/mixins/{compat => feature}/screenop/vanilla/SelectWorldScreenAccessor.java (87%) rename src/main/java/dev/isxander/controlify/mixins/{compat => feature}/screenop/vanilla/SelectWorldScreenMixin.java (91%) rename src/main/java/dev/isxander/controlify/mixins/{compat => feature}/screenop/vanilla/ServerSelectionListEntryMixin.java (79%) rename src/main/java/dev/isxander/controlify/mixins/{compat => feature}/screenop/vanilla/WorldSelectionListEntryMixin.java (72%) rename src/main/java/dev/isxander/controlify/mixins/{compat => feature}/screenop/yacl/CyclingControllerElementMixin.java (76%) rename src/main/java/dev/isxander/controlify/mixins/{compat => feature}/screenop/yacl/SliderControllerElementMixin.java (76%) rename src/main/java/dev/isxander/controlify/mixins/{compat => feature}/screenop/yacl/YACLScreenMixin.java (91%) create mode 100644 src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/AbstractContainerScreenMixin.java create mode 100644 src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/CreativeModeInventoryScreenMixin.java create mode 100644 src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/ScreenMixin.java rename src/main/java/dev/isxander/controlify/screenop/{component => }/ComponentProcessor.java (82%) rename src/main/java/dev/isxander/controlify/screenop/{component => }/ComponentProcessorProvider.java (88%) rename src/main/java/dev/isxander/controlify/screenop/{component => }/CustomFocus.java (73%) create mode 100644 src/main/java/dev/isxander/controlify/virtualmouse/ISnapBehaviour.java create mode 100644 src/main/java/dev/isxander/controlify/virtualmouse/SnapPoint.java diff --git a/src/main/java/dev/isxander/controlify/config/gui/BindButtonController.java b/src/main/java/dev/isxander/controlify/config/gui/BindButtonController.java index e778f5b..96747e3 100644 --- a/src/main/java/dev/isxander/controlify/config/gui/BindButtonController.java +++ b/src/main/java/dev/isxander/controlify/config/gui/BindButtonController.java @@ -4,8 +4,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import dev.isxander.controlify.bindings.Bind; import dev.isxander.controlify.bindings.IBind; import dev.isxander.controlify.screenop.ScreenProcessor; -import dev.isxander.controlify.screenop.component.ComponentProcessor; -import dev.isxander.controlify.screenop.component.ComponentProcessorProvider; +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; diff --git a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/AbstractButtonMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/AbstractButtonMixin.java similarity index 74% rename from src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/AbstractButtonMixin.java rename to src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/AbstractButtonMixin.java index d020c08..9e509c7 100644 --- a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/AbstractButtonMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/AbstractButtonMixin.java @@ -1,7 +1,7 @@ -package dev.isxander.controlify.mixins.compat.screenop.vanilla; +package dev.isxander.controlify.mixins.feature.screenop.vanilla; -import dev.isxander.controlify.screenop.component.ComponentProcessor; -import dev.isxander.controlify.screenop.component.ComponentProcessorProvider; +import dev.isxander.controlify.screenop.ComponentProcessor; +import dev.isxander.controlify.screenop.ComponentProcessorProvider; import dev.isxander.controlify.screenop.compat.vanilla.AbstractButtonComponentProcessor; import net.minecraft.client.gui.components.AbstractButton; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/AbstractContainerEventHandlerMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/AbstractContainerEventHandlerMixin.java similarity index 81% rename from src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/AbstractContainerEventHandlerMixin.java rename to src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/AbstractContainerEventHandlerMixin.java index 4184761..ccc9634 100644 --- a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/AbstractContainerEventHandlerMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/AbstractContainerEventHandlerMixin.java @@ -1,6 +1,6 @@ -package dev.isxander.controlify.mixins.compat.screenop.vanilla; +package dev.isxander.controlify.mixins.feature.screenop.vanilla; -import dev.isxander.controlify.screenop.component.CustomFocus; +import dev.isxander.controlify.screenop.CustomFocus; import net.minecraft.client.gui.components.events.AbstractContainerEventHandler; import net.minecraft.client.gui.components.events.GuiEventListener; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/AbstractSelectionListMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/AbstractSelectionListMixin.java similarity index 91% rename from src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/AbstractSelectionListMixin.java rename to src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/AbstractSelectionListMixin.java index 9886f19..d81cae1 100644 --- a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/AbstractSelectionListMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/AbstractSelectionListMixin.java @@ -1,4 +1,4 @@ -package dev.isxander.controlify.mixins.compat.screenop.vanilla; +package dev.isxander.controlify.mixins.feature.screenop.vanilla; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import dev.isxander.controlify.Controlify; diff --git a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/AbstractSliderButtonMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/AbstractSliderButtonMixin.java similarity index 88% rename from src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/AbstractSliderButtonMixin.java rename to src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/AbstractSliderButtonMixin.java index c4483b1..ebd4d2e 100644 --- a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/AbstractSliderButtonMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/AbstractSliderButtonMixin.java @@ -1,10 +1,10 @@ -package dev.isxander.controlify.mixins.compat.screenop.vanilla; +package dev.isxander.controlify.mixins.feature.screenop.vanilla; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import dev.isxander.controlify.Controlify; import dev.isxander.controlify.InputMode; -import dev.isxander.controlify.screenop.component.ComponentProcessor; -import dev.isxander.controlify.screenop.component.ComponentProcessorProvider; +import dev.isxander.controlify.screenop.ComponentProcessor; +import dev.isxander.controlify.screenop.ComponentProcessorProvider; import dev.isxander.controlify.screenop.compat.vanilla.SliderComponentProcessor; import net.minecraft.client.InputType; import net.minecraft.client.gui.components.AbstractSliderButton; diff --git a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/ContainerObjectSelectionListEntryMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/ContainerObjectSelectionListEntryMixin.java similarity index 81% rename from src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/ContainerObjectSelectionListEntryMixin.java rename to src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/ContainerObjectSelectionListEntryMixin.java index b0354a9..e85d437 100644 --- a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/ContainerObjectSelectionListEntryMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/ContainerObjectSelectionListEntryMixin.java @@ -1,6 +1,6 @@ -package dev.isxander.controlify.mixins.compat.screenop.vanilla; +package dev.isxander.controlify.mixins.feature.screenop.vanilla; -import dev.isxander.controlify.screenop.component.CustomFocus; +import dev.isxander.controlify.screenop.CustomFocus; import net.minecraft.client.gui.components.ContainerObjectSelectionList; import net.minecraft.client.gui.components.events.GuiEventListener; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/CreativeModeInventoryScreenAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/CreativeModeInventoryScreenAccessor.java similarity index 88% rename from src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/CreativeModeInventoryScreenAccessor.java rename to src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/CreativeModeInventoryScreenAccessor.java index d5edd0e..f2d102c 100644 --- a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/CreativeModeInventoryScreenAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/CreativeModeInventoryScreenAccessor.java @@ -1,4 +1,4 @@ -package dev.isxander.controlify.mixins.compat.screenop.vanilla; +package dev.isxander.controlify.mixins.feature.screenop.vanilla; import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen; import net.minecraft.world.item.CreativeModeTab; diff --git a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/CreativeModeInventoryScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/CreativeModeInventoryScreenMixin.java similarity index 92% rename from src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/CreativeModeInventoryScreenMixin.java rename to src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/CreativeModeInventoryScreenMixin.java index 1c816d9..cfc6d8f 100644 --- a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/CreativeModeInventoryScreenMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/CreativeModeInventoryScreenMixin.java @@ -1,4 +1,4 @@ -package dev.isxander.controlify.mixins.compat.screenop.vanilla; +package dev.isxander.controlify.mixins.feature.screenop.vanilla; import dev.isxander.controlify.screenop.ScreenProcessor; import dev.isxander.controlify.screenop.ScreenProcessorProvider; diff --git a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/JoinMultiplayerScreenAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/JoinMultiplayerScreenAccessor.java similarity index 84% rename from src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/JoinMultiplayerScreenAccessor.java rename to src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/JoinMultiplayerScreenAccessor.java index 0d8a5b6..08f9b0f 100644 --- a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/JoinMultiplayerScreenAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/JoinMultiplayerScreenAccessor.java @@ -1,4 +1,4 @@ -package dev.isxander.controlify.mixins.compat.screenop.vanilla; +package dev.isxander.controlify.mixins.feature.screenop.vanilla; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.screens.multiplayer.JoinMultiplayerScreen; diff --git a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/JoinMultiplayerScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/JoinMultiplayerScreenMixin.java similarity index 93% rename from src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/JoinMultiplayerScreenMixin.java rename to src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/JoinMultiplayerScreenMixin.java index 6945551..f3e31c1 100644 --- a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/JoinMultiplayerScreenMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/JoinMultiplayerScreenMixin.java @@ -1,4 +1,4 @@ -package dev.isxander.controlify.mixins.compat.screenop.vanilla; +package dev.isxander.controlify.mixins.feature.screenop.vanilla; import dev.isxander.controlify.screenop.ScreenProcessor; import dev.isxander.controlify.screenop.ScreenProcessorProvider; diff --git a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/LanguageSelectionListEntryMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/LanguageSelectionListEntryMixin.java similarity index 81% rename from src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/LanguageSelectionListEntryMixin.java rename to src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/LanguageSelectionListEntryMixin.java index dca314c..7e6fb99 100644 --- a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/LanguageSelectionListEntryMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/LanguageSelectionListEntryMixin.java @@ -1,7 +1,7 @@ -package dev.isxander.controlify.mixins.compat.screenop.vanilla; +package dev.isxander.controlify.mixins.feature.screenop.vanilla; -import dev.isxander.controlify.screenop.component.ComponentProcessor; -import dev.isxander.controlify.screenop.component.ComponentProcessorProvider; +import dev.isxander.controlify.screenop.ComponentProcessor; +import dev.isxander.controlify.screenop.ComponentProcessorProvider; import dev.isxander.controlify.screenop.compat.vanilla.LanguageSelectionListComponentProcessor; import net.minecraft.client.gui.screens.LanguageSelectScreen; import org.spongepowered.asm.mixin.Final; diff --git a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/OptionsSubScreenAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/OptionsSubScreenAccessor.java similarity index 83% rename from src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/OptionsSubScreenAccessor.java rename to src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/OptionsSubScreenAccessor.java index dfcbf4e..a666e7f 100644 --- a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/OptionsSubScreenAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/OptionsSubScreenAccessor.java @@ -1,4 +1,4 @@ -package dev.isxander.controlify.mixins.compat.screenop.vanilla; +package dev.isxander.controlify.mixins.feature.screenop.vanilla; import net.minecraft.client.gui.screens.OptionsSubScreen; import net.minecraft.client.gui.screens.Screen; diff --git a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/ScreenAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/ScreenAccessor.java similarity index 89% rename from src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/ScreenAccessor.java rename to src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/ScreenAccessor.java index 069f32b..4ab0e38 100644 --- a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/ScreenAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/ScreenAccessor.java @@ -1,4 +1,4 @@ -package dev.isxander.controlify.mixins.compat.screenop.vanilla; +package dev.isxander.controlify.mixins.feature.screenop.vanilla; import net.minecraft.client.gui.ComponentPath; import net.minecraft.client.gui.navigation.FocusNavigationEvent; diff --git a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/ScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/ScreenMixin.java similarity index 93% rename from src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/ScreenMixin.java rename to src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/ScreenMixin.java index caef724..f7593ce 100644 --- a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/ScreenMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/ScreenMixin.java @@ -1,4 +1,4 @@ -package dev.isxander.controlify.mixins.compat.screenop.vanilla; +package dev.isxander.controlify.mixins.feature.screenop.vanilla; import dev.isxander.controlify.screenop.ScreenProcessorProvider; import dev.isxander.controlify.screenop.ScreenProcessor; diff --git a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/SelectWorldScreenAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/SelectWorldScreenAccessor.java similarity index 87% rename from src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/SelectWorldScreenAccessor.java rename to src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/SelectWorldScreenAccessor.java index 3a2230d..a1ffe56 100644 --- a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/SelectWorldScreenAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/SelectWorldScreenAccessor.java @@ -1,4 +1,4 @@ -package dev.isxander.controlify.mixins.compat.screenop.vanilla; +package dev.isxander.controlify.mixins.feature.screenop.vanilla; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.screens.worldselection.SelectWorldScreen; diff --git a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/SelectWorldScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/SelectWorldScreenMixin.java similarity index 91% rename from src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/SelectWorldScreenMixin.java rename to src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/SelectWorldScreenMixin.java index d5e322e..43ef8e5 100644 --- a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/SelectWorldScreenMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/SelectWorldScreenMixin.java @@ -1,4 +1,4 @@ -package dev.isxander.controlify.mixins.compat.screenop.vanilla; +package dev.isxander.controlify.mixins.feature.screenop.vanilla; import dev.isxander.controlify.screenop.ScreenProcessor; import dev.isxander.controlify.screenop.ScreenProcessorProvider; diff --git a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/ServerSelectionListEntryMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/ServerSelectionListEntryMixin.java similarity index 79% rename from src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/ServerSelectionListEntryMixin.java rename to src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/ServerSelectionListEntryMixin.java index 76e3d38..2b22986 100644 --- a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/ServerSelectionListEntryMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/ServerSelectionListEntryMixin.java @@ -1,7 +1,7 @@ -package dev.isxander.controlify.mixins.compat.screenop.vanilla; +package dev.isxander.controlify.mixins.feature.screenop.vanilla; -import dev.isxander.controlify.screenop.component.ComponentProcessor; -import dev.isxander.controlify.screenop.component.ComponentProcessorProvider; +import dev.isxander.controlify.screenop.ComponentProcessor; +import dev.isxander.controlify.screenop.ComponentProcessorProvider; import dev.isxander.controlify.screenop.compat.vanilla.ServerSelectionListEntryComponentProcessor; import net.minecraft.client.gui.screens.multiplayer.ServerSelectionList; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/WorldSelectionListEntryMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/WorldSelectionListEntryMixin.java similarity index 72% rename from src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/WorldSelectionListEntryMixin.java rename to src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/WorldSelectionListEntryMixin.java index ab7d531..5985111 100644 --- a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/vanilla/WorldSelectionListEntryMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/vanilla/WorldSelectionListEntryMixin.java @@ -1,7 +1,7 @@ -package dev.isxander.controlify.mixins.compat.screenop.vanilla; +package dev.isxander.controlify.mixins.feature.screenop.vanilla; -import dev.isxander.controlify.screenop.component.ComponentProcessor; -import dev.isxander.controlify.screenop.component.ComponentProcessorProvider; +import dev.isxander.controlify.screenop.ComponentProcessor; +import dev.isxander.controlify.screenop.ComponentProcessorProvider; import dev.isxander.controlify.screenop.compat.vanilla.WorldListEntryComponentProcessor; import net.minecraft.client.gui.screens.worldselection.WorldSelectionList; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/yacl/CyclingControllerElementMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/yacl/CyclingControllerElementMixin.java similarity index 76% rename from src/main/java/dev/isxander/controlify/mixins/compat/screenop/yacl/CyclingControllerElementMixin.java rename to src/main/java/dev/isxander/controlify/mixins/feature/screenop/yacl/CyclingControllerElementMixin.java index 6f80180..a180078 100644 --- a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/yacl/CyclingControllerElementMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/yacl/CyclingControllerElementMixin.java @@ -1,7 +1,7 @@ -package dev.isxander.controlify.mixins.compat.screenop.yacl; +package dev.isxander.controlify.mixins.feature.screenop.yacl; -import dev.isxander.controlify.screenop.component.ComponentProcessor; -import dev.isxander.controlify.screenop.component.ComponentProcessorProvider; +import dev.isxander.controlify.screenop.ComponentProcessor; +import dev.isxander.controlify.screenop.ComponentProcessorProvider; import dev.isxander.controlify.screenop.compat.yacl.CyclingControllerElementComponentProcessor; import dev.isxander.yacl.gui.controllers.cycling.CyclingControllerElement; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/yacl/SliderControllerElementMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/yacl/SliderControllerElementMixin.java similarity index 76% rename from src/main/java/dev/isxander/controlify/mixins/compat/screenop/yacl/SliderControllerElementMixin.java rename to src/main/java/dev/isxander/controlify/mixins/feature/screenop/yacl/SliderControllerElementMixin.java index 74d7a84..b09b90c 100644 --- a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/yacl/SliderControllerElementMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/yacl/SliderControllerElementMixin.java @@ -1,7 +1,7 @@ -package dev.isxander.controlify.mixins.compat.screenop.yacl; +package dev.isxander.controlify.mixins.feature.screenop.yacl; -import dev.isxander.controlify.screenop.component.ComponentProcessor; -import dev.isxander.controlify.screenop.component.ComponentProcessorProvider; +import dev.isxander.controlify.screenop.ComponentProcessor; +import dev.isxander.controlify.screenop.ComponentProcessorProvider; import dev.isxander.controlify.screenop.compat.yacl.SliderControllerElementComponentProcessor; import dev.isxander.yacl.gui.controllers.slider.SliderControllerElement; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/yacl/YACLScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/yacl/YACLScreenMixin.java similarity index 91% rename from src/main/java/dev/isxander/controlify/mixins/compat/screenop/yacl/YACLScreenMixin.java rename to src/main/java/dev/isxander/controlify/mixins/feature/screenop/yacl/YACLScreenMixin.java index 8de4386..9a9465d 100644 --- a/src/main/java/dev/isxander/controlify/mixins/compat/screenop/yacl/YACLScreenMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/screenop/yacl/YACLScreenMixin.java @@ -1,4 +1,4 @@ -package dev.isxander.controlify.mixins.compat.screenop.yacl; +package dev.isxander.controlify.mixins.feature.screenop.yacl; import dev.isxander.controlify.screenop.ScreenProcessor; import dev.isxander.controlify.screenop.ScreenProcessorProvider; 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 new file mode 100644 index 0000000..5a016ae --- /dev/null +++ b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/AbstractContainerScreenMixin.java @@ -0,0 +1,37 @@ +package dev.isxander.controlify.mixins.feature.virtualmouse.snapping; + +import dev.isxander.controlify.virtualmouse.ISnapBehaviour; +import dev.isxander.controlify.virtualmouse.SnapPoint; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.network.chat.Component; +import net.minecraft.world.inventory.AbstractContainerMenu; +import org.joml.Vector2i; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Set; +import java.util.stream.Collectors; + +@Mixin(AbstractContainerScreen.class) +public abstract class AbstractContainerScreenMixin extends Screen implements ISnapBehaviour { + + protected AbstractContainerScreenMixin(Component title) { + super(title); + } + + @Shadow public abstract T getMenu(); + + @Shadow protected int leftPos; + + @Shadow protected int topPos; + + @Shadow protected int imageHeight; + + @Override + public Set getSnapPoints() { + return getMenu().slots.stream() + .map(slot -> new SnapPoint(new Vector2i(leftPos + slot.x + 8, topPos + slot.y + 8), 24)) + .collect(Collectors.toSet()); + } +} 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 new file mode 100644 index 0000000..0e7ccdf --- /dev/null +++ b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/CreativeModeInventoryScreenMixin.java @@ -0,0 +1,48 @@ +package dev.isxander.controlify.mixins.feature.virtualmouse.snapping; + +import dev.isxander.controlify.virtualmouse.SnapPoint; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.CreativeModeTabs; +import org.joml.Vector2i; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Set; + +@Mixin(CreativeModeInventoryScreen.class) +public abstract class CreativeModeInventoryScreenMixin extends AbstractContainerScreenMixin { + @Shadow protected abstract int getTabX(CreativeModeTab group); + @Shadow private float scrollOffs; + @Shadow private EditBox searchBox; + @Shadow protected abstract boolean canScroll(); + + protected CreativeModeInventoryScreenMixin(Component title) { + super(title); + } + + @Override + public Set getSnapPoints() { + Set points = super.getSnapPoints(); + for (var tab : CreativeModeTabs.tabs()) { + boolean topRow = tab.row() == CreativeModeTab.Row.TOP; + int x = leftPos + getTabX(tab); + int y = topPos + (topRow ? -28 : imageHeight - 4); + + points.add(new SnapPoint(new Vector2i(x + 13, y + 16), 38)); + } + + if (canScroll()) { + int scrollTop = topPos + 18; + int scrollBottom = scrollTop + 112; + points.add(new SnapPoint(new Vector2i(leftPos + 175 + 6, scrollTop + (int)((float)(scrollBottom - scrollTop - 17) * scrollOffs) + 7), 15)); + } + + if (searchBox.isVisible()) + points.add(new SnapPoint(new Vector2i(searchBox.getX() + searchBox.getWidth() / 2, searchBox.getY() + searchBox.getHeight() / 2), searchBox.getHeight() + 2)); + + return points; + } +} 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 new file mode 100644 index 0000000..089208d --- /dev/null +++ b/src/main/java/dev/isxander/controlify/mixins/feature/virtualmouse/snapping/ScreenMixin.java @@ -0,0 +1,31 @@ +package dev.isxander.controlify.mixins.feature.virtualmouse.snapping; + +import dev.isxander.controlify.virtualmouse.ISnapBehaviour; +import dev.isxander.controlify.virtualmouse.SnapPoint; +import net.minecraft.client.gui.components.AbstractWidget; +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.screens.Screen; +import org.joml.Vector2i; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +@Mixin(Screen.class) +public abstract class ScreenMixin implements ISnapBehaviour { + @Shadow public abstract List children(); + + @Override + public Set getSnapPoints() { + return children().stream() + .filter(child -> child instanceof AbstractWidget) + .map(AbstractWidget.class::cast) + .map(widget -> new SnapPoint( + new Vector2i(widget.getX() + widget.getWidth() / 2, widget.getY() + widget.getHeight() / 2), + Math.min(widget.getWidth(), widget.getHeight()) + 5 + )) + .collect(Collectors.toSet()); + } +} diff --git a/src/main/java/dev/isxander/controlify/screenop/component/ComponentProcessor.java b/src/main/java/dev/isxander/controlify/screenop/ComponentProcessor.java similarity index 82% rename from src/main/java/dev/isxander/controlify/screenop/component/ComponentProcessor.java rename to src/main/java/dev/isxander/controlify/screenop/ComponentProcessor.java index c0ac680..0060ce0 100644 --- a/src/main/java/dev/isxander/controlify/screenop/component/ComponentProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/ComponentProcessor.java @@ -1,6 +1,5 @@ -package dev.isxander.controlify.screenop.component; +package dev.isxander.controlify.screenop; -import dev.isxander.controlify.screenop.ScreenProcessor; import dev.isxander.controlify.controller.Controller; public interface ComponentProcessor { diff --git a/src/main/java/dev/isxander/controlify/screenop/component/ComponentProcessorProvider.java b/src/main/java/dev/isxander/controlify/screenop/ComponentProcessorProvider.java similarity index 88% rename from src/main/java/dev/isxander/controlify/screenop/component/ComponentProcessorProvider.java rename to src/main/java/dev/isxander/controlify/screenop/ComponentProcessorProvider.java index df259be..73976e4 100644 --- a/src/main/java/dev/isxander/controlify/screenop/component/ComponentProcessorProvider.java +++ b/src/main/java/dev/isxander/controlify/screenop/ComponentProcessorProvider.java @@ -1,4 +1,4 @@ -package dev.isxander.controlify.screenop.component; +package dev.isxander.controlify.screenop; import net.minecraft.client.gui.components.events.GuiEventListener; diff --git a/src/main/java/dev/isxander/controlify/screenop/component/CustomFocus.java b/src/main/java/dev/isxander/controlify/screenop/CustomFocus.java similarity index 73% rename from src/main/java/dev/isxander/controlify/screenop/component/CustomFocus.java rename to src/main/java/dev/isxander/controlify/screenop/CustomFocus.java index 9989401..07e05c6 100644 --- a/src/main/java/dev/isxander/controlify/screenop/component/CustomFocus.java +++ b/src/main/java/dev/isxander/controlify/screenop/CustomFocus.java @@ -1,4 +1,4 @@ -package dev.isxander.controlify.screenop.component; +package dev.isxander.controlify.screenop; import net.minecraft.client.gui.components.events.GuiEventListener; diff --git a/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java b/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java index dc9f553..676654a 100644 --- a/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/ScreenProcessor.java @@ -2,11 +2,9 @@ package dev.isxander.controlify.screenop; import dev.isxander.controlify.Controlify; import dev.isxander.controlify.InputMode; -import dev.isxander.controlify.screenop.component.ComponentProcessorProvider; -import dev.isxander.controlify.screenop.component.CustomFocus; import dev.isxander.controlify.controller.Controller; import dev.isxander.controlify.event.ControlifyEvents; -import dev.isxander.controlify.mixins.compat.screenop.vanilla.ScreenAccessor; +import dev.isxander.controlify.mixins.feature.screenop.vanilla.ScreenAccessor; import net.minecraft.client.gui.ComponentPath; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.navigation.FocusNavigationEvent; diff --git a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/AbstractButtonComponentProcessor.java b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/AbstractButtonComponentProcessor.java index de64c98..5a1c7db 100644 --- a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/AbstractButtonComponentProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/AbstractButtonComponentProcessor.java @@ -1,7 +1,7 @@ package dev.isxander.controlify.screenop.compat.vanilla; import dev.isxander.controlify.screenop.ScreenProcessor; -import dev.isxander.controlify.screenop.component.ComponentProcessor; +import dev.isxander.controlify.screenop.ComponentProcessor; import dev.isxander.controlify.controller.Controller; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.AbstractButton; diff --git a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/CreativeModeInventoryScreenProcessor.java b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/CreativeModeInventoryScreenProcessor.java index 66de702..59ae98c 100644 --- a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/CreativeModeInventoryScreenProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/CreativeModeInventoryScreenProcessor.java @@ -2,7 +2,7 @@ package dev.isxander.controlify.screenop.compat.vanilla; import dev.isxander.controlify.screenop.ScreenProcessor; import dev.isxander.controlify.controller.Controller; -import dev.isxander.controlify.mixins.compat.screenop.vanilla.CreativeModeInventoryScreenAccessor; +import dev.isxander.controlify.mixins.feature.screenop.vanilla.CreativeModeInventoryScreenAccessor; import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen; import net.minecraft.world.item.CreativeModeTabs; diff --git a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/LanguageSelectionListComponentProcessor.java b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/LanguageSelectionListComponentProcessor.java index dea3d81..c3c11d0 100644 --- a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/LanguageSelectionListComponentProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/LanguageSelectionListComponentProcessor.java @@ -1,9 +1,9 @@ package dev.isxander.controlify.screenop.compat.vanilla; import dev.isxander.controlify.screenop.ScreenProcessor; -import dev.isxander.controlify.screenop.component.ComponentProcessor; +import dev.isxander.controlify.screenop.ComponentProcessor; import dev.isxander.controlify.controller.Controller; -import dev.isxander.controlify.mixins.compat.screenop.vanilla.OptionsSubScreenAccessor; +import dev.isxander.controlify.mixins.feature.screenop.vanilla.OptionsSubScreenAccessor; import net.minecraft.client.Minecraft; public class LanguageSelectionListComponentProcessor implements ComponentProcessor { diff --git a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/SelectWorldScreenProcessor.java b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/SelectWorldScreenProcessor.java index 5ff4bd0..e3505f7 100644 --- a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/SelectWorldScreenProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/SelectWorldScreenProcessor.java @@ -2,7 +2,7 @@ package dev.isxander.controlify.screenop.compat.vanilla; import dev.isxander.controlify.screenop.ScreenProcessor; import dev.isxander.controlify.controller.Controller; -import dev.isxander.controlify.mixins.compat.screenop.vanilla.SelectWorldScreenAccessor; +import dev.isxander.controlify.mixins.feature.screenop.vanilla.SelectWorldScreenAccessor; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.screens.worldselection.SelectWorldScreen; diff --git a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/ServerSelectionListEntryComponentProcessor.java b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/ServerSelectionListEntryComponentProcessor.java index 64fb9be..83f2018 100644 --- a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/ServerSelectionListEntryComponentProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/ServerSelectionListEntryComponentProcessor.java @@ -1,9 +1,9 @@ package dev.isxander.controlify.screenop.compat.vanilla; import dev.isxander.controlify.screenop.ScreenProcessor; -import dev.isxander.controlify.screenop.component.ComponentProcessor; +import dev.isxander.controlify.screenop.ComponentProcessor; import dev.isxander.controlify.controller.Controller; -import dev.isxander.controlify.mixins.compat.screenop.vanilla.JoinMultiplayerScreenAccessor; +import dev.isxander.controlify.mixins.feature.screenop.vanilla.JoinMultiplayerScreenAccessor; public class ServerSelectionListEntryComponentProcessor implements ComponentProcessor { @Override diff --git a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/SliderComponentProcessor.java b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/SliderComponentProcessor.java index 82ebdb3..78ab591 100644 --- a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/SliderComponentProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/SliderComponentProcessor.java @@ -1,7 +1,7 @@ package dev.isxander.controlify.screenop.compat.vanilla; import dev.isxander.controlify.screenop.ScreenProcessor; -import dev.isxander.controlify.screenop.component.ComponentProcessor; +import dev.isxander.controlify.screenop.ComponentProcessor; import dev.isxander.controlify.controller.Controller; import net.minecraft.client.gui.components.AbstractSliderButton; import org.lwjgl.glfw.GLFW; diff --git a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/WorldListEntryComponentProcessor.java b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/WorldListEntryComponentProcessor.java index 95e620e..44c2de7 100644 --- a/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/WorldListEntryComponentProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/compat/vanilla/WorldListEntryComponentProcessor.java @@ -1,9 +1,9 @@ package dev.isxander.controlify.screenop.compat.vanilla; import dev.isxander.controlify.screenop.ScreenProcessor; -import dev.isxander.controlify.screenop.component.ComponentProcessor; +import dev.isxander.controlify.screenop.ComponentProcessor; import dev.isxander.controlify.controller.Controller; -import dev.isxander.controlify.mixins.compat.screenop.vanilla.SelectWorldScreenAccessor; +import dev.isxander.controlify.mixins.feature.screenop.vanilla.SelectWorldScreenAccessor; import net.minecraft.client.gui.screens.worldselection.SelectWorldScreen; public class WorldListEntryComponentProcessor implements ComponentProcessor { diff --git a/src/main/java/dev/isxander/controlify/screenop/compat/yacl/CyclingControllerElementComponentProcessor.java b/src/main/java/dev/isxander/controlify/screenop/compat/yacl/CyclingControllerElementComponentProcessor.java index db5ce3c..ff2feec 100644 --- a/src/main/java/dev/isxander/controlify/screenop/compat/yacl/CyclingControllerElementComponentProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/compat/yacl/CyclingControllerElementComponentProcessor.java @@ -1,7 +1,7 @@ package dev.isxander.controlify.screenop.compat.yacl; import dev.isxander.controlify.screenop.ScreenProcessor; -import dev.isxander.controlify.screenop.component.ComponentProcessor; +import dev.isxander.controlify.screenop.ComponentProcessor; import dev.isxander.controlify.controller.Controller; import dev.isxander.yacl.gui.controllers.cycling.CyclingControllerElement; diff --git a/src/main/java/dev/isxander/controlify/screenop/compat/yacl/SliderControllerElementComponentProcessor.java b/src/main/java/dev/isxander/controlify/screenop/compat/yacl/SliderControllerElementComponentProcessor.java index 2e6fbf3..85172be 100644 --- a/src/main/java/dev/isxander/controlify/screenop/compat/yacl/SliderControllerElementComponentProcessor.java +++ b/src/main/java/dev/isxander/controlify/screenop/compat/yacl/SliderControllerElementComponentProcessor.java @@ -1,7 +1,7 @@ package dev.isxander.controlify.screenop.compat.yacl; import dev.isxander.controlify.screenop.ScreenProcessor; -import dev.isxander.controlify.screenop.component.ComponentProcessor; +import dev.isxander.controlify.screenop.ComponentProcessor; import dev.isxander.controlify.controller.Controller; import dev.isxander.yacl.gui.controllers.slider.SliderControllerElement; diff --git a/src/main/java/dev/isxander/controlify/virtualmouse/ISnapBehaviour.java b/src/main/java/dev/isxander/controlify/virtualmouse/ISnapBehaviour.java new file mode 100644 index 0000000..210b418 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/virtualmouse/ISnapBehaviour.java @@ -0,0 +1,7 @@ +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 new file mode 100644 index 0000000..87acda2 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/virtualmouse/SnapPoint.java @@ -0,0 +1,6 @@ +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 33d9ca2..df8d9b2 100644 --- a/src/main/java/dev/isxander/controlify/virtualmouse/VirtualMouseHandler.java +++ b/src/main/java/dev/isxander/controlify/virtualmouse/VirtualMouseHandler.java @@ -2,6 +2,7 @@ package dev.isxander.controlify.virtualmouse; import com.mojang.blaze3d.systems.RenderSystem; 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.screenop.ScreenProcessorProvider; @@ -9,15 +10,23 @@ import dev.isxander.controlify.controller.Controller; import dev.isxander.controlify.event.ControlifyEvents; 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; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; +import org.joml.RoundingMode; +import org.joml.Vector2d; +import org.joml.Vector2i; import org.lwjgl.glfw.GLFW; +import java.util.Comparator; +import java.util.Set; + public class VirtualMouseHandler { + private static final boolean DEBUG_SNAPPING = FabricLoader.getInstance().isDevelopmentEnvironment(); private static final ResourceLocation CURSOR_TEXTURE = new ResourceLocation("controlify", "textures/gui/virtual_mouse.png"); private double targetX, targetY; @@ -28,9 +37,17 @@ public class VirtualMouseHandler { private final Minecraft minecraft; private boolean virtualMouseEnabled; + private Set snapPoints; + private SnapPoint snappedPoint, lastSnappedPoint; + public VirtualMouseHandler() { this.minecraft = Minecraft.getInstance(); + if (minecraft.screen != null && minecraft.screen instanceof ISnapBehaviour snapBehaviour) + snapPoints = snapBehaviour.getSnapPoints(); + else + snapPoints = Set.of(); + ControlifyEvents.INPUT_MODE_CHANGED.register(this::onInputModeChanged); } @@ -45,6 +62,24 @@ public class VirtualMouseHandler { var leftStickX = controller.state().axes().leftStickX(); var leftStickY = controller.state().axes().leftStickY(); + var prevLeftStickX = controller.prevState().axes().leftStickX(); + var prevLeftStickY = controller.prevState().axes().leftStickY(); + + if (minecraft.screen != null && minecraft.screen instanceof ISnapBehaviour snapBehaviour) { + snapPoints = snapBehaviour.getSnapPoints(); + } else { + snapPoints = Set.of(); + } + if (!snapPoints.contains(snappedPoint)) + snappedPoint = null; + + // if just released stick, snap to nearest snap point + if (leftStickX == 0 && leftStickY == 0) { + if ((prevLeftStickX != 0 || prevLeftStickY != 0)) + snapToClosestPoint(); + } else { + snappedPoint = null; + } // quadratic function to make small movements smaller // abs to keep sign @@ -82,8 +117,6 @@ public class VirtualMouseHandler { } else if (controller.bindings().VMOUSE_ESCAPE.justReleased()) { keyboardHandler.invokeKeyPress(minecraft.getWindow().getWindow(), GLFW.GLFW_KEY_ESCAPE, 0, GLFW.GLFW_RELEASE, 0); } - - // TODO: scrolling with right stick } public void updateMouse() { @@ -111,6 +144,32 @@ public class VirtualMouseHandler { } } + private void snapToClosestPoint() { + var window = minecraft.getWindow(); + var scaleFactor = new Vector2d((double)window.getGuiScaledWidth() / (double)window.getScreenWidth(), (double)window.getGuiScaledHeight() / (double)window.getScreenHeight()); + var target = new Vector2d(targetX, targetY).mul(scaleFactor); + + if (lastSnappedPoint != null) { + if (lastSnappedPoint.position().distanceSquared(new Vector2i(target, RoundingMode.FLOOR)) > lastSnappedPoint.range() * lastSnappedPoint.range() * scaleFactor.x()) { + lastSnappedPoint = null; + } + } + + var closestSnapPoint = snapPoints.stream() + .filter(snapPoint -> snapPoint != lastSnappedPoint) // don't snap to the point currently over snapped point + .map(snapPoint -> new Pair<>(snapPoint, snapPoint.position().distanceSquared(new Vector2i(target, RoundingMode.FLOOR)))) // map with distance to current pos + .filter(point -> point.getSecond() <= point.getFirst().range() * point.getFirst().range() * scaleFactor.x()) // filter out of range options + .min(Comparator.comparingLong(Pair::getSecond)) // find the closest point + .orElse(new Pair<>(null, Long.MAX_VALUE)).getFirst(); // retrieve point + + if (closestSnapPoint != null) { + snappedPoint = lastSnappedPoint = closestSnapPoint; + + targetX = snappedPoint.position().x() / scaleFactor.x(); + targetY = snappedPoint.position().y() / scaleFactor.y(); + } + } + public void onScreenChanged() { if (minecraft.screen != null) { if (requiresVirtualMouse()) { @@ -140,6 +199,12 @@ public class VirtualMouseHandler { public void renderVirtualMouse(PoseStack matrices) { if (!virtualMouseEnabled) return; + if (DEBUG_SNAPPING) { + for (var snapPoint : snapPoints) { + GuiComponent.fill(matrices, snapPoint.position().x() - 1, snapPoint.position().y() - 1, snapPoint.position().x() + 1, snapPoint.position().y() + 1, snapPoint == snappedPoint ? 0xFF00FF00 : snapPoint == lastSnappedPoint ? 0xFFFFFF00 : 0xFFFF0000); + } + } + RenderSystem.setShaderTexture(0, CURSOR_TEXTURE); RenderSystem.setShaderColor(1f, 1f, 1f, 1f); RenderSystem.enableBlend(); diff --git a/src/main/resources/controlify.mixins.json b/src/main/resources/controlify.mixins.json index b690a00..d891168 100644 --- a/src/main/resources/controlify.mixins.json +++ b/src/main/resources/controlify.mixins.json @@ -6,26 +6,6 @@ "mixins": [ ], "client": [ - "compat.screenop.vanilla.AbstractButtonMixin", - "compat.screenop.vanilla.AbstractContainerEventHandlerMixin", - "compat.screenop.vanilla.AbstractSelectionListMixin", - "compat.screenop.vanilla.AbstractSliderButtonMixin", - "compat.screenop.vanilla.ContainerObjectSelectionListEntryMixin", - "compat.screenop.vanilla.CreativeModeInventoryScreenAccessor", - "compat.screenop.vanilla.CreativeModeInventoryScreenMixin", - "compat.screenop.vanilla.JoinMultiplayerScreenAccessor", - "compat.screenop.vanilla.JoinMultiplayerScreenMixin", - "compat.screenop.vanilla.LanguageSelectionListEntryMixin", - "compat.screenop.vanilla.OptionsSubScreenAccessor", - "compat.screenop.vanilla.ScreenAccessor", - "compat.screenop.vanilla.ScreenMixin", - "compat.screenop.vanilla.SelectWorldScreenAccessor", - "compat.screenop.vanilla.SelectWorldScreenMixin", - "compat.screenop.vanilla.ServerSelectionListEntryMixin", - "compat.screenop.vanilla.WorldSelectionListEntryMixin", - "compat.screenop.yacl.CyclingControllerElementMixin", - "compat.screenop.yacl.SliderControllerElementMixin", - "compat.screenop.yacl.YACLScreenMixin", "core.ClientPacketListenerMixin", "core.KeyboardHandlerMixin", "core.MinecraftMixin", @@ -33,12 +13,35 @@ "feature.bind.KeyMappingAccessor", "feature.guide.ClientPacketListenerMixin", "feature.guide.GuiMixin", + "feature.screenop.vanilla.AbstractButtonMixin", + "feature.screenop.vanilla.AbstractContainerEventHandlerMixin", + "feature.screenop.vanilla.AbstractSelectionListMixin", + "feature.screenop.vanilla.AbstractSliderButtonMixin", + "feature.screenop.vanilla.ContainerObjectSelectionListEntryMixin", + "feature.screenop.vanilla.CreativeModeInventoryScreenAccessor", + "feature.screenop.vanilla.CreativeModeInventoryScreenMixin", + "feature.screenop.vanilla.JoinMultiplayerScreenAccessor", + "feature.screenop.vanilla.JoinMultiplayerScreenMixin", + "feature.screenop.vanilla.LanguageSelectionListEntryMixin", + "feature.screenop.vanilla.OptionsSubScreenAccessor", + "feature.screenop.vanilla.ScreenAccessor", + "feature.screenop.vanilla.ScreenMixin", + "feature.screenop.vanilla.SelectWorldScreenAccessor", + "feature.screenop.vanilla.SelectWorldScreenMixin", + "feature.screenop.vanilla.ServerSelectionListEntryMixin", + "feature.screenop.vanilla.WorldSelectionListEntryMixin", + "feature.screenop.yacl.CyclingControllerElementMixin", + "feature.screenop.yacl.SliderControllerElementMixin", + "feature.screenop.yacl.YACLScreenMixin", "feature.settingsbutton.ControlsScreenMixin", "feature.virtualmouse.GameRendererMixin", "feature.virtualmouse.InputConstantsMixin", "feature.virtualmouse.KeyboardHandlerAccessor", "feature.virtualmouse.MinecraftMixin", "feature.virtualmouse.MouseHandlerAccessor", - "feature.virtualmouse.MouseHandlerMixin" + "feature.virtualmouse.MouseHandlerMixin", + "feature.virtualmouse.snapping.AbstractContainerScreenMixin", + "feature.virtualmouse.snapping.CreativeModeInventoryScreenMixin", + "feature.virtualmouse.snapping.ScreenMixin" ] }