From 95a14c80563a248ea302d3bcd112fc6a4b8d1e42 Mon Sep 17 00:00:00 2001 From: viciscat <51047087+viciscat@users.noreply.github.com> Date: Mon, 22 Jul 2024 19:59:59 +0200 Subject: code the thing --- .../de/hysky/skyblocker/skyblock/ChestValue.java | 110 ++++++++++++++++++--- 1 file changed, 96 insertions(+), 14 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java index 908525e1..7d91ef2c 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java @@ -1,25 +1,31 @@ package de.hysky.skyblocker.skyblock; -import com.google.gson.JsonObject; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.config.configs.DungeonsConfig; import de.hysky.skyblocker.config.configs.UIAndVisualsConfig; import de.hysky.skyblocker.mixins.accessors.HandledScreenAccessor; import de.hysky.skyblocker.mixins.accessors.ScreenAccessor; -import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.Utils; import it.unimi.dsi.fastutil.doubles.DoubleBooleanPair; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.fabricmc.fabric.api.client.screen.v1.Screens; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.ingame.GenericContainerScreen; import net.minecraft.client.gui.tooltip.Tooltip; import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.client.gui.widget.TextWidget; import net.minecraft.item.ItemStack; import net.minecraft.screen.GenericContainerScreenHandler; import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Style; import net.minecraft.text.Text; +import net.minecraft.util.Util; +import net.minecraft.util.math.MathHelper; import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,6 +39,7 @@ public class ChestValue { private static final Logger LOGGER = LoggerFactory.getLogger(ChestValue.class); private static final Set DUNGEON_CHESTS = Set.of("Wood Chest", "Gold Chest", "Diamond Chest", "Emerald Chest", "Obsidian Chest", "Bedrock Chest"); private static final Pattern ESSENCE_PATTERN = Pattern.compile("(?[A-Za-z]+) Essence x(?[0-9]+)"); + private static final Pattern MINION_PATTERN = Pattern.compile("Minion (I|II|III|IV|V|VI|VII|VIII|IX|X|XI|XII)$"); private static final DecimalFormat FORMATTER = new DecimalFormat("#,###"); public static void init() { @@ -43,19 +50,28 @@ public class ChestValue { if (DUNGEON_CHESTS.contains(titleString)) { if (SkyblockerConfigManager.get().dungeons.dungeonChestProfit.enableProfitCalculator) { ScreenEvents.afterTick(screen).register(screen_ -> - ((ScreenAccessor) screen).setTitle(getDungeonChestProfit(genericContainerScreen.getScreenHandler(), title, titleString)) + { + Text dungeonChestProfit = getDungeonChestProfit(genericContainerScreen.getScreenHandler()); + if (dungeonChestProfit != null) addValueToContainer(genericContainerScreen, dungeonChestProfit, title); + } ); } } else if (SkyblockerConfigManager.get().uiAndVisuals.chestValue.enableChestValue && !titleString.equals("SkyBlock Menu")) { + boolean minion = MINION_PATTERN.matcher(title.getString().trim()).find(); Screens.getButtons(screen).add(ButtonWidget .builder(Text.literal("$"), buttonWidget -> { Screens.getButtons(screen).remove(buttonWidget); - ScreenEvents.afterTick(screen).register(screen_ -> - ((ScreenAccessor) screen).setTitle(getChestValue(genericContainerScreen.getScreenHandler(), title, titleString)) + ScreenEvents.afterTick(screen).register(screen_ -> { + Text chestValue = getChestValue(genericContainerScreen.getScreenHandler(), minion); + if (chestValue != null) { + addValueToContainer(genericContainerScreen, chestValue, title); + } + + } ); }) .dimensions(((HandledScreenAccessor) genericContainerScreen).getX() + ((HandledScreenAccessor) genericContainerScreen).getBackgroundWidth() - 16, ((HandledScreenAccessor) genericContainerScreen).getY() + 4, 12, 12) - .tooltip(Tooltip.of(Text.translatable("skyblocker.config.general.chestValue.@Tooltip"))) + .tooltip(minion ? Tooltip.of(Text.translatable("skyblocker.config.general.minionValue.@Tooltip")) : Tooltip.of(Text.translatable("skyblocker.config.general.chestValue.@Tooltip"))) .build() ); } @@ -63,14 +79,34 @@ public class ChestValue { }); } - private static Text getDungeonChestProfit(GenericContainerScreenHandler handler, Text title, String titleString) { + private static void addValueToContainer(GenericContainerScreen genericContainerScreen, Text chestValue, Text title) { + // If the contents get updated the widgets get added again, I have no idea why and I don't feel like debugging this. + Screens.getButtons(genericContainerScreen).removeIf(clickableWidget -> clickableWidget instanceof ScrollingTextWidget); + int backgroundWidth = ((HandledScreenAccessor) genericContainerScreen).getBackgroundWidth(); + int y = ((HandledScreenAccessor) genericContainerScreen).getY(); + int x = ((HandledScreenAccessor) genericContainerScreen).getX(); + ((ScreenAccessor) genericContainerScreen).setTitle(Text.empty()); + TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; + int chestValueWidth = Math.min(textRenderer.getWidth(chestValue), Math.max((backgroundWidth - 8) / 2 - 2, backgroundWidth - 8 - textRenderer.getWidth(title))); + + TextWidget chestValueWidget = new ScrollingTextWidget(chestValueWidth, textRenderer.fontHeight, chestValue, textRenderer); + chestValueWidget.setPosition(x + backgroundWidth - chestValueWidget.getWidth() - 4, y + 6); + Screens.getButtons(genericContainerScreen).add(chestValueWidget); + + ScrollingTextWidget chestTitleWidget = new ScrollingTextWidget(backgroundWidth - 8 - chestValueWidth - 2, textRenderer.fontHeight, title.copy().fillStyle(Style.EMPTY.withColor(4210752)), textRenderer); + chestTitleWidget.shadow = false; + chestTitleWidget.setPosition(x + 8, y + 6); + Screens.getButtons(genericContainerScreen).add(chestTitleWidget); + } + + private static @Nullable Text getDungeonChestProfit(GenericContainerScreenHandler handler) { try { double profit = 0; boolean hasIncompleteData = false, usedKismet = false; List slots = handler.slots.subList(0, handler.getRows() * 9); //If the item stack for the "Open Reward Chest" button or the kismet button hasn't been sent to the client yet - if (slots.get(31).getStack().isEmpty() || slots.get(50).getStack().isEmpty()) return title; + if (slots.get(31).getStack().isEmpty() || slots.get(50).getStack().isEmpty()) return null; for (Slot slot : slots) { ItemStack stack = slot.getStack(); @@ -138,19 +174,28 @@ public class ChestValue { profit -= kismetPriceData.leftDouble(); } - return Text.literal(titleString).append(getProfitText((long) profit, hasIncompleteData)); + return getProfitText((long) profit, hasIncompleteData); } catch (Exception e) { LOGGER.error("[Skyblocker Profit Calculator] Failed to calculate dungeon chest profit! ", e); } - return title; + return null; } - private static Text getChestValue(GenericContainerScreenHandler handler, Text title, String titleString) { + private static @Nullable Text getChestValue(GenericContainerScreenHandler handler, boolean minion) { try { double value = 0; boolean hasIncompleteData = false; - List slots = handler.slots.subList(0, handler.getRows() * 9); + List slots; + if (minion) { + slots = handler.slots.subList(0, handler.getRows() * 9).stream().filter(slot -> { + int x = slot.id % 9; + int y = slot.id / 9; + return x > 2 && x < 8 && y > 1 && y < 5; + }).toList(); + } else { + slots = handler.slots.subList(0, handler.getRows() * 9); + } for (Slot slot : slots) { ItemStack stack = slot.getStack(); @@ -169,12 +214,12 @@ public class ChestValue { } } - return Text.literal(titleString).append(getValueText((long) value, hasIncompleteData)); + return getValueText((long) value, hasIncompleteData); } catch (Exception e) { LOGGER.error("[Skyblocker Value Calculator] Failed to calculate dungeon chest value! ", e); } - return title; + return null; } /** @@ -193,4 +238,41 @@ public class ChestValue { UIAndVisualsConfig.ChestValue config = SkyblockerConfigManager.get().uiAndVisuals.chestValue; return Text.literal(' ' + FORMATTER.format(value) + " Coins").formatted(hasIncompleteData ? config.incompleteColor : config.color); } + + + + private static class ScrollingTextWidget extends TextWidget { + + public boolean shadow = true; + + public ScrollingTextWidget(int width, int height, Text message, TextRenderer textRenderer) { + super(width, height, message, textRenderer); + alignLeft(); + } + + @Override + public void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) { + draw(context, getTextRenderer(), getMessage(), getX(), getRight()); + } + + // Yoinked from ClickableWidget + protected void draw( + DrawContext context, TextRenderer textRenderer, Text text, int startX, int endX + ) { + int i = textRenderer.getWidth(text); + int k = endX - startX; + if (i > k) { + int l = i - k; + double d = (double) Util.getMeasuringTimeMs() / 600.0; + double e = Math.max((double)l * 0.5, 3.0); + double f = Math.sin((Math.PI / 2) * Math.cos((Math.PI * 2) * d / e)) / 2.0 + 0.5; + double g = MathHelper.lerp(f, 0.0, l); + context.enableScissor(startX, getY(), endX, getY() + textRenderer.fontHeight); + context.drawText(textRenderer, text, startX - (int)g, getY(), -1, shadow); + context.disableScissor(); + } else { + context.drawText(textRenderer, text, startX, getY(), -1, shadow); + } + } + } } -- cgit From b2387842f889bfc66dd2600171f01c8734aadbd2 Mon Sep 17 00:00:00 2001 From: viciscat <51047087+viciscat@users.noreply.github.com> Date: Mon, 22 Jul 2024 21:59:05 +0200 Subject: minion held coins and fix stupid --- .../de/hysky/skyblocker/skyblock/ChestValue.java | 36 +++++++++++++--------- 1 file changed, 21 insertions(+), 15 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java index 7d91ef2c..5cab28e7 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java @@ -18,6 +18,7 @@ import net.minecraft.client.gui.tooltip.Tooltip; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.TextWidget; import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.screen.GenericContainerScreenHandler; import net.minecraft.screen.slot.Slot; import net.minecraft.text.Style; @@ -30,6 +31,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.text.DecimalFormat; +import java.text.ParseException; import java.util.List; import java.util.Set; import java.util.regex.Matcher; @@ -49,26 +51,18 @@ public class ChestValue { String titleString = title.getString(); if (DUNGEON_CHESTS.contains(titleString)) { if (SkyblockerConfigManager.get().dungeons.dungeonChestProfit.enableProfitCalculator) { - ScreenEvents.afterTick(screen).register(screen_ -> - { - Text dungeonChestProfit = getDungeonChestProfit(genericContainerScreen.getScreenHandler()); - if (dungeonChestProfit != null) addValueToContainer(genericContainerScreen, dungeonChestProfit, title); - } - ); + Text dungeonChestProfit = getDungeonChestProfit(genericContainerScreen.getScreenHandler()); + if (dungeonChestProfit != null) addValueToContainer(genericContainerScreen, dungeonChestProfit, title); } } else if (SkyblockerConfigManager.get().uiAndVisuals.chestValue.enableChestValue && !titleString.equals("SkyBlock Menu")) { boolean minion = MINION_PATTERN.matcher(title.getString().trim()).find(); Screens.getButtons(screen).add(ButtonWidget .builder(Text.literal("$"), buttonWidget -> { Screens.getButtons(screen).remove(buttonWidget); - ScreenEvents.afterTick(screen).register(screen_ -> { Text chestValue = getChestValue(genericContainerScreen.getScreenHandler(), minion); - if (chestValue != null) { - addValueToContainer(genericContainerScreen, chestValue, title); - } - - } - ); + if (chestValue != null) { + addValueToContainer(genericContainerScreen, chestValue, title); + } }) .dimensions(((HandledScreenAccessor) genericContainerScreen).getX() + ((HandledScreenAccessor) genericContainerScreen).getBackgroundWidth() - 16, ((HandledScreenAccessor) genericContainerScreen).getY() + 4, 12, 12) .tooltip(minion ? Tooltip.of(Text.translatable("skyblocker.config.general.minionValue.@Tooltip")) : Tooltip.of(Text.translatable("skyblocker.config.general.chestValue.@Tooltip"))) @@ -80,8 +74,6 @@ public class ChestValue { } private static void addValueToContainer(GenericContainerScreen genericContainerScreen, Text chestValue, Text title) { - // If the contents get updated the widgets get added again, I have no idea why and I don't feel like debugging this. - Screens.getButtons(genericContainerScreen).removeIf(clickableWidget -> clickableWidget instanceof ScrollingTextWidget); int backgroundWidth = ((HandledScreenAccessor) genericContainerScreen).getBackgroundWidth(); int y = ((HandledScreenAccessor) genericContainerScreen).getY(); int x = ((HandledScreenAccessor) genericContainerScreen).getX(); @@ -193,6 +185,20 @@ public class ChestValue { int y = slot.id / 9; return x > 2 && x < 8 && y > 1 && y < 5; }).toList(); + ItemStack stack; + String coinsLine; + if (handler.slots.size() > 28 && + (stack = handler.slots.get(28).getStack()).isOf(Items.HOPPER) && + (coinsLine = ItemUtils.getLoreLineIf(stack, s -> s.contains("Held Coins:"))) != null) { + + String source = coinsLine.split(":")[1]; + try { + value += DecimalFormat.getNumberInstance(java.util.Locale.US).parse(source.trim()).doubleValue(); + } catch (ParseException e) { + LOGGER.warn("[Skyblocker] Failed to parse {}", source); + } + + } } else { slots = handler.slots.subList(0, handler.getRows() * 9); } -- cgit From a0f0bfe5655434d440bb7cbaddd6765afef52e21 Mon Sep 17 00:00:00 2001 From: viciscat <51047087+viciscat@users.noreply.github.com> Date: Tue, 30 Jul 2024 20:37:03 +0200 Subject: wow so crazy --- .../de/hysky/skyblocker/skyblock/ChestValue.java | 59 ++++++++++++---------- 1 file changed, 32 insertions(+), 27 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java index 5cab28e7..861bf0c4 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java @@ -51,18 +51,24 @@ public class ChestValue { String titleString = title.getString(); if (DUNGEON_CHESTS.contains(titleString)) { if (SkyblockerConfigManager.get().dungeons.dungeonChestProfit.enableProfitCalculator) { - Text dungeonChestProfit = getDungeonChestProfit(genericContainerScreen.getScreenHandler()); - if (dungeonChestProfit != null) addValueToContainer(genericContainerScreen, dungeonChestProfit, title); + ScreenEvents.afterTick(screen).register(ignored -> { + Text dungeonChestProfit = getDungeonChestProfit(genericContainerScreen.getScreenHandler()); + if (dungeonChestProfit != null) + addValueToContainer(genericContainerScreen, dungeonChestProfit, title); + }); } } else if (SkyblockerConfigManager.get().uiAndVisuals.chestValue.enableChestValue && !titleString.equals("SkyBlock Menu")) { boolean minion = MINION_PATTERN.matcher(title.getString().trim()).find(); Screens.getButtons(screen).add(ButtonWidget .builder(Text.literal("$"), buttonWidget -> { Screens.getButtons(screen).remove(buttonWidget); + ScreenEvents.afterTick(screen).register(ignored -> { Text chestValue = getChestValue(genericContainerScreen.getScreenHandler(), minion); - if (chestValue != null) { - addValueToContainer(genericContainerScreen, chestValue, title); - } + if (chestValue != null) { + addValueToContainer(genericContainerScreen, chestValue, title); + } + }); + }) .dimensions(((HandledScreenAccessor) genericContainerScreen).getX() + ((HandledScreenAccessor) genericContainerScreen).getBackgroundWidth() - 16, ((HandledScreenAccessor) genericContainerScreen).getY() + 4, 12, 12) .tooltip(minion ? Tooltip.of(Text.translatable("skyblocker.config.general.minionValue.@Tooltip")) : Tooltip.of(Text.translatable("skyblocker.config.general.chestValue.@Tooltip"))) @@ -73,24 +79,6 @@ public class ChestValue { }); } - private static void addValueToContainer(GenericContainerScreen genericContainerScreen, Text chestValue, Text title) { - int backgroundWidth = ((HandledScreenAccessor) genericContainerScreen).getBackgroundWidth(); - int y = ((HandledScreenAccessor) genericContainerScreen).getY(); - int x = ((HandledScreenAccessor) genericContainerScreen).getX(); - ((ScreenAccessor) genericContainerScreen).setTitle(Text.empty()); - TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; - int chestValueWidth = Math.min(textRenderer.getWidth(chestValue), Math.max((backgroundWidth - 8) / 2 - 2, backgroundWidth - 8 - textRenderer.getWidth(title))); - - TextWidget chestValueWidget = new ScrollingTextWidget(chestValueWidth, textRenderer.fontHeight, chestValue, textRenderer); - chestValueWidget.setPosition(x + backgroundWidth - chestValueWidget.getWidth() - 4, y + 6); - Screens.getButtons(genericContainerScreen).add(chestValueWidget); - - ScrollingTextWidget chestTitleWidget = new ScrollingTextWidget(backgroundWidth - 8 - chestValueWidth - 2, textRenderer.fontHeight, title.copy().fillStyle(Style.EMPTY.withColor(4210752)), textRenderer); - chestTitleWidget.shadow = false; - chestTitleWidget.setPosition(x + 8, y + 6); - Screens.getButtons(genericContainerScreen).add(chestTitleWidget); - } - private static @Nullable Text getDungeonChestProfit(GenericContainerScreenHandler handler) { try { double profit = 0; @@ -245,13 +233,30 @@ public class ChestValue { return Text.literal(' ' + FORMATTER.format(value) + " Coins").formatted(hasIncompleteData ? config.incompleteColor : config.color); } + private static void addValueToContainer(GenericContainerScreen genericContainerScreen, Text chestValue, Text title) { + Screens.getButtons(genericContainerScreen).removeIf(clickableWidget -> clickableWidget instanceof ChestValueTextWidget); + int backgroundWidth = ((HandledScreenAccessor) genericContainerScreen).getBackgroundWidth(); + int y = ((HandledScreenAccessor) genericContainerScreen).getY(); + int x = ((HandledScreenAccessor) genericContainerScreen).getX(); + ((ScreenAccessor) genericContainerScreen).setTitle(Text.empty()); + TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; + int chestValueWidth = Math.min(textRenderer.getWidth(chestValue), Math.max((backgroundWidth - 8) / 2 - 2, backgroundWidth - 8 - textRenderer.getWidth(title))); + TextWidget chestValueWidget = new ChestValueTextWidget(chestValueWidth, textRenderer.fontHeight, chestValue, textRenderer); + chestValueWidget.setPosition(x + backgroundWidth - chestValueWidget.getWidth() - 4, y + 6); + Screens.getButtons(genericContainerScreen).add(chestValueWidget); + + ChestValueTextWidget chestTitleWidget = new ChestValueTextWidget(backgroundWidth - 8 - chestValueWidth - 2, textRenderer.fontHeight, title.copy().fillStyle(Style.EMPTY.withColor(4210752)), textRenderer); + chestTitleWidget.shadow = false; + chestTitleWidget.setPosition(x + 8, y + 6); + Screens.getButtons(genericContainerScreen).add(chestTitleWidget); + } - private static class ScrollingTextWidget extends TextWidget { + private static class ChestValueTextWidget extends TextWidget { public boolean shadow = true; - public ScrollingTextWidget(int width, int height, Text message, TextRenderer textRenderer) { + public ChestValueTextWidget(int width, int height, Text message, TextRenderer textRenderer) { super(width, height, message, textRenderer); alignLeft(); } @@ -270,11 +275,11 @@ public class ChestValue { if (i > k) { int l = i - k; double d = (double) Util.getMeasuringTimeMs() / 600.0; - double e = Math.max((double)l * 0.5, 3.0); + double e = Math.max((double) l * 0.5, 3.0); double f = Math.sin((Math.PI / 2) * Math.cos((Math.PI * 2) * d / e)) / 2.0 + 0.5; double g = MathHelper.lerp(f, 0.0, l); context.enableScissor(startX, getY(), endX, getY() + textRenderer.fontHeight); - context.drawText(textRenderer, text, startX - (int)g, getY(), -1, shadow); + context.drawText(textRenderer, text, startX - (int) g, getY(), -1, shadow); context.disableScissor(); } else { context.drawText(textRenderer, text, startX, getY(), -1, shadow); -- cgit From 9696338aa62f5eb4a1cecdcb99dd720c0839c417 Mon Sep 17 00:00:00 2001 From: viciscat <51047087+viciscat@users.noreply.github.com> Date: Wed, 31 Jul 2024 20:18:20 +0200 Subject: รน MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../de/hysky/skyblocker/skyblock/ChestValue.java | 38 ++++++++++------------ 1 file changed, 17 insertions(+), 21 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java index 861bf0c4..0c908b5f 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/ChestValue.java @@ -26,6 +26,7 @@ import net.minecraft.text.Text; import net.minecraft.util.Util; import net.minecraft.util.math.MathHelper; import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -166,34 +167,21 @@ public class ChestValue { try { double value = 0; boolean hasIncompleteData = false; - List slots; - if (minion) { - slots = handler.slots.subList(0, handler.getRows() * 9).stream().filter(slot -> { - int x = slot.id % 9; - int y = slot.id / 9; - return x > 2 && x < 8 && y > 1 && y < 5; - }).toList(); - ItemStack stack; - String coinsLine; - if (handler.slots.size() > 28 && - (stack = handler.slots.get(28).getStack()).isOf(Items.HOPPER) && - (coinsLine = ItemUtils.getLoreLineIf(stack, s -> s.contains("Held Coins:"))) != null) { + List slots = minion ? getMinionSlots(handler) : handler.slots.subList(0, handler.getRows() * 9); + for (Slot slot : slots) { + ItemStack stack = slot.getStack(); + if (stack.isEmpty()) { + continue; + } + String coinsLine; + if (minion && slot.id == 28 && stack.isOf(Items.HOPPER) && (coinsLine = ItemUtils.getLoreLineIf(stack, s -> s.contains("Held Coins:"))) != null) { String source = coinsLine.split(":")[1]; try { value += DecimalFormat.getNumberInstance(java.util.Locale.US).parse(source.trim()).doubleValue(); } catch (ParseException e) { LOGGER.warn("[Skyblocker] Failed to parse {}", source); } - - } - } else { - slots = handler.slots.subList(0, handler.getRows() * 9); - } - - for (Slot slot : slots) { - ItemStack stack = slot.getStack(); - if (stack.isEmpty()) { continue; } @@ -216,6 +204,14 @@ public class ChestValue { return null; } + private static @NotNull List getMinionSlots(GenericContainerScreenHandler handler) { + return handler.slots.subList(0, handler.getRows() * 9).stream().filter(slot -> { + int x = slot.id % 9; + int y = slot.id / 9; + return x > 2 && x < 8 && y > 1 && y < 5 || slot.id == 28; + }).toList(); + } + /** * Searches for a specific string of characters in the name and lore of an item */ -- cgit