diff options
5 files changed, 60 insertions, 31 deletions
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<String> skin; private final Optional<String> 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<Text> 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<Text> 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<Text> processLore(List<String> lore) { + private List<Text> processLore(List<String> lore, ItemStack heldItem) { Map<String, Map<Rarity, PetNumbers>> 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 |