diff --git a/src/main/java/dev/isxander/controlify/bindings/Bind.java b/src/main/java/dev/isxander/controlify/bindings/Bind.java index de6b905..db81e57 100644 --- a/src/main/java/dev/isxander/controlify/bindings/Bind.java +++ b/src/main/java/dev/isxander/controlify/bindings/Bind.java @@ -33,7 +33,7 @@ public enum Bind { Bind(BiFunction state, String identifier) { this.state = state; this.identifier = identifier; - this.textureLocation = new ResourceLocation("controlify", "textures/gui/buttons/" + identifier + ".png"); + this.textureLocation = new ResourceLocation("controlify", "textures/gui/buttons/xbox/" + identifier + ".png"); } Bind(Function state, String identifier) { diff --git a/src/main/java/dev/isxander/controlify/bindings/ControllerBinding.java b/src/main/java/dev/isxander/controlify/bindings/ControllerBinding.java index 2164a6c..bb4bdd7 100644 --- a/src/main/java/dev/isxander/controlify/bindings/ControllerBinding.java +++ b/src/main/java/dev/isxander/controlify/bindings/ControllerBinding.java @@ -17,7 +17,7 @@ public class ControllerBinding { this.controller = controller; this.bind = this.defaultBind = defaultBind; this.id = id; - this.name = Component.translatable("controlify.binding." + id); + this.name = Component.translatable("controlify.binding." + id.getNamespace() + "." + id.getPath()); this.description = description; this.override = override; } diff --git a/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java b/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java index 280d407..205a0d9 100644 --- a/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java +++ b/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java @@ -5,7 +5,7 @@ import dev.isxander.controlify.Controlify; import dev.isxander.controlify.InputMode; import dev.isxander.controlify.controller.Controller; import dev.isxander.controlify.event.ControlifyEvents; -import dev.isxander.controlify.mixins.KeyMappingAccessor; +import dev.isxander.controlify.mixins.feature.bind.KeyMappingAccessor; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; @@ -17,6 +17,7 @@ public class ControllerBindings { JUMP, SNEAK, ATTACK, USE, SPRINT, + DROP, NEXT_SLOT, PREV_SLOT, PAUSE, INVENTORY, @@ -24,7 +25,7 @@ public class ControllerBindings { OPEN_CHAT, GUI_PRESS, GUI_BACK; - private final Map registry = new HashMap<>(); + private final Map registry = new LinkedHashMap<>(); public ControllerBindings(Controller controller) { var options = Minecraft.getInstance().options; @@ -34,6 +35,7 @@ public class ControllerBindings { register(ATTACK = new ControllerBinding(controller, Bind.RIGHT_TRIGGER, new ResourceLocation("controlify", "attack"), options.keyAttack)); register(USE = new ControllerBinding(controller, Bind.LEFT_TRIGGER, new ResourceLocation("controlify", "use"), options.keyUse)); register(SPRINT = new ControllerBinding(controller, Bind.LEFT_STICK, new ResourceLocation("controlify", "sprint"), options.keySprint)); + register(DROP = new ControllerBinding(controller, Bind.DPAD_DOWN, new ResourceLocation("controlify", "drop"), options.keyDrop)); register(NEXT_SLOT = new ControllerBinding(controller, Bind.RIGHT_BUMPER, new ResourceLocation("controlify", "next_slot"), null)); register(PREV_SLOT = new ControllerBinding(controller, Bind.LEFT_BUMPER, new ResourceLocation("controlify", "prev_slot"), null)); register(PAUSE = new ControllerBinding(controller, Bind.START, new ResourceLocation("controlify", "pause"), null)); @@ -43,6 +45,7 @@ public class ControllerBindings { register(GUI_PRESS = new ControllerBinding(controller, Bind.A_BUTTON, new ResourceLocation("controlify", "gui_press"), null)); register(GUI_BACK = new ControllerBinding(controller, Bind.B_BUTTON, new ResourceLocation("controlify", "gui_back"), null)); + ControlifyEvents.CONTROLLER_BIND_REGISTRY.invoker().onRegisterControllerBinds(this, controller); ControlifyEvents.CONTROLLER_STATE_UPDATED.register(this::imitateVanillaClick); diff --git a/src/main/java/dev/isxander/controlify/compatibility/screen/ScreenProcessor.java b/src/main/java/dev/isxander/controlify/compatibility/screen/ScreenProcessor.java index 44752b2..5502eef 100644 --- a/src/main/java/dev/isxander/controlify/compatibility/screen/ScreenProcessor.java +++ b/src/main/java/dev/isxander/controlify/compatibility/screen/ScreenProcessor.java @@ -3,17 +3,22 @@ package dev.isxander.controlify.compatibility.screen; import dev.isxander.controlify.Controlify; import dev.isxander.controlify.InputMode; import dev.isxander.controlify.compatibility.screen.component.ComponentProcessorProvider; +import dev.isxander.controlify.compatibility.screen.component.CustomFocus; import dev.isxander.controlify.controller.Controller; -import dev.isxander.controlify.mixins.ScreenAccessor; +import dev.isxander.controlify.mixins.compat.screen.vanilla.ScreenAccessor; import net.minecraft.client.gui.ComponentPath; +import net.minecraft.client.gui.components.events.AbstractContainerEventHandler; +import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.navigation.FocusNavigationEvent; import net.minecraft.client.gui.navigation.ScreenDirection; import net.minecraft.client.gui.screens.Screen; import org.lwjgl.glfw.GLFW; +import java.util.*; +import java.util.concurrent.ArrayBlockingQueue; + public class ScreenProcessor { - private static final int REPEAT_DELAY = 5; - private static final int INITIAL_REPEAT_DELAY = 20; + private static final int REPEAT_DELAY = 3; public final Screen screen; private int lastMoved = 0; @@ -28,15 +33,16 @@ public class ScreenProcessor { } protected void handleComponentNavigation(Controller controller) { - if (screen.getFocused() != null) { - var focused = screen.getFocused(); + var focusTree = getFocusTree(); + while (!focusTree.isEmpty()) { + var focused = focusTree.poll(); var processor = ComponentProcessorProvider.provide(focused); if (processor.overrideControllerNavigation(this, controller)) return; } var accessor = (ScreenAccessor) screen; - boolean repeatEventAvailable = ++lastMoved > INITIAL_REPEAT_DELAY; + boolean repeatEventAvailable = ++lastMoved >= REPEAT_DELAY; var axes = controller.state().axes(); var prevAxes = controller.prevState().axes(); @@ -67,14 +73,15 @@ public class ScreenProcessor { if (path != null) { accessor.invokeChangeFocus(path); ComponentProcessorProvider.provide(path.component()).onNavigateTo(this, controller); - lastMoved = repeatEventAvailable ? INITIAL_REPEAT_DELAY - REPEAT_DELAY : 0; + lastMoved = 0; } } } protected void handleButtons(Controller controller) { - if (screen.getFocused() != null) { - var focused = screen.getFocused(); + var focusTree = getFocusTree(); + while (!focusTree.isEmpty()) { + var focused = focusTree.poll(); var processor = ComponentProcessorProvider.provide(focused); if (processor.overrideControllerButtons(this, controller)) return; } @@ -94,4 +101,18 @@ public class ScreenProcessor { accessor.invokeChangeFocus(path); } } + + protected Queue getFocusTree() { + if (screen.getFocused() == null) return new ArrayDeque<>(); + + var tree = new ArrayDeque(); + var focused = screen.getFocused(); + tree.add(focused); + while (focused instanceof CustomFocus customFocus) { + focused = customFocus.getCustomFocus(); + tree.addFirst(focused); + } + + return tree; + } } diff --git a/src/main/java/dev/isxander/controlify/compatibility/screen/component/ComponentProcessor.java b/src/main/java/dev/isxander/controlify/compatibility/screen/component/ComponentProcessor.java index 70bb213..236994b 100644 --- a/src/main/java/dev/isxander/controlify/compatibility/screen/component/ComponentProcessor.java +++ b/src/main/java/dev/isxander/controlify/compatibility/screen/component/ComponentProcessor.java @@ -7,23 +7,17 @@ import dev.isxander.controlify.controller.Controller; import dev.isxander.controlify.controller.ControllerState; import net.minecraft.client.gui.components.events.GuiEventListener; -public class ComponentProcessor { - static final ComponentProcessor EMPTY = new ComponentProcessor<>(null); +public interface ComponentProcessor { + ComponentProcessor EMPTY = new ComponentProcessor(){}; - protected final T component; - - public ComponentProcessor(T component) { - this.component = component; - } - - public boolean overrideControllerNavigation(ScreenProcessor screen, Controller controller) { + default boolean overrideControllerNavigation(ScreenProcessor screen, Controller controller) { return false; } - public boolean overrideControllerButtons(ScreenProcessor screen, Controller controller) { + default boolean overrideControllerButtons(ScreenProcessor screen, Controller controller) { return false; } - public void onNavigateTo(ScreenProcessor screen, Controller controller) { + default void onNavigateTo(ScreenProcessor screen, Controller controller) { } } diff --git a/src/main/java/dev/isxander/controlify/compatibility/screen/component/ComponentProcessorProvider.java b/src/main/java/dev/isxander/controlify/compatibility/screen/component/ComponentProcessorProvider.java index 55c9feb..efea3b9 100644 --- a/src/main/java/dev/isxander/controlify/compatibility/screen/component/ComponentProcessorProvider.java +++ b/src/main/java/dev/isxander/controlify/compatibility/screen/component/ComponentProcessorProvider.java @@ -3,9 +3,9 @@ package dev.isxander.controlify.compatibility.screen.component; import net.minecraft.client.gui.components.events.GuiEventListener; public interface ComponentProcessorProvider { - ComponentProcessor componentProcessor(); + ComponentProcessor componentProcessor(); - static ComponentProcessor provide(GuiEventListener component) { + static ComponentProcessor provide(GuiEventListener component) { if (component instanceof ComponentProcessorProvider provider) return provider.componentProcessor(); return ComponentProcessor.EMPTY; diff --git a/src/main/java/dev/isxander/controlify/compatibility/screen/component/CustomFocus.java b/src/main/java/dev/isxander/controlify/compatibility/screen/component/CustomFocus.java new file mode 100644 index 0000000..a8212f7 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/compatibility/screen/component/CustomFocus.java @@ -0,0 +1,7 @@ +package dev.isxander.controlify.compatibility.screen.component; + +import net.minecraft.client.gui.components.events.GuiEventListener; + +public interface CustomFocus { + GuiEventListener getCustomFocus(); +} diff --git a/src/main/java/dev/isxander/controlify/compatibility/screen/component/SliderComponentProcessor.java b/src/main/java/dev/isxander/controlify/compatibility/screen/component/SliderComponentProcessor.java index b37e1fc..b4ee3c3 100644 --- a/src/main/java/dev/isxander/controlify/compatibility/screen/component/SliderComponentProcessor.java +++ b/src/main/java/dev/isxander/controlify/compatibility/screen/component/SliderComponentProcessor.java @@ -8,15 +8,17 @@ import org.lwjgl.glfw.GLFW; import java.util.function.Consumer; import java.util.function.Supplier; -public class SliderComponentProcessor extends ComponentProcessor { +public class SliderComponentProcessor implements ComponentProcessor { private final Supplier canChangeValueGetter; private final Consumer canChangeValueSetter; + private final AbstractSliderButton component; + private static final int SLIDER_CHANGE_DELAY = 1; private int lastSliderChange = SLIDER_CHANGE_DELAY; public SliderComponentProcessor(AbstractSliderButton component, Supplier canChangeValueGetter, Consumer canChangeValueSetter) { - super(component); + this.component = component; this.canChangeValueGetter = canChangeValueGetter; this.canChangeValueSetter = canChangeValueSetter; } diff --git a/src/main/java/dev/isxander/controlify/config/ControlifyConfig.java b/src/main/java/dev/isxander/controlify/config/ControlifyConfig.java index e517643..3a8a724 100644 --- a/src/main/java/dev/isxander/controlify/config/ControlifyConfig.java +++ b/src/main/java/dev/isxander/controlify/config/ControlifyConfig.java @@ -50,6 +50,7 @@ public class ControlifyConfig { for (var controller : Controller.CONTROLLERS.values()) { // `add` replaces if already existing + // TODO: find a better way to identify controllers, GUID will report the same for multiple controllers of the same model configCopy.add(controller.guid(), generateControllerConfig(controller)); } diff --git a/src/main/java/dev/isxander/controlify/config/gui/BindButtonController.java b/src/main/java/dev/isxander/controlify/config/gui/BindButtonController.java new file mode 100644 index 0000000..ddc9c52 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/config/gui/BindButtonController.java @@ -0,0 +1,119 @@ +package dev.isxander.controlify.config.gui; + +import com.mojang.blaze3d.vertex.PoseStack; +import dev.isxander.controlify.bindings.Bind; +import dev.isxander.controlify.compatibility.screen.ScreenProcessor; +import dev.isxander.controlify.compatibility.screen.component.ComponentProcessor; +import dev.isxander.controlify.compatibility.screen.component.ComponentProcessorProvider; +import dev.isxander.controlify.event.ControlifyEvents; +import dev.isxander.controlify.gui.ButtonRenderer; +import dev.isxander.yacl.api.Controller; +import dev.isxander.yacl.api.Option; +import dev.isxander.yacl.api.utils.Dimension; +import dev.isxander.yacl.gui.AbstractWidget; +import dev.isxander.yacl.gui.YACLScreen; +import dev.isxander.yacl.gui.controllers.ControllerWidget; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import org.lwjgl.glfw.GLFW; + +public class BindButtonController implements Controller { + private final Option option; + + public BindButtonController(Option option) { + this.option = option; + } + + @Override + public Option option() { + return this.option; + } + + @Override + public Component formatValue() { + return Component.literal(option().pendingValue().identifier()); + } + + @Override + public AbstractWidget provideWidget(YACLScreen yaclScreen, Dimension dimension) { + return new BindButtonWidget(this, yaclScreen, dimension); + } + + public static class BindButtonWidget extends ControllerWidget implements ComponentProcessorProvider, ComponentProcessor { + private boolean awaitingControllerInput = false; + private final Component awaitingText = Component.translatable("controlify.gui.bind_input_awaiting").withStyle(ChatFormatting.ITALIC); + + public BindButtonWidget(BindButtonController control, YACLScreen screen, Dimension dim) { + super(control, screen, dim); + } + + @Override + protected void drawValueText(PoseStack matrices, int mouseX, int mouseY, float delta) { + if (awaitingControllerInput) { + textRenderer.drawShadow(matrices, awaitingText, getDimension().xLimit() - textRenderer.width(awaitingText) - getXPadding(), getDimension().centerY() - textRenderer.lineHeight / 2f, 0xFFFFFF); + } else { + ButtonRenderer.drawButton(control.option().pendingValue(), matrices, getDimension().xLimit() - ButtonRenderer.BUTTON_SIZE / 2, getDimension().centerY(), ButtonRenderer.BUTTON_SIZE); + } + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + if (isFocused() && keyCode == GLFW.GLFW_KEY_ENTER && !awaitingControllerInput) { + awaitingControllerInput = true; + return true; + } + + return false; + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (getDimension().isPointInside((int)mouseX, (int)mouseY)) { + awaitingControllerInput = true; + return true; + } + + return false; + } + + @Override + public ComponentProcessor componentProcessor() { + return this; + } + + @Override + public boolean overrideControllerButtons(ScreenProcessor screen, dev.isxander.controlify.controller.Controller controller) { + if (!awaitingControllerInput || !isFocused()) return false; + + for (var bind : Bind.values()) { + boolean stateNow = bind.state(controller.state(), controller); + boolean stateBefore = bind.state(controller.prevState(), controller); + if (stateNow && !stateBefore) { + control.option().requestSet(bind); + awaitingControllerInput = false; + return true; + } + } + + return false; + } + + @Override + public boolean overrideControllerNavigation(ScreenProcessor screen, dev.isxander.controlify.controller.Controller controller) { + return awaitingControllerInput; + } + + @Override + protected int getHoveredControlWidth() { + return getUnhoveredControlWidth(); + } + + @Override + protected int getUnhoveredControlWidth() { + if (awaitingControllerInput) + return textRenderer.width(awaitingText); + + return ButtonRenderer.BUTTON_SIZE; + } + } +} diff --git a/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java b/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java index 9ebf1db..435285f 100644 --- a/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java +++ b/src/main/java/dev/isxander/controlify/config/gui/YACLHelper.java @@ -1,5 +1,6 @@ package dev.isxander.controlify.config.gui; +import dev.isxander.controlify.bindings.Bind; import dev.isxander.controlify.config.ControlifyConfig; import dev.isxander.controlify.controller.Controller; import dev.isxander.controlify.controller.ControllerConfig; @@ -69,6 +70,17 @@ public class YACLHelper { .build()); category.group(configGroup.build()); + var controlsGroup = OptionGroup.createBuilder() + .name(Component.translatable("controlify.gui.group.controls")); + for (var control : controller.bindings().registry().values()) { + controlsGroup.option(Option.createBuilder(Bind.class) + .name(control.name()) + .binding(control.defaultBind(), control::currentBind, control::setCurrentBind) + .controller(BindButtonController::new) + .build()); + } + category.group(controlsGroup.build()); + yacl.category(category.build()); } diff --git a/src/main/java/dev/isxander/controlify/gui/ButtonRenderer.java b/src/main/java/dev/isxander/controlify/gui/ButtonRenderer.java new file mode 100644 index 0000000..d121f01 --- /dev/null +++ b/src/main/java/dev/isxander/controlify/gui/ButtonRenderer.java @@ -0,0 +1,17 @@ +package dev.isxander.controlify.gui; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import dev.isxander.controlify.bindings.Bind; +import net.minecraft.client.gui.GuiComponent; + +public class ButtonRenderer { + public static final int BUTTON_SIZE = 22; + + public static void drawButton(Bind button, PoseStack poseStack, int x, int y, int size) { + RenderSystem.setShaderTexture(0, button.textureLocation()); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + + GuiComponent.blit(poseStack, x - size / 2, y - size / 2, 0, 0, BUTTON_SIZE, BUTTON_SIZE, BUTTON_SIZE, BUTTON_SIZE); + } +} diff --git a/src/main/java/dev/isxander/controlify/mixins/compat/screen/vanilla/AbstractContainerEventHandlerMixin.java b/src/main/java/dev/isxander/controlify/mixins/compat/screen/vanilla/AbstractContainerEventHandlerMixin.java new file mode 100644 index 0000000..7eb6dac --- /dev/null +++ b/src/main/java/dev/isxander/controlify/mixins/compat/screen/vanilla/AbstractContainerEventHandlerMixin.java @@ -0,0 +1,18 @@ +package dev.isxander.controlify.mixins.compat.screen.vanilla; + +import dev.isxander.controlify.compatibility.screen.component.CustomFocus; +import net.minecraft.client.gui.components.events.AbstractContainerEventHandler; +import net.minecraft.client.gui.components.events.GuiEventListener; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(AbstractContainerEventHandler.class) +public abstract class AbstractContainerEventHandlerMixin implements CustomFocus { + @Shadow public abstract @Nullable GuiEventListener getFocused(); + + @Override + public GuiEventListener getCustomFocus() { + return getFocused(); + } +} diff --git a/src/main/java/dev/isxander/controlify/mixins/AbstractSliderButtonMixin.java b/src/main/java/dev/isxander/controlify/mixins/compat/screen/vanilla/AbstractSliderButtonMixin.java similarity index 90% rename from src/main/java/dev/isxander/controlify/mixins/AbstractSliderButtonMixin.java rename to src/main/java/dev/isxander/controlify/mixins/compat/screen/vanilla/AbstractSliderButtonMixin.java index 79d5ee3..0145546 100644 --- a/src/main/java/dev/isxander/controlify/mixins/AbstractSliderButtonMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/compat/screen/vanilla/AbstractSliderButtonMixin.java @@ -1,4 +1,4 @@ -package dev.isxander.controlify.mixins; +package dev.isxander.controlify.mixins.compat.screen.vanilla; import dev.isxander.controlify.compatibility.screen.component.ComponentProcessor; import dev.isxander.controlify.compatibility.screen.component.ComponentProcessorProvider; @@ -23,7 +23,7 @@ public class AbstractSliderButtonMixin implements ComponentProcessorProvider { ); @Override - public ComponentProcessor componentProcessor() { + public ComponentProcessor componentProcessor() { return controlify$processor; } } diff --git a/src/main/java/dev/isxander/controlify/mixins/compat/screen/vanilla/ContainerObjectSelectionListEntryMixin.java b/src/main/java/dev/isxander/controlify/mixins/compat/screen/vanilla/ContainerObjectSelectionListEntryMixin.java new file mode 100644 index 0000000..14da78e --- /dev/null +++ b/src/main/java/dev/isxander/controlify/mixins/compat/screen/vanilla/ContainerObjectSelectionListEntryMixin.java @@ -0,0 +1,18 @@ +package dev.isxander.controlify.mixins.compat.screen.vanilla; + +import dev.isxander.controlify.compatibility.screen.component.CustomFocus; +import net.minecraft.client.gui.components.ContainerObjectSelectionList; +import net.minecraft.client.gui.components.events.GuiEventListener; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(ContainerObjectSelectionList.Entry.class) +public abstract class ContainerObjectSelectionListEntryMixin implements CustomFocus { + @Shadow public abstract @Nullable GuiEventListener getFocused(); + + @Override + public GuiEventListener getCustomFocus() { + return getFocused(); + } +} diff --git a/src/main/java/dev/isxander/controlify/mixins/ScreenAccessor.java b/src/main/java/dev/isxander/controlify/mixins/compat/screen/vanilla/ScreenAccessor.java similarity index 89% rename from src/main/java/dev/isxander/controlify/mixins/ScreenAccessor.java rename to src/main/java/dev/isxander/controlify/mixins/compat/screen/vanilla/ScreenAccessor.java index 8ea82af..028b979 100644 --- a/src/main/java/dev/isxander/controlify/mixins/ScreenAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/compat/screen/vanilla/ScreenAccessor.java @@ -1,4 +1,4 @@ -package dev.isxander.controlify.mixins; +package dev.isxander.controlify.mixins.compat.screen.vanilla; import net.minecraft.client.gui.ComponentPath; import net.minecraft.client.gui.navigation.FocusNavigationEvent; diff --git a/src/main/java/dev/isxander/controlify/mixins/ScreenMixin.java b/src/main/java/dev/isxander/controlify/mixins/compat/screen/vanilla/ScreenMixin.java similarity index 93% rename from src/main/java/dev/isxander/controlify/mixins/ScreenMixin.java rename to src/main/java/dev/isxander/controlify/mixins/compat/screen/vanilla/ScreenMixin.java index bfec972..d2c78a6 100644 --- a/src/main/java/dev/isxander/controlify/mixins/ScreenMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/compat/screen/vanilla/ScreenMixin.java @@ -1,4 +1,4 @@ -package dev.isxander.controlify.mixins; +package dev.isxander.controlify.mixins.compat.screen.vanilla; import dev.isxander.controlify.compatibility.screen.ScreenProcessorProvider; import dev.isxander.controlify.compatibility.screen.ScreenProcessor; diff --git a/src/main/java/dev/isxander/controlify/mixins/ClientPacketListenerMixin.java b/src/main/java/dev/isxander/controlify/mixins/core/ClientPacketListenerMixin.java similarity index 97% rename from src/main/java/dev/isxander/controlify/mixins/ClientPacketListenerMixin.java rename to src/main/java/dev/isxander/controlify/mixins/core/ClientPacketListenerMixin.java index c8ec1c8..493d8fe 100644 --- a/src/main/java/dev/isxander/controlify/mixins/ClientPacketListenerMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/core/ClientPacketListenerMixin.java @@ -1,4 +1,4 @@ -package dev.isxander.controlify.mixins; +package dev.isxander.controlify.mixins.core; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; diff --git a/src/main/java/dev/isxander/controlify/mixins/KeyboardHandlerMixin.java b/src/main/java/dev/isxander/controlify/mixins/core/KeyboardHandlerMixin.java similarity index 94% rename from src/main/java/dev/isxander/controlify/mixins/KeyboardHandlerMixin.java rename to src/main/java/dev/isxander/controlify/mixins/core/KeyboardHandlerMixin.java index 737d8b6..81ab391 100644 --- a/src/main/java/dev/isxander/controlify/mixins/KeyboardHandlerMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/core/KeyboardHandlerMixin.java @@ -1,4 +1,4 @@ -package dev.isxander.controlify.mixins; +package dev.isxander.controlify.mixins.core; import dev.isxander.controlify.Controlify; import dev.isxander.controlify.InputMode; diff --git a/src/main/java/dev/isxander/controlify/mixins/MinecraftMixin.java b/src/main/java/dev/isxander/controlify/mixins/core/MinecraftMixin.java similarity index 95% rename from src/main/java/dev/isxander/controlify/mixins/MinecraftMixin.java rename to src/main/java/dev/isxander/controlify/mixins/core/MinecraftMixin.java index b724e23..905976c 100644 --- a/src/main/java/dev/isxander/controlify/mixins/MinecraftMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/core/MinecraftMixin.java @@ -1,4 +1,4 @@ -package dev.isxander.controlify.mixins; +package dev.isxander.controlify.mixins.core; import dev.isxander.controlify.Controlify; import net.minecraft.client.Minecraft; diff --git a/src/main/java/dev/isxander/controlify/mixins/MouseHandlerMixin.java b/src/main/java/dev/isxander/controlify/mixins/core/MouseHandlerMixin.java similarity index 96% rename from src/main/java/dev/isxander/controlify/mixins/MouseHandlerMixin.java rename to src/main/java/dev/isxander/controlify/mixins/core/MouseHandlerMixin.java index 14f023f..a4515f8 100644 --- a/src/main/java/dev/isxander/controlify/mixins/MouseHandlerMixin.java +++ b/src/main/java/dev/isxander/controlify/mixins/core/MouseHandlerMixin.java @@ -1,4 +1,4 @@ -package dev.isxander.controlify.mixins; +package dev.isxander.controlify.mixins.core; import dev.isxander.controlify.Controlify; import dev.isxander.controlify.InputMode; diff --git a/src/main/java/dev/isxander/controlify/mixins/KeyMappingAccessor.java b/src/main/java/dev/isxander/controlify/mixins/feature/bind/KeyMappingAccessor.java similarity index 84% rename from src/main/java/dev/isxander/controlify/mixins/KeyMappingAccessor.java rename to src/main/java/dev/isxander/controlify/mixins/feature/bind/KeyMappingAccessor.java index 567e610..a06b5a7 100644 --- a/src/main/java/dev/isxander/controlify/mixins/KeyMappingAccessor.java +++ b/src/main/java/dev/isxander/controlify/mixins/feature/bind/KeyMappingAccessor.java @@ -1,4 +1,4 @@ -package dev.isxander.controlify.mixins; +package dev.isxander.controlify.mixins.feature.bind; import com.mojang.blaze3d.platform.InputConstants; import net.minecraft.client.KeyMapping; diff --git a/src/main/resources/assets/controlify/lang/en_us.json b/src/main/resources/assets/controlify/lang/en_us.json index fd538bf..8fcb128 100644 --- a/src/main/resources/assets/controlify/lang/en_us.json +++ b/src/main/resources/assets/controlify/lang/en_us.json @@ -1,6 +1,10 @@ { "controlify.gui.group.config": "Config", "controlify.gui.group.config.tooltip": "Adjust the controller configuration.", + "controlify.gui.horizontal_look_sensitivity": "Horizontal Look Sensitivity", + "controlify.gui.horizontal_look_sensitivity.tooltip": "How fast the camera moves horizontally when looking around.", + "controlify.gui.vertical_look_sensitivity": "Vertical Look Sensitivity", + "controlify.gui.vertical_look_sensitivity.tooltip": "How fast the camera moves vertically when looking around.", "controlify.gui.left_stick_deadzone": "Left Stick Deadzone", "controlify.gui.left_stick_deadzone.tooltip": "How far the left joystick needs to be pushed before registering input.", "controlify.gui.right_stick_deadzone": "Right Stick Deadzone", @@ -9,5 +13,24 @@ "controlify.gui.left_trigger_threshold": "Left Trigger Threshold", "controlify.gui.left_trigger_threshold.tooltip": "How far the left trigger needs to be pushed before registering as pressed.", "controlify.gui.right_trigger_threshold": "Right Trigger Threshold", - "controlify.gui.right_trigger_threshold.tooltip": "How far the right trigger needs to be pushed before registering as pressed." + "controlify.gui.right_trigger_threshold.tooltip": "How far the right trigger needs to be pushed before registering as pressed.", + + "controlify.gui.group.controls": "Controls", + "controlify.gui.group.controls.tooltip": "Adjust the controller controls.", + "controlify.gui.bind_input_awaiting": "Press any button", + + "controlify.binding.controlify.jump": "Jump", + "controlify.binding.controlify.sneak": "Sneak", + "controlify.binding.controlify.attack": "Attack", + "controlify.binding.controlify.use": "Use", + "controlify.binding.controlify.sprint": "Sprint", + "controlify.binding.controlify.next_slot": "Next Hotbar Slot", + "controlify.binding.controlify.prev_slot": "Previous Hotbar Slot", + "controlify.binding.controlify.pause": "Pause Game", + "controlify.binding.controlify.inventory": "Open Inventory", + "controlify.binding.controlify.change_perspective": "Change Perspective", + "controlify.binding.controlify.open_chat": "Open Chat", + "controlify.binding.controlify.gui_press": "GUI Press", + "controlify.binding.controlify.gui_back": "GUI Back", + "controlify.binding.controlify.drop": "Drop Item" } diff --git a/src/main/resources/controlify.mixins.json b/src/main/resources/controlify.mixins.json index ffdb4b0..5c3ee34 100644 --- a/src/main/resources/controlify.mixins.json +++ b/src/main/resources/controlify.mixins.json @@ -6,13 +6,15 @@ "mixins": [ ], "client": [ - "AbstractSliderButtonMixin", - "ClientPacketListenerMixin", - "KeyboardHandlerMixin", - "KeyMappingAccessor", - "MinecraftMixin", - "MouseHandlerMixin", - "ScreenAccessor", - "ScreenMixin" + "compat.screen.vanilla.AbstractContainerEventHandlerMixin", + "compat.screen.vanilla.AbstractSliderButtonMixin", + "core.ClientPacketListenerMixin", + "compat.screen.vanilla.ContainerObjectSelectionListEntryMixin", + "core.KeyboardHandlerMixin", + "feature.bind.KeyMappingAccessor", + "core.MinecraftMixin", + "core.MouseHandlerMixin", + "compat.screen.vanilla.ScreenAccessor", + "compat.screen.vanilla.ScreenMixin" ] }