diff options
author | Rime <81419447+Emirlol@users.noreply.github.com> | 2024-07-10 02:07:08 +0300 |
---|---|---|
committer | Rime <81419447+Emirlol@users.noreply.github.com> | 2024-07-10 02:08:24 +0300 |
commit | 1dbb973e791456c418acfa45be824640db2b111f (patch) | |
tree | c27face889863c3d77eda1b95992f3ba21e2f1d2 /src/main/java/de/hysky/skyblocker/skyblock/bazaar/BazaarHelper.java | |
parent | a5d43a82d09e20a0ec37756496b9a7c65b7569c4 (diff) | |
download | Skyblocker-1dbb973e791456c418acfa45be824640db2b111f.tar.gz Skyblocker-1dbb973e791456c418acfa45be824640db2b111f.tar.bz2 Skyblocker-1dbb973e791456c418acfa45be824640db2b111f.zip |
Refactor the bz order helper to display slot text instead of highlights
Also removes the coloring schema option as that's not relevant anymore. Or rather, there's no reasonable way to display the order type anymore without making the item impossible to see.
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/skyblock/bazaar/BazaarHelper.java')
-rw-r--r-- | src/main/java/de/hysky/skyblocker/skyblock/bazaar/BazaarHelper.java | 93 |
1 files changed, 40 insertions, 53 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/bazaar/BazaarHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/bazaar/BazaarHelper.java index 546bc9bc..032d2295 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/bazaar/BazaarHelper.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/bazaar/BazaarHelper.java @@ -1,22 +1,23 @@ package de.hysky.skyblocker.skyblock.bazaar; import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.item.slottext.SlotText; +import de.hysky.skyblocker.skyblock.item.slottext.SlotTextAdder; import de.hysky.skyblocker.utils.ItemUtils; -import de.hysky.skyblocker.utils.render.gui.ColorHighlight; -import de.hysky.skyblocker.utils.render.gui.ContainerSolver; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; import net.minecraft.util.Formatting; import org.apache.commons.lang3.math.NumberUtils; +import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -public class BazaarHelper extends ContainerSolver { - private static final Pattern ORDER_PATTERN = Pattern.compile("You have [\\d,]+ (items|coins) to claim!"); +public class BazaarHelper extends SlotTextAdder { private static final Pattern FILLED_PATTERN = Pattern.compile("Filled: \\S+ \\(?([\\d.]+)%\\)?!?"); public BazaarHelper() { @@ -24,58 +25,44 @@ public class BazaarHelper extends ContainerSolver { } @Override - protected boolean isEnabled() { - return SkyblockerConfigManager.get().helpers.bazaar.enableBazaarHelper; - } + public @NotNull List<SlotText> getText(Slot slot) { + if (!SkyblockerConfigManager.get().helpers.bazaar.enableBazaarHelper) return List.of(); + // Skip the first row as it's always glass panes. + if (slot.id < 10) return List.of(); + // Skip the last 10 items. 11 is subtracted because size is 1-based so the last slot is size - 1. + if (slot.id > slot.inventory.size() - 11) return List.of(); //Note that this also skips the slots in player's inventory (anything above 36/45/54 depending on the order count) - @Override - protected List<ColorHighlight> getColors(String[] groups, Int2ObjectMap<ItemStack> slots) { - ArrayList<ColorHighlight> highlights = new ArrayList<>(); - // Skip the first and last 10 slots as those are always glass panes. - for (int slot = 10; slot < slots.size() - 10; slot++) { - ItemStack item = slots.get(slot); - if (item.isEmpty() || item.isOf(Items.BLACK_STAINED_GLASS_PANE)) continue; - if (ItemUtils.getLoreLineIf(slots.get(slot), str -> str.equals("Expired!")) != null) { - highlights.add(ColorHighlight.red(slot)); - continue; - } - switch (SkyblockerConfigManager.get().helpers.bazaar.highlightingScheme) { - case ORDER_TYPE -> { - Matcher matcher = ItemUtils.getLoreLineIfMatch(slots.get(slot), ORDER_PATTERN); - if (matcher != null) { - switch (matcher.group(1)) { - case "items" -> highlights.add(new ColorHighlight(slot, Formatting.DARK_GREEN.getColorValue() & 0x70000000)); - case "coins" -> highlights.add(new ColorHighlight(slot, Formatting.GOLD.getColorValue() & 0x70000000)); - } - } - } - case FULFILLMENT -> { - Matcher matcher = ItemUtils.getLoreLineIfMatch(slots.get(slot), FILLED_PATTERN); - if (matcher != null) { - int filled = NumberUtils.toInt(matcher.group(1)); - if (filled < 100) { - highlights.add(ColorHighlight.yellow(slot)); - } else if (filled == 100) { - highlights.add(ColorHighlight.green(slot)); - } - } - } + int column = slot.id % 9; + if (column == 0 || column == 8) return List.of(); // Skip the first and last column as those are always glass panes as well. + + ItemStack item = slot.getStack(); + if (item.isEmpty()) return List.of(); //We've skipped all invalid slots, so we can just check if it's not air here. + + ObjectArrayList<SlotText> icons = new ObjectArrayList<>(); + if (ItemUtils.getLoreLineIf(item, str -> str.equals("Expired!")) != null) { + //Todo: Handle the case where the order is close to expiring but hasn't expired yet. + icons.add(SlotText.topRight(getExpiredIcon(true))); + } + + Matcher matcher = ItemUtils.getLoreLineIfMatch(item, FILLED_PATTERN); + if (matcher != null) { + List<Text> lore = ItemUtils.getLore(item); + if (!lore.isEmpty() && lore.getLast().getString().equals("Click to claim!")) { + int filled = NumberUtils.toInt(matcher.group(1)); + icons.add(SlotText.topLeft(getFilledIcon(filled))); } } - return highlights; + return icons; } - public enum HighlightingScheme { - ORDER_TYPE, - FULFILLMENT; + public static @NotNull MutableText getExpiredIcon(boolean expired) { + if (expired) return Text.literal("⏰").withColor(0xe60b1e).formatted(Formatting.BOLD); + return Text.literal("⏰").withColor(0xe6ba0b).formatted(Formatting.BOLD); + } - @Override - public String toString() { - return switch (this) { - case ORDER_TYPE -> "Order Type"; - case FULFILLMENT -> "Fulfillment"; - }; - } + public static @NotNull MutableText getFilledIcon(int filled) { + if (filled < 100) return Text.literal("%").withColor(0xe6ba0b).formatted(Formatting.BOLD); + return Text.literal("✅").withColor(0x1ee60b).formatted(Formatting.BOLD); } } |