diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java index 065157d203..20e3610880 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/MuseumTooltip.java @@ -25,11 +25,7 @@ public void addToTooltip(@Nullable Slot focusedSlot, ItemStack stack, List "%-18s"; - case "Armor" -> "%-19s"; - default -> "%-20s"; - }; + String format = "%-20s"; //Special case the special category so that it doesn't always display not donated if (itemCategory.equals("Special")) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/museum/ItemFilter.java b/src/main/java/de/hysky/skyblocker/skyblock/museum/ItemFilter.java index 84f59be968..1a4a9d618e 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/museum/ItemFilter.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/museum/ItemFilter.java @@ -1,86 +1,57 @@ package de.hysky.skyblocker.skyblock.museum; -import java.util.List; -import java.util.function.UnaryOperator; -import java.util.stream.Collectors; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.components.Tooltip; import net.minecraft.network.chat.Component; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; +import net.minecraft.network.chat.MutableComponent; -public class ItemFilter { - private FilterMode currentFilterMode = FilterMode.ALL; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; - // Filtering logic methods - private static final UnaryOperator> FILTER_ALL = donations -> donations; - private static final UnaryOperator> FILTER_WEAPONS = donations -> - donations.stream().filter(d -> "weapons".equals(d.getCategory())).collect(Collectors.toList()); - private static final UnaryOperator> FILTER_ARMOR = donations -> - donations.stream().filter(d -> "armor".equals(d.getCategory())).collect(Collectors.toList()); - private static final UnaryOperator> FILTER_RARITIES = donations -> - donations.stream().filter(d -> "rarities".equals(d.getCategory())).collect(Collectors.toList()); +public class ItemFilter { + private final List categories = new ArrayList<>(); + private int filterIndex = 0; + + public void updateCategories() { + categories.clear(); + this.categories.add("All"); + this.categories.addAll(MuseumItemCache.MUSEUM_CATEGORIES); + this.categories.remove("special"); + filterIndex = Math.min(filterIndex, categories.size()-1); + } // Method to cycle through filtering modes and apply the corresponding logic public void cycleFilterMode(List items, List filteredList) { - // Cycle to the next filter mode - currentFilterMode = FilterMode.values()[(currentFilterMode.ordinal() + 1) % FilterMode.values().length]; - // Apply the filtering logic for the current mode - currentFilterMode.applyFilter(items, filteredList); + if (categories.isEmpty()) return; + filterIndex = (filterIndex + 1) % categories.size(); + applyFilter(items, filteredList); } public void applyFilter(List items, List filteredList) { - currentFilterMode.applyFilter(items, filteredList); - } - - // Get the item associated with the current filter mode - public ItemStack getCurrentFilterItem() { - return currentFilterMode.getAssociatedItem(); + filteredList.clear(); + if (filterIndex == 0) { + filteredList.addAll(items); + } else { + items.stream().filter(d -> d.getCategory().equals(categories.get(filterIndex))).forEach(filteredList::add); + } } public Tooltip getTooltip() { - Component tooltip = Component.translatable("skyblocker.museum.hud.filter").append("\n\n").withStyle(ChatFormatting.GREEN) - .append(getFilterText(FilterMode.ALL)) - .append(getFilterText(FilterMode.WEAPONS)) - .append(getFilterText(FilterMode.ARMOR)) - .append(getFilterText(FilterMode.RARITIES)) - .append("\n").append(Component.translatable("skyblocker.museum.hud.filter.switch").withStyle(ChatFormatting.YELLOW)); + MutableComponent tooltip = Component.translatable("skyblocker.museum.hud.filter").append("\n\n").withStyle(ChatFormatting.GREEN); + int i = 0; + for (String category : categories) { + String categoryName = category.length() < 2 ? category : category.substring(0, 1).toUpperCase(Locale.ENGLISH) + category.substring(1); + tooltip.append(getFilterText(i, Component.literal(categoryName))); + i += 1; + } + tooltip.append("\n").append(Component.translatable("skyblocker.museum.hud.filter.switch").withStyle(ChatFormatting.YELLOW)); return Tooltip.create(tooltip); } - private Component getFilterText(FilterMode mode) { - boolean isCurrent = mode == currentFilterMode; - return Component.literal((isCurrent ? "➤ " : " ")).append(mode.getDisplayName()).append("\n") + private Component getFilterText(int index, Component category) { + boolean isCurrent = index == filterIndex; + return Component.literal((isCurrent ? "➤ " : " ")).append(category).append("\n") .withStyle(isCurrent ? ChatFormatting.AQUA : ChatFormatting.GRAY); } - - public enum FilterMode { - ALL(new ItemStack(Items.NETHER_STAR), FILTER_ALL, Component.translatable("skyblocker.museum.hud.filter.all")), - WEAPONS(new ItemStack(Items.DIAMOND_SWORD), FILTER_WEAPONS, Component.translatable("skyblocker.museum.hud.filter.weapons")), - ARMOR(new ItemStack(Items.DIAMOND_CHESTPLATE), FILTER_ARMOR, Component.translatable("skyblocker.museum.hud.filter.armor")), - RARITIES(new ItemStack(Items.EMERALD), FILTER_RARITIES, Component.translatable("skyblocker.museum.hud.filter.rarities")); - - private final ItemStack associatedItem; - private final UnaryOperator> filterFunction; - private final Component displayName; - - FilterMode(ItemStack item, UnaryOperator> function, Component displayName) { - this.associatedItem = item; - this.filterFunction = function; - this.displayName = displayName; - } - - public ItemStack getAssociatedItem() { - return associatedItem; - } - - public Component getDisplayName() { - return displayName; - } - - public void applyFilter(List items, List filteredList) { - filteredList.clear(); - filteredList.addAll(filterFunction.apply(items)); - } - } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/museum/MuseumItemCache.java b/src/main/java/de/hysky/skyblocker/skyblock/museum/MuseumItemCache.java index 9443e8daee..0715ad1d45 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/museum/MuseumItemCache.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/museum/MuseumItemCache.java @@ -11,6 +11,7 @@ import com.mojang.util.UndashedUuid; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.annotations.Init; +import de.hysky.skyblocker.debug.Debug; import de.hysky.skyblocker.events.SkyblockEvents; import de.hysky.skyblocker.utils.Constants; import de.hysky.skyblocker.utils.Http; @@ -51,6 +52,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executors; @@ -71,6 +73,7 @@ public class MuseumItemCache { /** Set Id -> Display Item Id */ public static final Map ARMOR_TO_ID = Object2ObjectMaps.synchronize(new Object2ObjectArrayMap<>()); private static final Map MAPPED_IDS = Object2ObjectMaps.synchronize(new Object2ObjectArrayMap<>()); + public static Set MUSEUM_CATEGORIES = Set.of(); public static final ObjectList MUSEUM_DONATIONS = ObjectLists.synchronize(new ObjectArrayList<>()); private static final ObjectList> ORDERED_UPGRADES = ObjectLists.synchronize(new ObjectArrayList<>()); @@ -95,6 +98,16 @@ private static void registerCommands(CommandDispatcher { + ctx.getSource().sendFeedback(Component.literal("Reloading...")); + loadMuseumItems(); + ctx.getSource().sendFeedback(Component.literal("Reloaded!")); + return Command.SINGLE_SUCCESS; + })) + ) + ); } /** @@ -107,6 +120,7 @@ public static void loadMuseumItems() { MAPPED_IDS.clear(); MUSEUM_DONATIONS.clear(); ORDERED_UPGRADES.clear(); + MUSEUM_CATEGORIES = Set.of(); NEURepoFile filePath = NEURepoManager.file(CONSTANTS_MUSEUM_DATA); if (filePath == null) return; @@ -120,23 +134,18 @@ public static void loadMuseumItems() { Map setsToItems = json.get("sets_to_items").getAsJsonObject().asMap(); Map children = json.get("children").getAsJsonObject().asMap(); Map armorToId = json.get("armor_to_id").getAsJsonObject().asMap(); - - Map allDonations = Map.of( - "weapons", json.get("weapons").getAsJsonArray(), - "armor", json.get("armor").getAsJsonArray(), - "rarities", json.get("rarities").getAsJsonArray() - ); - mappedIds.forEach((s, jsonElement) -> MAPPED_IDS.put(s, jsonElement.getAsString())); - for (Map.Entry entry : allDonations.entrySet()) { - String category = entry.getKey(); - JsonArray array = entry.getValue(); + Map itemCategories = json.get("items").getAsJsonObject().asMap(); + MUSEUM_CATEGORIES = itemCategories.keySet(); + itemCategories.forEach((category, elem) -> { + JsonArray array = elem.getAsJsonArray(); + if (category.equals("special")) return; for (JsonElement element : array) { String itemID = element.getAsString(); List> set = new ArrayList<>(); - if (category.equals("armor")) { + if (armorToId.containsKey(itemID)) { boolean isEquipment = true; for (JsonElement jsonElement : setsToItems.get(itemID).getAsJsonArray()) { if (isEquipment) isEquipment = MuseumUtils.isEquipment(jsonElement.getAsString()); @@ -149,7 +158,8 @@ public static void loadMuseumItems() { .orElse(itemID); ARMOR_NAMES.put(itemID, MuseumUtils.formatArmorName(realId, isEquipment)); } - int itemXP = itemToXp.get(itemID).getAsInt(); + int itemXP = 0; + if (itemToXp.containsKey(itemID)) itemXP = itemToXp.get(itemID).getAsInt(); List upgrades = getUpgrades(children, itemID); if (!upgrades.isEmpty()) { @@ -179,7 +189,7 @@ public static void loadMuseumItems() { MUSEUM_DONATIONS.add(new Donation(category, itemID, set, itemXP)); } - } + }); MUSEUM_DONATIONS.forEach(donation -> { for (List list : ORDERED_UPGRADES) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/museum/MuseumManager.java b/src/main/java/de/hysky/skyblocker/skyblock/museum/MuseumManager.java index 5992c71099..fb96940baf 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/museum/MuseumManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/museum/MuseumManager.java @@ -1,6 +1,7 @@ package de.hysky.skyblocker.skyblock.museum; import com.google.common.collect.Lists; +import de.hysky.skyblocker.skyblock.tabhud.util.Ico; import de.hysky.skyblocker.utils.hoveredItem.HoveredItemStackProvider; import com.mojang.datafixers.util.Either; import de.hysky.skyblocker.skyblock.item.wikilookup.WikiLookupManager; @@ -75,6 +76,7 @@ public MuseumManager(Screen screen, int x, int y, int backgroundWidth) { this.prevPageButton = new ImageButton(getX() + 38, getY() + 133, 12, 17, RecipeBookPage.PAGE_BACKWARD_SPRITES, _ignored -> {}); donations = MuseumItemCache.getDonations(); + ITEM_FILTER.updateCategories(); // Create donation buttons for pagination for (int i = 0; i < BUTTONS_PER_PAGE; i++) { @@ -206,9 +208,8 @@ protected void renderWidget(GuiGraphics context, int mouseX, int mouseY, float d if (this.filterButton.active) { int iconX = this.filterButton.getX() + (this.filterButton.getWidth() - 16) / 2; int iconY = this.filterButton.getY() + (this.filterButton.getHeight() - 16) / 2; - ItemStack stack = ITEM_FILTER.getCurrentFilterItem(); filterButton.render(context, mouseX, mouseY, delta); - context.renderFakeItem(stack, iconX, iconY); + context.renderFakeItem(Ico.HOPPER, iconX, iconY); } if (ItemRepository.filesImported()) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/Ico.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/Ico.java index 10950dbedf..d2c96f013d 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/Ico.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/Ico.java @@ -95,4 +95,5 @@ public class Ico { public static final ItemStack CATACOMBS = ItemUtils.createSkull(HeadTextures.CATACOMBS); public static final ItemStack MADDOX_BATPHONE = ItemUtils.createSkull(HeadTextures.MADDOX_BATPHONE); public static final ItemStack LEAD = Items.LEAD.getDefaultInstance(); + public static final ItemStack HOPPER = Items.HOPPER.getDefaultInstance(); }