diff options
| author | nmccullagh <narhanael64@gmail.com> | 2024-07-03 20:43:31 +0100 |
|---|---|---|
| committer | nmccullagh <narhanael64@gmail.com> | 2024-07-06 19:01:10 +0100 |
| commit | 9bce5935109c2922887e282e8fc093b13e49c0a4 (patch) | |
| tree | a5745322ac1ed2ac10ba8388c4e05ede97e01ff7 /src/main/java | |
| parent | ff1d61e162ea1f1fd5e49584d00a3ce1128ff6fc (diff) | |
| download | Skyblocker-9bce5935109c2922887e282e8fc093b13e49c0a4.tar.gz Skyblocker-9bce5935109c2922887e282e8fc093b13e49c0a4.tar.bz2 Skyblocker-9bce5935109c2922887e282e8fc093b13e49c0a4.zip | |
some changes
Diffstat (limited to 'src/main/java')
21 files changed, 277 insertions, 166 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/PetCache.java b/src/main/java/de/hysky/skyblocker/skyblock/PetCache.java index 8d0406cb..8ddcd60e 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/PetCache.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/PetCache.java @@ -133,13 +133,14 @@ public class PetCache { return CACHED_PETS.containsKey(uuid) && CACHED_PETS.get(uuid).containsKey(profileId) ? CACHED_PETS.get(uuid).get(profileId) : null; } - public record PetInfo(String type, double exp, String tier, Optional<String> uuid, Optional<String> item) { + public record PetInfo(String type, double exp, String tier, Optional<String> uuid, Optional<String> item, Optional<String> skin) { public static final Codec<PetInfo> CODEC = RecordCodecBuilder.create(instance -> instance.group( Codec.STRING.fieldOf("type").forGetter(PetInfo::type), Codec.DOUBLE.fieldOf("exp").forGetter(PetInfo::exp), Codec.STRING.fieldOf("tier").forGetter(PetInfo::tier), Codec.STRING.optionalFieldOf("uuid").forGetter(PetInfo::uuid), - Codec.STRING.optionalFieldOf("heldItem").forGetter(PetInfo::item)) + Codec.STRING.optionalFieldOf("heldItem").forGetter(PetInfo::item), + Codec.STRING.optionalFieldOf("skin").forGetter(PetInfo::skin)) .apply(instance, PetInfo::new)); private static final Codec<Object2ObjectOpenHashMap<String, Object2ObjectOpenHashMap<String, PetInfo>>> SERIALIZATION_CODEC = Codec.unboundedMap(Codec.STRING, Codec.unboundedMap(Codec.STRING, CODEC).xmap(Object2ObjectOpenHashMap::new, Object2ObjectOpenHashMap::new) diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/ProfileViewerNavButton.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/ProfileViewerNavButton.java index d867a0e6..16f7eb28 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/ProfileViewerNavButton.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/ProfileViewerNavButton.java @@ -1,7 +1,7 @@ package de.hysky.skyblocker.skyblock.profileviewer; import com.mojang.blaze3d.systems.RenderSystem; -import de.hysky.skyblocker.skyblock.profileviewer.utils.SkullCreator; +import de.hysky.skyblocker.skyblock.profileviewer.utils.ProfileViewerUtils; import de.hysky.skyblocker.skyblock.tabhud.util.Ico; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; @@ -22,9 +22,9 @@ public class ProfileViewerNavButton extends ClickableWidget { private static final Map<String, ItemStack> HEAD_ICON = Map.ofEntries( Map.entry("Skills", Ico.IRON_SWORD), - Map.entry("Slayers", SkullCreator.createSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHBzOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzkzMzZkN2NjOTVjYmY2Njg5ZjVlOGM5NTQyOTRlYzhkMWVmYzQ5NGE0MDMxMzI1YmI0MjdiYzgxZDU2YTQ4NGQifX19")), + Map.entry("Slayers", ProfileViewerUtils.createSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHBzOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzkzMzZkN2NjOTVjYmY2Njg5ZjVlOGM5NTQyOTRlYzhkMWVmYzQ5NGE0MDMxMzI1YmI0MjdiYzgxZDU2YTQ4NGQifX19")), Map.entry("Pets", Ico.BONE), - Map.entry("Dungeons", SkullCreator.createSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHBzOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzliNTY4OTViOTY1OTg5NmFkNjQ3ZjU4NTk5MjM4YWY1MzJkNDZkYjljMWIwMzg5YjhiYmViNzA5OTlkYWIzM2QifX19")), + Map.entry("Dungeons", ProfileViewerUtils.createSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHBzOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzliNTY4OTViOTY1OTg5NmFkNjQ3ZjU4NTk5MjM4YWY1MzJkNDZkYjljMWIwMzg5YjhiYmViNzA5OTlkYWIzM2QifX19")), Map.entry("Inventories", Ico.E_CHEST), Map.entry("Collections", Ico.PAINTING) ); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/collections/GenericCategory.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/collections/GenericCategory.java index ef26332e..e842939a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/collections/GenericCategory.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/collections/GenericCategory.java @@ -5,13 +5,12 @@ import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.skyblock.itemlist.ItemRepository; import de.hysky.skyblocker.skyblock.profileviewer.ProfileViewerPage; import de.hysky.skyblocker.skyblock.tabhud.util.Ico; -import de.hysky.skyblocker.utils.NEURepoManager; -import io.github.moulberry.repo.data.NEUItem; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.LoreComponent; +import net.minecraft.component.type.NbtComponent; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.tooltip.TooltipType; @@ -21,17 +20,18 @@ import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; import java.awt.*; -import java.text.NumberFormat; +import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; -import java.util.*; +import java.util.Map; import static de.hysky.skyblocker.skyblock.profileviewer.ProfileViewerScreen.fetchCollectionsData; +import static de.hysky.skyblocker.skyblock.profileviewer.utils.ProfileViewerUtils.COMMA_FORMATTER; public class GenericCategory implements ProfileViewerPage { private final String category; private final LinkedList<ItemStack> collections = new LinkedList<>(); private static final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; - private static final NumberFormat FORMATTER = NumberFormat.getInstance(Locale.US); private static final Identifier BUTTON_TEXTURE = Identifier.of(SkyblockerMod.NAMESPACE, "textures/gui/profile_viewer/button_icon_toggled.png"); private static final int COLUMN_GAP = 26; private static final int ROW_GAP = 34; @@ -61,40 +61,50 @@ public class GenericCategory implements ProfileViewerPage { JsonObject playerCollection = pProfile.getAsJsonObject("collection"); for (String collection : collectionsMap.get(this.category)) { - Map<String, NEUItem> items = NEURepoManager.NEU_REPO.getItems().getItems(); - ItemStack itemStack = items.values().stream() - .filter(i -> Formatting.strip(i.getSkyblockItemId()).equals(ICON_TRANSLATION.getOrDefault(collection, collection).replace(':', '-'))) - .findFirst() - .map(NEUItem::getSkyblockItemId) - .map(ItemRepository::getItemStack) - .map(ItemStack::copy) - .orElse(Ico.BARRIER.copy()); + ItemStack itemStack = ItemRepository.getItemStack(ICON_TRANSLATION.getOrDefault(collection, collection).replace(':', '-')); + itemStack = itemStack == null ? Ico.BARRIER.copy() : itemStack.copy(); + + if (itemStack.getItem().getName().getString().equals("Barrier")) { + itemStack.set(DataComponentTypes.CUSTOM_NAME, Text.of(collection)); + System.out.println(collection); + System.out.println(this.category); + } + + Style style = Style.EMPTY.withColor(Formatting.WHITE).withItalic(false); + itemStack.set(DataComponentTypes.CUSTOM_NAME, Text.literal(Formatting.strip(itemStack.getComponents().get(DataComponentTypes.CUSTOM_NAME).getString())).setStyle(style)); - if (itemStack.getItem().getName().getString().equals("Barrier")) itemStack.set(DataComponentTypes.ITEM_NAME, Text.of(collection)); int personalColl = playerCollection != null && playerCollection.has(collection) ? playerCollection.get(collection).getAsInt() : 0; - int coopColl = 0; + int totalCollection = 0; for (String member : hProfile.get("members").getAsJsonObject().keySet()) { if (!hProfile.getAsJsonObject("members").getAsJsonObject(member).has("collection")) continue; JsonObject memberColl = hProfile.getAsJsonObject("members").getAsJsonObject(member).getAsJsonObject("collection"); - coopColl += memberColl.has(collection) ? memberColl.get(collection).getAsInt() : 0; + totalCollection += memberColl.has(collection) ? memberColl.get(collection).getAsInt() : 0; } - int collectionTier = calculateTier(coopColl, tierRequirementsMap.get(collection)); + int collectionTier = calculateTier(totalCollection, tierRequirementsMap.get(collection)); List<Integer> tierRequirements = tierRequirementsMap.get(collection); List<Text> lore = new ArrayList<>(); - Style style = Style.EMPTY.withItalic(false); - lore.add(Text.literal("Collection: " + FORMATTER.format(personalColl)).setStyle(style).formatted(Formatting.YELLOW)); + lore.add(Text.literal("Collection Item").setStyle(style).formatted(Formatting.DARK_GRAY)); + lore.add(Text.empty()); + if (hProfile.get("members").getAsJsonObject().keySet().size() > 1) { - lore.add(Text.literal("Co-op Collection: " + FORMATTER.format(coopColl)).setStyle(style).formatted(Formatting.AQUA)); + lore.add(Text.literal("Personal: " + COMMA_FORMATTER.format(personalColl)).setStyle(style).formatted(Formatting.GOLD)); + lore.add(Text.literal("Co-op Collection: " + COMMA_FORMATTER.format(totalCollection-personalColl)).setStyle(style).formatted(Formatting.AQUA)); } - lore.add(Text.literal("Collection Tier: " + collectionTier).setStyle(style).formatted(Formatting.LIGHT_PURPLE)); - itemStack.set(DataComponentTypes.LORE, new LoreComponent(lore)); + lore.add(Text.literal("Collection: " + COMMA_FORMATTER.format(totalCollection)).setStyle(style).formatted(Formatting.YELLOW)); + + lore.add(Text.empty()); + lore.add(Text.literal("Collection Tier: " + collectionTier + "/" + tierRequirements.size()).setStyle(style).formatted(Formatting.LIGHT_PURPLE)); if (collectionTier == tierRequirements.size()) itemStack.set(DataComponentTypes.ENCHANTMENT_GLINT_OVERRIDE, true); + itemStack.set(DataComponentTypes.LORE, new LoreComponent(lore)); + + itemStack.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.DEFAULT); + collections.add(itemStack); } } @@ -116,11 +126,16 @@ public class GenericCategory implements ProfileViewerPage { ItemStack itemStack = collections.get(i); List<Text> lore = itemStack.getOrDefault(DataComponentTypes.LORE, LoreComponent.DEFAULT).lines(); for (Text text : lore) { - if (!text.getString().startsWith("Collection Tier: ")) continue; - int cTier = Integer.parseInt(text.getString().substring("Collection Tier: ".length())); - Color colour = Boolean.TRUE.equals(itemStack.get(DataComponentTypes.ENCHANTMENT_GLINT_OVERRIDE)) ? Color.MAGENTA : Color.darkGray; - context.drawText(textRenderer, Text.literal(toRomanNumerals(cTier)), x + 9 - (textRenderer.getWidth(toRomanNumerals(cTier)) / 2), y + 21, colour.getRGB(), false); - break; + if (text.getString().startsWith("Collection Tier: ")) { + String tierText = text.getString().substring("Collection Tier: ".length()); + if (tierText.contains("/")) { + String[] parts = tierText.split("/"); + int cTier = Integer.parseInt(parts[0].trim()); + Color colour = Boolean.TRUE.equals(itemStack.get(DataComponentTypes.ENCHANTMENT_GLINT_OVERRIDE)) ? Color.MAGENTA : Color.darkGray; + context.drawText(textRenderer, Text.literal(toRomanNumerals(cTier)), x + 9 - (textRenderer.getWidth(toRomanNumerals(cTier)) / 2), y + 21, colour.getRGB(), false); + } + break; + } } if (mouseX > x && mouseX < x + 16 && mouseY > y && mouseY < y + 16) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonClassWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonClassWidget.java index 3b847b1b..37953a2b 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonClassWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonClassWidget.java @@ -3,15 +3,20 @@ package de.hysky.skyblocker.skyblock.profileviewer.dungeons; import com.google.gson.JsonObject; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.skyblock.profileviewer.utils.LevelFinder; +import de.hysky.skyblocker.skyblock.profileviewer.utils.ProfileViewerUtils; import de.hysky.skyblocker.skyblock.tabhud.util.Ico; import de.hysky.skyblocker.utils.render.RenderHelper; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; import java.awt.*; +import java.util.ArrayList; +import java.util.List; import java.util.Map; public class DungeonClassWidget { @@ -48,7 +53,7 @@ public class DungeonClassWidget { } } - public void render(DrawContext context, int x, int y) { + public void render(DrawContext context, int mouseX, int mouseY, int x, int y) { context.drawTexture(TEXTURE, x, y, 0, 0, 109, 26, 109, 26); context.drawItem(stack, x + 3, y + 5); if (active) context.drawTexture(ACTIVE_TEXTURE, x + 3, y + 5, 0, 0, 16, 16, 16, 16); @@ -57,6 +62,12 @@ public class DungeonClassWidget { Color fillColor = classLevel.level >= CLASS_CAP ? Color.MAGENTA : Color.GREEN; context.drawGuiTexture(BAR_BACK, x + 30, y + 15, 75, 6); RenderHelper.renderNineSliceColored(context, BAR_FILL, x + 30, y + 15, (int) (75 * classLevel.fill), 6, fillColor); - } + if (mouseX > x + 30 && mouseX < x + 105 && mouseY > y + 12 && mouseY < y + 22){ + List<Text> tooltipText = new ArrayList<>(); + tooltipText.add(Text.literal(this.className).formatted(Formatting.GREEN)); + tooltipText.add(Text.literal("XP: " + ProfileViewerUtils.COMMA_FORMATTER.format(this.classLevel.xp)).formatted(Formatting.GOLD)); + context.drawTooltip(textRenderer, tooltipText, mouseX, mouseY); + } + } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonFloorRunsWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonFloorRunsWidget.java index 7c9206c0..b592266a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonFloorRunsWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonFloorRunsWidget.java @@ -11,6 +11,8 @@ import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; import java.awt.*; +import java.util.ArrayList; +import java.util.List; import java.util.Map; public class DungeonFloorRunsWidget { @@ -26,8 +28,7 @@ public class DungeonFloorRunsWidget { } catch (Exception ignored) {} } - // TODO: Hovering on each floor should probably showcase best run times in a tooltip - public void render(DrawContext context, int x, int y) { + public void render(DrawContext context, int mouseX ,int mouseY, int x, int y) { context.drawTexture(TEXTURE, x, y, 0, 0, 109, 110, 109, 110); context.drawText(textRenderer, Text.literal("Floor Runs").formatted(Formatting.BOLD), x + 6, y + 4, Color.WHITE.getRGB(), true); @@ -36,12 +37,33 @@ public class DungeonFloorRunsWidget { for (String dungeon : DUNGEONS) { JsonObject dungeonData; try { - dungeonData = dungeonsStats.getAsJsonObject(dungeon).getAsJsonObject(dungeon.equals("catacombs") ? "times_played" : "tier_completions"); + dungeonData = dungeonsStats.getAsJsonObject(dungeon).getAsJsonObject("tier_completions"); for (Map.Entry<String, JsonElement> entry : dungeonData.entrySet()) { if (entry.getKey().equals("total")) continue; String textToRender = String.format((dungeon.equals("catacombs") ? "§aF" : "§cM") + "%s§r %s", entry.getKey(), entry.getValue().getAsInt()); context.drawText(textRenderer, textToRender, columnX + 2, elementY + 2, Color.WHITE.getRGB(), true); + if (!entry.getKey().equals("0") && mouseX >= columnX && mouseX <= columnX + 40 && mouseY >= elementY && mouseY <= elementY + 9) { + List<Text> tooltipText = new ArrayList<>(); + tooltipText.add(Text.literal("Personal Bests").formatted(Formatting.BOLD, Formatting.LIGHT_PURPLE)); + + JsonObject fastestTimes = dungeonsStats.getAsJsonObject(dungeon).getAsJsonObject("fastest_time_s"); + if (fastestTimes != null && fastestTimes.has(entry.getKey())) { + tooltipText.add(Text.literal("S Run: " + formatTime(fastestTimes.get(entry.getKey()).getAsLong())).formatted(Formatting.GOLD)); + } + + fastestTimes = dungeonsStats.getAsJsonObject(dungeon).getAsJsonObject("fastest_time_s_plus"); + if (fastestTimes != null && fastestTimes.has(entry.getKey())) { + tooltipText.add(Text.literal("S+ Run: " + formatTime(fastestTimes.get(entry.getKey()).getAsLong())).formatted(Formatting.GOLD)); + } + + fastestTimes = dungeonsStats.getAsJsonObject(dungeon).getAsJsonObject("fastest_time"); + if (fastestTimes != null && fastestTimes.has(entry.getKey()) && tooltipText.size() == 1) { + tooltipText.add(Text.literal("Completion: " + formatTime(fastestTimes.get(entry.getKey()).getAsLong())).formatted(Formatting.GOLD)); + } + + context.drawTooltip(textRenderer, tooltipText, mouseX, mouseY); + } elementY += 11; } @@ -52,4 +74,11 @@ public class DungeonFloorRunsWidget { } } } + + private String formatTime(long milliseconds) { + long seconds = milliseconds / 1000; + long minutes = seconds / 60; + seconds %= 60; + return String.format("%2d:%02d", minutes, seconds); + } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonMiscStatsWidgets.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonMiscStatsWidgets.java index 679cc575..780eec24 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonMiscStatsWidgets.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonMiscStatsWidgets.java @@ -31,7 +31,7 @@ public class DungeonMiscStatsWidgets { secrets = DUNGEONS_DATA.get("secrets").getAsInt(); for (String dungeon : DUNGEONS) { - JsonObject dungeonData = DUNGEONS_DATA.getAsJsonObject("dungeon_types").getAsJsonObject(dungeon).getAsJsonObject(dungeon.equals("catacombs") ? "times_played" : "tier_completions"); + JsonObject dungeonData = DUNGEONS_DATA.getAsJsonObject("dungeon_types").getAsJsonObject(dungeon).getAsJsonObject("tier_completions"); int runs = 0; for (Map.Entry<String, JsonElement> entry : dungeonData.entrySet()) { String key = entry.getKey(); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonsPage.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonsPage.java index b1398661..e0051c88 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonsPage.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/dungeons/DungeonsPage.java @@ -30,10 +30,10 @@ public class DungeonsPage implements ProfileViewerPage { public void render(DrawContext context, int mouseX, int mouseY, float delta, int rootX, int rootY) { dungeonHeaderWidget.render(context, rootX, rootY); - dungeonFloorRunsWidget.render(context, rootX + 113, rootY + 56); + dungeonFloorRunsWidget.render(context, mouseX, mouseY, rootX + 113, rootY + 56); dungeonMiscStatsWidgets.render(context, rootX + 113, rootY); for (int i = 0; i < dungeonClassWidgetsList.size(); i++) { - dungeonClassWidgetsList.get(i).render(context, rootX, rootY + 28 + i * 28); + dungeonClassWidgetsList.get(i).render(context, mouseX, mouseY, rootX, rootY + 28 + i * 28); } } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/Inventory.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/Inventory.java index a2f7d9d6..c24967f9 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/Inventory.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/Inventory.java @@ -49,7 +49,7 @@ public class Inventory implements ProfileViewerPage { context.drawTexture(TEXTURE, rootX, rootYAdjusted + dimensions.leftInt() * 18 + 17, 0, 215, dimensions.rightInt() * 18 + 7, 7); context.drawTexture(TEXTURE, rootX + dimensions.rightInt() * 18 + 7, rootYAdjusted + dimensions.leftInt() * 18 + 17, 169, 215, 7, 7); - context.drawText(textRenderer, containerName, rootX + 7, rootYAdjusted + 7, Color.DARK_GRAY.getRGB(), false); + context.drawText(textRenderer, Text.translatable("skyblocker.profileviewer.inventory." + containerName), rootX + 7, rootYAdjusted + 7, Color.DARK_GRAY.getRGB(), false); if (containerList.size() > itemsPerPage) { previousPage.setX(rootX + 44); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/InventoryPage.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/InventoryPage.java index 8b0cbefc..d215e6fc 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/InventoryPage.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/InventoryPage.java @@ -6,7 +6,7 @@ import de.hysky.skyblocker.skyblock.profileviewer.ProfileViewerScreen; import de.hysky.skyblocker.skyblock.profileviewer.inventory.itemLoaders.BackpackItemLoader; import de.hysky.skyblocker.skyblock.profileviewer.inventory.itemLoaders.PetsInventoryItemLoader; import de.hysky.skyblocker.skyblock.profileviewer.inventory.itemLoaders.WardrobeInventoryItemLoader; -import de.hysky.skyblocker.skyblock.profileviewer.utils.SkullCreator; +import de.hysky.skyblocker.skyblock.profileviewer.utils.ProfileViewerUtils; import de.hysky.skyblocker.skyblock.profileviewer.utils.SubPageSelectButton; import de.hysky.skyblocker.skyblock.tabhud.util.Ico; import it.unimi.dsi.fastutil.ints.IntIntPair; @@ -27,10 +27,10 @@ public class InventoryPage implements ProfileViewerPage { private static final Map<String, ItemStack> ICON_MAP = Map.ofEntries( Map.entry("Wardrobe", Ico.L_CHESTPLATE), Map.entry("Inventory", Ico.CHEST), - Map.entry("Backpack", SkullCreator.createSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHBzOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzYyZjNiM2EwNTQ4MWNkZTc3MjQwMDA1YzBkZGNlZTFjMDY5ZTU1MDRhNjJjZTA5Nzc4NzlmNTVhMzkzOTYxNDYifX19")), + Map.entry("Backpack", ProfileViewerUtils.createSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHBzOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzYyZjNiM2EwNTQ4MWNkZTc3MjQwMDA1YzBkZGNlZTFjMDY5ZTU1MDRhNjJjZTA5Nzc4NzlmNTVhMzkzOTYxNDYifX19")), Map.entry("Pets", Ico.BONE), Map.entry("Enderchest", Ico.E_CHEST), - Map.entry("Accessory Bag", SkullCreator.createSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTYxYTkxOGMwYzQ5YmE4ZDA1M2U1MjJjYjkxYWJjNzQ2ODkzNjdiNGQ4YWEwNmJmYzFiYTkxNTQ3MzA5ODVmZiJ9fX0=")) + Map.entry("Accessory Bag", ProfileViewerUtils.createSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTYxYTkxOGMwYzQ5YmE4ZDA1M2U1MjJjYjkxYWJjNzQ2ODkzNjdiNGQ4YWEwNmJmYzFiYTkxNTQ3MzA5ODVmZiJ9fX0=")) ); private static final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/Pet.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/Pet.java index b3389d39..94928967 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/Pet.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/Pet.java @@ -10,65 +10,89 @@ import de.hysky.skyblocker.utils.NEURepoManager; import io.github.moulberry.repo.constants.PetNumbers; import io.github.moulberry.repo.data.NEUItem; import io.github.moulberry.repo.data.Rarity; -import io.github.moulberry.repo.util.PetId; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.LoreComponent; import net.minecraft.component.type.ProfileComponent; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.nbt.NbtString; import net.minecraft.registry.Registries; +import net.minecraft.text.Style; import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; -import net.minecraft.util.Pair; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; import java.util.regex.Matcher; -import java.util.stream.Collectors; +import java.util.regex.Pattern; import static de.hysky.skyblocker.skyblock.itemlist.ItemStackBuilder.SKULL_TEXTURE_PATTERN; -import static de.hysky.skyblocker.skyblock.itemlist.ItemStackBuilder.SKULL_UUID_PATTERN; public class Pet { private final String name; private final double xp; private final String tier; private final Optional<String> heldItem; + private final Optional<String> skin; + private final Optional<String> skinTexture; private final int level; private final ItemStack icon; + private final Pattern statsMatcher = Pattern.compile("\\{[A-Za-z_]+}"); + private final Pattern numberMatcher = Pattern.compile("\\{\\d+}"); + + + private static final Map<String, Integer> TIER_MAP = Map.of( "COMMON", 0, "UNCOMMON", 1, "RARE", 2, "EPIC", 3, "LEGENDARY", 4, "MYTHIC", 5 ); + private static final Map<Integer, Formatting> RARITY_COLOR_MAP = Map.of( + 0, Formatting.WHITE, // COMMON + 1, Formatting.GREEN, // UNCOMMON + 2, Formatting.BLUE, // RARE + 3, Formatting.DARK_PURPLE, // EPIC + 4, Formatting.GOLD, // LEGENDARY + 5, Formatting.LIGHT_PURPLE // MYTHIC + ); + public Pet(PetCache.PetInfo petData) { this.name = petData.type(); this.xp = petData.exp(); this.heldItem = petData.item(); - if ((heldItem.isPresent() && heldItem.get().equals("PET_ITEM_TIER_BOOST"))) { - this.tier = switch (petData.tier()) { - case "COMMON" -> "UNCOMMON"; - case "UNCOMMON" -> "RARE"; - case "RARE" -> "EPIC"; - case "EPIC" -> "LEGENDARY"; - case "LEGENDARY" -> "MYTHIC"; - default -> petData.tier(); - }; - } else { - this.tier = petData.tier(); - } + this.skin = petData.skin(); + this.skinTexture = calculateSkinTexture(); + this.tier = petData.tier(); this.level = LevelFinder.getLevelInfo(this.name.equals("GOLDEN_DRAGON") ? "PET_GREG" : "PET_" + this.tier, (long) xp).level; this.icon = createIcon(); } - public String getName() { return name; } - public long getXP() { return (long) xp; } - public int getTier() { return TIER_MAP.getOrDefault(tier, 0); } - public String getTierAsString() { return tier; } - public String getSkin() { return null; } + private String getName() { + return name; + } + + public long getXP() { + return (long) xp; + } + + private int getTier() { + return TIER_MAP.getOrDefault(tier, 0); + } + + public String getTierAsString() { + return tier; + } + + private Optional<String> calculateSkinTexture() { + // This should also save: SkullOwner && pet skin name via item.getDisplayName() + if (this.skin.isPresent()) { + NEUItem item = NEURepoManager.NEU_REPO.getItems().getItemBySkyblockId("PET_SKIN_" + this.skin.get()); + if (item == null) return Optional.empty(); + Matcher skullTexture = SKULL_TEXTURE_PATTERN.matcher(item.getNbttag()); + if (skullTexture.find()) return Optional.of(skullTexture.group(1)); + } + return Optional.empty(); + } public int getLevel() { return level; } public ItemStack getIcon() { return icon; } @@ -78,19 +102,15 @@ public class Pet { Map<String, NEUItem> items = NEURepoManager.NEU_REPO.getItems().getItems(); if (items == null) return Ico.BARRIER; - String targetItemId = this.getName() + ";" + this.getTier(); - NEUItem item = items.values().stream() - .filter(i -> Formatting.strip(i.getSkyblockItemId()).equals(targetItemId)) - .findFirst().orElse(null); + String targetItemId = this.getName() + ";" + (this.getTier() + (heldItem.isPresent() && heldItem.get().equals("PET_ITEM_TIER_BOOST") ? 1 : 0)); + NEUItem item = NEURepoManager.NEU_REPO.getItems().getItems().get(targetItemId); - NEUItem petItem = null; - if (this.heldItem.isPresent()) { - petItem = items.values().stream() - .filter(i -> Formatting.strip(i.getSkyblockItemId()).equals(this.heldItem.get())) - .findFirst().orElse(null); + // For cases life RIFT_FERRET Where it can be tier boosted into a pet that otherwise can't exist + if (item == null && heldItem.isPresent() && heldItem.get().equals("PET_ITEM_TIER_BOOST")) { + item = NEURepoManager.NEU_REPO.getItems().getItems().get(getName() + ";" + getTier()); } - return fromNEUItem(item, petItem); + return fromNEUItem(item, this.heldItem.map(ItemRepository::getItemStack).orElse(null)); } /** @@ -100,87 +120,87 @@ public class Pet { * the NBT Data into modern DataComponentTypes before returning the final ItemStack </p * * @param item The NEUItem representing the pet. - * @param helditem The NEUItem representing the held item, if any. + * @param heldItem The NEUItem representing the held item, if any. * @return The ItemStack representing the pet with all its properties set. */ - private ItemStack fromNEUItem(NEUItem item, NEUItem helditem) { - if (item == null) return Ico.BARRIER; - List<Pair<String, String>> injectors = new ArrayList<>(createLoreReplacers(item.getSkyblockItemId(), helditem)); - Identifier itemId = Identifier.of(ItemFixerUpper.convertItemId(item.getMinecraftItemId(), item.getDamage())); - ItemStack stack = new ItemStack(Registries.ITEM.get(itemId)); - - NbtCompound customData = new NbtCompound(); - customData.put(ItemUtils.ID, NbtString.of(item.getSkyblockItemId())); - stack.set(DataComponentTypes.CUSTOM_NAME, Text.of(injectData(item.getDisplayName(), injectors))); - - stack.set(DataComponentTypes.LORE, new LoreComponent( - item.getLore().stream().map(line -> injectData(line, injectors)) - .filter(line -> !line.contains("SKIP")).map(Text::of) - .collect(Collectors.toList( |
