From 6af04833db55d5958b1c045321a9e9bea5a8d23b Mon Sep 17 00:00:00 2001 From: Alex <8379108+Alex33856@users.noreply.github.com> Date: Mon, 7 Jul 2025 13:11:07 -0400 Subject: Bazaar Quick Quantities (#1354) * Initial implementation # Conflicts: # src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java # src/main/java/de/hysky/skyblocker/config/configs/UIAndVisualsConfig.java * Add clipboard button * Move to Bazaar package, call AbstractSignEditScreen#close instead of removing screen * Fix last input not being updated when using Bazaar Quick Quantity button --- .../config/categories/UIAndVisualsCategory.java | 42 +++++++++++++++++ .../config/configs/UIAndVisualsConfig.java | 14 ++++++ .../skyblocker/mixins/SignEditScreenMixin.java | 13 ++++++ .../skyblock/bazaar/BazaarQuickQuantities.java | 54 ++++++++++++++++++++++ .../skyblock/calculators/SignCalculator.java | 3 +- .../resources/assets/skyblocker/lang/en_us.json | 6 +++ 6 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/bazaar/BazaarQuickQuantities.java (limited to 'src') diff --git a/src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java index 0685d1c6..87b8a0a3 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/UIAndVisualsCategory.java @@ -561,6 +561,48 @@ public class UIAndVisualsCategory { .build()) .build()) + // Bazaar Quick Quantities + .group(OptionGroup.createBuilder() + .name(Text.translatable("skyblocker.config.uiAndVisuals.bazaarQuickQuantities")) + .collapsed(true) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.uiAndVisuals.bazaarQuickQuantities.enabled")) + .description(Text.translatable("skyblocker.config.uiAndVisuals.bazaarQuickQuantities.enabled.@Tooltip")) + .binding(defaults.uiAndVisuals.bazaarQuickQuantities.enabled, + () -> config.uiAndVisuals.bazaarQuickQuantities.enabled, + newValue -> config.uiAndVisuals.bazaarQuickQuantities.enabled = newValue) + .controller(ConfigUtils.createBooleanController()) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.uiAndVisuals.bazaarQuickQuantities.closeSignOnUse")) + .binding(defaults.uiAndVisuals.bazaarQuickQuantities.closeSignOnUse, + () -> config.uiAndVisuals.bazaarQuickQuantities.closeSignOnUse, + newValue -> config.uiAndVisuals.bazaarQuickQuantities.closeSignOnUse = newValue) + .controller(ConfigUtils.createBooleanController()) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.uiAndVisuals.bazaarQuickQuantities.slotQuantity", 1)) + .binding(defaults.uiAndVisuals.bazaarQuickQuantities.slot1Quantity, + () -> config.uiAndVisuals.bazaarQuickQuantities.slot1Quantity, + newValue -> config.uiAndVisuals.bazaarQuickQuantities.slot1Quantity = newValue) + .controller(IntegerController.createBuilder().range(1, 71680).build()) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.uiAndVisuals.bazaarQuickQuantities.slotQuantity", 2)) + .binding(defaults.uiAndVisuals.bazaarQuickQuantities.slot2Quantity, + () -> config.uiAndVisuals.bazaarQuickQuantities.slot2Quantity, + newValue -> config.uiAndVisuals.bazaarQuickQuantities.slot2Quantity = newValue) + .controller(IntegerController.createBuilder().range(1, 71680).build()) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.uiAndVisuals.bazaarQuickQuantities.slotQuantity", 3)) + .binding(defaults.uiAndVisuals.bazaarQuickQuantities.slot3Quantity, + () -> config.uiAndVisuals.bazaarQuickQuantities.slot3Quantity, + newValue -> config.uiAndVisuals.bazaarQuickQuantities.slot3Quantity = newValue) + .controller(IntegerController.createBuilder().range(1, 71680).build()) + .build()) + .build()) + //Input Calculator .group(OptionGroup.createBuilder() .name(Text.translatable("skyblocker.config.uiAndVisuals.inputCalculator")) diff --git a/src/main/java/de/hysky/skyblocker/config/configs/UIAndVisualsConfig.java b/src/main/java/de/hysky/skyblocker/config/configs/UIAndVisualsConfig.java index 96086c02..532a87af 100644 --- a/src/main/java/de/hysky/skyblocker/config/configs/UIAndVisualsConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/configs/UIAndVisualsConfig.java @@ -61,6 +61,8 @@ public class UIAndVisualsConfig { public SearchOverlay searchOverlay = new SearchOverlay(); + public BazaarQuickQuantities bazaarQuickQuantities = new BazaarQuickQuantities(); + public InputCalculator inputCalculator = new InputCalculator(); public FlameOverlay flameOverlay = new FlameOverlay(); @@ -320,6 +322,18 @@ public class UIAndVisualsConfig { public List auctionHistory = new ArrayList<>(); } + public static class BazaarQuickQuantities { + public boolean enabled = false; + + public boolean closeSignOnUse = false; + + public int slot1Quantity = 28; + + public int slot2Quantity = 2240; + + public int slot3Quantity = 256; + } + public static class InputCalculator { public boolean enabled = true; diff --git a/src/main/java/de/hysky/skyblocker/mixins/SignEditScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/SignEditScreenMixin.java index 33a51c7d..a7d75b9d 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/SignEditScreenMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/SignEditScreenMixin.java @@ -3,12 +3,14 @@ package de.hysky.skyblocker.mixins; import com.llamalad7.mixinextras.sugar.Local; import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.bazaar.BazaarQuickQuantities; import de.hysky.skyblocker.skyblock.calculators.SignCalculator; import de.hysky.skyblocker.skyblock.speedPreset.SpeedPresets; import de.hysky.skyblocker.utils.Utils; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.AbstractSignEditScreen; +import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.util.InputUtil; import net.minecraft.text.Text; import net.minecraft.util.Formatting; @@ -35,6 +37,17 @@ public abstract class SignEditScreenMixin extends Screen { super(title); } + @Inject(method = "init", at = @At("TAIL")) + private void skyblocker$init(CallbackInfo ci) { + if (Utils.isOnSkyblock()) { + var config = SkyblockerConfigManager.get(); + if (isInputSign() && messages[3].equals("to order") && config.uiAndVisuals.bazaarQuickQuantities.enabled) { + ButtonWidget[] buttons = BazaarQuickQuantities.getButtons(this.width, messages); + for (ButtonWidget button : buttons) if (button != null) addDrawableChild(button); + } + } + } + @Inject(method = "render", at = @At("HEAD")) private void skyblocker$render(CallbackInfo ci, @Local(argsOnly = true) DrawContext context) { if (Utils.isOnSkyblock()) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/bazaar/BazaarQuickQuantities.java b/src/main/java/de/hysky/skyblocker/skyblock/bazaar/BazaarQuickQuantities.java new file mode 100644 index 00000000..fc952cbe --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/bazaar/BazaarQuickQuantities.java @@ -0,0 +1,54 @@ +package de.hysky.skyblocker.skyblock.bazaar; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.config.configs.UIAndVisualsConfig; +import de.hysky.skyblocker.skyblock.calculators.SignCalculator; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import org.apache.commons.lang3.math.NumberUtils; + +public class BazaarQuickQuantities { + private static final MinecraftClient client = MinecraftClient.getInstance(); + + public static ButtonWidget[] getButtons(int width, String[] messages) { + ButtonWidget[] buttons = new ButtonWidget[4]; + UIAndVisualsConfig.BazaarQuickQuantities config = SkyblockerConfigManager.get().uiAndVisuals.bazaarQuickQuantities; + + int x = width / 2 + 50; + int y = 45; + + buttons[0] = ButtonWidget.builder(Text.of(String.valueOf(config.slot1Quantity)), + button -> onButtonPressed(messages, config.slot1Quantity)).dimensions(x, y + 20, 50, 20).build(); + buttons[1] = ButtonWidget.builder(Text.of(String.valueOf(config.slot2Quantity)), + button -> onButtonPressed(messages, config.slot2Quantity)).dimensions(x, y + 40, 50, 20).build(); + buttons[2] = ButtonWidget.builder(Text.of(String.valueOf(config.slot3Quantity)), + button -> onButtonPressed(messages, config.slot3Quantity)).dimensions(x, y + 60, 50, 20).build(); + + String clipboard = client.keyboard.getClipboard(); + if (clipboard.length() <= 5 && NumberUtils.isCreatable(clipboard)) { // Only show option if clipboard is numeric + MutableText text = Text.literal(clipboard); + text.styled(style -> style.withColor(Formatting.AQUA)); + + buttons[3] = ButtonWidget.builder(text, + button -> onButtonPressed(messages, clipboard)).dimensions(x, y + 80, 50, 20).build(); + } + return buttons; + } + + static void onButtonPressed(String[] messages, int value) { + onButtonPressed(messages, String.valueOf(value)); + } + + static void onButtonPressed(String[] messages, String value) { + messages[0] = value; + + UIAndVisualsConfig.BazaarQuickQuantities config = SkyblockerConfigManager.get().uiAndVisuals.bazaarQuickQuantities; + if (config.closeSignOnUse && client.currentScreen != null) { + SignCalculator.calculate(messages[0]); // Avoid conflict on `finishEditing` with SignCalculator + client.currentScreen.close(); + } + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/calculators/SignCalculator.java b/src/main/java/de/hysky/skyblocker/skyblock/calculators/SignCalculator.java index 4a43dbff..fad2f810 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/calculators/SignCalculator.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/calculators/SignCalculator.java @@ -27,14 +27,13 @@ public class SignCalculator { calculate(message); render(context, message, renderX, renderY); - - lastInput = message; } @VisibleForTesting public static void calculate(String message) { //only update output if new input if (!message.equals(lastInput)) { + lastInput = message; try { output = Calculator.calculate(message); } catch (Exception e) { diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index 97c6c350..8ad7f78a 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -955,6 +955,12 @@ "skyblocker.config.uiAndVisuals.healthBars.emptyBarColor": "Empty Health Bar Color", "skyblocker.config.uiAndVisuals.healthBars.emptyBarColor.@Tooltip": "Color of health bar when mob is at full hp", + "skyblocker.config.uiAndVisuals.bazaarQuickQuantities": "Bazaar Quick Quantities", + "skyblocker.config.uiAndVisuals.bazaarQuickQuantities.enabled": "Enabled", + "skyblocker.config.uiAndVisuals.bazaarQuickQuantities.enabled.@Tooltip": "Adds 3 buttons to quickly fill out Bazaar buy order amounts", + "skyblocker.config.uiAndVisuals.bazaarQuickQuantities.closeSignOnUse": "Close Sign on Use", + "skyblocker.config.uiAndVisuals.bazaarQuickQuantities.slotQuantity": "Slot #%s Quantity", + "skyblocker.config.uiAndVisuals.inputCalculator": "Input Calculator", "skyblocker.config.uiAndVisuals.inputCalculator.enabled": "Enable Sign Calculator", "skyblocker.config.uiAndVisuals.inputCalculator.enabled.@Tooltip": "Enables the ability for you to do calculations when inputting values such as price for the ah.\n Key:\n S = 64\n E = 160\n K = 1,000\n M = 1,000,000\n B = 1,000,000,000\n\n purse/P = current purse value", -- cgit