From c77f78b00eb9cd621a7113221ae56832f46ee0e3 Mon Sep 17 00:00:00 2001 From: isXander Date: Tue, 16 May 2023 20:31:48 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Allow=20repeat=20events=20?= =?UTF-8?q?for=20drop=20key=20+=20drop=20stack?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controlify/bindings/ControllerBindings.java | 8 +++++++- .../controlify/gui/guide/InGameButtonGuide.java | 6 ++++++ .../controlify/ingame/InGameInputHandler.java | 16 +++++++++++++--- .../controlify/utils/NavigationHelper.java | 10 ++++++++++ .../resources/assets/controlify/lang/en_us.json | 1 + 5 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java b/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java index 899e5c9..1dbeb56 100644 --- a/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java +++ b/src/main/java/dev/isxander/controlify/bindings/ControllerBindings.java @@ -44,7 +44,7 @@ public class ControllerBindings { JUMP, SNEAK, ATTACK, USE, SPRINT, - DROP, + DROP, DROP_STACK, NEXT_SLOT, PREV_SLOT, PAUSE, INVENTORY, @@ -172,6 +172,12 @@ public class ControllerBindings { .category(GAMEPLAY_CATEGORY) .context(BindContexts.INGAME, BindContexts.INVENTORY) .build()); + register(DROP_STACK = ControllerBindingBuilder.create(controller) + .identifier("controlify", "drop_stack") + .defaultBind(new EmptyBind<>()) + .category(GAMEPLAY_CATEGORY) + .context(BindContexts.INGAME) + .build()); register(NEXT_SLOT = ControllerBindingBuilder.create(controller) .identifier("controlify", "next_slot") .defaultBind(GamepadBinds.RIGHT_BUMPER) diff --git a/src/main/java/dev/isxander/controlify/gui/guide/InGameButtonGuide.java b/src/main/java/dev/isxander/controlify/gui/guide/InGameButtonGuide.java index 7078703..558d3af 100644 --- a/src/main/java/dev/isxander/controlify/gui/guide/InGameButtonGuide.java +++ b/src/main/java/dev/isxander/controlify/gui/guide/InGameButtonGuide.java @@ -187,6 +187,12 @@ public class InGameButtonGuide implements IngameGuideRegistry { return Optional.of(Component.translatable("controlify.guide.ingame.drop")); return Optional.empty(); }); + registerGuideAction(controller.bindings().DROP_STACK, ActionLocation.RIGHT, ctx -> { + var holdingItem = ctx.player().getInventory().getSelected(); + if (!holdingItem.isEmpty() && holdingItem.getCount() > 1) + return Optional.of(Component.translatable("controlify.binding.controlify.drop_stack")); + return Optional.empty(); + }); registerGuideAction(controller.bindings().SWAP_HANDS, ActionLocation.RIGHT, (ctx) -> { var player = ctx.player(); if (player.hasItemInSlot(EquipmentSlot.MAINHAND) || player.hasItemInSlot(EquipmentSlot.OFFHAND)) diff --git a/src/main/java/dev/isxander/controlify/ingame/InGameInputHandler.java b/src/main/java/dev/isxander/controlify/ingame/InGameInputHandler.java index ec31398..3401873 100644 --- a/src/main/java/dev/isxander/controlify/ingame/InGameInputHandler.java +++ b/src/main/java/dev/isxander/controlify/ingame/InGameInputHandler.java @@ -6,6 +6,7 @@ import dev.isxander.controlify.api.ingameinput.LookInputModifier; import dev.isxander.controlify.controller.Controller; import dev.isxander.controlify.api.event.ControlifyEvents; import dev.isxander.controlify.controller.gamepad.GamepadController; +import dev.isxander.controlify.utils.NavigationHelper; import net.minecraft.client.CameraType; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.inventory.InventoryScreen; @@ -24,9 +25,12 @@ public class InGameInputHandler { private double lookInputX, lookInputY; private boolean shouldShowPlayerList; + private final NavigationHelper dropRepeatHelper; + public InGameInputHandler(Controller controller) { this.controller = controller; this.minecraft = Minecraft.getInstance(); + this.dropRepeatHelper = new NavigationHelper(20, 1); ControlifyEvents.INPUT_MODE_CHANGED.register(mode -> { if (minecraft.player != null) { @@ -60,9 +64,15 @@ public class InGameInputHandler { } if (!minecraft.player.isSpectator()) { - if (controller.bindings().DROP.justPressed()) { - minecraft.player.drop(false); - minecraft.player.swing(InteractionHand.MAIN_HAND); + if (controller.bindings().DROP_STACK.justPressed()) { + if (minecraft.player.drop(true)) { + minecraft.player.swing(InteractionHand.MAIN_HAND); + } + } else if (dropRepeatHelper.shouldAction(controller.bindings().DROP)) { + if (minecraft.player.drop(false)) { + dropRepeatHelper.onNavigate(); + minecraft.player.swing(InteractionHand.MAIN_HAND); + } } if (controller.bindings().SWAP_HANDS.justPressed()) { diff --git a/src/main/java/dev/isxander/controlify/utils/NavigationHelper.java b/src/main/java/dev/isxander/controlify/utils/NavigationHelper.java index 0eea20d..6d51a4a 100644 --- a/src/main/java/dev/isxander/controlify/utils/NavigationHelper.java +++ b/src/main/java/dev/isxander/controlify/utils/NavigationHelper.java @@ -1,5 +1,7 @@ package dev.isxander.controlify.utils; +import dev.isxander.controlify.api.bind.ControllerBinding; + public class NavigationHelper { private final int initialDelay, repeatDelay; private int currentDelay; @@ -32,4 +34,12 @@ public class NavigationHelper { hasResetThisTick = false; } } + + public boolean shouldAction(ControllerBinding binding) { + boolean shouldAction = binding.held() && (canNavigate() || !binding.prevHeld()); + if (shouldAction && !binding.prevHeld()) { + reset(); + } + return shouldAction; + } } diff --git a/src/main/resources/assets/controlify/lang/en_us.json b/src/main/resources/assets/controlify/lang/en_us.json index d811dff..b32c754 100644 --- a/src/main/resources/assets/controlify/lang/en_us.json +++ b/src/main/resources/assets/controlify/lang/en_us.json @@ -173,6 +173,7 @@ "controlify.binding.controlify.inv_quick_move": "Quick Move", "controlify.binding.controlify.inv_take_half": "Take Half", "controlify.binding.controlify.drop": "Drop Item", + "controlify.binding.controlify.drop_stack": "Drop Stack", "controlify.binding.controlify.pick_block": "Pick Block", "controlify.binding.controlify.toggle_hud_visibility": "Toggle HUD Visibility", "controlify.binding.controlify.show_player_list": "Show Player List",