From 9bce5935109c2922887e282e8fc093b13e49c0a4 Mon Sep 17 00:00:00 2001 From: nmccullagh Date: Wed, 3 Jul 2024 20:43:31 +0100 Subject: some changes --- .../de/hysky/skyblocker/skyblock/PetCache.java | 5 +- .../profileviewer/ProfileViewerNavButton.java | 6 +- .../profileviewer/collections/GenericCategory.java | 69 ++++--- .../profileviewer/dungeons/DungeonClassWidget.java | 15 +- .../dungeons/DungeonFloorRunsWidget.java | 35 +++- .../dungeons/DungeonMiscStatsWidgets.java | 2 +- .../profileviewer/dungeons/DungeonsPage.java | 4 +- .../profileviewer/inventory/Inventory.java | 2 +- .../profileviewer/inventory/InventoryPage.java | 6 +- .../skyblock/profileviewer/inventory/Pet.java | 224 +++++++++++---------- .../profileviewer/inventory/PlayerInventory.java | 2 +- .../inventory/itemLoaders/BackpackItemLoader.java | 13 +- .../inventory/itemLoaders/ItemLoader.java | 11 +- .../skyblock/profileviewer/skills/SkillWidget.java | 17 +- .../skyblock/profileviewer/skills/SkillsPage.java | 2 +- .../profileviewer/slayers/SlayerWidget.java | 14 +- .../profileviewer/slayers/SlayersPage.java | 2 +- .../skyblock/profileviewer/utils/LevelFinder.java | 5 +- .../profileviewer/utils/ProfileViewerUtils.java | 31 +++ .../skyblock/profileviewer/utils/SkullCreator.java | 27 --- .../profileviewer/utils/SubPageSelectButton.java | 2 +- .../hysky/skyblocker/skyblock/tabhud/util/Ico.java | 1 + 22 files changed, 303 insertions(+), 192 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/profileviewer/utils/ProfileViewerUtils.java delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/profileviewer/utils/SkullCreator.java (limited to 'src/main/java/de/hysky/skyblocker/skyblock') 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 uuid, Optional item) { + public record PetInfo(String type, double exp, String tier, Optional uuid, Optional item, Optional skin) { public static final Codec 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>> 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 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 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 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 tierRequirements = tierRequirementsMap.get(collection); List 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 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 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 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 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 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 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 heldItem; + private final Optional skin; + private final Optional 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 TIER_MAP = Map.of( "COMMON", 0, "UNCOMMON", 1, "RARE", 2, "EPIC", 3, "LEGENDARY", 4, "MYTHIC", 5 ); + private static final Map 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 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 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

> 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()))); - - Matcher skullUuid = SKULL_UUID_PATTERN.matcher(item.getNbttag()); - Matcher skullTexture = SKULL_TEXTURE_PATTERN.matcher(item.getNbttag()); - if (skullUuid.find() && skullTexture.find()) { - UUID uuid = UUID.fromString(skullUuid.group(1)); - String textureValue = this.getSkin() == null ? skullTexture.group(1) : this.getSkin(); - stack.set(DataComponentTypes.PROFILE, new ProfileComponent( - Optional.of(item.getSkyblockItemId()), Optional.of(uuid), - ItemUtils.propertyMapWithTexture(textureValue))); + private ItemStack fromNEUItem(NEUItem item, ItemStack heldItem) { + if (item == null) { + ItemStack errIcon = Ico.BARRIER.copy(); + errIcon.set(DataComponentTypes.CUSTOM_NAME, Text.of(this.getName())); + return errIcon; } - return stack; - } - /** - * Generates a list of placeholder-replacement pairs for the itemName of a pet item. - *

This method uses the pet's data from the NEU repository and uses PetInfo to generate replacers, and optionally - * includes data about a held item.

- * - * @param itemSkyblockID The initial itemName string containing the pet's name and tier separated by a semicolon. - * @param helditem The NEUItem representing the held item, if any. - * @return A list of placeholder-replacement pairs to be used for injecting data into the pet item's itemName. - */ - private List> createLoreReplacers(String itemSkyblockID, NEUItem helditem) { - List> list = new ArrayList<>(); - Map<@PetId String, Map> petNums = NEURepoManager.NEU_REPO.getConstants().getPetNumbers(); - String petName = itemSkyblockID.split(";")[0]; - if (!itemSkyblockID.contains(";") || !petNums.containsKey(petName)) return list; - - Rarity rarity = Rarity.values()[Integer.parseInt(itemSkyblockID.split(";")[1])]; - try { - PetNumbers data = petNums.get(petName).get(rarity); - list.add(new Pair<>("\\{LVL\\}", String.valueOf(this.level))); - data.interpolatedStatsAtLevel(this.level).getStatNumbers().forEach((key, value) -> - list.add(new Pair<>("\\{" + key + "\\}", fixDecimals(value, true)))); - - List otherNumsMin = data.interpolatedStatsAtLevel(this.level).getOtherNumbers(); - for (int i = 0; i < otherNumsMin.size(); ++i) { - list.add(new Pair<>("\\{" + i + "\\}", fixDecimals(otherNumsMin.get(i), false))); + Identifier itemId = Identifier.of(ItemFixerUpper.convertItemId(item.getMinecraftItemId(), item.getDamage())); + ItemStack petStack = new ItemStack(Registries.ITEM.get(itemId)).copy(); + + List lore = item.getLore(); + List formattedLore = new ArrayList<>(); + + Map> petNums = NEURepoManager.NEU_REPO.getConstants().getPetNumbers(); + Rarity rarity = Rarity.values()[getTier()]; + PetNumbers data = petNums.get(getName()).get(rarity); + + for (String line : lore) { + if (line.contains("Right-click to add this") || line.contains("pet menu!")) continue; + + String formattedLine = line; + + Matcher stats = statsMatcher.matcher(formattedLine); + Matcher other = numberMatcher.matcher(formattedLine); + while (stats.find()) { + String placeholder = stats.group(); + String statKey = placeholder.substring(1, placeholder.length() - 1); + String statValue = String.valueOf(fixDecimals(data.interpolatedStatsAtLevel(this.level).getStatNumbers().get(statKey), true)); + formattedLine = formattedLine.replace(placeholder, statValue); } - list.add(new Pair<>("Right-click to add this pet to", - helditem != null ? "§r§6Held Item: " + helditem.getDisplayName() : "SKIP")); - list.add(new Pair<>("pet menu!", "SKIP")); - } catch (Exception e) { - if (petName.equals("GOLDEN_DRAGON")) { - list.add(new Pair<>("Golden Dragon", - "§r§7[Lvl " + this.level + "] " + "§6Golden Dragon Egg §c[Not Supported by NEU-Repo]")); + while (other.find()) { + String placeholder = other.group(); + int numberKey = Integer.parseInt(placeholder.substring(1, placeholder.length() - 1)); + String statValue = String.valueOf(fixDecimals(data.interpolatedStatsAtLevel(this.level).getOtherNumbers().get(numberKey), false)); + formattedLine = formattedLine.replace(placeholder, statValue); } + + formattedLore.add(Text.of(formattedLine)); } - return list; - } - private String injectData(String string, List> injectors) { - for (Pair injector : injectors) { - if (string.contains(injector.getLeft())) return injector.getRight(); - string = string.replaceAll(injector.getLeft(), injector.getRight()); + if (heldItem != null) { + formattedLore.set(formattedLore.size() - 2, Text.of("§r§6Held Item: " + heldItem.getName().getString())); + formattedLore.add(formattedLore.size() - 1, Text.empty()); } - return string; + + // Skin Head Texture + if (skinTexture.isPresent()) { + formattedLore.set(0, Text.of(formattedLore.getFirst().getString() + ", " + Formatting.strip(NEURepoManager.NEU_REPO.getItems().getItems().get("PET_SKIN_" + skin.get()).getDisplayName()))); + petStack.set(DataComponentTypes.PROFILE, new ProfileComponent( + Optional.of(item.getSkyblockItemId()), Optional.of(UUID.randomUUID()), + ItemUtils.propertyMapWithTexture(this.skinTexture.get()))); + } else { + Matcher skullTexture = SKULL_TEXTURE_PATTERN.matcher(item.getNbttag()); + if (skullTexture.find()) { + petStack.set(DataComponentTypes.PROFILE, new ProfileComponent( + Optional.of(item.getSkyblockItemId()), Optional.of(UUID.randomUUID()), + ItemUtils.propertyMapWithTexture(skullTexture.group(1)))); + } + } + + Style style = Style.EMPTY.withItalic(false); + formattedLore.set(formattedLore.size()-1, Text.literal(Rarity.values()[getTier() + (boosted() ? 1 : 0)].toString()).setStyle(style).formatted(Formatting.BOLD, RARITY_COLOR_MAP.get(getTier() + (boosted() ? 1 : 0)))); + + // Update the lore and name + petStack.set(DataComponentTypes.LORE, new LoreComponent(formattedLore)); + petStack.set(DataComponentTypes.CUSTOM_NAME, Text.of(item.getDisplayName().formatted(RARITY_COLOR_MAP.get(this.getTier() + (boosted() ? 1 : 0))).replace("{LVL}", String.valueOf(this.level)))); + + return petStack; } private String fixDecimals(double num, boolean truncate) { - if (num % 1 == 0) return String.valueOf((int) num); - BigDecimal roundedNum = new BigDecimal(num).setScale(3, RoundingMode.HALF_UP); - return truncate && num > 1 ? String.valueOf(roundedNum.intValue()) - : roundedNum.stripTrailingZeros().toPlainString(); + if (num % 1 == 0) return String.valueOf((int) (num)); + BigDecimal roundedNum = new BigDecimal(num).setScale(truncate ? 1 : 3, RoundingMode.HALF_UP); + return roundedNum.stripTrailingZeros().toPlainString(); + } + + private Boolean boosted() { + return this.heldItem.isPresent() && this.heldItem.get().equals("PET_ITEM_TIER_BOOST"); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/PlayerInventory.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/PlayerInventory.java index 26673693..a44d2edc 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/PlayerInventory.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/PlayerInventory.java @@ -49,7 +49,7 @@ public class PlayerInventory implements ProfileViewerPage { context.drawTexture(TEXTURE, rootX + dimensions.rightInt() * 18 + 7, rootY + dimensions.leftInt() * 18 + 17, 169, 215, 7, 7); } - context.drawText(textRenderer, containerName, rootX + 7, rootY + 7, Color.DARK_GRAY.getRGB(), false); + context.drawText(textRenderer, Text.translatable("skyblocker.profileviewer.inventory." + containerName), rootX + 7, rootY + 7, Color.DARK_GRAY.getRGB(), false); } private void drawContainerItems(DrawContext context, int rootX, int rootY, IntIntPair dimensions, int startIndex, int endIndex, int mouseX, int mouseY) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/itemLoaders/BackpackItemLoader.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/itemLoaders/BackpackItemLoader.java index 99e728be..dee2bfaf 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/itemLoaders/BackpackItemLoader.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/itemLoaders/BackpackItemLoader.java @@ -2,7 +2,11 @@ package de.hysky.skyblocker.skyblock.profileviewer.inventory.itemLoaders; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import de.hysky.skyblocker.skyblock.tabhud.util.Ico; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.LoreComponent; import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; import java.util.ArrayList; import java.util.List; @@ -23,9 +27,12 @@ public class BackpackItemLoader extends ItemLoader { for (int i = 0; i < sortedEntries.size(); i++) { backpackItems.addAll(super.loadItems(sortedEntries.get(i).getValue().getAsJsonObject())); - int padding = (i + 1) * 45 % (backpackItems.isEmpty() ? 1 : backpackItems.size()); - for (int j = 0; j < padding; j++) { - backpackItems.add(ItemStack.EMPTY); + int paddingNeeded = (45 - (backpackItems.size() % 45)) % 45; + for (int j = 0; j < paddingNeeded; j++) { + ItemStack paddingItem = Ico.GRAY_DYE.copy(); + paddingItem.set(DataComponentTypes.CUSTOM_NAME, Text.translatable("skyblocker.profileviewer.inventory.inactive")); + paddingItem.set(DataComponentTypes.LORE, new LoreComponent(List.of(Text.translatable("skyblocker.profileviewer.inventory.inactive.description.backpack"),Text.translatable("skyblocker.profileviewer.inventory.inactive.description.general")))); + backpackItems.add(paddingItem); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/itemLoaders/ItemLoader.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/itemLoaders/ItemLoader.java index 9d9b1b07..f3045c11 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/itemLoaders/ItemLoader.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/itemLoaders/ItemLoader.java @@ -12,10 +12,7 @@ import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.NEURepoManager; import io.github.moulberry.repo.data.NEUItem; import net.minecraft.component.DataComponentTypes; -import net.minecraft.component.type.AttributeModifiersComponent; -import net.minecraft.component.type.DyedColorComponent; -import net.minecraft.component.type.LoreComponent; -import net.minecraft.component.type.ProfileComponent; +import net.minecraft.component.type.*; import net.minecraft.datafixer.fix.ItemIdFix; import net.minecraft.datafixer.fix.ItemInstanceTheFlatteningFix; import net.minecraft.item.ItemStack; @@ -44,9 +41,9 @@ public class ItemLoader { } NbtCompound nbttag = containerContent.getCompound(i).getCompound("tag"); - String internalName = nbttag.getCompound("ExtraAttributes").getString("id"); + NbtCompound extraAttributes = nbttag.getCompound("ExtraAttributes"); + String internalName = extraAttributes.getString("id"); if (internalName.equals("PET")) { - NbtCompound extraAttributes = nbttag .getCompound("ExtraAttributes"); PetCache.PetInfo petInfo = PetCache.PetInfo.CODEC.parse(JsonOps.INSTANCE, JsonParser.parseString(extraAttributes.getString("petInfo"))).getOrThrow(); Pet pet = new Pet(petInfo); itemList.add(pet.getIcon()); @@ -114,6 +111,8 @@ public class ItemLoader { // Set Count stack.setCount(containerContent.getCompound(i).getInt("Count")); + stack.set(DataComponentTypes.CUSTOM_DATA, NbtComponent.of(extraAttributes)); + itemList.add(stack); } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/skills/SkillWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/skills/SkillWidget.java index 3a3870f3..51f5e5f4 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/skills/SkillWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/skills/SkillWidget.java @@ -2,16 +2,20 @@ package de.hysky.skyblocker.skyblock.profileviewer.skills; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.skyblock.profileviewer.utils.LevelFinder; -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 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 SkillWidget { @@ -33,7 +37,7 @@ public class SkillWidget { Map.entry("Alchemy", Ico.BREWING_STAND), Map.entry("Taming", Ico.SPAWN_EGG), Map.entry("Carpentry", Ico.CRAFTING_TABLE), - Map.entry("Catacombs", SkullCreator.createSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHBzOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzliNTY4OTViOTY1OTg5NmFkNjQ3ZjU4NTk5MjM4YWY1MzJkNDZkYjljMWIwMzg5YjhiYmViNzA5OTlkYWIzM2QifX19")), + Map.entry("Catacombs", ProfileViewerUtils.createSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHBzOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzliNTY4OTViOTY1OTg5NmFkNjQ3ZjU4NTk5MjM4YWY1MzJkNDZkYjljMWIwMzg5YjhiYmViNzA5OTlkYWIzM2QifX19")), Map.entry("Runecraft", Ico.MAGMA_CREAM), Map.entry("Social", Ico.EMERALD) ); @@ -75,7 +79,7 @@ public class SkillWidget { } - public void render(DrawContext context, int x, int y) { + public void render(DrawContext context, int mouseX, int mouseY, int x, int y) { context.drawItem(this.stack, x + 3, y + 2); context.drawText(textRenderer, SKILL_NAME + " " + SKILL_LEVEL.level, x + 31, y + 2, Color.white.hashCode(), false); @@ -91,5 +95,12 @@ public class SkillWidget { context.drawGuiTexture(BAR_BACK, x + 30, y + 12, 75, 6); RenderHelper.renderNineSliceColored(context, BAR_FILL, x + 30, y + 12, (int) (75 * SKILL_LEVEL.fill), 6, fillColor); + + if (mouseX > x + 30 && mouseX < x + 105 && mouseY > y + 10 && mouseY < y + 19){ + List tooltipText = new ArrayList<>(); + tooltipText.add(Text.literal(this.SKILL_NAME).formatted(Formatting.GREEN)); + tooltipText.add(Text.literal("XP: " + ProfileViewerUtils.COMMA_FORMATTER.format(this.SKILL_LEVEL.xp)).formatted(Formatting.GOLD)); + context.drawTooltip(textRenderer, tooltipText, mouseX, mouseY); + } } } \ No newline at end of file diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/skills/SkillsPage.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/skills/SkillsPage.java index c331bbdd..952e5620 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/skills/SkillsPage.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/skills/SkillsPage.java @@ -41,7 +41,7 @@ public class SkillsPage implements ProfileViewerPage { int x = (i < 6) ? rootX : column2; int y = rootY + (i % 6) * ROW_GAP; context.drawTexture(TEXTURE, x, y, 0, 0, 109, 26, 109, 26); - skillWidgets.get(i).render(context, x, y + 3); + skillWidgets.get(i).render(context, mouseX, mouseY, x, y + 3); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/slayers/SlayerWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/slayers/SlayerWidget.java index a9c05c11..978c58c4 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/slayers/SlayerWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/slayers/SlayerWidget.java @@ -3,15 +3,20 @@ package de.hysky.skyblocker.skyblock.profileviewer.slayers; 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 SlayerWidget { @@ -53,7 +58,7 @@ public class SlayerWidget { } catch (Exception ignored) {} } - 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.drawTexture(this.item, x + 1, y + 3, 0, 0, 20, 20, 20, 20); context.drawText(textRenderer, slayerName + " " + slayerLevel.level, x + 31, y + 5, Color.white.hashCode(), false); @@ -67,6 +72,13 @@ public class SlayerWidget { context.drawGuiTexture(BAR_BACK, x + 30, y + 15, 75, 6); Color fillColor = slayerLevel.fill == 1 ? Color.MAGENTA : Color.green; RenderHelper.renderNineSliceColored(context, BAR_FILL, x + 30, y + 15, (int) (75 * slayerLevel.fill), 6, fillColor); + + if (mouseX > x + 30 && mouseX < x + 105 && mouseY > y + 12 && mouseY < y + 22){ + List tooltipText = new ArrayList<>(); + tooltipText.add(Text.literal(this.slayerName).formatted(Formatting.GREEN)); + tooltipText.add(Text.literal("XP: " + ProfileViewerUtils.COMMA_FORMATTER.format(this.slayerLevel.xp)).formatted(Formatting.GOLD)); + context.drawTooltip(textRenderer, tooltipText, mouseX, mouseY); + } } private int findTotalKills() { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/slayers/SlayersPage.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/slayers/SlayersPage.java index 08e2ca06..528bd3ac 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/slayers/SlayersPage.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/slayers/SlayersPage.java @@ -26,7 +26,7 @@ public class SlayersPage implements ProfileViewerPage { public void render(DrawContext context, int mouseX, int mouseY, float delta, int rootX, int rootY) { for (int i = 0; i < slayerWidgets.size(); i++) { - slayerWidgets.get(i).render(context, rootX, rootY + i * ROW_GAP); + slayerWidgets.get(i).render(context, mouseX, mouseY, rootX, rootY + i * ROW_GAP); } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/utils/LevelFinder.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/utils/LevelFinder.java index b52fd579..9b0fdfb1 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/utils/LevelFinder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/utils/LevelFinder.java @@ -14,7 +14,8 @@ public class LevelFinder { this.level = level; } - public LevelInfo(int level, double fill) { + public LevelInfo(long xp, int level, double fill) { + this.xp = xp; this.level = level; this.fill = fill; } @@ -264,7 +265,7 @@ public class LevelFinder { } else { fill = 1.0; } - return new LevelInfo(boundaries.get(i).level, fill); + return new LevelInfo(xp, boundaries.get(i).level, fill); } } return new LevelInfo(0L, 0); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/utils/ProfileViewerUtils.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/utils/ProfileViewerUtils.java new file mode 100644 index 00000000..dca4dd85 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/utils/ProfileViewerUtils.java @@ -0,0 +1,31 @@ +package de.hysky.skyblocker.skyblock.profileviewer.utils; + +import com.mojang.authlib.properties.Property; +import com.mojang.authlib.properties.PropertyMap; +import de.hysky.skyblocker.skyblock.profileviewer.ProfileViewerScreen; +import net.minecraft.component.DataComponentTypes; +import net.minecraft.component.type.ProfileComponent; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; + +import java.text.NumberFormat; +import java.util.Locale; +import java.util.Optional; +import java.util.UUID; + +public class ProfileViewerUtils { + public static ItemStack createSkull(String textureB64) { + ItemStack skull = new ItemStack(Items.PLAYER_HEAD); + try { + PropertyMap map = new PropertyMap(); + map.put("textures", new Property("textures", textureB64)); + ProfileComponent profile = new ProfileComponent(Optional.of("skull"), Optional.of(UUID.randomUUID()), map); + skull.set(DataComponentTypes.PROFILE, profile); + } catch (Exception e) { + ProfileViewerScreen.LOGGER.error("[Skyblocker Profile Viewer] Failed to create skull", e); + } + return skull; + } + + public static final NumberFormat COMMA_FORMATTER = NumberFormat.getNumberInstance(Locale.US); +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/utils/SkullCreator.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/utils/SkullCreator.java deleted file mode 100644 index b074952c..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/utils/SkullCreator.java +++ /dev/null @@ -1,27 +0,0 @@ -package de.hysky.skyblocker.skyblock.profileviewer.utils; - -import com.mojang.authlib.properties.Property; -import com.mojang.authlib.properties.PropertyMap; -import de.hysky.skyblocker.skyblock.profileviewer.ProfileViewerScreen; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.component.type.ProfileComponent; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; - -import java.util.Optional; -import java.util.UUID; - -public class SkullCreator { - public static ItemStack createSkull(String textureB64) { - ItemStack skull = new ItemStack(Items.PLAYER_HEAD); - try { - PropertyMap map = new PropertyMap(); - map.put("textures", new Property("textures", textureB64)); - ProfileComponent profile = new ProfileComponent(Optional.of("skull"), Optional.of(UUID.randomUUID()), map); - skull.set(DataComponentTypes.PROFILE, profile); - } catch (Exception e) { - ProfileViewerScreen.LOGGER.error("[Skyblocker Profile Viewer] Failed to create skull", e); - } - return skull; - } -} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/utils/SubPageSelectButton.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/utils/SubPageSelectButton.java index 4c9dcda4..8398747d 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/utils/SubPageSelectButton.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/utils/SubPageSelectButton.java @@ -34,7 +34,7 @@ public class SubPageSelectButton extends ClickableWidget { @Override protected void renderWidget(DrawContext context, int mouseX, int mouseY, float delta) { context.fill(this.getX(), this.getY(), this.getX() + 20, this.getY() + 20, Color.BLACK.getRGB()); - context.drawTexture(TEXTURES.get(toggled, isHovered()), this.getX() + 1, this.getY() + 1,0, 0, 18, 18, 18, 18); + context.drawTexture(TEXTURES.get(toggled, (mouseX > getX() && mouseX < getX() + 19 && mouseY > getY() && mouseY < getY() + 19)), this.getX() + 1, this.getY() + 1,0, 0, 18, 18, 18, 18); context.drawItem(ICON, this.getX() + 2, this.getY() + 2); if ((mouseX > getX() + 1 && mouseX < getX() + 19 && mouseY > getY() + 1 && mouseY < getY() + 19)) { LoreComponent lore = ICON.get(DataComponentTypes.LORE); 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 b37a3883..f182a949 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 @@ -73,6 +73,7 @@ public class Ico { public static final ItemStack EXPERIENCE_BOTTLE = new ItemStack(Items.EXPERIENCE_BOTTLE); public static final ItemStack PINK_DYE = new ItemStack(Items.PINK_DYE); public static final ItemStack LIME_DYE = new ItemStack(Items.LIME_DYE); + public static final ItemStack GRAY_DYE = new ItemStack(Items.GRAY_DYE); public static final ItemStack ENCHANTED_BOOK = new ItemStack(Items.ENCHANTED_BOOK); public static final ItemStack SPIDER_EYE = new ItemStack(Items.SPIDER_EYE); public static final ItemStack BLUE_ICE = new ItemStack(Items.BLUE_ICE); -- cgit From 477567dec368705b0b01e5234e789c1d062aa82f Mon Sep 17 00:00:00 2001 From: nmccullagh Date: Thu, 4 Jul 2024 06:52:51 +0100 Subject: few more changes --- .../profileviewer/ProfileViewerScreen.java | 47 ++++++++++++++++------ .../profileviewer/inventory/Inventory.java | 7 ++++ .../profileviewer/inventory/PlayerInventory.java | 6 +++ 3 files changed, 47 insertions(+), 13 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker/skyblock') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/ProfileViewerScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/ProfileViewerScreen.java index 1d0b21ca..f74526a4 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/ProfileViewerScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/ProfileViewerScreen.java @@ -27,6 +27,7 @@ import net.minecraft.client.gui.widget.ClickableWidget; import net.minecraft.client.network.OtherClientPlayerEntity; import net.minecraft.client.network.PlayerListEntry; import net.minecraft.client.util.SkinTextures; +import net.minecraft.command.CommandSource; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerModelPart; import net.minecraft.text.Text; @@ -55,6 +56,7 @@ public class ProfileViewerScreen extends Screen { private String playerName; private JsonObject hypixelProfile; private JsonObject playerProfile; + private boolean profileNotFound = false; private int activePage = 0; private static final String[] PAGE_NAMES = {"Skills", "Slayers", "Dungeons", "Inventories", "Collections"}; @@ -73,6 +75,8 @@ public class ProfileViewerScreen extends Screen { } private void initialisePagesAndWidgets() { + if (profileNotFound) return; + textWidget = new ProfileViewerTextWidget(hypixelProfile, playerProfile); CompletableFuture skillsFuture = CompletableFuture.runAsync(() -> profileViewerPages[0] = new SkillsPage(hypixelProfile, playerProfile)); @@ -105,6 +109,7 @@ public class ProfileViewerScreen extends Screen { button.render(context, mouseX, mouseY, delta); } + if (textWidget != null) textWidget.render(context, textRenderer, rootX + 8, rootY + 120); drawPlayerEntity(context, playerName != null ? playerName : "Loading...", rootX, rootY, mouseX, mouseY); @@ -112,7 +117,7 @@ public class ProfileViewerScreen extends Screen { profileViewerPages[activePage].markWidgetsAsVisible(); profileViewerPages[activePage].render(context, mouseX, mouseY, delta, rootX + 93, rootY + 7); } else { - context.drawText(textRenderer, "Loading...", rootX + 180, rootY + 80, Color.WHITE.getRGB(), true); + context.drawText(textRenderer, profileNotFound ? "No Profile" : "Loading...", rootX + 180, rootY + 80, Color.WHITE.getRGB(), true); } } @@ -120,18 +125,24 @@ public class ProfileViewerScreen extends Screen { if (entity != null) drawEntity(context, rootX + 9, rootY + 16, rootX + 89, rootY + 124, 42, 0.0625F, mouseX, mouseY, entity); context.drawCenteredTextWithShadow(textRenderer, username.length() > 15 ? username.substring(0, 15) : username, rootX + 47, rootY + 14, Color.WHITE.getRGB()); - } private CompletableFuture fetchPlayerData(String username) { CompletableFuture profileFuture = ProfileUtils.fetchFullProfile(username).thenAccept(profiles -> { - this.hypixelProfile = profiles.getAsJsonArray("profiles").asList().stream() - .map(JsonElement::getAsJsonObject) - .filter(profile -> profile.getAsJsonPrimitive("selected").getAsBoolean()) - .findFirst() - .orElseThrow(() -> new IllegalStateException("No selected profile found!")); - - this.playerProfile = hypixelProfile.getAsJsonObject("members").get(ApiUtils.name2Uuid(username)).getAsJsonObject(); + try { + Optional selectedProfile = profiles.getAsJsonArray("profiles").asList().stream() + .map(JsonElement::getAsJsonObject) + .filter(profile -> profile.getAsJsonPrimitive("selected").getAsBoolean()) + .findFirst(); + + if (selectedProfile.isPresent()) { + this.hypixelProfile = selectedProfile.get(); + this.playerProfile = hypixelProfile.getAsJsonObject("members").get(ApiUtils.name2Uuid(username)).getAsJsonObject(); + } + } catch (Exception e) { + this.profileNotFound = true; + LOGGER.warn("[Skyblocker Profile Viewer] Error while looking for profile", e); + } }); CompletableFuture minecraftProfileFuture = SkullBlockEntityAccessor.invokeFetchProfileByName(username).thenAccept(profile -> { @@ -156,12 +167,14 @@ public class ProfileViewerScreen extends Screen { entity.setCustomNameVisible(false); }).exceptionally(ex -> { this.playerName = "User not found"; + this.profileNotFound = true; return null; }); return CompletableFuture.allOf(profileFuture, minecraftProfileFuture); } + public void onNavButtonClick(ProfileViewerNavButton clickedButton) { if (profileViewerPages[activePage] != null) profileViewerPages[activePage].markWidgetsAsInvisible(); for (ProfileViewerNavButton button : profileViewerNavButtons) { @@ -188,10 +201,11 @@ public class ProfileViewerScreen extends Screen { ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> { LiteralArgumentBuilder literalArgumentBuilder = ClientCommandManager.literal("pv") - .then(ClientCommandManager.argument("username", StringArgumentType.string()) - .executes(Scheduler.queueOpenScreenFactoryCommand(context -> new ProfileViewerScreen(StringArgumentType.getString(context, "username")))) - ) - .executes(Scheduler.queueOpenScreenCommand(() -> new ProfileViewerScreen(MinecraftClient.getInstance().getSession().getUsername()))); + .then(ClientCommandManager.argument("username", StringArgumentType.string()) + .suggests((source, builder) -> CommandSource.suggestMatching(getPlayerSuggestions(source.getSource()), builder)) + .executes(Scheduler.queueOpenScreenFactoryCommand(context -> new ProfileViewerScreen(StringArgumentType.getString(context, "username")))) + ) + .executes(Scheduler.queueOpenScreenCommand(() -> new ProfileViewerScreen(MinecraftClient.getInstance().getSession().getUsername()))); dispatcher.register(literalArgumentBuilder); dispatcher.register(ClientCommandManager.literal(SkyblockerMod.NAMESPACE).then(literalArgumentBuilder)); }); @@ -227,4 +241,11 @@ public class ProfileViewerScreen extends Screen { } return Collections.emptyMap(); } + + /** + * Ensures that "dummy" players aren't included in command suggestions + */ + private static String[] getPlayerSuggestions(FabricClientCommandSource source) { + return source.getPlayerNames().stream().filter(playerName -> playerName.matches("[A-Za-z0-9_]+")).toArray(String[]::new); + } } 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 c24967f9..a114f4d6 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 @@ -1,6 +1,8 @@ package de.hysky.skyblocker.skyblock.profileviewer.inventory; import com.google.gson.JsonObject; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.item.ItemRarityBackgrounds; import de.hysky.skyblocker.skyblock.profileviewer.ProfileViewerPage; import de.hysky.skyblocker.skyblock.profileviewer.inventory.itemLoaders.ItemLoader; import it.unimi.dsi.fastutil.ints.IntIntPair; @@ -72,6 +74,11 @@ public class Inventory implements ProfileViewerPage { int x = rootX + 8 + column * 18; int y = rootYAdjusted + 18 + row * 18; + + if (SkyblockerConfigManager.get().general.itemInfoDisplay.itemRarityBackgrounds) { + ItemRarityBackgrounds.tryDraw(containerList.get(startIndex + i), context, x, y); + } + context.drawItem(containerList.get(startIndex + i), x, y); context.drawItemInSlot(textRenderer, containerList.get(startIndex + i), x, y); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/PlayerInventory.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/PlayerInventory.java index a44d2edc..969960d8 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/PlayerInventory.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/PlayerInventory.java @@ -1,6 +1,8 @@ package de.hysky.skyblocker.skyblock.profileviewer.inventory; import com.google.gson.JsonObject; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.item.ItemRarityBackgrounds; import de.hysky.skyblocker.skyblock.profileviewer.ProfileViewerPage; import de.hysky.skyblocker.skyblock.profileviewer.inventory.itemLoaders.InventoryItemLoader; import it.unimi.dsi.fastutil.ints.IntIntPair; @@ -61,6 +63,10 @@ public class PlayerInventory implements ProfileViewerPage { int x = rootX + 8 + column * 18; int y = (rootY + 18 + row * 18) + (dimensions.leftInt() > 1 && row + 1 == dimensions.leftInt() ? 4 : 0); + if (SkyblockerConfigManager.get().general.itemInfoDisplay.itemRarityBackgrounds) { + ItemRarityBackgrounds.tryDraw(containerList.get(startIndex + i), context, x, y); + } + context.drawItem(containerList.get(startIndex + i), x, y); context.drawItemInSlot(textRenderer, containerList.get(startIndex + i), x, y); -- cgit From 3b50cece25be2f5bfec478dbae19ac7217eb821f Mon Sep 17 00:00:00 2001 From: nmccullagh Date: Thu, 4 Jul 2024 09:06:40 +0100 Subject: fix z stacking issues with rarity and tooltip --- .../skyblocker/skyblock/profileviewer/inventory/Inventory.java | 7 +++++-- .../skyblock/profileviewer/inventory/PlayerInventory.java | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker/skyblock') 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 a114f4d6..c4dc6fff 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 @@ -18,6 +18,7 @@ import net.minecraft.util.Identifier; import java.awt.*; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class Inventory implements ProfileViewerPage { @@ -67,6 +68,7 @@ public class Inventory implements ProfileViewerPage { int startIndex = activePage * itemsPerPage; int endIndex = Math.min(startIndex + itemsPerPage, containerList.size()); + List tooltip = Collections.emptyList(); for (int i = 0; i < endIndex - startIndex; i++) { if (containerList.get(startIndex + i) == ItemStack.EMPTY) continue; int column = i % dimensions.rightInt(); @@ -83,10 +85,11 @@ public class Inventory implements ProfileViewerPage { context.drawItemInSlot(textRenderer, containerList.get(startIndex + i), x, y); if (mouseX > x && mouseX < x + 16 && mouseY > y && mouseY < y + 16) { - List tooltip = containerList.get(startIndex + i).getTooltip(Item.TooltipContext.DEFAULT, MinecraftClient.getInstance().player, TooltipType.BASIC); - context.drawTooltip(textRenderer, tooltip, mouseX, mouseY); + tooltip = containerList.get(startIndex + i).getTooltip(Item.TooltipContext.DEFAULT, MinecraftClient.getInstance().player, TooltipType.BASIC); } } + + if (!tooltip.isEmpty()) context.drawTooltip(textRenderer, tooltip, mouseX, mouseY); } public void nextPage() { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/PlayerInventory.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/PlayerInventory.java index 969960d8..0412c32e 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/PlayerInventory.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/PlayerInventory.java @@ -16,12 +16,14 @@ import net.minecraft.text.Text; import net.minecraft.util.Identifier; import java.awt.*; +import java.util.Collections; import java.util.List; public class PlayerInventory implements ProfileViewerPage { private static final Identifier TEXTURE = Identifier.of("textures/gui/container/generic_54.png"); private static final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; private final List containerList; + private List tooltip = Collections.emptyList(); public PlayerInventory(JsonObject inventory) { this.containerList = new InventoryItemLoader().loadItems(inventory); @@ -33,9 +35,11 @@ public class PlayerInventory implements ProfileViewerPage { drawContainerTextures(context, "Inventory", rootX, rootY + 2, IntIntPair.of(4, 9)); drawContainerTextures(context, "Equipment", rootX + 90, rootY + 108, IntIntPair.of(1, 4)); + tooltip.clear(); drawContainerItems(context, rootX, rootY + 108, IntIntPair.of(1, 4), 36, 40, mouseX, mouseY); drawContainerItems(context, rootX, rootY + 2, IntIntPair.of(4, 9), 0, 36, mouseX, mouseY); drawContainerItems(context, rootX + 90, rootY + 108, IntIntPair.of(1, 4), 40, containerList.size(), mouseX, mouseY); + if (!tooltip.isEmpty()) context.drawTooltip(textRenderer, tooltip, mouseX, mouseY); } private void drawContainerTextures(DrawContext context, String containerName, int rootX, int rootY, IntIntPair dimensions) { @@ -71,8 +75,7 @@ public class PlayerInventory implements ProfileViewerPage { context.drawItemInSlot(textRenderer, containerList.get(startIndex + i), x, y); if (mouseX > x && mouseX < x + 16 && mouseY > y && mouseY < y + 16) { - List tooltip = containerList.get(startIndex + i).getTooltip(Item.TooltipContext.DEFAULT, MinecraftClient.getInstance().player, TooltipType.BASIC); - context.drawTooltip(textRenderer, tooltip, mouseX, mouseY); + tooltip = containerList.get(startIndex + i).getTooltip(Item.TooltipContext.DEFAULT, MinecraftClient.getInstance().player, TooltipType.BASIC); } } } -- cgit From a5ae5cbfe7f6056d533e353f84c7258b9f88bf8d Mon Sep 17 00:00:00 2001 From: nmccullagh Date: Sat, 6 Jul 2024 09:11:34 +0100 Subject: nothing to see here --- .../skyblocker/skyblock/profileviewer/collections/GenericCategory.java | 2 +- .../java/de/hysky/skyblocker/skyblock/profileviewer/inventory/Pet.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker/skyblock') 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 e842939a..306fe279 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 @@ -131,7 +131,7 @@ public class GenericCategory implements ProfileViewerPage { 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; + Color colour = itemStack.hasGlint() ? Color.MAGENTA : Color.darkGray; context.drawText(textRenderer, Text.literal(toRomanNumerals(cTier)), x + 9 - (textRenderer.getWidth(toRomanNumerals(cTier)) / 2), y + 21, colour.getRGB(), false); } break; 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 94928967..52d02e99 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 @@ -84,7 +84,6 @@ public class Pet { } private Optional 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(); @@ -200,7 +199,7 @@ public class Pet { return roundedNum.stripTrailingZeros().toPlainString(); } - private Boolean boosted() { + private boolean boosted() { return this.heldItem.isPresent() && this.heldItem.get().equals("PET_ITEM_TIER_BOOST"); } } -- cgit From 666f1569142074467431bf4a9c81cd3603cf0772 Mon Sep 17 00:00:00 2001 From: viciscat <51047087+viciscat@users.noreply.github.com> Date: Sat, 6 Jul 2024 20:15:53 +0200 Subject: fine and you --- .../skyblocker/skyblock/profileviewer/inventory/PlayerInventory.java | 2 +- src/main/resources/assets/skyblocker/lang/en_us.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker/skyblock') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/PlayerInventory.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/PlayerInventory.java index 0412c32e..7a83b2e0 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/PlayerInventory.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/PlayerInventory.java @@ -31,7 +31,7 @@ public class PlayerInventory implements ProfileViewerPage { // Z-STACKING forces this nonsense of separating the Background texture and Item Drawing :( public void render(DrawContext context, int mouseX, int mouseY, float delta, int rootX, int rootY) { - drawContainerTextures(context, "Armour", rootX, rootY + 108, IntIntPair.of(1, 4)); + drawContainerTextures(context, "Armor", rootX, rootY + 108, IntIntPair.of(1, 4)); drawContainerTextures(context, "Inventory", rootX, rootY + 2, IntIntPair.of(4, 9)); drawContainerTextures(context, "Equipment", rootX + 90, rootY + 108, IntIntPair.of(1, 4)); diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index f2ac9b9d..ffbe716f 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -937,7 +937,7 @@ "skyblocker.waypoints.ordered.import.coleWeight.fail": "§cFailed to import waypoints from the Cole Weight format. Make sure to have the waypoint data copied to your clipboard!", "skyblocker.profileviewer.inventory.Inventory": "Inventory", - "skyblocker.profileviewer.inventory.Armour": "Armor", + "skyblocker.profileviewer.inventory.Armor": "Armor", "skyblocker.profileviewer.inventory.Equipment": "Equipment", "skyblocker.profileviewer.inventory.Enderchest": "Enderchest", "skyblocker.profileviewer.inventory.Backpack": "Backpack", -- cgit From 5128fa758a9d63aaba4ddf7204e5ee69c306a57b Mon Sep 17 00:00:00 2001 From: nmccullagh Date: Sat, 6 Jul 2024 19:33:57 +0100 Subject: I'm not too bad myself. Had family over this week which was quite nice --- .../java/de/hysky/skyblocker/skyblock/profileviewer/inventory/Pet.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/main/java/de/hysky/skyblocker/skyblock') 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 52d02e99..9a279bbe 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 @@ -119,7 +119,7 @@ public class Pet { * the NBT Data into modern DataComponentTypes before returning the final ItemStack

Date: Sun, 7 Jul 2024 07:42:36 +0100 Subject: like this Monsieur Aaron? --- .../skyblock/profileviewer/inventory/Inventory.java | 3 ++- .../skyblock/profileviewer/inventory/InventoryPage.java | 14 +++++++------- .../profileviewer/inventory/PlayerInventory.java | 12 ++++++------ src/main/resources/assets/skyblocker/lang/en_us.json | 16 ++++++++-------- 4 files changed, 23 insertions(+), 22 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker/skyblock') 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 c4dc6fff..2b9961a9 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 @@ -10,6 +10,7 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.widget.ClickableWidget; +import net.minecraft.client.resource.language.I18n; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.tooltip.TooltipType; @@ -52,7 +53,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, Text.translatable("skyblocker.profileviewer.inventory." + containerName), rootX + 7, rootYAdjusted + 7, Color.DARK_GRAY.getRGB(), false); + context.drawText(textRenderer, I18n.translate("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 d215e6fc..6aa92ef6 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 @@ -22,15 +22,15 @@ import java.util.List; import java.util.Map; public class InventoryPage implements ProfileViewerPage { - private static final String[] INVENTORY_PAGES = {"Inventory", "Enderchest", "Backpack", "Wardrobe", "Pets", "Accessory Bag"}; + private static final String[] INVENTORY_PAGES = {"inventory", "enderchest", "backpack", "wardrobe", "pets", "accessoryBag"}; private static final int TOTAL_HEIGHT = 165; private static final Map ICON_MAP = Map.ofEntries( - Map.entry("Wardrobe", Ico.L_CHESTPLATE), - Map.entry("Inventory", Ico.CHEST), - Map.entry("Backpack", ProfileViewerUtils.createSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHBzOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzYyZjNiM2EwNTQ4MWNkZTc3MjQwMDA1YzBkZGNlZTFjMDY5ZTU1MDRhNjJjZTA5Nzc4NzlmNTVhMzkzOTYxNDYifX19")), - Map.entry("Pets", Ico.BONE), - Map.entry("Enderchest", Ico.E_CHEST), - Map.entry("Accessory Bag", ProfileViewerUtils.createSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTYxYTkxOGMwYzQ5YmE4ZDA1M2U1MjJjYjkxYWJjNzQ2ODkzNjdiNGQ4YWEwNmJmYzFiYTkxNTQ3MzA5ODVmZiJ9fX0=")) + Map.entry("wardrobe", Ico.L_CHESTPLATE), + Map.entry("inventory", Ico.CHEST), + Map.entry("backpack", ProfileViewerUtils.createSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHBzOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzYyZjNiM2EwNTQ4MWNkZTc3MjQwMDA1YzBkZGNlZTFjMDY5ZTU1MDRhNjJjZTA5Nzc4NzlmNTVhMzkzOTYxNDYifX19")), + Map.entry("pets", Ico.BONE), + Map.entry("enderchest", Ico.E_CHEST), + Map.entry("accessoryBag", ProfileViewerUtils.createSkull("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTYxYTkxOGMwYzQ5YmE4ZDA1M2U1MjJjYjkxYWJjNzQ2ODkzNjdiNGQ4YWEwNmJmYzFiYTkxNTQ3MzA5ODVmZiJ9fX0=")) ); private static final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/PlayerInventory.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/PlayerInventory.java index 7a83b2e0..abfd3b67 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/PlayerInventory.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/PlayerInventory.java @@ -9,6 +9,7 @@ import it.unimi.dsi.fastutil.ints.IntIntPair; import net.minecraft.client.MinecraftClient; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.resource.language.I18n; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.tooltip.TooltipType; @@ -31,9 +32,9 @@ public class PlayerInventory implements ProfileViewerPage { // Z-STACKING forces this nonsense of separating the Background texture and Item Drawing :( public void render(DrawContext context, int mouseX, int mouseY, float delta, int rootX, int rootY) { - drawContainerTextures(context, "Armor", rootX, rootY + 108, IntIntPair.of(1, 4)); - drawContainerTextures(context, "Inventory", rootX, rootY + 2, IntIntPair.of(4, 9)); - drawContainerTextures(context, "Equipment", rootX + 90, rootY + 108, IntIntPair.of(1, 4)); + drawContainerTextures(context, "armor", rootX, rootY + 108, IntIntPair.of(1, 4)); + drawContainerTextures(context, "inventory", rootX, rootY + 2, IntIntPair.of(4, 9)); + drawContainerTextures(context, "equipment", rootX + 90, rootY + 108, IntIntPair.of(1, 4)); tooltip.clear(); drawContainerItems(context, rootX, rootY + 108, IntIntPair.of(1, 4), 36, 40, mouseX, mouseY); @@ -43,7 +44,7 @@ public class PlayerInventory implements ProfileViewerPage { } private void drawContainerTextures(DrawContext context, String containerName, int rootX, int rootY, IntIntPair dimensions) { - if (containerName.equals("Inventory")) { + if (containerName.equals("inventory")) { context.drawTexture(TEXTURE, rootX, rootY + dimensions.leftInt() + 10, 0, 136, dimensions.rightInt() * 18 + 7, dimensions.leftInt() * 18 + 17); context.drawTexture(TEXTURE, rootX + dimensions.rightInt() * 18 + 7, rootY, 169, 0, 7, dimensions.leftInt() * 18 + 21); context.drawTexture(TEXTURE, rootX, rootY, 0, 0, dimensions.rightInt() * 18 + 7, 14); @@ -54,8 +55,7 @@ public class PlayerInventory implements ProfileViewerPage { context.drawTexture(TEXTURE, rootX, rootY + dimensions.leftInt() * 18 + 17, 0, 215, dimensions.rightInt() * 18 + 7, 7); context.drawTexture(TEXTURE, rootX + dimensions.rightInt() * 18 + 7, rootY + dimensions.leftInt() * 18 + 17, 169, 215, 7, 7); } - - context.drawText(textRenderer, Text.translatable("skyblocker.profileviewer.inventory." + containerName), rootX + 7, rootY + 7, Color.DARK_GRAY.getRGB(), false); + context.drawText(textRenderer, I18n.translate("skyblocker.profileviewer.inventory." + containerName), rootX + 7, rootY + 7, Color.DARK_GRAY.getRGB(), false); } private void drawContainerItems(DrawContext context, int rootX, int rootY, IntIntPair dimensions, int startIndex, int endIndex, int mouseX, int mouseY) { diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index ffbe716f..6c285f2f 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -936,14 +936,14 @@ "skyblocker.waypoints.ordered.import.coleWeight.success": "Successfully imported waypoints from the Cole Weight format.", "skyblocker.waypoints.ordered.import.coleWeight.fail": "§cFailed to import waypoints from the Cole Weight format. Make sure to have the waypoint data copied to your clipboard!", - "skyblocker.profileviewer.inventory.Inventory": "Inventory", - "skyblocker.profileviewer.inventory.Armor": "Armor", - "skyblocker.profileviewer.inventory.Equipment": "Equipment", - "skyblocker.profileviewer.inventory.Enderchest": "Enderchest", - "skyblocker.profileviewer.inventory.Backpack": "Backpack", - "skyblocker.profileviewer.inventory.Wardrobe": "Wardrobe", - "skyblocker.profileviewer.inventory.Pets": "Pets", - "skyblocker.profileviewer.inventory.Accessory Bag": "Accessory Bag", + "skyblocker.profileviewer.inventory.inventory": "Inventory", + "skyblocker.profileviewer.inventory.armor": "Armor", + "skyblocker.profileviewer.inventory.equipment": "Equipment", + "skyblocker.profileviewer.inventory.enderchest": "Enderchest", + "skyblocker.profileviewer.inventory.backpack": "Backpack", + "skyblocker.profileviewer.inventory.wardrobe": "Wardrobe", + "skyblocker.profileviewer.inventory.pets": "Pets", + "skyblocker.profileviewer.inventory.accessoryBag": "Accessory Bag", "skyblocker.profileviewer.inventory.inactive": "Locked Slot", "skyblocker.profileviewer.inventory.inactive.description.backpack": "The selected backpack", "skyblocker.profileviewer.inventory.inactive.description.general": "does not contain this slot", -- cgit From 5f3c5b728515b7c1f4396394a7f2757a872697ce Mon Sep 17 00:00:00 2001 From: nmccullagh Date: Sun, 7 Jul 2024 12:49:42 +0100 Subject: int2objectmapcauseyep --- .../de/hysky/skyblocker/skyblock/profileviewer/inventory/Pet.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker/skyblock') 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 9a279bbe..3ab53921 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,6 +10,9 @@ 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 it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMaps; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import net.minecraft.component.DataComponentTypes; import net.minecraft.component.type.LoreComponent; import net.minecraft.component.type.ProfileComponent; @@ -47,14 +50,14 @@ public class Pet { "COMMON", 0, "UNCOMMON", 1, "RARE", 2, "EPIC", 3, "LEGENDARY", 4, "MYTHIC", 5 ); - private static final Map RARITY_COLOR_MAP = Map.of( + private static final Int2ObjectMap RARITY_COLOR_MAP = Int2ObjectMaps.unmodifiable(new Int2ObjectOpenHashMap<>(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(); -- cgit From d02a1fcd973da0125e744546e9fd87ec07fc99c9 Mon Sep 17 00:00:00 2001 From: nmccullagh Date: Sun, 7 Jul 2024 18:20:01 +0100 Subject: Hardcode Golden Dragon Egg cause its not in NEU Repo --- .../skyblock/profileviewer/inventory/Pet.java | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'src/main/java/de/hysky/skyblocker/skyblock') 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 3ab53921..e6be9884 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 @@ -23,9 +23,12 @@ import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; +import java.awt.*; import java.math.BigDecimal; import java.math.RoundingMode; +import java.text.Normalizer; import java.util.*; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -142,6 +145,9 @@ public class Pet { Rarity rarity = Rarity.values()[getTier()]; PetNumbers data = petNums.get(getName()).get(rarity); + if (name.equals("GOLDEN_DRAGON") && level < 101) { + formattedLore = buildGoldenDragonLore(lore); + } else { for (String line : lore) { if (line.contains("Right-click to add this") || line.contains("pet menu!")) continue; @@ -165,6 +171,7 @@ public class Pet { formattedLore.add(Text.of(formattedLine)); } + } if (heldItem != null) { formattedLore.set(formattedLore.size() - 2, Text.of("§r§6Held Item: " + heldItem.getName().getString())); @@ -196,6 +203,22 @@ public class Pet { return petStack; } + private List buildGoldenDragonLore(List lore) { + List formattedLore = new ArrayList<>(); + Style style = Style.EMPTY.withItalic(false); + + formattedLore.add(Text.of(lore.getFirst())); + formattedLore.add(Text.empty()); + formattedLore.add(Text.literal("Perks:").setStyle(style).formatted(Formatting.GRAY)); + formattedLore.add(Text.literal("???").setStyle(style).formatted(Formatting.RED, Formatting.BOLD)); + formattedLore.add(Text.empty()); + formattedLore.add(Text.literal("Hatches at level §b100").setStyle(style).formatted(Formatting.GRAY)); + formattedLore.add(Text.empty()); + formattedLore.add(Text.of("Legendary")); + + return formattedLore; + } + private String fixDecimals(double num, boolean truncate) { if (num % 1 == 0) return String.valueOf((int) (num)); BigDecimal roundedNum = new BigDecimal(num).setScale(truncate ? 1 : 3, RoundingMode.HALF_UP); -- cgit From a8f0b5815e566ed94ec0dac59795b4a353e7f1a5 Mon Sep 17 00:00:00 2001 From: nmccullagh Date: Sun, 7 Jul 2024 19:32:13 +0100 Subject: fix highlights and colours --- .../profileviewer/inventory/Inventory.java | 2 +- .../skyblock/profileviewer/inventory/Pet.java | 87 ++++++++++++---------- .../profileviewer/inventory/PlayerInventory.java | 2 +- .../hysky/skyblocker/utils/ApiAuthentication.java | 2 +- 4 files changed, 52 insertions(+), 41 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker/skyblock') 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 2b9961a9..126c55ec 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 @@ -85,7 +85,7 @@ public class Inventory implements ProfileViewerPage { context.drawItem(containerList.get(startIndex + i), x, y); context.drawItemInSlot(textRenderer, containerList.get(startIndex + i), x, y); - if (mouseX > x && mouseX < x + 16 && mouseY > y && mouseY < y + 16) { + if (mouseX > x -1 && mouseX < x + 16 && mouseY > y - 1 && mouseY < y + 16) { tooltip = containerList.get(startIndex + i).getTooltip(Item.TooltipContext.DEFAULT, MinecraftClient.getInstance().player, TooltipType.BASIC); } } 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 e6be9884..b6aebe2f 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 @@ -23,7 +23,6 @@ import net.minecraft.text.Text; import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; -import java.awt.*; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.Normalizer; @@ -59,7 +58,8 @@ public class Pet { 2, Formatting.BLUE, // RARE 3, Formatting.DARK_PURPLE, // EPIC 4, Formatting.GOLD, // LEGENDARY - 5, Formatting.LIGHT_PURPLE // MYTHIC + 5, Formatting.LIGHT_PURPLE, // MYTHIC + 6, Formatting.AQUA // DIVINE (future proofing, because why not) ))); public Pet(PetCache.PetInfo petData) { @@ -138,16 +138,49 @@ public class Pet { Identifier itemId = Identifier.of(ItemFixerUpper.convertItemId(item.getMinecraftItemId(), item.getDamage())); ItemStack petStack = new ItemStack(Registries.ITEM.get(itemId)).copy(); - List lore = item.getLore(); - List formattedLore = new ArrayList<>(); + List formattedLore = !(name.equals("GOLDEN_DRAGON") && level < 101) ? processLore( item.getLore()) : buildGoldenDragonEggLore( item.getLore()); + + if (heldItem != null) { + formattedLore.set(formattedLore.size() - 2, Text.of("§r§6Held Item: " + heldItem.getName().getString())); + formattedLore.add(formattedLore.size() - 1, Text.empty()); + } + + // Skin Head Texture + if (skinTexture.isPresent()) { + formattedLore.set(0, Text.of(formattedLore.getFirst().getString() + ", " + Formatting.strip(NEURepoManager.NEU_REPO.getItems().getItems().get("PET_SKIN_" + skin.get()).getDisplayName()))); + petStack.set(DataComponentTypes.PROFILE, new ProfileComponent( + Optional.of(item.getSkyblockItemId()), Optional.of(UUID.randomUUID()), + ItemUtils.propertyMapWithTexture(this.skinTexture.get()))); + } else { + Matcher skullTexture = SKULL_TEXTURE_PATTERN.matcher(item.getNbttag()); + if (skullTexture.find()) { + petStack.set(DataComponentTypes.PROFILE, new ProfileComponent( + Optional.of(item.getSkyblockItemId()), Optional.of(UUID.randomUUID()), + ItemUtils.propertyMapWithTexture(skullTexture.group(1)))); + } + } + + Style style = Style.EMPTY.withItalic(false); + formattedLore.set(formattedLore.size() - 1, Text.literal(Rarity.values()[getTier() + (boosted() ? 1 : 0)].toString()).setStyle(style).formatted(Formatting.BOLD, RARITY_COLOR_MAP.get(getTier() + (boosted() ? 1 : 0)))); + + // Update the lore and name + petStack.set(DataComponentTypes.LORE, new LoreComponent(formattedLore)); + String displayName = Formatting.strip(item.getDisplayName()).replace("[Lvl {LVL}]", "§7[Lvl " + this.level + "]§r"); + petStack.set(DataComponentTypes.CUSTOM_NAME, Text.literal(displayName).setStyle(style).formatted(RARITY_COLOR_MAP.get(this.getTier() + (boosted() ? 1 : 0)))); + return petStack; + } + /** + * Iterates through a Pet's lore injecting interpolated stat numbers based on pet level + * @param lore the lore data stored in NEU Repo + * @return Formatted lore with injected stats + */ + private List processLore(List lore) { Map> petNums = NEURepoManager.NEU_REPO.getConstants().getPetNumbers(); Rarity rarity = Rarity.values()[getTier()]; PetNumbers data = petNums.get(getName()).get(rarity); + List formattedLore = new ArrayList<>(); - if (name.equals("GOLDEN_DRAGON") && level < 101) { - formattedLore = buildGoldenDragonLore(lore); - } else { for (String line : lore) { if (line.contains("Right-click to add this") || line.contains("pet menu!")) continue; @@ -155,6 +188,7 @@ public class Pet { Matcher stats = statsMatcher.matcher(formattedLine); Matcher other = numberMatcher.matcher(formattedLine); + while (stats.find()) { String placeholder = stats.group(); String statKey = placeholder.substring(1, placeholder.length() - 1); @@ -171,39 +205,16 @@ public class Pet { formattedLore.add(Text.of(formattedLine)); } - } - - if (heldItem != null) { - formattedLore.set(formattedLore.size() - 2, Text.of("§r§6Held Item: " + heldItem.getName().getString())); - formattedLore.add(formattedLore.size() - 1, Text.empty()); - } - // Skin Head Texture - if (skinTexture.isPresent()) { - formattedLore.set(0, Text.of(formattedLore.getFirst().getString() + ", " + Formatting.strip(NEURepoManager.NEU_REPO.getItems().getItems().get("PET_SKIN_" + skin.get()).getDisplayName()))); - petStack.set(DataComponentTypes.PROFILE, new ProfileComponent( - Optional.of(item.getSkyblockItemId()), Optional.of(UUID.randomUUID()), - ItemUtils.propertyMapWithTexture(this.skinTexture.get()))); - } else { - Matcher skullTexture = SKULL_TEXTURE_PATTERN.matcher(item.getNbttag()); - if (skullTexture.find()) { - petStack.set(DataComponentTypes.PROFILE, new ProfileComponent( - Optional.of(item.getSkyblockItemId()), Optional.of(UUID.randomUUID()), - ItemUtils.propertyMapWithTexture(skullTexture.group(1)))); - } - } - - Style style = Style.EMPTY.withItalic(false); - formattedLore.set(formattedLore.size()-1, Text.literal(Rarity.values()[getTier() + (boosted() ? 1 : 0)].toString()).setStyle(style).formatted(Formatting.BOLD, RARITY_COLOR_MAP.get(getTier() + (boosted() ? 1 : 0)))); - - // Update the lore and name - petStack.set(DataComponentTypes.LORE, new LoreComponent(formattedLore)); - petStack.set(DataComponentTypes.CUSTOM_NAME, Text.of(item.getDisplayName().formatted(RARITY_COLOR_MAP.get(this.getTier() + (boosted() ? 1 : 0))).replace("{LVL}", String.valueOf(this.level)))); - - return petStack; + return formattedLore; } - private List buildGoldenDragonLore(List lore) { + /** + * NEU Repo doesn't distinguish between the Egg and the hatched GoldenDragon pet so hardcoded lore :eues: + * @param lore the existing lore + * @return Fully formatted GoldenDragonEgg Lore + */ + private List buildGoldenDragonEggLore(List lore) { List formattedLore = new ArrayList<>(); Style style = Style.EMPTY.withItalic(false); @@ -214,7 +225,7 @@ public class Pet { formattedLore.add(Text.empty()); formattedLore.add(Text.literal("Hatches at level §b100").setStyle(style).formatted(Formatting.GRAY)); formattedLore.add(Text.empty()); - formattedLore.add(Text.of("Legendary")); + formattedLore.add(Text.of(lore.getLast())); return formattedLore; } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/PlayerInventory.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/PlayerInventory.java index abfd3b67..e210ca9a 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/PlayerInventory.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/inventory/PlayerInventory.java @@ -74,7 +74,7 @@ public class PlayerInventory implements ProfileViewerPage { context.drawItem(containerList.get(startIndex + i), x, y); context.drawItemInSlot(textRenderer, containerList.get(startIndex + i), x, y); - if (mouseX > x && mouseX < x + 16 && mouseY > y && mouseY < y + 16) { + if (mouseX > x -1 && mouseX < x + 16 && mouseY > y - 1 && mouseY < y + 16) { tooltip = containerList.get(startIndex + i).getTooltip(Item.TooltipContext.DEFAULT, MinecraftClient.getInstance().player, TooltipType.BASIC); } } diff --git a/src/main/java/de/hysky/skyblocker/utils/ApiAuthentication.java b/src/main/java/de/hysky/skyblocker/utils/ApiAuthentication.java index 5f65c336..02fdb1be 100644 --- a/src/main/java/de/hysky/skyblocker/utils/ApiAuthentication.java +++ b/src/main/java/de/hysky/skyblocker/utils/ApiAuthentication.java @@ -86,7 +86,7 @@ public class ApiAuthentication { } } else { //The Minecraft Services API is probably down so we will retry in 5 minutes, either that or your access token has expired (game open for 24h) and you need to restart. - logErrorAndScheduleRetry(Text.translatable("skyblocker.api.token.noProfileKeys"), 300 * 20, "[Skyblocker Api Auth] Failed to fetch profile keys! Some features may not work temporarily :( (Has your game been open for more than 24 hours? If so restart.)"); + logErrorAndScheduleRetry(Text.translatable("skyblocker.api.token.noProfileKeys"), 20, "[Skyblocker Api Auth] Failed to fetch profile keys! Some features may not work temporarily :( (Has your game been open for more than 24 hours? If so restart.)"); } }).exceptionally(throwable -> { //Try again in 1 minute -- cgit From 45579f64b14096a632df5799a9528eda810c219a Mon Sep 17 00:00:00 2001 From: nmccullagh Date: Sun, 7 Jul 2024 20:36:04 +0100 Subject: pet xp in tooltip --- .../profileviewer/ProfileViewerTextWidget.java | 17 ++------- .../skyblock/profileviewer/inventory/Pet.java | 42 ++++++++++++++++------ .../skyblock/profileviewer/utils/LevelFinder.java | 16 ++++++--- .../profileviewer/utils/ProfileViewerUtils.java | 14 +++++++- .../hysky/skyblocker/utils/ApiAuthentication.java | 2 +- 5 files changed, 60 insertions(+), 31 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker/skyblock') diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/ProfileViewerTextWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/ProfileViewerTextWidget.java index 4ee2dbba..58c238f8 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/ProfileViewerTextWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/ProfileViewerTextWidget.java @@ -1,6 +1,7 @@ package de.hysky.skyblocker.skyblock.profileviewer; import com.google.gson.JsonObject; +import de.hysky.skyblocker.skyblock.profileviewer.utils.ProfileViewerUtils; import de.hysky.skyblocker.skyblock.tabhud.util.Ico; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; @@ -36,20 +37,8 @@ public class ProfileViewerTextWidget { context.drawText(textRenderer, "§n"+PROFILE_NAME, root_x + 14, root_y + 3, Colors.WHITE, true); context.drawText(textRenderer, "§aLevel:§r " + SKYBLOCK_LEVEL, root_x + 2, root_y + 6 + ROW_GAP, Colors.WHITE, true); - context.drawText(textRenderer, "§6Purse:§r " + formatCoins(PURSE), root_x + 2, root_y + 6 + ROW_GAP * 2, Colors.WHITE, true); - context.drawText(textRenderer, "§6Bank:§r " + formatCoins(BANK), root_x + 2, root_y + 6 + ROW_GAP * 3, Colors.WHITE, true); + context.drawText(textRenderer, "§6Purse:§r " + ProfileViewerUtils.numLetterFormat(PURSE), root_x + 2, root_y + 6 + ROW_GAP * 2, Colors.WHITE, true); + context.drawText(textRenderer, "§6Bank:§r " + ProfileViewerUtils.numLetterFormat(BANK), root_x + 2, root_y + 6 + ROW_GAP * 3, Colors.WHITE, true); context.drawText(textRenderer, "§6NW:§r " + "Soon™", root_x + 2, root_y + 6 + ROW_GAP * 4, Colors.WHITE, true ); } - - private String formatCoins(double amount) { - if (amount >= 1_000_000_000) { - return String.format("%.4gB", amount / 1_000_000_000); - } else if (amount >= 1_000_000) { - return String.format("%.4gM", amount / 1_000_000); - } else if (amount >= 1_000) { - return String.format("%.4gK", amount / 1_000); - } else { - return String.valueOf((int)(amount)); - } - } } 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 b6aebe2f..a44f166b 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 @@ -25,13 +25,14 @@ import net.minecraft.util.Identifier; import java.math.BigDecimal; import java.math.RoundingMode; -import java.text.Normalizer; import java.util.*; -import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import static de.hysky.skyblocker.skyblock.itemlist.ItemStackBuilder.SKULL_TEXTURE_PATTERN; +import static de.hysky.skyblocker.skyblock.profileviewer.utils.ProfileViewerUtils.numLetterFormat; public class Pet { private final String name; @@ -41,6 +42,9 @@ public class Pet { private final Optional skin; private final Optional skinTexture; private final int level; + private final double perecentageToLevel; + private final long levelXP; + private final long nextLevelXP; private final ItemStack icon; private final Pattern statsMatcher = Pattern.compile("\\{[A-Za-z_]+}"); @@ -63,13 +67,17 @@ public class Pet { ))); public Pet(PetCache.PetInfo petData) { + LevelFinder.LevelInfo info = LevelFinder.getLevelInfo(petData.type().equals("GOLDEN_DRAGON") ? "PET_GREG" : "PET_" + petData.tier(), (long) petData.exp()); this.name = petData.type(); this.xp = petData.exp(); this.heldItem = petData.item(); 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.level = info.level; + this.perecentageToLevel = info.fill; + this.levelXP = info.levelXP; + this.nextLevelXP = info.nextLevelXP; this.icon = createIcon(); } @@ -138,12 +146,7 @@ public class Pet { Identifier itemId = Identifier.of(ItemFixerUpper.convertItemId(item.getMinecraftItemId(), item.getDamage())); ItemStack petStack = new ItemStack(Registries.ITEM.get(itemId)).copy(); - List formattedLore = !(name.equals("GOLDEN_DRAGON") && level < 101) ? processLore( item.getLore()) : buildGoldenDragonEggLore( item.getLore()); - - if (heldItem != null) { - formattedLore.set(formattedLore.size() - 2, Text.of("§r§6Held Item: " + heldItem.getName().getString())); - formattedLore.add(formattedLore.size() - 1, Text.empty()); - } + List formattedLore = !(name.equals("GOLDEN_DRAGON") && level < 101) ? processLore(item.getLore(), heldItem) : buildGoldenDragonEggLore(item.getLore()); // Skin Head Texture if (skinTexture.isPresent()) { @@ -172,10 +175,12 @@ public class Pet { /** * Iterates through a Pet's lore injecting interpolated stat numbers based on pet level - * @param lore the lore data stored in NEU Repo + * + * @param lore the lore data stored in NEU Repo + * @param heldItem * @return Formatted lore with injected stats */ - private List processLore(List lore) { + private List processLore(List lore, ItemStack heldItem) { Map> petNums = NEURepoManager.NEU_REPO.getConstants().getPetNumbers(); Rarity rarity = Rarity.values()[getTier()]; PetNumbers data = petNums.get(getName()).get(rarity); @@ -206,6 +211,21 @@ public class Pet { formattedLore.add(Text.of(formattedLine)); } + + if (heldItem != null) { + formattedLore.set(formattedLore.size() - 2, Text.of("§r§6Held Item: " + heldItem.getName().getString())); + formattedLore.add(formattedLore.size() - 1, Text.empty()); + } + + if (level != 100 && level != 200) { + Style style = Style.EMPTY.withItalic(false); + String progress = "Progress to Level " + this.level + ": §e" + fixDecimals(this.perecentageToLevel * 100, true) + "%"; + formattedLore.add(formattedLore.size() - 1, Text.literal(progress).setStyle(style).formatted(Formatting.GRAY)); + String string = "§a§m ".repeat((int) Math.round(perecentageToLevel * 30)) + "§f§m ".repeat(30 - (int) Math.round(perecentageToLevel * 30)); + formattedLore.add(formattedLore.size() - 1, Text.literal(string + "§r§e " + numLetterFormat(levelXP) + "§6/§e" + numLetterFormat(nextLevelXP)).setStyle(style)); + formattedLore.add(formattedLore.size() - 1, Text.empty()); + } + return formattedLore; } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/utils/LevelFinder.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/utils/LevelFinder.java index 9b0fdfb1..f53df0f5 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/utils/LevelFinder.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/utils/LevelFinder.java @@ -8,16 +8,20 @@ public class LevelFinder { public long xp; public int level; public double fill; + public long levelXP; + public long nextLevelXP; public LevelInfo(long xp, int level) { this.xp = xp; this.level = level; } - public LevelInfo(long xp, int level, double fill) { + public LevelInfo(long xp, int level, double fill, double levelXP, double nextLevelXP) { this.xp = xp; this.level = level; this.fill = fill; + this.levelXP = (long) levelXP; + this.nextLevelXP = (long) nextLevelXP; } } @@ -256,16 +260,20 @@ public class LevelFinder { for (int i = boundaries.size() - 1; i >= 0 ; i--) { if (xp >= boundaries.get(i).xp) { double fill; + double xpInCurrentLevel; + double levelXPRange; if (i < boundaries.getLast().level) { double currentLevelXP = boundaries.get(i).xp; double nextLevelXP = boundaries.get(i + 1).xp; - double levelXPRange = nextLevelXP - currentLevelXP; - double xpInCurrentLevel = xp - currentLevelXP; + levelXPRange = nextLevelXP - currentLevelXP; + xpInCurrentLevel = xp - currentLevelXP; fill = xpInCurrentLevel / levelXPRange; } else { fill = 1.0; + xpInCurrentLevel = xp - boundaries.getLast().xp; + levelXPRange = boundaries.getLast().xp - boundaries.get(boundaries.size()-2).xp; } - return new LevelInfo(xp, boundaries.get(i).level, fill); + return new LevelInfo(xp, boundaries.get(i).level, fill, xpInCurrentLevel, levelXPRange); } } return new LevelInfo(0L, 0); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/utils/ProfileViewerUtils.java b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/utils/ProfileViewerUtils.java index dca4dd85..8dadedaf 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/utils/ProfileViewerUtils.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/utils/ProfileViewerUtils.java @@ -14,6 +14,8 @@ import java.util.Optional; import java.util.UUID; public class ProfileViewerUtils { + public static final NumberFormat COMMA_FORMATTER = NumberFormat.getNumberInstance(Locale.US); + public static ItemStack createSkull(String textureB64) { ItemStack skull = new ItemStack(Items.PLAYER_HEAD); try { @@ -27,5 +29,15 @@ public class ProfileViewerUtils { return skull; } - public static final NumberFormat COMMA_FORMATTER = NumberFormat.getNumberInstance(Locale.US); + public static String numLetterFormat(double amount) { + if (amount >= 1_000_000_000) { + return String.format("%.4gB", amount / 1_000_000_000); + } else if (amount >= 1_000_000) { + return String.format("%.4gM", amount / 1_000_000); + } else if (amount >= 1_000) { + return String.format("%.4gK", amount / 1_000); + } else { + return String.valueOf((int)(amount)); + } + } } diff --git a/src/main/java/de/hysky/skyblocker/utils/ApiAuthentication.java b/src/main/java/de/hysky/skyblocker/utils/ApiAuthentication.java index 02fdb1be..5f65c336 100644 --- a/src/main/java/de/hysky/skyblocker/utils/ApiAuthentication.java +++ b/src/main/java/de/hysky/skyblocker/utils/ApiAuthentication.java @@ -86,7 +86,7 @@ public class ApiAuthentication { } } else { //The Minecraft Services API is probably down so we will retry in 5 minutes, either that or your access token has expired (game open for 24h) and you need to restart. - logErrorAndScheduleRetry(Text.translatable("skyblocker.api.token.noProfileKeys"), 20, "[Skyblocker Api Auth] Failed to fetch profile keys! Some features may not work temporarily :( (Has your game been open for more than 24 hours? If so restart.)"); + logErrorAndScheduleRetry(Text.translatable("skyblocker.api.token.noProfileKeys"), 300 * 20, "[Skyblocker Api Auth] Failed to fetch profile keys! Some features may not work temporarily :( (Has your game been open for more than 24 hours? If so restart.)"); } }).exceptionally(throwable -> { //Try again in 1 minute -- cgit From 0725b0a35b4d440c8b4eafa1fb2ba96ed4bf27d7 Mon Sep 17 00:00:00 2001 From: nmccullagh Date: Sun, 7 Jul 2024 22:24:55 +0100 Subject: one last cheeky commit b4 bed --- .../skyblock/profileviewer/inventory/Pet.java | 27 +++++++++++----------- 1 file changed, 13 insertions(+), 14 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker/skyblock') 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 a44f166b..0b22a8f8 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 @@ -28,8 +28,6 @@ import java.math.RoundingMode; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Collectors; -import java.util.stream.IntStream; import static de.hysky.skyblocker.skyblock.itemlist.ItemStackBuilder.SKULL_TEXTURE_PATTERN; import static de.hysky.skyblocker.skyblock.profileviewer.utils.ProfileViewerUtils.numLetterFormat; @@ -148,6 +146,16 @@ public class Pet { List formattedLore = !(name.equals("GOLDEN_DRAGON") && level < 101) ? processLore(item.getLore(), heldItem) : buildGoldenDragonEggLore(item.getLore()); + // Calculate and display XP for level + if (level != 100 && level != 200) { + Style style = Style.EMPTY.withItalic(false); + String progress = "Progress to Level " + this.level + ": §e" + fixDecimals(this.perecentageToLevel * 100, true) + "%"; + formattedLore.add(formattedLore.size() - 1, Text.literal(progress).setStyle(style).formatted(Formatting.GRAY)); + String string = "§a§m ".repeat((int) Math.round(perecentageToLevel * 30)) + "§f§m ".repeat(30 - (int) Math.round(perecentageToLevel * 30)); + formattedLore.add(formattedLore.size() - 1, Text.literal(string + "§r§e " + numLetterFormat(levelXP) + "§6/§e" + numLetterFormat(nextLevelXP)).setStyle(style)); + formattedLore.add(formattedLore.size() - 1, Text.empty()); + } + // Skin Head Texture if (skinTexture.isPresent()) { formattedLore.set(0, Text.of(formattedLore.getFirst().getString() + ", " + Formatting.strip(NEURepoManager.NEU_REPO.getItems().getItems().get("PET_SKIN_" + skin.get()).getDisplayName()))); @@ -176,9 +184,9 @@ public class Pet { /** * Iterates through a Pet's lore injecting interpolated stat numbers based on pet level * - * @param lore the lore data stored in NEU Repo - * @param heldItem - * @return Formatted lore with injected stats + * @param lore the raw lore data stored in NEU Repo + * @param heldItem the pet's held item, if any + * @return Formatted lore with injected stats inserted into the tooltip */ private List processLore(List lore, ItemStack heldItem) { Map> petNums = NEURepoManager.NEU_REPO.getConstants().getPetNumbers(); @@ -217,15 +225,6 @@ public class Pet { formattedLore.add(formattedLore.size() - 1, Text.empty()); } - if (level != 100 && level != 200) { - Style style = Style.EMPTY.withItalic(false); - String progress = "Progress to Level " + this.level + ": §e" + fixDecimals(this.perecentageToLevel * 100, true) + "%"; - formattedLore.add(formattedLore.size() - 1, Text.literal(progress).setStyle(style).formatted(Formatting.GRAY)); - String string = "§a§m ".repeat((int) Math.round(perecentageToLevel * 30)) + "§f§m ".repeat(30 - (int) Math.round(perecentageToLevel * 30)); - formattedLore.add(formattedLore.size() - 1, Text.literal(string + "§r§e " + numLetterFormat(levelXP) + "§6/§e" + numLetterFormat(nextLevelXP)).setStyle(style)); - formattedLore.add(formattedLore.size() - 1, Text.empty()); - } - return formattedLore; } -- cgit From 86c8148f6fe8bef1eed667e6369473b2ec56a7ed Mon Sep 17 00:00:00 2001 From: nmccullagh Date: Sun, 7 Jul 2024 22:40:06 +0100 Subject: i suck at colours --- .../skyblocker/skyblock/profileviewer/inventory/Pet.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) (limited to 'src/main/java/de/hysky/skyblocker/skyblock') 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 0b22a8f8..857198e1 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 @@ -4,6 +4,7 @@ import de.hysky.skyblocker.skyblock.PetCache; import de.hysky.skyblocker.skyblock.itemlist.ItemFixerUpper; import de.hysky.skyblocker.skyblock.itemlist.ItemRepository; 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.ItemUtils; import de.hysky.skyblocker.utils.NEURepoManager; @@ -147,13 +148,17 @@ public class Pet { List formattedLore = !(name.equals("GOLDEN_DRAGON") && level < 101) ? processLore(item.getLore(), heldItem) : buildGoldenDragonEggLore(item.getLore()); // Calculate and display XP for level + Style style = Style.EMPTY.withItalic(false); if (level != 100 && level != 200) { - Style style = Style.EMPTY.withItalic(false); String progress = "Progress to Level " + this.level + ": §e" + fixDecimals(this.perecentageToLevel * 100, true) + "%"; formattedLore.add(formattedLore.size() - 1, Text.literal(progress).setStyle(style).formatted(Formatting.GRAY)); - String string = "§a§m ".repeat((int) Math.round(perecentageToLevel * 30)) + "§f§m ".repeat(30 - (int) Math.round(perecentageToLevel * 30)); + String string = "§2§m ".repeat((int) Math.round(perecentageToLevel * 30)) + "§f§m ".repeat(30 - (int) Math.round(perecentageToLevel * 30)); formattedLore.add(formattedLore.size() - 1, Text.literal(string + "§r§e " + numLetterFormat(levelXP) + "§6/§e" + numLetterFormat(nextLevelXP)).setStyle(style)); formattedLore.add(formattedLore.size() - 1, Text.empty()); + } else { + formattedLore.add(formattedLore.size() - 1, Text.literal("MAX LEVEL").setStyle(style).formatted(Formatting.AQUA, Formatting.BOLD)); + formattedLore.add(formattedLore.size() - 1, Text.literal("▸ " + ProfileViewerUtils.COMMA_FORMATTER.format((long) xp) + " XP").setStyle(style).formatted(Formatting.DARK_GRAY)); + formattedLore.add(formattedLore.size() - 1, Text.empty()); } // Skin Head Texture @@ -171,8 +176,7 @@ public class Pet { } } - Style style = Style.EMPTY.withItalic(false); - formattedLore.set(formattedLore.size() - 1, Text.literal(Rarity.values()[getTier() + (boosted() ? 1 : 0)].toString()).setStyle(style).formatted(Formatting.BOLD, RARITY_COLOR_MAP.get(getTier() + (boosted() ? 1 : 0)))); + if ((boosted())) formattedLore.set(formattedLore.size() - 1, Text.literal(Rarity.values()[getTier() + 1].toString()).setStyle(style).formatted(Formatting.BOLD, RARITY_COLOR_MAP.get(getTier() + 1))); // Update the lore and name petStack.set(DataComponentTypes.LORE, new LoreComponent(formattedLore)); -- cgit