diff options
| author | Kevin <92656833+kevinthegreat1@users.noreply.github.com> | 2024-04-28 14:46:28 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-04-28 14:46:28 -0400 |
| commit | 75547cb59396252f8e5bde41181b9f27c655ccf2 (patch) | |
| tree | 9e24bb51bed5c65758c6b762a05c2ea9bb761ff1 /src/main/java/de/hysky/skyblocker/skyblock/garden | |
| parent | 115078d8ce5584fa1bae256d4a44696c6ac79b44 (diff) | |
| parent | 76d03afae9e757510fae0ae5ac701c26d19f6327 (diff) | |
| download | Skyblocker-75547cb59396252f8e5bde41181b9f27c655ccf2.tar.gz Skyblocker-75547cb59396252f8e5bde41181b9f27c655ccf2.tar.bz2 Skyblocker-75547cb59396252f8e5bde41181b9f27c655ccf2.zip | |
Merge pull request #675 from viciscat/fixes-and-things
Fixes and things
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/skyblock/garden')
| -rw-r--r-- | src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java | 46 |
1 files changed, 30 insertions, 16 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java index 2805cb0e..ff6086d3 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/garden/VisitorHelper.java @@ -1,5 +1,6 @@ package de.hysky.skyblocker.skyblock.garden; +import com.mojang.authlib.properties.Property; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.itemlist.ItemRepository; import de.hysky.skyblocker.utils.ItemUtils; @@ -7,14 +8,17 @@ import de.hysky.skyblocker.utils.NEURepoManager; import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.scheduler.MessageScheduler; import io.github.moulberry.repo.data.NEUItem; +import it.unimi.dsi.fastutil.Pair; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectObjectImmutablePair; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.component.DataComponentTypes; import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.screen.ScreenHandler; import net.minecraft.screen.slot.Slot; import net.minecraft.text.Text; @@ -33,7 +37,8 @@ import java.util.Map; public class VisitorHelper { private static final Logger LOGGER = LoggerFactory.getLogger("Skyblocker Visitor Helper"); - private static final Map<String, Object2IntMap<String>> itemMap = new HashMap<>(); + // The pair contains the name of the visitor and the texture if the icon is a player head + private static final Map<Pair<String, String>, Object2IntMap<String>> itemMap = new HashMap<>(); private static final Map<String, ItemStack> itemCache = new HashMap<>(); private static final int TEXT_START_X = 4; private static final int TEXT_START_Y = 4; @@ -57,7 +62,7 @@ public class VisitorHelper { public static void onMouseClicked(double mouseX, double mouseY, int mouseButton, TextRenderer textRenderer) { int yPosition = TEXT_START_Y; - for (Map.Entry<String, Object2IntMap<String>> visitorEntry : itemMap.entrySet()) { + for (Map.Entry<Pair<String, String>, Object2IntMap<String>> visitorEntry : itemMap.entrySet()) { int textWidth; int textHeight = textRenderer.fontHeight; @@ -76,9 +81,9 @@ public class VisitorHelper { } } - public static void onSlotClick(Slot slot, int slotId, String title) { + public static void onSlotClick(Slot slot, int slotId, String title, ItemStack visitorHeadStack) { if (slotId == 29 || slotId == 13 || slotId == 33) { - itemMap.remove(title); + itemMap.remove(new ObjectObjectImmutablePair<>(title, getTextureOrNull(visitorHeadStack))); } } @@ -87,33 +92,42 @@ public class VisitorHelper { if (visitorItem == null || !visitorItem.contains(DataComponentTypes.LORE) || ItemUtils.getLoreLineIf(visitorItem, t -> t.contains("Times Visited")) == null) return; ItemStack acceptButton = handler.getSlot(29).getStack(); if (acceptButton == null) return; - processLore(visitorName, ItemUtils.getLore(acceptButton)); + processLore(visitorName, getTextureOrNull(visitorItem), ItemUtils.getLore(acceptButton)); } - private static void processLore(String visitorName, List<Text> loreList) { + private static @Nullable String getTextureOrNull(ItemStack stack) { + if (!stack.isOf(Items.PLAYER_HEAD) || stack.get(DataComponentTypes.PROFILE) == null) return null; + return stack.get(DataComponentTypes.PROFILE).properties().get("textures").stream() + .map(Property::value) + .findFirst() + .orElse(null); + } + + private static void processLore(String visitorName, @Nullable String visitorTexture, List<Text> loreList) { boolean saveRequiredItems = false; - for (int i = 0; i < loreList.size(); i++) { - String lore = loreList.get(i).getString(); + for (Text text : loreList) { + String lore = text.getString(); if (lore.contains("Items Required")) saveRequiredItems = true; else if (lore.contains("Rewards")) break; else if (saveRequiredItems) - updateItemMap(visitorName, loreList.get(i)); + updateItemMap(visitorName, visitorTexture, text); } } - private static void updateItemMap(String visitorName, Text lore) { + private static void updateItemMap(String visitorName, @Nullable String visitorTexture, Text lore) { String[] splitItemText = lore.getString().split(" x"); String itemName = splitItemText[0].trim(); if (itemName.isEmpty()) return; try { int amount = splitItemText.length == 2 ? NumberFormat.getInstance(Locale.US).parse(splitItemText[1].trim()).intValue() : 1; - Object2IntMap<String> visitorMap = itemMap.getOrDefault(visitorName, new Object2IntOpenHashMap<>()); + Pair<String, String> key = Pair.of(visitorName, visitorTexture); + Object2IntMap<String> visitorMap = itemMap.getOrDefault(key, new Object2IntOpenHashMap<>()); visitorMap.putIfAbsent(itemName, amount); - itemMap.putIfAbsent(visitorName, visitorMap); + itemMap.putIfAbsent(key, visitorMap); } catch (Exception e) { - LOGGER.error("[Skyblocker Visitor Helper] Failed to parse item: " + lore.getString(), e); + LOGGER.error("[Skyblocker Visitor Helper] Failed to parse item: {}", lore.getString(), e); } } @@ -121,9 +135,9 @@ public class VisitorHelper { context.getMatrices().push(); context.getMatrices().translate(0, 0, 200); int index = 0; - for (Map.Entry<String, Object2IntMap<String>> visitorEntry : itemMap.entrySet()) { - String visitorName = visitorEntry.getKey(); - drawTextWithOptionalUnderline(context, textRenderer, Text.literal(visitorName), TEXT_START_X, TEXT_START_Y + index * (LINE_SPACING + textRenderer.fontHeight), mouseX, mouseY); + for (Map.Entry<Pair<String, String>, Object2IntMap<String>> visitorEntry : itemMap.entrySet()) { + Pair<String, String> visitorName = visitorEntry.getKey(); + drawTextWithOptionalUnderline(context, textRenderer, Text.literal(visitorName.left()), TEXT_START_X, TEXT_START_Y + index * (LINE_SPACING + textRenderer.fontHeight), mouseX, mouseY); index++; for (Object2IntMap.Entry<String> itemEntry : visitorEntry.getValue().object2IntEntrySet()) { |
