diff options
| author | Peyton Brown <81496880+PeytonBrown@users.noreply.github.com> | 2025-07-07 13:21:46 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-07 13:21:46 -0400 |
| commit | 2974e6b2a239f0d6ac6bb785654e79283159b9be (patch) | |
| tree | b444625354ad6a2b6df554bf2fd7114fc59a0f66 /src/main/java/de | |
| parent | 6af04833db55d5958b1c045321a9e9bea5a8d23b (diff) | |
| download | Skyblocker-2974e6b2a239f0d6ac6bb785654e79283159b9be.tar.gz Skyblocker-2974e6b2a239f0d6ac6bb785654e79283159b9be.tar.bz2 Skyblocker-2974e6b2a239f0d6ac6bb785654e79283159b9be.zip | |
Basic Networth calculator for Profile Viewer (#1431)
* Initial Implementation
* Fix armor being counted twice.
* Added a reusable method
Diffstat (limited to 'src/main/java/de')
| -rw-r--r-- | src/main/java/de/hysky/skyblocker/skyblock/profileviewer/ProfileViewerScreen.java | 2 | ||||
| -rw-r--r-- | src/main/java/de/hysky/skyblocker/skyblock/profileviewer/ProfileViewerTextWidget.java | 171 |
2 files changed, 140 insertions, 33 deletions
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 60f272c0..24a2ff53 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/ProfileViewerScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/ProfileViewerScreen.java @@ -116,7 +116,7 @@ public class ProfileViewerScreen extends Screen { } - if (textWidget != null) textWidget.render(context, textRenderer, rootX + 8, rootY + 120); + if (textWidget != null) textWidget.render(context, textRenderer, rootX + 8, rootY + 120, mouseX, mouseY); drawPlayerEntity(context, playerName != null ? playerName : "Loading...", rootX, rootY, mouseX, mouseY); if (profileViewerPages[activePage] != null) { 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 bf7bb178..fa2c0bf1 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/ProfileViewerTextWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/profileviewer/ProfileViewerTextWidget.java @@ -1,44 +1,151 @@ package de.hysky.skyblocker.skyblock.profileviewer; import com.google.gson.JsonObject; + +import de.hysky.skyblocker.skyblock.profileviewer.inventory.itemLoaders.BackpackItemLoader; +import de.hysky.skyblocker.skyblock.profileviewer.inventory.itemLoaders.InventoryItemLoader; +import de.hysky.skyblocker.skyblock.profileviewer.inventory.itemLoaders.ItemLoader; +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.ProfileViewerUtils; import de.hysky.skyblocker.skyblock.tabhud.util.Ico; +import de.hysky.skyblocker.utils.networth.NetworthCalculator; import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.item.ItemStack; import net.minecraft.util.Colors; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.PriorityQueue; +import java.util.HashSet; +import java.util.Set; public class ProfileViewerTextWidget { - private static final int ROW_GAP = 9; - - private String PROFILE_NAME = "UNKNOWN"; - private int SKYBLOCK_LEVEL = 0; - private double PURSE = 0; - private double BANK = 0; - - public ProfileViewerTextWidget(JsonObject hypixelProfile, JsonObject playerProfile){ - try { - this.PROFILE_NAME = hypixelProfile.get("cute_name").getAsString(); - this.SKYBLOCK_LEVEL = playerProfile.getAsJsonObject("leveling").get("experience").getAsInt() / 100; - this.PURSE = playerProfile.getAsJsonObject("currencies").get("coin_purse").getAsDouble(); - this.BANK = hypixelProfile.getAsJsonObject("banking").get("balance").getAsDouble(); - } catch (Exception ignored) {} - } - - public void render(DrawContext context, TextRenderer textRenderer, int root_x, int root_y){ - // Profile Icon - MatrixStack matrices = context.getMatrices(); - matrices.push(); - matrices.scale(0.75f, 0.75f, 1); - int rootAdjustedX = (int) ((root_x) / 0.75f); - int rootAdjustedY = (int) ((root_y) / 0.75f); - context.drawItem(Ico.PAINTING, rootAdjustedX, rootAdjustedY); - matrices.pop(); - - 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 " + 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 static final int ROW_GAP = 9; + + private String PROFILE_NAME = "UNKNOWN"; + private int SKYBLOCK_LEVEL = 0; + private double PURSE = 0; + private double BANK = 0; + private double NETWORTH = 0; + private List<Text> networthTooltip = List.of(); + + public ProfileViewerTextWidget(JsonObject hypixelProfile, JsonObject playerProfile) { + try { + this.PROFILE_NAME = hypixelProfile.get("cute_name").getAsString(); + this.SKYBLOCK_LEVEL = playerProfile.getAsJsonObject("leveling").get("experience").getAsInt() / 100; + this.PURSE = playerProfile.getAsJsonObject("currencies").get("coin_purse").getAsDouble(); + this.BANK = hypixelProfile.getAsJsonObject("banking").get("balance").getAsDouble(); + } catch (Exception ignored) {} + + this.NETWORTH = PURSE + BANK + getItemsNetworth(playerProfile); + } + + private double getItemsNetworth(JsonObject playerProfile) { + double value = 0; + PriorityQueue<ItemValue> top = new PriorityQueue<>(Comparator.comparingDouble(ItemValue::price)); + try { + JsonObject inventoryData = playerProfile.getAsJsonObject("inventory"); + if (inventoryData != null) { + for (ItemStack stack : new InventoryItemLoader().loadItems(inventoryData)) { + value += addItemNetworth(top, stack); + } + + if (inventoryData.has("ender_chest_contents")) { + for (ItemStack stack : new ItemLoader().loadItems(inventoryData.getAsJsonObject("ender_chest_contents"))) { + value += addItemNetworth(top, stack); + } + } + + if (inventoryData.has("backpack_contents")) { + for (ItemStack stack : new BackpackItemLoader().loadItems(inventoryData.getAsJsonObject("backpack_contents"))) { + value += addItemNetworth(top, stack); + } + } + + if (inventoryData.has("wardrobe_contents")) { + int activeSlot = inventoryData.get("wardrobe_equipped_slot").getAsInt(); + Set<Integer> skip = new HashSet<>(); + if (activeSlot != -1) { + for (int i = 0; i < 4; i++) { + int baseIndex = (activeSlot - 1) % 9; + int page = (activeSlot - 1) / 9; + int slotIndex = (page * 36) + (i * 9) + baseIndex; + skip.add(slotIndex); + } + } + + WardrobeInventoryItemLoader loader = new WardrobeInventoryItemLoader(inventoryData); + List<ItemStack> wardrobeItems = loader.loadItems(inventoryData.getAsJsonObject("wardrobe_contents")); + for (int index = 0; index < wardrobeItems.size(); index++) { + if (skip.contains(index)) continue; + ItemStack stack = wardrobeItems.get(index); + value += addItemNetworth(top, stack); + } + } + + if (inventoryData.has("bag_contents") && inventoryData.getAsJsonObject("bag_contents").has("talisman_bag")) { + for (ItemStack stack : new ItemLoader().loadItems(inventoryData.getAsJsonObject("bag_contents").getAsJsonObject("talisman_bag"))) { + value += addItemNetworth(top, stack); + } + } + } + + for (ItemStack stack : new PetsInventoryItemLoader().loadItems(playerProfile)) { + value += addItemNetworth(top, stack); + } + } catch (Exception ignored) {} + + List<ItemValue> list = new ArrayList<>(top); + list.sort(Comparator.comparingDouble(ItemValue::price).reversed()); + List<Text> tooltip = new ArrayList<>(); + tooltip.add(Text.literal("Top Items:").formatted(Formatting.GOLD)); + for (ItemValue iv : list) { + tooltip.add(Text.literal(iv.name + ": ") + .append(Text.literal(ProfileViewerUtils.numLetterFormat(iv.price)).formatted(Formatting.YELLOW))); + } + this.networthTooltip = tooltip; + + return value; + } + + private double addItemNetworth(PriorityQueue<ItemValue> top, ItemStack stack) { + double p = NetworthCalculator.getItemNetworth(stack).price(); + if (p > 0) { + top.offer(new ItemValue(stack.getName().getString(), p)); + if (top.size() > 10) top.poll(); + } + return p; + } + + public void render(DrawContext context, TextRenderer textRenderer, int root_x, int root_y, int mouseX, int mouseY) { + // Profile Icon + MatrixStack matrices = context.getMatrices(); + matrices.push(); + matrices.scale(0.75f, 0.75f, 1); + int rootAdjustedX = (int) ((root_x) / 0.75f); + int rootAdjustedY = (int) ((root_y) / 0.75f); + context.drawItem(Ico.PAINTING, rootAdjustedX, rootAdjustedY); + matrices.pop(); + + 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 " + 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); + String nwString = "§6NW:§r " + ProfileViewerUtils.numLetterFormat(NETWORTH); + int nwX = root_x + 2; + int nwY = root_y + 6 + ROW_GAP * 4; + context.drawText(textRenderer, nwString, nwX, nwY, Colors.WHITE, true); + if (mouseX >= nwX && mouseX <= nwX + textRenderer.getWidth(nwString) + && mouseY >= nwY && mouseY <= nwY + textRenderer.fontHeight) { + context.drawTooltip(textRenderer, networthTooltip, mouseX, mouseY); + } + } + + private record ItemValue(String name, double price) {} } |
