From bd6ed47c7ee1740fecc56e4a778516a7f1eb4254 Mon Sep 17 00:00:00 2001 From: Rime <81419447+Emirlol@users.noreply.github.com> Date: Mon, 9 Sep 2024 00:47:11 +0300 Subject: Add wardrobe helper based on hotbar keybinds (#943) * Wardrobe helper initial commit * Remove unnecessary getter from RegexContainerMatcher * Clarify config description * Allow mouse keys to work with wardrobe --- .../config/categories/HelperCategory.java | 9 +++ .../skyblocker/config/configs/HelperConfig.java | 3 + .../skyblocker/skyblock/WardrobeKeybinds.java | 65 ++++++++++++++++++++++ .../utils/container/RegexContainerMatcher.java | 6 +- 4 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/WardrobeKeybinds.java (limited to 'src/main/java') diff --git a/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java index ec34dea6..eee4b525 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java @@ -26,6 +26,15 @@ public class HelperCategory { .controller(ConfigUtils::createBooleanController) .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.enableWardrobeHelper")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.enableWardrobeHelper.@Tooltip"))) + .binding(defaults.helpers.enableWardrobeHelper, + () -> config.helpers.enableWardrobeHelper, + newValue -> config.helpers.enableWardrobeHelper = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + //Mythological Ritual .group(OptionGroup.createBuilder() .name(Text.translatable("skyblocker.config.helpers.mythologicalRitual")) diff --git a/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java b/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java index ad5a14ae..b4b15009 100644 --- a/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java @@ -8,6 +8,9 @@ public class HelperConfig { @SerialEntry public boolean enableNewYearCakesHelper = true; + @SerialEntry + public boolean enableWardrobeHelper = true; + @SerialEntry public MythologicalRitual mythologicalRitual = new MythologicalRitual(); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/WardrobeKeybinds.java b/src/main/java/de/hysky/skyblocker/skyblock/WardrobeKeybinds.java new file mode 100644 index 00000000..795acf1c --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/WardrobeKeybinds.java @@ -0,0 +1,65 @@ +package de.hysky.skyblocker.skyblock; + +import de.hysky.skyblocker.annotations.Init; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.utils.container.RegexContainerMatcher; +import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; +import net.fabricmc.fabric.api.client.screen.v1.ScreenKeyboardEvents; +import net.fabricmc.fabric.api.client.screen.v1.ScreenMouseEvents; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.ingame.HandledScreen; +import net.minecraft.client.option.KeyBinding; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.screen.slot.SlotActionType; +import org.lwjgl.glfw.GLFW; + +import java.util.function.Predicate; + +@SuppressWarnings("unused") +public class WardrobeKeybinds extends RegexContainerMatcher { + private static final WardrobeKeybinds INSTANCE = new WardrobeKeybinds(); + + public WardrobeKeybinds() { + super("Wardrobe \\([12]/2\\)"); + } + + @Init + public static void init() { + ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> { + if (!(screen instanceof HandledScreen handledScreen) || !INSTANCE.test(handledScreen) || !INSTANCE.isEnabled() || client.interactionManager == null) return; + ScreenKeyboardEvents.allowKeyPress(handledScreen).register((ignored, keyCode, scanCode, modifiers) -> + allowInput(client, handledScreen, keybinding -> keybinding.matchesKey(keyCode, scanCode)) + ); + ScreenMouseEvents.allowMouseClick(handledScreen).register((ignored, mouseX, mouseY, button) -> + allowInput(client, handledScreen, keybinding -> keybinding.matchesMouse(button)) + ); + }); + } + + private static boolean allowInput(MinecraftClient client, HandledScreen handledScreen, Predicate predicate) { + boolean found = false; + int i; + for (i = 0; i < client.options.hotbarKeys.length; i++) { + if (predicate.test(client.options.hotbarKeys[i])) { + found = true; + break; + } + } + if (!found) return true; + // The items start from the 5th row in the inventory. The i number we have is the column in the first row, so we have to offset it by 4 rows to get the 5th row, which is where the items start. + i += 9 * 4; + ItemStack itemStack = handledScreen.getScreenHandler().getSlot(i).getStack(); + // Check if the item in the slot is a swap/unequip item before going further. + // This prevents usage when the inventory hasn't loaded fully or when the slot pressed is locked (which would be meaningless to click) + if (!itemStack.isOf(Items.PINK_DYE) && !itemStack.isOf(Items.LIME_DYE)) return true; + assert client.interactionManager != null; + client.interactionManager.clickSlot(handledScreen.getScreenHandler().syncId, i, GLFW.GLFW_MOUSE_BUTTON_1, SlotActionType.PICKUP, client.player); + return false; + } + + @Override + public boolean isEnabled() { + return SkyblockerConfigManager.get().helpers.enableWardrobeHelper; + } +} diff --git a/src/main/java/de/hysky/skyblocker/utils/container/RegexContainerMatcher.java b/src/main/java/de/hysky/skyblocker/utils/container/RegexContainerMatcher.java index 4f9d49ae..0cd3c867 100644 --- a/src/main/java/de/hysky/skyblocker/utils/container/RegexContainerMatcher.java +++ b/src/main/java/de/hysky/skyblocker/utils/container/RegexContainerMatcher.java @@ -23,7 +23,7 @@ public abstract class RegexContainerMatcher implements ContainerMatcher { public final Pattern titlePattern; @Nullable - public String[] groups = null; + protected String[] groups = null; @Override public boolean test(@NotNull Screen screen) { @@ -61,8 +61,4 @@ public abstract class RegexContainerMatcher implements ContainerMatcher { public @Nullable Pattern getTitlePattern() { return titlePattern; } - - public final @Nullable String[] getGroups() { - return groups; - } } -- cgit