diff options
51 files changed, 1922 insertions, 2533 deletions
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java index a5bea05d..6b68fccf 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java @@ -39,7 +39,6 @@ import io.github.moulberry.notenoughupdates.util.ApiUtil; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.ItemResolutionQuery; import io.github.moulberry.notenoughupdates.util.ItemUtils; -import io.github.moulberry.notenoughupdates.util.SBInfo; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.settings.KeyBinding; @@ -49,7 +48,6 @@ import net.minecraft.inventory.ContainerChest; import net.minecraft.item.Item; import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.JsonToNBT; import net.minecraft.nbt.NBTException; import net.minecraft.nbt.NBTTagCompound; @@ -63,7 +61,6 @@ import javax.net.ssl.HttpsURLConnection; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.BufferedWriter; -import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -143,7 +140,6 @@ public class NEUManager { public File configLocation; public File repoLocation; - public File configFile; public KatSitterOverlay katSitterOverlay; @@ -162,24 +158,6 @@ public class NEUManager { repoLocation.mkdir(); } - public String getCurrentProfile() { - return SBInfo.getInstance().currentProfile; - } - - public <T> T getJsonFromFile(File file, Class<T> clazz) { - try ( - BufferedReader reader = new BufferedReader(new InputStreamReader( - new FileInputStream(file), - StandardCharsets.UTF_8 - )) - ) { - T obj = gson.fromJson(reader, clazz); - return obj; - } catch (Exception e) { - return null; - } - } - /** * Parses a file in to a JsonObject. */ @@ -738,17 +716,6 @@ public class NEUManager { return inputWithoutLastChar + incrementedLastChar; } - public JsonObject getJsonFromItemBytes(String item_bytes) { - try { - NBTTagCompound tag = - CompressedStreamTools.readCompressed(new ByteArrayInputStream(Base64.getDecoder().decode(item_bytes))); - //System.out.println(tag.toString()); - return getJsonFromNBT(tag); - } catch (IOException e) { - return null; - } - } - public static String getUUIDFromNBT(NBTTagCompound tag) { String uuid = null; if (tag != null && tag.hasKey("ExtraAttributes", 10)) { @@ -778,16 +745,6 @@ public class NEUManager { return null; } - /** - * Replaced with {@link #createItemResolutionQuery()} - */ - @Deprecated - public String getInternalnameFromNBT(NBTTagCompound tag) { - return createItemResolutionQuery() - .withItemNBT(tag) - .resolveInternalName(); - } - public String[] getLoreFromNBT(NBTTagCompound tag) { return ItemUtils.getLore(tag).toArray(new String[0]); } @@ -806,7 +763,9 @@ public class NEUManager { if (id == 141) id = 391; //for some reason hypixel thinks carrots have id 141 - String internalname = getInternalnameFromNBT(tag); + String internalname = createItemResolutionQuery() + .withItemNBT(tag) + .resolveInternalName(); if (internalname == null) return null; NBTTagCompound display = tag.getCompoundTag("display"); @@ -818,8 +777,6 @@ public class NEUManager { itemid = itemMc.getRegistryName(); } String displayName = display.getString("Name"); - String[] info = new String[0]; - String clickcommand = ""; JsonObject item = new JsonObject(); item.addProperty("internalname", internalname); @@ -1232,25 +1189,6 @@ public class NEUManager { } public boolean writeItemJson( - String internalname, String itemid, String displayName, String[] lore, String crafttext, - String infoType, String[] info, String clickcommand, int damage, NBTTagCompound nbttag - ) { - return writeItemJson( - new JsonObject(), - internalname, - itemid, - displayName, - lore, - crafttext, - infoType, - info, - clickcommand, - damage, - nbttag - ); - } - - public boolean writeItemJson( JsonObject base, String internalname, String itemid, String displayName, String[] lore, String crafttext, String infoType, String[] info, String clickcommand, int damage, NBTTagCompound nbttag ) { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/util/StringUtils.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/StringUtils.java index ec50633f..e59a6a14 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/core/util/StringUtils.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/StringUtils.java @@ -19,18 +19,14 @@ package io.github.moulberry.notenoughupdates.core.util; -import com.google.common.collect.Sets; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; - -import java.io.UnsupportedEncodingException; import java.math.BigInteger; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.Set; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.util.Locale; public class StringUtils { - public static final Set<String> PROTOCOLS = Sets.newHashSet("http", "https"); + private final static DecimalFormat TENTHS_DECIMAL_FORMAT = new DecimalFormat("#.#"); + public static final NumberFormat NUMBER_FORMAT = NumberFormat.getInstance(Locale.US); public static String cleanColour(String in) { return in.replaceAll("(?i)\\u00A7.", ""); @@ -40,24 +36,6 @@ public class StringUtils { return in.replaceAll("(?i)\\u00A7[0-9a-f]", "\u00A7r"); } - public static String trimToWidth(String str, int len) { - FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; - String trim = fr.trimStringToWidth(str, len); - - if (str.length() != trim.length() && !trim.endsWith(" ")) { - char next = str.charAt(trim.length()); - if (next != ' ') { - String[] split = trim.split(" "); - String last = split[split.length - 1]; - if (last.length() < 8) { - trim = trim.substring(0, trim.length() - last.length()); - } - } - } - - return trim; - } - public static String substringBetween(String str, String open, String close) { return org.apache.commons.lang3.StringUtils.substringBetween(str, open, close); } @@ -99,22 +77,6 @@ public class StringUtils { return d < 1000 ? (isRound || d > 9.99 ? (int) d * 10 / 10 : d + "") + "" + sizeSuffix[iteration] : shortNumberFormat(d, iteration + 1); } - public static String urlEncode(String something) { - try { - return URLEncoder.encode(something, StandardCharsets.UTF_8.name()); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); // UTF 8 should always be present - } - } - - /** - * taken and modified from https://stackoverflow.com/a/23326014/5507634 - */ - public static String replaceLast(String string, String toReplace, String replacement) { - int start = string.lastIndexOf(toReplace); - return string.substring(0, start) + replacement + string.substring(start + toReplace.length()); - } - public static String removeLastWord(String string, String splitString) { try { String[] split = string.split(splitString); @@ -143,4 +105,12 @@ public class StringUtils { } return true; } + + public static String formatToTenths(Number num) { + return TENTHS_DECIMAL_FORMAT.format(num); + } + + public static String formatNumber(Number num) { + return NUMBER_FORMAT.format(num); + } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/GuiCosmetics.java b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/GuiCosmetics.java index cacae83b..3dbd52a5 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/GuiCosmetics.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/GuiCosmetics.java @@ -49,11 +49,12 @@ import java.util.HashMap; import java.util.List; import java.util.Random; +import static io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer.pv_bg; +import static io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer.pv_dropdown; +import static io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer.pv_elements; + public class GuiCosmetics extends GuiScreen { - public static final ResourceLocation pv_bg = new ResourceLocation("notenoughupdates:pv_bg.png"); - public static final ResourceLocation pv_dropdown = new ResourceLocation("notenoughupdates:pv_dropdown.png"); public static final ResourceLocation cosmetics_fg = new ResourceLocation("notenoughupdates:cosmetics_fg.png"); - public static final ResourceLocation pv_elements = new ResourceLocation("notenoughupdates:pv_elements.png"); private final GuiElementTextField unlockTextField = new GuiElementTextField("", GuiElementTextField.SCALE_TEXT); @@ -301,7 +302,6 @@ public class GuiCosmetics extends GuiScreen { } } - int index = 0; int displayingCapes = 0; for (CapeManager.CapeData cape : CapeManager.INSTANCE.getCapes()) { boolean equipable = CapeManager.INSTANCE.getAvailableCapes() == null || @@ -315,7 +315,6 @@ public class GuiCosmetics extends GuiScreen { float totalAvail = sizeX - 20; float xOffset = scroll * (totalNeeded - totalAvail); - index = 0; int displayIndex = 0; for (CapeManager.CapeData cape : CapeManager.INSTANCE.getCapes()) { boolean equipable = CapeManager.INSTANCE.getAvailableCapes() == null || @@ -447,7 +446,6 @@ public class GuiCosmetics extends GuiScreen { Minecraft.getMinecraft().displayWidth * (sizeX - 6) / width, Minecraft.getMinecraft().displayHeight ); - int index = 0; int displayingCapes = 0; for (CapeManager.CapeData capeData : CapeManager.INSTANCE.getCapes()) { boolean equipable = CapeManager.INSTANCE.getAvailableCapes() == null || @@ -461,7 +459,6 @@ public class GuiCosmetics extends GuiScreen { float totalAvail = sizeX - 20; float xOffset = scroll * (totalNeeded - totalAvail); - index = 0; int displayIndex = 0; for (CapeManager.CapeData capeData : CapeManager.INSTANCE.getCapes()) { boolean equipable = CapeManager.INSTANCE.getAvailableCapes() == null || diff --git a/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java b/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java index 1e3dd7e0..01a173d3 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipListener.java @@ -30,7 +30,6 @@ import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.core.util.MiscUtils; import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.miscfeatures.PetInfoOverlay; -import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.PetLeveling; import io.github.moulberry.notenoughupdates.util.Utils; @@ -57,7 +56,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.TreeSet; @@ -164,7 +162,6 @@ public class ItemTooltipListener { for (int k = 0; k < event.toolTip.size(); k++) { String line = event.toolTip.get(k); - boolean thisLineHasEnchants = false; if (line.endsWith(EnumChatFormatting.DARK_GRAY + "Reforge Stone") && NotEnoughUpdates.INSTANCE.config.tooltipTweaks.showReforgeStats) { @@ -299,7 +296,7 @@ public class ItemTooltipListener { if (reforgeCost >= 0) { String text = EnumChatFormatting.BLUE + "Apply Cost: " + EnumChatFormatting.GOLD + - NumberFormat.getNumberInstance().format(reforgeCost) + " coins"; + StringUtils.formatNumber(reforgeCost) + " coins"; newTooltip.add(""); newTooltip.add(text); } @@ -495,12 +492,11 @@ public class ItemTooltipListener { } } - NumberFormat format = NumberFormat.getInstance(Locale.US); String valueStringBIN1; String valueStringBIN2; if (totalValue >= 0) { valueStringBIN1 = EnumChatFormatting.YELLOW + "Value (BIN): "; - valueStringBIN2 = EnumChatFormatting.GOLD + format.format(totalValue) + " coins"; + valueStringBIN2 = EnumChatFormatting.GOLD + StringUtils.formatNumber(totalValue) + " coins"; } else { valueStringBIN1 = EnumChatFormatting.YELLOW + "Can't find BIN: "; valueStringBIN2 = missingItem; @@ -513,9 +509,9 @@ public class ItemTooltipListener { String plStringBIN; if (profitLossBIN >= 0) { - plStringBIN = prefix + "+" + format.format(profitLossBIN) + " coins"; + plStringBIN = prefix + "+" + StringUtils.formatNumber(profitLossBIN) + " coins"; } else { - plStringBIN = prefix + "-" + format.format(-profitLossBIN) + " coins"; + plStringBIN = prefix + "-" + StringUtils.formatNumber(-profitLossBIN) + " coins"; } String neu = EnumChatFormatting.YELLOW + "[NEU] "; @@ -526,7 +522,7 @@ public class ItemTooltipListener { } for (Map.Entry<String, Double> entry : itemValues.entrySet()) { - newTooltip.add(neu + entry.getKey() + prefix + "+" + format.format(entry.getValue().intValue())); + newTooltip.add(neu + entry.getKey() + prefix + "+" + StringUtils.formatNumber(entry.getValue().intValue())); } } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipRngListener.java b/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipRngListener.java index 06d294a3..10882b9b 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipRngListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/ItemTooltipRngListener.java @@ -169,17 +169,17 @@ public class ItemTooltipRngListener { if (matcher.matches()) { String odds = matcher.group(1); int baseChance = calculateChance(matcher.group(2)); - String baseFormat = GuiProfileViewer.numberFormat.format(baseChance); + String baseFormat = StringUtils.formatNumber(baseChance); String fractionFormat = "§7(1/" + baseFormat + ")"; result = odds + " " + fractionFormat; } else if (matcherSelected.matches()) { String odds = matcherSelected.group(1); int baseChance = calculateChance(matcherSelected.group(2)); - String baseFormat = GuiProfileViewer.numberFormat.format(baseChance); + String baseFormat = StringUtils.formatNumber(baseChance); int increasedChance = calculateChance(matcherSelected.group(3)); - String increased = GuiProfileViewer.numberFormat.format(increasedChance); + String increased = StringUtils.formatNumber(increasedChance); String fractionFormat = "§7(§8§m1/" + baseFormat + "§r §71/" + increased + ")"; result = odds + " " + fractionFormat; @@ -304,8 +304,8 @@ public class ItemTooltipRngListener { int runsNeeded = (int) Math.floor((double) needed / (double) gainPerRun); int runsHaving = having / gainPerRun; - String runsNeededFormat = GuiProfileViewer.numberFormat.format(runsNeeded); - String runsHavingFormat = GuiProfileViewer.numberFormat.format(runsHaving); + String runsNeededFormat = StringUtils.formatNumber(runsNeeded); + String runsHavingFormat = StringUtils.formatNumber(runsHaving); String progressString = null; if (nextLineProgress) { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java b/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java index 9b88a094..a31e54c4 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/listener/RenderListener.java @@ -940,7 +940,7 @@ public class RenderListener { if (tag.hasKey("SkullOwner") && tag.getCompoundTag("SkullOwner").hasKey("Name")) { String username = tag.getCompoundTag("SkullOwner").getString("Name"); Utils.playPressSound(); - NotEnoughUpdates.profileViewer.getProfileByName(username, profile -> { + NotEnoughUpdates.profileViewer.loadPlayerByName(username, profile -> { if (profile == null) { Utils.addChatMessage("${RED}Invalid player name/API key. Maybe the API is down? Try /api new."); } else { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CustomItemEffects.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CustomItemEffects.java index 55dedadf..72431697 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CustomItemEffects.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CustomItemEffects.java @@ -715,7 +715,9 @@ public class CustomItemEffects { NBTTagCompound buildersItem = items.getCompoundTagAt(j); if (buildersItem.getKeySet().size() > 0) { String internalname = - NotEnoughUpdates.INSTANCE.manager.getInternalnameFromNBT(buildersItem.getCompoundTag("tag")); + NotEnoughUpdates.INSTANCE.manager.createItemResolutionQuery() + .withItemNBT(buildersItem.getCompoundTag("tag")) + .resolveInternalName(); if (internalname != null && internalname.equals("INFINIDIRT_WAND")) { return true; } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PetInfoOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PetInfoOverlay.java index 693bb3e3..fadf8b1b 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PetInfoOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PetInfoOverlay.java @@ -22,6 +22,7 @@ package io.github.moulberry.notenoughupdates.miscfeatures; import com.google.common.collect.Lists; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonNull; import com.google.gson.JsonObject; @@ -36,6 +37,7 @@ import io.github.moulberry.notenoughupdates.options.NEUConfig; import io.github.moulberry.notenoughupdates.overlays.TextOverlay; import io.github.moulberry.notenoughupdates.overlays.TextOverlayStyle; import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer; +import io.github.moulberry.notenoughupdates.profileviewer.SkyblockProfiles; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.PetLeveling; import io.github.moulberry.notenoughupdates.util.ProfileApiSyncer; @@ -66,15 +68,11 @@ import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; import java.nio.file.Files; -import java.text.DecimalFormat; -import java.text.DecimalFormatSymbols; -import java.text.NumberFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Set; @@ -283,15 +281,15 @@ public class PetInfoOverlay extends TextOverlay { } } - private static void getAndSetPet(ProfileViewer.Profile profile) { - Map<String, ProfileViewer.Level> skyblockInfo = profile.getSkyblockInfo(profile.getLatestProfile()); - JsonObject invInfo = profile.getInventoryInfo(profile.getLatestProfile()); - JsonObject profileInfo = profile.getProfileInformation(profile.getLatestProfile()); + private static void getAndSetPet(SkyblockProfiles profile) { + Map<String, ProfileViewer.Level> skyblockInfo = profile.getLatestProfile().getLevelingInfo(); + Map<String, JsonArray> invInfo = profile.getLatestProfile().getInventoryInfo(); + JsonObject profileInfo = profile.getLatestProfile().getProfileJson(); if (invInfo != null && profileInfo != null) { JsonObject stats = profileInfo.get("stats").getAsJsonObject(); boolean hasBeastmasterCrest = false; Rarity currentBeastRarity = Rarity.COMMON; - for (JsonElement talisman : invInfo.get("talisman_bag").getAsJsonArray()) { + for (JsonElement talisman : invInfo.get("talisman_bag")) { if (talisman.isJsonNull()) continue; String internalName = talisman.getAsJsonObject().get("internalname").getAsString(); if (internalName.startsWith("BEASTMASTER_CREST")) { @@ -323,7 +321,9 @@ public class PetInfoOverlay extends TextOverlay { } } } - if (skyblockInfo != null) config.tamingLevel = (int) skyblockInfo.get("taming").level; + if (skyblockInfo != null && profile.getLatestProfile().skillsApiEnabled()) { + config.tamingLevel = (int) skyblockInfo.get("taming").level; + } //JsonObject petObject = profile.getPetsInfo(profile.getLatestProfile()); /*JsonObject petsJson = Constants.PETS; @@ -515,10 +515,9 @@ public class PetInfoOverlay extends TextOverlay { } public float getLevelPercent(Pet pet) { - DecimalFormat df = new DecimalFormat("#.#", DecimalFormatSymbols.getInstance(Locale.ENGLISH)); if (pet == null) return 0; try { - return Float.parseFloat(df.format(Math.min(pet.petLevel.getPercentageToNextLevel() * 100f, 100f))); + return Float.parseFloat(StringUtils.formatToTenths(Math.min(pet.petLevel.getPercentageToNextLevel() * 100f, 100f))); } catch (Exception ignored) { return 0; } @@ -1085,13 +1084,13 @@ public class PetInfoOverlay extends TextOverlay { public String roundFloat(float f) { if (f % 1 < 0.05f) { - return NumberFormat.getNumberInstance().format((int) f); + return StringUtils.formatNumber((int) f); } else { String s = Utils.floatToString(f, 1); if (s.contains(".")) { - return NumberFormat.getNumberInstance().format((int) f) + '.' + s.split("\\.")[1]; + return StringUtils.formatNumber((int) f) + '.' + s.split("\\.")[1]; } else if (s.contains(",")) { - return NumberFormat.getNumberInstance().format((int) f) + ',' + s.split(",")[1]; + return StringUtils.formatNumber((int) f) + ',' + s.split(",")[1]; } else { return s; } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PowerStoneStatsDisplay.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PowerStoneStatsDisplay.java index 907f0f0d..fd9b2938 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PowerStoneStatsDisplay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PowerStoneStatsDisplay.java @@ -19,6 +19,7 @@ package io.github.moulberry.notenoughupdates.miscfeatures; +import com.google.gson.JsonArray; import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.autosubscribe.NEUAutoSubscribe; @@ -38,15 +39,12 @@ import net.minecraftforge.event.entity.player.ItemTooltipEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; -import java.text.NumberFormat; import java.util.LinkedList; import java.util.List; -import java.util.Locale; @NEUAutoSubscribe public class PowerStoneStatsDisplay { private static PowerStoneStatsDisplay instance = null; - private final NumberFormat format = NumberFormat.getInstance(Locale.US); private boolean dirty = true; public static PowerStoneStatsDisplay getInstance() { @@ -59,16 +57,14 @@ public class PowerStoneStatsDisplay { @SubscribeEvent public void onProfileDataLoaded(ProfileDataLoadedEvent event) { JsonObject profileInfo = event.getProfileInfo(); - if (profileInfo == null) return; - JsonObject inventoryInfo = ProfileViewerUtils.readInventoryInfo(profileInfo, "talisman_bag"); + JsonArray inventoryInfo = ProfileViewerUtils.readInventoryInfo(profileInfo, "talisman_bag"); if (inventoryInfo == null) return; NEUConfig.HiddenProfileSpecific configProfileSpecific = NotEnoughUpdates.INSTANCE.config.getProfileSpecific(); if (configProfileSpecific == null) return; - int powerAmount = ProfileViewerUtils.getMagicalPower(inventoryInfo, profileInfo); - configProfileSpecific.magicalPower = powerAmount; + configProfileSpecific.magicalPower = ProfileViewerUtils.getMagicalPower(inventoryInfo, profileInfo); } @SubscribeEvent @@ -92,8 +88,7 @@ public class PowerStoneStatsDisplay { String rawNumber = line.split("§6")[1].replace(",", ""); NEUConfig.HiddenProfileSpecific configProfileSpecific = NotEnoughUpdates.INSTANCE.config.getProfileSpecific(); if (configProfileSpecific == null) return; - int magicalPower = Integer.parseInt(rawNumber); - configProfileSpecific.magicalPower = magicalPower; + configProfileSpecific.magicalPower = Integer.parseInt(rawNumber); } } } @@ -153,7 +148,7 @@ public class PowerStoneStatsDisplay { return; } - event.toolTip.set(index, "§7At §6" + format.format((double) magicalPower) + " Magical Power§7:"); + event.toolTip.set(index, "§7At §6" + StringUtils.formatNumber((double) magicalPower) + " Magical Power§7:"); foundMagicalPower = true; continue; } @@ -177,7 +172,7 @@ public class PowerStoneStatsDisplay { } double realStat = (currentStat / scaledCurrentPower) * scaledMagicalPower; - String format = this.format.format((double) Math.round(realStat)); + String format = StringUtils.formatNumber((double) Math.round(realStat)); format += rawStat.substring(rawStat.length() - 1); event.toolTip.set(index, line.replace(rawStat, format)); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/TradeWindow.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/TradeWindow.java index 6d565bb3..4d88ef07 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/TradeWindow.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/TradeWindow.java @@ -23,6 +23,7 @@ import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.auction.APIManager; import io.github.moulberry.notenoughupdates.core.config.KeybindHelper; +import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.miscfeatures.SlotLocking; import io.github.moulberry.notenoughupdates.mixins.AccessorGuiContainer; import io.github.moulberry.notenoughupdates.util.Utils; @@ -46,12 +47,10 @@ import org.lwjgl.opengl.GL11; import java.awt.*; import java.io.ByteArrayInputStream; -import java.text.NumberFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.TreeMap; @@ -75,10 +74,6 @@ public class TradeWindow { private static String[] theirTradeOld = new String[16]; private static Long[] theirTradeChangesMillis = new Long[16]; - private static ItemStack lastBackpack; - private static int lastBackpackX; - private static int lastBackpackY; - public static boolean hypixelTradeWindowActive(String containerName) { return containerName != null && containerName.trim().startsWith("You "); } @@ -129,9 +124,8 @@ public class TradeWindow { JsonObject info = NotEnoughUpdates.INSTANCE.manager.auctionManager.getItemAuctionInfo(internalName); if (info != null && !NotEnoughUpdates.INSTANCE.manager.auctionManager.isVanillaItem(internalName) && info.has("price") && info.has("count")) { - long auctionPricePer = (long) (info.get("price").getAsDouble() / info.get("count").getAsDouble()); - pricePer = auctionPricePer; + pricePer = (long) (info.get("price").getAsDouble() / info.get("count").getAsDouble()); } } if (pricePer == -1) { @@ -293,7 +287,9 @@ public class TradeWindow { for (int k = 0; k < items.tagCount(); k++) { if (items.getCompoundTagAt(k).getKeySet().size() > 0) { NBTTagCompound nbt = items.getCompoundTagAt(k).getCompoundTag("tag"); - String internalname2 = NotEnoughUpdates.INSTANCE.manager.getInternalnameFromNBT(nbt); + String internalname2 = NotEnoughUpdates.INSTANCE.manager.createItemResolutionQuery() + .withItemNBT(nbt) + .resolveInternalName(); if (internalname2 != null) { long pricePer2 = getPrice(internalname2); if (pricePer2 > 0) { @@ -412,7 +408,7 @@ public class TradeWindow { if (stack == null) continue; NBTTagCompound tag = stack.getTagCompound(); - String uuid = null; + String uuid; if (tag != null && tag.hasKey("ExtraAttributes", 10)) { NBTTagCompound ea = tag.getCompoundTag("ExtraAttributes"); @@ -533,7 +529,7 @@ public class TradeWindow { if (stack == null) continue; NBTTagCompound tag = stack.getTagCompound(); - String uuid = null; + String uuid; if (tag != null && tag.hasKey("ExtraAttributes", 10)) { NBTTagCompound ea = tag.getCompoundTag("ExtraAttributes"); @@ -820,8 +816,6 @@ public class TradeWindow { theirPrice += processTopItems(stack, theirTopItems, theirTopItemsStack, theirTopItemsCount); } - NumberFormat format = NumberFormat.getInstance(Locale.US); - GlStateManager.disableLighting(); GlStateManager.color(1, 1, 1, 1); Minecraft.getMinecraft().getTextureManager().bindTexture(location); @@ -831,7 +825,7 @@ public class TradeWindow { drawStringShadow(EnumChatFormatting.GOLD.toString() + EnumChatFormatting.BOLD + "Total Value", guiLeft - 40 - 3, guiTop + 11, 72 ); - drawStringShadow(EnumChatFormatting.GOLD.toString() + EnumChatFormatting.BOLD + format.format(ourPrice), + drawStringShadow(EnumChatFormatting.GOLD.toString() + EnumChatFormatting.BOLD + StringUtils.formatNumber(ourPrice), guiLeft - 40 - 3, guiTop + 21, 72 ); @@ -861,7 +855,7 @@ public class TradeWindow { GlStateManager.disableBlend(); GlStateManager.color(1, 1, 1, 1); drawStringShadow( - EnumChatFormatting.GOLD.toString() + EnumChatFormatting.BOLD + format.format(entry.getKey()), + EnumChatFormatting.GOLD.toString() + EnumChatFormatting.BOLD + StringUtils.formatNumber(entry.getKey()), guiLeft - 29 - 3, guiTop + 57 + 18 * ourTopIndex, 52 @@ -875,7 +869,7 @@ public class TradeWindow { 72 ); drawStringShadow( - EnumChatFormatting.GOLD.toString() + EnumChatFormatting.BOLD + format.format(entry.getKey()), + EnumChatFormatting.GOLD.toString() + EnumChatFormatting.BOLD + StringUtils.formatNumber(entry.getKey()), guiLeft - 40 - 3, guiTop + 56 + 20 * ourTopIndex, 72 @@ -894,7 +888,7 @@ public class TradeWindow { drawStringShadow(EnumChatFormatting.GOLD.toString() + EnumChatFormatting.BOLD + "Total Value", guiLeft + xSize + 3 + 40, guiTop + 11, 72 ); - drawStringShadow(EnumChatFormatting.GOLD.toString() + EnumChatFormatting.BOLD + format.format(theirPrice), + drawStringShadow(EnumChatFormatting.GOLD.toString() + EnumChatFormatting.BOLD + StringUtils.formatNumber(theirPrice), guiLeft + xSize + 3 + 40, guiTop + 21, 72 ); @@ -924,7 +918,7 @@ public class TradeWindow { GlStateManager.disableBlend(); GlStateManager.color(1, 1, 1, 1); drawStringShadow( - EnumChatFormatting.GOLD.toString() + EnumChatFormatting.BOLD + format.format(entry.getKey()), + EnumChatFormatting.GOLD.toString() + EnumChatFormatting.BOLD + StringUtils.formatNumber(entry.getKey()), guiLeft + xSize + 3 + 51, guiTop + 57 + 18 * theirTopIndex, 52 @@ -935,7 +929,7 @@ public class TradeWindow { guiLeft + xSize + 3 + 40, guiTop + 46 + 20 * theirTopIndex, 72 ); drawStringShadow( - EnumChatFormatting.GOLD.toString() + EnumChatFormatting.BOLD + format.format(entry.getKey()), + EnumChatFormatting.GOLD.toString() + EnumChatFormatting.BOLD + StringUtils.formatNumber(entry.getKey()), guiLeft + xSize + 3 + 40, guiTop + 56 + 20 * theirTopIndex, 72 @@ -1099,15 +1093,12 @@ public class TradeWindow { if (mouseY >= guiTop + ySize - 19 && mouseY <= guiTop + ySize - 19 + 17) { NotEnoughUpdates.INSTANCE.config.tradeMenu.enableCustomTrade = !NotEnoughUpdates.INSTANCE.config.tradeMenu.enableCustomTrade; - return; } else if (mouseY >= guiTop + ySize - 38 && mouseY <= guiTop + ySize - 38 + 17) { NotEnoughUpdates.INSTANCE.config.tradeMenu.customTradePrices = !NotEnoughUpdates.INSTANCE.config.tradeMenu.customTradePrices; - return; } else if (mouseY >= guiTop + ySize - 57 && mouseY <= guiTop + ySize - 57 + 17) { NotEnoughUpdates.INSTANCE.config.tradeMenu.customTradePriceStyle = !NotEnoughUpdates.INSTANCE.config.tradeMenu.customTradePriceStyle; - return; } } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/hex/GuiCustomHex.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/hex/GuiCustomHex.java index deef7bdc..fb936a4d 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/hex/GuiCustomHex.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/hex/GuiCustomHex.java @@ -25,6 +25,7 @@ import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.core.GlScissorStack; import io.github.moulberry.notenoughupdates.core.GuiElementTextField; +import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.core.util.lerp.LerpingFloat; import io.github.moulberry.notenoughupdates.core.util.lerp.LerpingInteger; import io.github.moulberry.notenoughupdates.miscfeatures.SlotLocking; @@ -63,13 +64,11 @@ import org.lwjgl.opengl.GL11; import org.lwjgl.util.glu.Project; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.text.NumberFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.List; -import java.util.Locale; import java.util.Objects; import java.util.Random; import java.util.regex.Matcher; @@ -82,14 +81,10 @@ public class GuiCustomHex extends Gui { "textures/entity/enchanting_table_book.png"); private static final ModelBook MODEL_BOOK = new ModelBook(); - private static final int EXPERIENCE_ORB_COUNT = 30; - private static final Pattern XP_COST_PATTERN = Pattern.compile("\\u00a73(\\d+) Exp Levels"); private static final Pattern ENCHANT_LEVEL_PATTERN = Pattern.compile("(.*)_(.*)"); private static final Pattern ENCHANT_NAME_PATTERN = Pattern.compile("([^IVX]*) ([IVX]*)"); - public static final NumberFormat numberFormat = NumberFormat.getInstance(Locale.US); - public class Enchantment { public int slotIndex; public String enchantName; @@ -112,8 +107,10 @@ public class GuiCustomHex extends Gui { this.level = level; boolean isUlt = false; for (String lore : displayLore) { - if (lore.contains("§l")) isUlt = true; - break; + if (lore.contains("§l")) { + isUlt = true; + break; + } } JsonObject bazaarInfo = NotEnoughUpdates.INSTANCE.manager.auctionManager.getBazaarInfo( (isUlt ? "ULTIMATE_" : "") + enchId.toUpperCase() + ";" + level); @@ -502,7 +499,7 @@ public class GuiCustomHex extends Gui { int index = 0; for (String lore : enchantment.displayLore) { if (lore.contains("N/A") && enchantment.price > 0) { - String price = numberFormat.format(enchantment.price); + String price = StringUtils.formatNumber(enchantment.price); enchantment.displayLore.set(index, "\u00a76" + price + ".0 Coins"); } if (lore.contains("Loading...")) { @@ -1532,7 +1529,7 @@ public class GuiCustomHex extends Gui { fr.drawString(levelStr, left + 8 - levelWidth / 2, top + 4 + 1, 0x2d2102, false); fr.drawString(levelStr, left + 8 - levelWidth / 2, top + 4, colour, false); - String priceStr = "" + numberFormat.format(enchanterCurrentEnch.price) + " Coins"; + String priceStr = StringUtils.formatNumber(enchanterCurrentEnch.price) + " Coins"; if (enchanterCurrentEnch.price < 0) priceStr = ""; int priceWidth = fr.getStringWidth(priceStr); int priceTop = guiTop + 16; @@ -2076,7 +2073,7 @@ public class GuiCustomHex extends Gui { } } - String priceStr = "" + numberFormat.format(enchanterCurrentItem.getPrice()) + " Coins"; + String priceStr = StringUtils.formatNumber(enchanterCurrentItem.getPrice()) + " Coins"; if (enchanterCurrentItem.price < 0) priceStr = ""; int priceWidth = fr.getStringWidth(priceStr); int priceTop = guiTop + 10; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/CrystalHollowOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/CrystalHollowOverlay.java index 852a2742..1bc08744 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/CrystalHollowOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/CrystalHollowOverlay.java @@ -21,6 +21,7 @@ package io.github.moulberry.notenoughupdates.overlays; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.core.config.Position; +import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.miscfeatures.StorageManager; import io.github.moulberry.notenoughupdates.options.NEUConfig; import io.github.moulberry.notenoughupdates.util.SBInfo; @@ -34,7 +35,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; import org.lwjgl.util.vector.Vector2f; -import java.text.DecimalFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -213,11 +213,10 @@ public class CrystalHollowOverlay extends TextOverlay { if (crystalCheck()) { int count = getCountCrystal(hidden.crystals); float percent = (float) count / hidden.crystals.size() * 100; - DecimalFormat df = new DecimalFormat("#.#"); overlayStrings.add( EnumChatFormatting.values()[NotEnoughUpdates.INSTANCE.config.mining.crystalHollowPartColor] + "Crystals: " + getColor(percent) + - df.format(percent) + "%"); + StringUtils.formatToTenths(percent) + "%"); } break; case 3: @@ -334,11 +333,10 @@ public class CrystalHollowOverlay extends TextOverlay { ) { int count = getCount(parts, inventoryData, storageData); float percent = (float) count / parts.size() * 100; - DecimalFormat df = new DecimalFormat("#.#"); overlayStrings.add( EnumChatFormatting.values()[NotEnoughUpdates.INSTANCE.config.mining.crystalHollowPartColor] + text + ": " + getColor(percent) + - df.format(percent) + "%"); + StringUtils.formatToTenths(percent) + "%"); } private EnumChatFormatting getColor(float percent) { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/BasicPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/BasicPage.java index 266722e5..d6740c0c 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/BasicPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/BasicPage.java @@ -28,6 +28,7 @@ import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.profileviewer.level.LevelPage; import io.github.moulberry.notenoughupdates.profileviewer.weight.lily.LilyWeight; import io.github.moulberry.notenoughupdates.profileviewer.weight.senither.SenitherWeight; +import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.Weight; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.PronounDB; import io.github.moulberry.notenoughupdates.util.SBInfo; @@ -67,7 +68,6 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; -import static io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer.DECIMAL_FORMAT; import static io.github.moulberry.notenoughupdates.util.Utils.roundToNearestInt; public class BasicPage extends GuiProfileViewerPage { @@ -130,13 +130,12 @@ public class BasicPage extends GuiProfileViewerPage { @Override public void drawPage(int mouseX, int mouseY, float partialTicks) { FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; - ProfileViewer.Profile profile = GuiProfileViewer.getProfile(); - String profileId = GuiProfileViewer.getProfileId(); + SkyblockProfiles profile = GuiProfileViewer.getProfile(); int guiLeft = GuiProfileViewer.getGuiLeft(); int guiTop = GuiProfileViewer.getGuiTop(); if (onSecondPage) { - levelPage.drawPage(mouseX, mouseY); + levelPage.drawPage(mouseX, mouseY, partialTicks); return; } @@ -202,8 +201,11 @@ public class BasicPage extends GuiProfileViewerPage { Minecraft.getMinecraft().getTextureManager().bindTexture(pv_basic); Utils.drawTexturedRect(guiLeft, guiTop, getInstance().sizeX, getInstance().sizeY, GL11.GL_NEAREST); - JsonObject profileInfo = profile.getProfileInformation(profileId); - if (profileInfo == null) return; + String profileName = GuiProfileViewer.getProfileName(); + SkyblockProfiles.SkyblockProfile selectedProfile = getSelectedProfile(); + if (selectedProfile == null) { + return; + } if (entityPlayer != null && profile.getHypixelProfile() != null) { String playerName = null; @@ -251,11 +253,10 @@ public class BasicPage extends GuiProfileViewerPage { playerName = EnumChatFormatting.GRAY + name; if (rankName != null) { - String icon = getIcon(getGameModeType(profileInfo)); + String icon = selectedProfile.getGamemode() == null ? "" : getIcon(selectedProfile.getGamemode()); playerName = "\u00A7" + rankColor + "[" + rankName + rankPlusColor + rankPlus + "\u00A7" + rankColor + "] " + name + (icon.equals("") ? "" : " " + icon); - ; } } } @@ -279,50 +280,45 @@ public class BasicPage extends GuiProfileViewerPage { } } - long networth; + String stateStr = EnumChatFormatting.RED + "An error occurred"; + long networth = -2; ArrayList<String> nwCategoryHover = new ArrayList<>(); if (NotEnoughUpdates.INSTANCE.config.profileViewer.useSoopyNetworth) { - ProfileViewer.Profile.SoopyNetworthData nwData = profile.getSoopyNetworth(profileId, () -> {}); - if (nwData == null) { - networth = -2l; - } else { - networth = nwData.getTotal(); - - for (String category : nwData.getCategories()) { - if (nwData.getCategory(category) == 0) continue; - - nwCategoryHover.add(EnumChatFormatting.GREEN + - WordUtils.capitalizeFully(category.replace("_", " ")) + + SkyblockProfiles.SoopyNetworth nwData = selectedProfile.getSoopyNetworth(() -> {}); + networth = nwData.getNetworth(); + + if (networth == -1) { + stateStr = EnumChatFormatting.YELLOW + "Loading..."; + } else if (networth != -2) { // -2 indicates error + for (Map.Entry<String, Long> entry : nwData.getCategoryToTotal().entrySet()) { + nwCategoryHover.add( + EnumChatFormatting.GREEN + + WordUtils.capitalizeFully(entry.getKey().replace("_", " ")) + ": " + EnumChatFormatting.GOLD + - GuiProfileViewer.numberFormat.format(nwData.getCategory(category))); + StringUtils.formatNumber(entry.getValue()) + ); } - nwCategoryHover.add(""); } - } else { - networth = profile.getNetWorth(profileId); } - //Networth is under 0 - //If = -1 -> an error occurred - //If = -2 -> still loading networth - String stateStr = EnumChatFormatting.RED + "An error occurred"; + // Calculate using NEU networth if not using soopy networth or soopy networth errored if (networth == -2) { - stateStr = EnumChatFormatting.YELLOW + "Loading..."; - } else if (networth == -1) { - networth = profile.getNetWorth(profileId); + networth = selectedProfile.getNetworth(); } - int fontWidth = fr.getStringWidth("Net Worth: " + GuiProfileViewer.numberFormat.format(networth)); - int offset = (fontWidth >= 117 ? 63 + (fontWidth - 117) : 63); + if (networth > 0) { + int fontWidth = fr.getStringWidth("Net Worth: " + StringUtils.formatNumber(networth)); + int offset = (fontWidth >= 117 ? 63 + (fontWidth - 117) : 63); + if (fontWidth >= 117) { fr.drawString(EnumChatFormatting.GREEN + "Net Worth: " + EnumChatFormatting.GOLD + - GuiProfileViewer.numberFormat.format(networth), guiLeft + 8, guiTop + 38 - fr.FONT_HEIGHT / 2f, 0, true); + StringUtils.formatNumber(networth), guiLeft + 8, guiTop + 38 - fr.FONT_HEIGHT / 2f, 0, true); } else { Utils.drawStringCentered( EnumChatFormatting.GREEN + "Net Worth: " + EnumChatFormatting.GOLD + - GuiProfileViewer.numberFormat.format(networth), + StringUtils.formatNumber(networth), guiLeft + 68, guiTop + 38, true, 0 ); } @@ -336,7 +332,7 @@ public class BasicPage extends GuiProfileViewerPage { .get("avg_buy") .getAsDouble() ); - String networthIRLMoney = GuiProfileViewer.numberFormat.format(Math.round( + String networthIRLMoney = StringUtils.formatNumber(Math.round( ((networthInCookies * 325) / 675) * 4.99)); @@ -355,10 +351,10 @@ public class BasicPage extends GuiProfileViewerPage { if (NotEnoughUpdates.INSTANCE.config.profileViewer.useSoopyNetworth && profile.getSoopyNetworthLeaderboardPosition() >= 0 - && profile.isProfileMaxSoopyWeight(profile, profileId)) { + && profile.isProfileMaxSoopyWeight(profileName)) { getInstance().tooltipToDisplay.add(""); String lbPosStr = - EnumChatFormatting.DARK_GREEN + "#" + EnumChatFormatting.GOLD + GuiProfileViewer.numberFormat.format( + EnumChatFormatting.DARK_GREEN + "#" + EnumChatFormatting.GOLD + StringUtils.formatNumber( profile.getSoopyNetworthLeaderboardPosition()); getInstance().tooltipToDisplay.add( lbPosStr + EnumChatFormatting.GREEN + " on soopy's networth leaderboard!"); @@ -472,15 +468,15 @@ public class BasicPage extends GuiProfileViewerPage { entityPlayer.getDataWatcher().updateObject(10, b); } - Map<String, ProfileViewer.Level> skyblockInfo = profile.getSkyblockInfo(profileId); - JsonObject inventoryInfo = profile.getInventoryInfo(profileId); + Map<String, ProfileViewer.Level> skyblockInfo = getSelectedProfile().getLevelingInfo(); + Map<String, JsonArray> inventoryInfo = getSelectedProfile().getInventoryInfo(); if (entityPlayer != null) { if (backgroundClickedX != -1 && Mouse.isButtonDown(1)) { Arrays.fill(entityPlayer.inventory.armorInventory, null); } else { - if (inventoryInfo != null && inventoryInfo.has("inv_armor")) { - JsonArray items = inventoryInfo.get("inv_armor").getAsJsonArray(); + if (inventoryInfo != null && inventoryInfo.containsKey("inv_armor")) { + JsonArray items = inventoryInfo.get("inv_armor"); if (items != null && items.size() == 4) { for (int i = 0; i < entityPlayer.inventory.armorInventory.length; i++) { JsonElement itemElement = items.get(i); @@ -531,7 +527,7 @@ public class BasicPage extends GuiProfileViewerPage { } GlStateManager.color(1, 1, 1, 1); - JsonObject petsInfo = profile.getPetsInfo(profileId); + JsonObject petsInfo = profile.getProfile(profileName).getPetsInfo(); if (petsInfo != null) { JsonElement activePetElement = petsInfo.get("active_pet"); if (activePetElement != null && activePetElement.isJsonObject()) { @@ -582,8 +578,8 @@ public class BasicPage extends GuiProfileViewerPage { int sbLevelX = guiLeft + 162; int sbLevelY = guiTop + 90; - double skyblockLevel = profile.getSkyblockLevel(profileId); - EnumChatFormatting skyblockLevelColour = profile.getSkyblockLevelColour(profileId); + double skyblockLevel = profile.getProfile(profileName).getSkyblockLevel(); + EnumChatFormatting skyblockLevelColour = profile.getProfile(profileName).getSkyblockLevelColour(); GlStateManager.pushMatrix(); GlStateManager.translate(sbLevelX, sbLevelY, 0); @@ -607,7 +603,7 @@ public class BasicPage extends GuiProfileViewerPage { } } - if (skyblockInfo != null) { + if (skyblockInfo != null && selectedProfile.skillsApiEnabled()) { int position = 0; for (Map.Entry<String, ItemStack> entry : ProfileViewer.getSkillToSkillDisplayMap().entrySet()) { if (entry.getValue() == null || entry.getKey() == null) { @@ -653,15 +649,15 @@ public class BasicPage extends GuiProfileViewerPage { "/" + StringUtils.shortNumberFormat(maxXp)); } - String totalXpS = GuiProfileViewer.numberFormat.format((long) level.totalXp); + String totalXpS = StringUtils.formatNumber((long) level.totalXp); tooltipToDisplay.add(EnumChatFormatting.GRAY + "Total XP: " + EnumChatFormatting.DARK_PURPLE + totalXpS + EnumChatFormatting.DARK_GRAY + " (" + - DECIMAL_FORMAT.format(guiProfileViewer.getPercentage(entry.getKey().toLowerCase(), level)) + + StringUtils.formatToTenths(guiProfileViewer.getPercentage(entry.getKey().toLowerCase(), level)) + "% to " + level.maxLevel + ")"); if (entry.getKey().equals("farming")) { // double drops + pelts - int doubleDrops = Utils.getElementAsInt(Utils.getElement(profileInfo, "jacob2.perks.double_drops"), 0); - int peltCount = Utils.getElementAsInt(Utils.getElement(profileInfo, "trapper_quest.pelt_count"), 0); + int doubleDrops = Utils.getElementAsInt(Utils.getElement(selectedProfile.getProfileJson(), "jacob2.perks.double_drops"), 0); + int peltCount = Utils.getElementAsInt(Utils.getElement(selectedProfile.getProfileJson(), "trapper_quest.pelt_count"), 0); if (doubleDrops == 15) { tooltipToDisplay.add("§7Double Drops: §6" + (doubleDrops * 2) + "%"); @@ -670,7 +666,7 @@ public class BasicPage extends GuiProfileViewerPage { tooltipToDisplay.add("§7Pelts: §e" + peltCount); // medals - JsonObject medals_inv = Utils.getElement(profileInfo, "jacob2.medals_inv").getAsJsonObject(); + JsonObject medals_inv = Utils.getElement(selectedProfile.getProfileJson(), "jacob2.medals_inv").getAsJsonObject(); tooltipToDisplay.add(" "); for (String medalName : medalNames) { String textWithoutFormattingCodes = @@ -687,12 +683,18 @@ public class BasicPage extends GuiProfileViewerPage { } String slayerNameLower = entry.getKey().toLowerCase(); - if (ExtraPage.slayers.containsKey(slayerNameLower)) { - int maxLevel = ExtraPage.slayers.get(slayerNameLower); + if (Weight.SLAYER_NAMES.contains(slayerNameLower)) { + JsonObject slayerToTier = Constants.LEVELING.getAsJsonObject("slayer_to_highest_tier"); + if (slayerToTier == null) { + Utils.showOutdatedRepoNotification(); + return; + } + + int maxLevel = slayerToTier.get(slayerNameLower).getAsInt(); for (int i = 0; i < 5; i++) { if (i >= maxLevel) break; float tier = Utils.getElementAsFloat( - Utils.getElement(profileInfo, "slayer_bosses." + slayerNameLower + ".boss_kills_tier_" + i), + Utils.getElement(selectedProfile.getProfileJson(), "slayer_bosses." + slayerNameLower + ".boss_kills_tier_" + i), 0 ); tooltipToDisplay.add(EnumChatFormatting.GRAY + "T" + (i + 1) + " Kills: " + @@ -718,7 +720,9 @@ public class BasicPage extends GuiProfileViewerPage { } drawSideButtons(); - if (NotEnoughUpdates.INSTANCE.config.profileViewer.displayWeight) renderWeight(mouseX, mouseY, skyblockInfo, profileInfo); + if (NotEnoughUpdates.INSTANCE.config.profileViewer.displayWeight) { + renderWeight(mouseX, mouseY, selectedProfile); + } } private String getIcon(String gameModeType) { @@ -761,15 +765,19 @@ public class BasicPage extends GuiProfileViewerPage { private void renderWeight( int mouseX, int mouseY, - Map<String, ProfileViewer.Level> skyblockInfo, - JsonObject profileInfo + SkyblockProfiles.SkyblockProfile selectedProfile ) { + if (!selectedProfile.skillsApiEnabled()) { + return; + } + + Map<String, ProfileViewer.Level> skyblockInfo = selectedProfile.getLevelingInfo(); if (skyblockInfo == null) { return; } - ProfileViewer.Profile profile = GuiProfileViewer.getProfile(); - String profileId = GuiProfileViewer.getProfileId(); + SkyblockProfiles profile = GuiProfileViewer.getProfile(); + String profileName = GuiProfileViewer.getProfileName(); if (Constants.WEIGHT == null || Utils.getElement(Constants.WEIGHT, "lily.skills.overall") == null || !Utils.getElement(Constants.WEIGHT, "lily.skills.overall").isJsonPrimitive()) { @@ -782,7 +790,7 @@ public class BasicPage extends GuiProfileViewerPage { int guiTop = GuiProfileViewer.getGuiTop(); SenitherWeight senitherWeight = new SenitherWeight(skyblockInfo); - LilyWeight lilyWeight = new LilyWeight(skyblockInfo, profileInfo); + LilyWeight lilyWeight = new LilyWeight(skyblockInfo, selectedProfile.getProfileJson()); long weight = -2L; if (NotEnoughUpdates.INSTANCE.config.profileViewer.useSoopyNetworth) { @@ -793,13 +801,13 @@ public class BasicPage extends GuiProfileViewerPage { EnumChatFormatting.GREEN + "Senither Weight: " + EnumChatFormatting.GOLD + - GuiProfileViewer.numberFormat.format(roundToNearestInt(senitherWeight.getTotalWeight().getRaw())), + StringUtils.formatNumber(roundToNearestInt(senitherWeight.getTotalWeight().getRaw())), guiLeft + 63, guiTop + 18, true, 0 ); int textWidth = fr.getStringWidth( "Senither Weight: " + - GuiProfileViewer.numberFormat.format(roundToNearestInt(senitherWeight.getTotalWeight().getRaw())) + StringUtils.formatNumber(roundToNearestInt(senitherWeight.getTotalWeight().getRaw())) ); if (mouseX > guiLeft + 63 - textWidth / 2 && mouseX < guiLeft + 63 + textWidth / 2) { if (mouseY > guiTop + 12 && mouseY < guiTop + 12 + fr.FONT_HEIGHT) { @@ -809,7 +817,7 @@ public class BasicPage extends GuiProfileViewerPage { EnumChatFormatting.GREEN + "Skills: " + EnumChatFormatting.GOLD + - GuiProfileViewer.numberFormat.format(roundToNearestInt(senitherWeight + StringUtils.formatNumber(roundToNearestInt(senitherWeight .getSkillsWeight() .getWeightStruct() .getRaw())) @@ -819,7 +827,7 @@ public class BasicPage extends GuiProfileViewerPage { EnumChatFormatting.GREEN + "Slayer: " + EnumChatFormatting.GOLD + - GuiProfileViewer.numberFormat.format(roundToNearestInt(senitherWeight + StringUtils.formatNumber(roundToNearestInt(senitherWeight .getSlayerWeight() .getWeightStruct() .getRaw())) @@ -829,16 +837,16 @@ public class BasicPage extends GuiProfileViewerPage { EnumChatFormatting.GREEN + "Dungeons: " + EnumChatFormatting.GOLD + - GuiProfileViewer.numberFormat.format( + StringUtils.formatNumber( roundToNearestInt(senitherWeight.getDungeonsWeight().getWeightStruct().getRaw()) ) ); if (NotEnoughUpdates.INSTANCE.config.profileViewer.useSoopyNetworth - && profile.isProfileMaxSoopyWeight(profile, profileId)) { + && profile.isProfileMaxSoopyWeight(profileName)) { String lbPosStr = - EnumChatFormatting.DARK_GREEN + "#" + EnumChatFormatting.GOLD + GuiProfileViewer.numberFormat.format( + EnumChatFormatting.DARK_GREEN + "#" + EnumChatFormatting.GOLD + StringUtils.formatNumber( profile.getSoopyWeightLeaderboardPosition()); getInstance().tooltipToDisplay.add(""); String stateStr = EnumChatFormatting.RED + "An error occurred"; @@ -856,12 +864,12 @@ public class BasicPage extends GuiProfileViewerPage { Utils.drawStringCentered( EnumChatFormatting.GREEN + "Lily Weight: " + EnumChatFormatting.GOLD + - GuiProfileViewer.numberFormat.format(roundToNearestInt(lilyWeight.getTotalWeight().getRaw())), + StringUtils.formatNumber(roundToNearestInt(lilyWeight.getTotalWeight().getRaw())), guiLeft + 63, guiTop + 28, true, 0 ); int fontWidth = fr.getStringWidth( - "Lily Weight: " + GuiProfileViewer.numberFormat.format(roundToNearestInt(lilyWeight.getTotalWeight().getRaw())) + "Lily Weight: " + StringUtils.formatNumber(roundToNearestInt(lilyWeight.getTotalWeight().getRaw())) ); if (mouseX > guiLeft + 63 - fontWidth / 2 && mouseX < guiLeft + 63 + fontWidth / 2) { if (mouseY > guiTop + 22 && mouseY < guiTop + 22 + fr.FONT_HEIGHT) { @@ -871,7 +879,7 @@ public class BasicPage extends GuiProfileViewerPage { EnumChatFormatting.GREEN + "Skills: " + EnumChatFormatting.GOLD + - GuiProfileViewer.numberFormat.format(roundToNearestInt(lilyWeight + StringUtils.formatNumber(roundToNearestInt(lilyWeight .getSkillsWeight() .getWeightStruct() .getRaw())) @@ -881,7 +889,7 @@ public class BasicPage extends GuiProfileViewerPage { EnumChatFormatting.GREEN + "Slayer: " + EnumChatFormatting.GOLD + - GuiProfileViewer.numberFormat.format(roundToNearestInt(lilyWeight + StringUtils.formatNumber(roundToNearestInt(lilyWeight .getSlayerWeight() .getWeightStruct() .getRaw())) @@ -891,7 +899,7 @@ public class BasicPage extends GuiProfileViewerPage { EnumChatFormatting.GREEN + "Dungeons: " + EnumChatFormatting.GOLD + - GuiProfileViewer.numberFormat.format(roundToNearestInt(lilyWeight + StringUtils.formatNumber(roundToNearestInt(lilyWeight .getDungeonsWeight() .getWeightStruct() .getRaw())) @@ -974,13 +982,6 @@ public class BasicPage extends GuiProfileViewerPage { return 0; } - public String getGameModeType(JsonObject profileInfo) { - if (profileInfo != null && profileInfo.has("game_mode")) { - return profileInfo.get("game_mode").getAsString(); - } - return ""; - } - public void drawSideButtons() { GlStateManager.enableDepth(); GlStateManager.translate(0, 0, 5); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/BingoPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/BingoPage.java index cc5fc92f..fa14ad52 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/BingoPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/BingoPage.java @@ -52,8 +52,7 @@ public class BingoPage extends GuiProfileViewerPage { @Override public void drawPage(int mouseX, int mouseY, float partialTicks) { - processBingoResources(); - JsonObject bingoInfo = GuiProfileViewer.getProfile().getBingoInformation(); + loadBingoResources(); ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); int width = scaledResolution.getScaledWidth(); @@ -61,12 +60,19 @@ public class BingoPage extends GuiProfileViewerPage { int guiLeft = GuiProfileViewer.getGuiLeft(); int guiTop = GuiProfileViewer.getGuiTop(); - //check if the player has created a bingo profile for the current event + + JsonObject bingoInfo = GuiProfileViewer.getProfile().getBingoInformation(); + // Check if the player has created a bingo profile for the current event if (bingoInfo == null) { showMissingDataMessage(guiLeft, guiTop); return; } + // Bingo goals data not loaded yet + if (bingoGoals == null) { + return; + } + JsonArray events = bingoInfo.get("events").getAsJsonArray(); JsonObject lastEvent = events.get(events.size() - 1).getAsJsonObject(); int lastParticipatedId = lastEvent.get("key").getAsInt(); @@ -304,7 +310,7 @@ public class BingoPage extends GuiProfileViewerPage { return list; } - private void processBingoResources() { + private void loadBingoResources() { long currentTime = System.currentTimeMillis(); //renew every 2 minutes diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/CollectionsPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/CollectionsPage.java index 03be7cf1..da90843a 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/CollectionsPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/CollectionsPage.java @@ -37,16 +37,15 @@ import org.lwjgl.opengl.GL11; import java.awt.*; import java.io.IOException; import java.math.BigInteger; -import java.text.NumberFormat; import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import java.util.Locale; + +import static io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer.pv_elements; public class CollectionsPage extends GuiProfileViewerPage { - public static final ResourceLocation pv_cols = new ResourceLocation("notenoughupdates:pv_cols.png"); - public static final ResourceLocation pv_elements = new ResourceLocation("notenoughupdates:pv_elements.png"); + private static final ResourceLocation pv_cols = new ResourceLocation("notenoughupdates:pv_cols.png"); private static final int COLLS_XCOUNT = 5; private static final int COLLS_YCOUNT = 4; private static final float COLLS_XPADDING = (190 - COLLS_XCOUNT * 20) / (float) (COLLS_XCOUNT + 1); @@ -72,7 +71,6 @@ public class CollectionsPage extends GuiProfileViewerPage { "XIX", "XX", }; - private static final NumberFormat numberFormat = NumberFormat.getInstance(Locale.US); private static List<String> tooltipToDisplay = null; private static ItemStack selectedCollectionCategory = null; private int page = 0; @@ -89,8 +87,17 @@ public class CollectionsPage extends GuiProfileViewerPage { Minecraft.getMinecraft().getTextureManager().bindTexture(pv_cols); Utils.drawTexturedRect(guiLeft, guiTop, getInstance().sizeX, getInstance().sizeY, GL11.GL_NEAREST); - ProfileCollectionInfo collectionInfo = - GuiProfileViewer.getProfile().getCollectionInfo(GuiProfileViewer.getProfileId()); + SkyblockProfiles.SkyblockProfile selectedProfile = getSelectedProfile(); + if (selectedProfile == null) { + return; + } + + JsonObject resourceCollectionInfo = ProfileViewer.getOrLoadCollectionsResource(); + if (resourceCollectionInfo == null) { + return; + } + + ProfileCollectionInfo collectionInfo = selectedProfile.getCollectionInfo(); if (collectionInfo == null) { Utils.drawStringCentered( EnumChatFormatting.RED + "Collection API not enabled!", @@ -99,9 +106,6 @@ public class CollectionsPage extends GuiProfileViewerPage { return; } - JsonObject resourceCollectionInfo = ProfileViewer.getResourceCollectionInformation(); - if (resourceCollectionInfo == null) return; - int collectionCatSize = ProfileViewer.getCollectionCatToCollectionMap().size(); int collectionCatYSize = (int) (162f / (collectionCatSize - 1 + 0.0000001f)); { @@ -274,19 +278,17 @@ public class CollectionsPage extends GuiProfileViewerPage { tierString ); tooltipToDisplay.add( - "Collected: " + numberFormat.format(thisCollection.getPersonalCollectionCount()) + "Collected: " + StringUtils.formatNumber(thisCollection.getPersonalCollectionCount()) ); - tooltipToDisplay.add("Total Collected: " + numberFormat.format(amount)); + tooltipToDisplay.add("Total Collected: " + StringUtils.formatNumber(amount)); } } GlStateManager.color(1, 1, 1, 1); - if (tier >= 0) { - Utils.drawStringCentered(tierString, guiLeft + x + 10, guiTop + y - 4, true, tierStringColour); - } + Utils.drawStringCentered(tierString, guiLeft + x + 10, guiTop + y - 4, true, tierStringColour); Utils.drawStringCentered( - StringUtils.shortNumberFormat(amount) + "", guiLeft + x + 10, guiTop + y + 26, true, color.getRGB()); + StringUtils.shortNumberFormat(amount), guiLeft + x + 10, guiTop + y + 26, true, color.getRGB()); } } @@ -402,16 +404,16 @@ public class CollectionsPage extends GuiProfileViewerPage { switch (keyCode) { case Keyboard.KEY_5: case Keyboard.KEY_NUMPAD5: - stack = items.next(); + items.next(); case Keyboard.KEY_4: case Keyboard.KEY_NUMPAD4: - stack = items.next(); + items.next(); case Keyboard.KEY_3: case Keyboard.KEY_NUMPAD3: - stack = items.next(); + items.next(); case Keyboard.KEY_2: case Keyboard.KEY_NUMPAD2: - stack = items.next(); + items.next(); case Keyboard.KEY_1: case Keyboard.KEY_NUMPAD1: stack = items.next(); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/CrimsonIslePage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/CrimsonIslePage.java index 454ad989..ab2f9d59 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/CrimsonIslePage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/CrimsonIslePage.java @@ -104,9 +104,13 @@ public class CrimsonIslePage extends GuiProfileViewerPage { int guiLeft = GuiProfileViewer.getGuiLeft(); int guiTop = GuiProfileViewer.getGuiTop(); - JsonObject profileInfo = GuiProfileViewer.getProfile().getProfileInformation(GuiProfileViewer.getProfileId()); + SkyblockProfiles.SkyblockProfile selectedProfile = getSelectedProfile(); + if (selectedProfile == null) { + return; + } - if (profileInfo == null || !profileInfo.has("nether_island_player_data")) { + JsonObject profileInfo = selectedProfile.getProfileJson(); + if (!profileInfo.has("nether_island_player_data")) { Utils.drawStringCentered( EnumChatFormatting.RED + "No data found for the Crimson Isles", guiLeft + 431 / 2f, guiTop + 101, true, 0 @@ -204,33 +208,26 @@ public class CrimsonIslePage extends GuiProfileViewerPage { public void drawDojoStats(JsonObject data, int guiLeft, int guiTop) { Utils.drawStringCentered(EnumChatFormatting.YELLOW + "Dojo Stats", guiLeft + (431 * 0.49f), guiTop + 14, true, 0); - JsonObject dojoStats = data.getAsJsonObject("dojo"); - int[] dojoScores = {0, 0, 0, 0, 0, 0, 0}; - int pointsTotal = 0; - - for (int i = 0; i < apiDojoTestNames.size(); i++) { - for (Map.Entry<String, JsonElement> dojoData : dojoStats.entrySet()) { - if (dojoData.getKey().equals("dojo_points_" + apiDojoTestNames.keySet().toArray()[i])) { - dojoScores[i] = dojoData.getValue().getAsInt(); - pointsTotal += dojoData.getValue().getAsInt(); - } - } - } - for (int i = 0; i < apiDojoTestNames.size(); i++) { + int totalPoints = 0; + int idx = 0; + for (Map.Entry<String, String> dojoTest : apiDojoTestNames.entrySet()) { + int curPoints = Utils.getElementAsInt(data.get("dojo.dojo_points_" + dojoTest.getKey()), 0); + totalPoints += curPoints; Utils.renderAlignedString( - apiDojoTestNames.get(apiDojoTestNames.keySet().toArray()[i]) + ": ", - EnumChatFormatting.WHITE + String.valueOf(dojoScores[i]) + " (" + - dojoGrades[(dojoScores[i] / 200) >= 6 ? 5 : (dojoScores[i] / 200)] + ")", + dojoTest.getValue() + ": ", + EnumChatFormatting.WHITE + "" + curPoints + " (" + + dojoGrades[(curPoints / 200) >= 6 ? 5 : (curPoints / 200)] + ")", guiLeft + (431 * 0.49f) - 65, - guiTop + 30 + (i * 12), + guiTop + 30 + (idx * 12), 130 ); + idx ++; } Utils.renderAlignedString( EnumChatFormatting.GRAY + "Points: ", - EnumChatFormatting.GOLD + String.valueOf(pointsTotal), + EnumChatFormatting.GOLD + String.valueOf(totalPoints), guiLeft + (431 * 0.49f) - 65, guiTop + 40 + (apiDojoTestNames.size() * 12), 130 @@ -238,7 +235,7 @@ public class CrimsonIslePage extends GuiProfileViewerPage { Utils.renderAlignedString( EnumChatFormatting.GRAY + "Rank: ", - getRank(pointsTotal), + getRank(totalPoints), guiLeft + (431 * 0.49f) - 65, guiTop + 52 + (apiDojoTestNames.size() * 12), 130 @@ -246,9 +243,9 @@ public class CrimsonIslePage extends GuiProfileViewerPage { Utils.renderAlignedString( EnumChatFormatting.GRAY + "Points to next: ", - getPointsToNextRank(pointsTotal) == 0 + getPointsToNextRank(totalPoints) == 0 ? EnumChatFormatting.GOLD + "MAXED!" - : String.valueOf(getPointsToNextRank(pointsTotal)), + : String.valueOf(getPointsToNextRank(totalPoints)), guiLeft + (431 * 0.49f) - 65, guiTop + 64 + (apiDojoTestNames.size() * 12), 130 @@ -263,7 +260,7 @@ public class CrimsonIslePage extends GuiProfileViewerPage { } lastRank = rank.getKey(); } - return dojoPointsToRank.get(dojoPointsToRank.keySet().toArray()[dojoPointsToRank.size() - 1]); + return dojoPointsToRank.get(lastRank); } public int getPointsToNextRank(int pointsTotal) { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/DungeonPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/DungeonPage.java index 4b49d053..66c7c2a1 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/DungeonPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/DungeonPage.java @@ -27,6 +27,7 @@ import com.google.gson.JsonPrimitive; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.itemeditor.GuiElementTextField; +import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.Weight; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; @@ -40,6 +41,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; +import org.apache.commons.lang3.text.WordUtils; import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; @@ -47,21 +49,21 @@ import java.io.IOException; import java.util.Base64; import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.Map; import java.util.UUID; public class DungeonPage extends GuiProfileViewerPage { private static final ResourceLocation pv_dung = new ResourceLocation("notenoughupdates:pv_dung.png"); private static final ItemStack DEADBUSH = new ItemStack(Item.getItemFromBlock(Blocks.deadbush)); - private static final String[] dungSkillsName = {"Healer", "Mage", "Berserk", "Archer", "Tank"}; private static final ItemStack[] BOSS_HEADS = new ItemStack[7]; - private static final ItemStack[] dungSkillsStack = { - new ItemStack(Items.potionitem, 1, 16389), - new ItemStack(Items.blaze_rod), - new ItemStack(Items.iron_sword), - new ItemStack(Items.bow), - new ItemStack(Items.leather_chestplate), - }; + private static final Map<String, ItemStack> classToIcon = new HashMap<String, ItemStack>() {{ + put("healer", new ItemStack(Items.potionitem, 1, 16389)); + put("mage", new ItemStack(Items.blaze_rod)); + put("berserk", new ItemStack(Items.iron_sword)); + put("archer", new ItemStack(Items.bow)); + put("tank", new ItemStack(Items.leather_chestplate)); + }}; private static final String[] bossFloorArr = {"Bonzo", "Scarf", "Professor", "Thorn", "Livid", "Sadan", "Necron"}; private static final String[] bossFloorHeads = { "12716ecbf5b8da00b05f316ec6af61e8bd02805b21eb8e440151468dc656549c", @@ -72,7 +74,6 @@ public class DungeonPage extends GuiProfileViewerPage { "fa06cb0c471c1c9bc169af270cd466ea701946776056e472ecdaeb49f0f4a4dc", "a435164c05cea299a3f016bbbed05706ebb720dac912ce4351c2296626aecd9a", }; - private static final LinkedHashMap<String, ItemStack> dungeonsModeIcons = new LinkedHashMap<String, ItemStack>() { { put( @@ -99,9 +100,6 @@ public class DungeonPage extends GuiProfileViewerPage { }; private static int floorTime = 7; - private final HashMap<String, HashMap<String, ProfileViewer.Level>> levelObjClasseses = new HashMap<>(); - - private final HashMap<String, ProfileViewer.Level> levelObjCatas = new HashMap<>(); private final GuiElementTextField dungeonLevelTextField = new GuiElementTextField("", GuiElementTextField.SCALE_TEXT); private int floorLevelTo = -1; private long floorLevelToXP = -1; @@ -120,17 +118,19 @@ public class DungeonPage extends GuiProfileViewerPage { Minecraft.getMinecraft().getTextureManager().bindTexture(pv_dung); Utils.drawTexturedRect(guiLeft, guiTop, getInstance().sizeX, getInstance().sizeY, GL11.GL_NEAREST); - ProfileViewer.Profile profile = GuiProfileViewer.getProfile(); - String profileId = GuiProfileViewer.getProfileId(); - JsonObject hypixelInfo = profile.getHypixelProfile(); - JsonObject profileInfo = profile.getProfileInformation(profileId); - if (profileInfo == null) return; - JsonObject leveling = Constants.LEVELING; if (leveling == null) return; - int sectionWidth = 110; + SkyblockProfiles.SkyblockProfile selectedProfile = getSelectedProfile(); + if (selectedProfile == null) { + return; + } + Map<String, ProfileViewer.Level> levelingInfo = selectedProfile.getLevelingInfo(); + JsonObject profileInfo = selectedProfile.getProfileJson(); + JsonObject hypixelInfo = GuiProfileViewer.getProfile().getHypixelProfile(); + + int sectionWidth = 110; String dungeonString = onMasterMode ? "master_catacombs" : "catacombs"; Utils.renderShadowedString( @@ -140,28 +140,14 @@ public class DungeonPage extends GuiProfileViewerPage { sectionWidth ); - ProfileViewer.Level levelObjCata = levelObjCatas.get(profileId); - //Catacombs level thingy + ProfileViewer.Level levelObjCata = levelingInfo.get("cosmetic_catacombs"); { - if (levelObjCata == null) { - float cataXp = getElementAsFloat(profileInfo, "dungeons.dungeon_types.catacombs.experience"); - levelObjCata = - ProfileViewer.getLevel( - Utils.getElementOrDefault(leveling, "catacombs", new JsonArray()).getAsJsonArray(), - cataXp, - 99, - false - ); - levelObjCata.totalXp = cataXp; - levelObjCatas.put(profileId, levelObjCata); - } - String skillName = EnumChatFormatting.RED + "Catacombs"; float level = levelObjCata.level; int levelFloored = (int) Math.floor(level); if (floorLevelTo == -1 && levelFloored >= 0) { - dungeonLevelTextField.setText("" + (levelFloored + 1)); + dungeonLevelTextField.setText(String.valueOf(levelFloored + 1)); calculateFloorLevelXP(); } @@ -267,56 +253,12 @@ public class DungeonPage extends GuiProfileViewerPage { } if (mouseX > x && mouseX < x + sectionWidth && mouseY > y + 16 && mouseY < y + 24 && onMasterMode) { - float M3 = - ( - Utils.getElementAsFloat( - Utils.getElement(profileInfo, "dungeons.dungeon_types.master_catacombs.tier_completions." + 3), - 0 - ) - ); - float M4 = - ( - Utils.getElementAsFloat( - Utils.getElement(profileInfo, "dungeons.dungeon_types.master_catacombs.tier_completions." + 4), - 0 - ) - ); - float M5 = - ( - Utils.getElementAsFloat( - Utils.getElement(profileInfo, "dungeons.dungeon_types.master_catacombs.tier_completions." + 5), - 0 - ) - ); //this can prob be done better - float M6 = - ( - Utils.getElementAsFloat( - Utils.getElement(profileInfo, "dungeons.dungeon_types.master_catacombs.tier_completions." + 6), - 0 - ) - ); - float M7 = - ( - Utils.getElementAsFloat( - Utils.getElement(profileInfo, "dungeons.dungeon_types.master_catacombs.tier_completions." + 7), - 0 - ) - ); - if (M3 > 50) { - M3 = 50; - } - if (M4 > 50) { - M4 = 50; - } - if (M5 > 50) { - M5 = 50; - } - if (M6 > 50) { - M6 = 50; - } - if (M7 > 50) { - M7 = 50; - } + float M3 = Math.min(getElementAsFloat(profileInfo, "dungeons.dungeon_types.master_catacombs.tier_completions.3"), 50); + float M4 = Math.min(getElementAsFloat(profileInfo, "dungeons.dungeon_types.master_catacombs.tier_completions.4"), 50); + float M5 = Math.min(getElementAsFloat(profileInfo, "dungeons.dungeon_types.master_catacombs.tier_completions.5"), 50); + float M6 = Math.min(getElementAsFloat(profileInfo, "dungeons.dungeon_types.master_catacombs.tier_completions.6"), 50); + float M7 = Math.min(getElementAsFloat(profileInfo, "dungeons.dungeon_types.master_catacombs.tier_completions.7"), 50); + float xpM3 = 35000 * (M3 / 100 + 1); float xpM4 = 55000 * (M4 / 100 + 1); float xpM5 = 70000 * (M5 / 100 + 1); @@ -403,8 +345,7 @@ public class DungeonPage extends GuiProfileViewerPage { 100 ); - //Random stats - + // Random stats float secrets = -1; if (hypixelInfo != null) { secrets = Utils.getElementAsFloat(Utils.getElement(hypixelInfo, "achievements.skyblock_treasure_hunter"), 0); @@ -484,12 +425,9 @@ public class DungeonPage extends GuiProfileViewerPage { int y3 = y + 117; for (int i = 1; i <= 7; i++) { - int w = fontRendererObj.getStringWidth("" + i); - + int w = fontRendererObj.getStringWidth(String.valueOf(i)); int bx = x + sectionWidth * i / 8 - w / 2; - GlStateManager.color(1, 1, 1, 1); - Utils.renderShadowedString(EnumChatFormatting.WHITE.toString() + i, bx + w / 2, y3, 10); } @@ -583,13 +521,11 @@ public class DungeonPage extends GuiProfileViewerPage { } } - //Skills + // Classes { int x = guiLeft + 298; int y = guiTop + 27; - //Gui.drawRect(x, y, x+120, y+147, 0xffffffff); - Utils.renderShadowedString( EnumChatFormatting.DARK_PURPLE + "Class Levels", x + sectionWidth / 2, @@ -603,47 +539,18 @@ public class DungeonPage extends GuiProfileViewerPage { activeClass = activeClassElement.getAsString(); } - ProfileViewer.Level classAverage = new ProfileViewer.Level(); - - for (int i = 0; i < dungSkillsName.length; i++) { - String skillName = dungSkillsName[i]; - - HashMap<String, ProfileViewer.Level> levelObjClasses = levelObjClasseses.computeIfAbsent( - profileId, - k -> new HashMap<>() - ); - if (!levelObjClasses.containsKey(skillName)) { - float cataXp = getElementAsFloat(profileInfo, "dungeons.player_classes." + skillName.toLowerCase() + ".experience"); - ProfileViewer.Level levelObj = ProfileViewer.getLevel( - Utils.getElementOrDefault(leveling, "catacombs", new JsonArray()).getAsJsonArray(), - cataXp, - 50, - false - ); - - if (levelObj.level == 50) { - levelObj.level = 50 + (cataXp - 569809640) / 200000000; - } - - levelObjClasses.put(skillName, levelObj); - } - - classAverage.level = (float) (levelObjClasses.values().stream().mapToDouble(l -> Math.min(50, l.level)).sum() / 5); - if (classAverage.level >= 50) { - classAverage.maxed = true; - } - - String colour = EnumChatFormatting.WHITE.toString(); - if (skillName.toLowerCase().equals(activeClass)) { - colour = EnumChatFormatting.GREEN.toString(); - } + float classLevelSum = 0; + for (int i = 0; i < Weight.DUNGEON_CLASS_NAMES.size(); i++) { + String className = Weight.DUNGEON_CLASS_NAMES.get(i); - ProfileViewer.Level levelObj = levelObjClasses.get(skillName); + classLevelSum += levelingInfo.get(className).level; + String colour = className.equalsIgnoreCase(activeClass) ? EnumChatFormatting.GREEN.toString() : EnumChatFormatting.WHITE.toString(); + ProfileViewer.Level levelObj = levelingInfo.get("cosmetic_" + className); getInstance() .renderXpBar( - colour + skillName, - dungSkillsStack[i], + colour + WordUtils.capitalizeFully(className), + classToIcon.get(className), x, y + 20 + 24 * i, sectionWidth, @@ -653,6 +560,12 @@ public class DungeonPage extends GuiProfileViewerPage { ); } + ProfileViewer.Level classAverage = new ProfileViewer.Level(); + classAverage.level = classLevelSum / Weight.DUNGEON_CLASS_NAMES.size(); + if (classAverage.level >= 50) { + classAverage.maxed = true; + } + getInstance().renderXpBar( EnumChatFormatting.WHITE + "Class Average", new ItemStack(Items.nether_star), @@ -705,7 +618,7 @@ public class DungeonPage extends GuiProfileViewerPage { if (mouseY >= y - 2 && mouseY <= y + 9) { for (int i = 1; i <= 7; i++) { - int w = fontRendererObj.getStringWidth("" + i); + int w = fontRendererObj.getStringWidth(String.valueOf(i)); int x = guiLeft + 23 + 110 * i / 8 - w / 2; @@ -752,14 +665,15 @@ public class DungeonPage extends GuiProfileViewerPage { private void calculateFloorLevelXP() { JsonObject leveling = Constants.LEVELING; if (leveling == null) return; - ProfileViewer.Level levelObjCata = levelObjCatas.get(GuiProfileViewer.getProfileId()); - if (levelObjCata == null) return; + SkyblockProfiles.SkyblockProfile selectedProfile = getSelectedProfile(); + if (selectedProfile == null) return; + ProfileViewer.Level levelObjCata = selectedProfile.getLevelingInfo().get("cosmetic_catacombs"); try { dungeonLevelTextField.setCustomBorderColour(0xffffffff); floorLevelTo = Integer.parseInt(dungeonLevelTextField.getText()); - JsonArray levelingArray = Utils.getElementOrDefault(leveling, "catacombs", new JsonArray()).getAsJsonArray(); + JsonArray levelingArray = leveling.getAsJsonArray("catacombs"); float remaining = -((levelObjCata.level % 1) * levelObjCata.maxXpForLevel); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ExtraPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ExtraPage.java index 90ffd388..d08e96a3 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ExtraPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ExtraPage.java @@ -25,6 +25,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.core.util.StringUtils; +import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.Weight; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; @@ -41,7 +42,6 @@ import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Locale; @@ -51,13 +51,23 @@ import java.util.TimeZone; import java.util.TreeMap; public class ExtraPage extends GuiProfileViewerPage { -// Hehe + private static final ResourceLocation pv_extra = new ResourceLocation("notenoughupdates:pv_extra.png"); + private static final List<String> skills = Arrays.asList( + "taming", + "mining", + "foraging", + "enchanting", + "farming", + "combat", + "fishing", + "alchemy", + "carpentry" + ); // TODO: why is this hardcoded private TreeMap<Integer, Set<String>> topKills = null; private TreeMap<Integer, Set<String>> topDeaths = null; private int deathScroll = 0; private int killScroll = 0; - private int mouseDWheel = 0; public ExtraPage(GuiProfileViewer instance) { super(instance); @@ -77,9 +87,8 @@ public class ExtraPage extends GuiProfileViewerPage { @Override public boolean mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException { super.mouseClicked(mouseX, mouseY, mouseButton); - //Note: don't know why it made me make it return a boolean, but it fixed the error, so I left it alone. - //Dimensions: X: guiLeft + xStart + xOffset * 3, Y: guiTop + yStartBottom + 77, Width: 80, Height: 12 + // Dimensions: X: guiLeft + xStart + xOffset * 3, Y: guiTop + yStartBottom + 77, Width: 80, Height: 12 if (mouseX >= GuiProfileViewer.getGuiLeft() + 22 + 103 * 3 && mouseX <= GuiProfileViewer.getGuiLeft() + 22 + 103 * 3 + 80 && mouseY >= GuiProfileViewer.getGuiTop() + 105 + 77 && mouseY <= GuiProfileViewer.getGuiTop() + 105 + 77 + 12) { @@ -93,17 +102,6 @@ public class ExtraPage extends GuiProfileViewerPage { return false; } - // pls update in the future tyvm !!! - public final static HashMap<String, Integer> slayers = new HashMap<String, Integer>() { - { - put("zombie", 5); - put("spider", 4); - put("wolf", 4); - put("enderman", 4); - put("blaze", 4); - } - }; - public void drawEssence( JsonObject profileInfo, float xStart, @@ -113,16 +111,17 @@ public class ExtraPage extends GuiProfileViewerPage { float mouseX, float mouseY ) { - int guiLeft = GuiProfileViewer.getGuiLeft(); - int guiTop = GuiProfileViewer.getGuiTop(); - yStartTop += 77; if (Constants.PARENTS == null || !Constants.PARENTS.has("ESSENCE_WITHER")) { Utils.showOutdatedRepoNotification(); return; } - JsonObject parents = Constants.PARENTS; + + int guiLeft = GuiProfileViewer.getGuiLeft(); + int guiTop = GuiProfileViewer.getGuiTop(); + yStartTop += 77; + JsonArray essenceArray = new JsonArray(); - essenceArray.addAll(parents.get("ESSENCE_WITHER").getAsJsonArray()); + essenceArray.addAll(Constants.PARENTS.get("ESSENCE_WITHER").getAsJsonArray()); //add wither essence since it's not part of the parents array essenceArray.add(new JsonPrimitive("ESSENCE_WITHER")); @@ -146,6 +145,7 @@ public class ExtraPage extends GuiProfileViewerPage { guiTop + yStartTop + (yOffset - 1) * i, 76 ); + if (Constants.ESSENCESHOPS == null) return; JsonObject essenceShops = Constants.ESSENCESHOPS; if (mouseX >= guiLeft + xStart + xOffset && mouseX <= guiLeft + xStart + xOffset + 76 && @@ -166,7 +166,6 @@ public class ExtraPage extends GuiProfileViewerPage { String name = entry.getValue().getAsJsonObject().get("name").getAsString(); getInstance().tooltipToDisplay.add(EnumChatFormatting.GOLD + name + ": " + formatting + perkTier + "/" + max); } - } } } @@ -179,11 +178,13 @@ public class ExtraPage extends GuiProfileViewerPage { Minecraft.getMinecraft().getTextureManager().bindTexture(pv_extra); Utils.drawTexturedRect(guiLeft, guiTop, getInstance().sizeX, getInstance().sizeY, GL11.GL_NEAREST); - ProfileViewer.Profile profile = GuiProfileViewer.getProfile(); - String profileId = GuiProfileViewer.getProfileId(); - JsonObject profileInfo = profile.getProfileInformation(profileId); - if (profileInfo == null) return; - Map<String, ProfileViewer.Level> skyblockInfo = profile.getSkyblockInfo(profileId); + SkyblockProfiles.SkyblockProfile selectedProfile = getSelectedProfile(); + if (selectedProfile == null) { + return; + } + + JsonObject profileInfo = selectedProfile.getProfileJson(); + Map<String, ProfileViewer.Level> skyblockInfo = selectedProfile.getLevelingInfo(); float xStart = 22; float xOffset = 103; @@ -221,7 +222,7 @@ public class ExtraPage extends GuiProfileViewerPage { ); } } - JsonObject guildInfo = profile.getGuildInformation(null); + JsonObject guildInfo = GuiProfileViewer.getProfile().getOrLoadGuildInformation(null); boolean shouldRenderGuild = guildInfo != null && guildInfo.has("name"); { if (shouldRenderGuild) { @@ -266,24 +267,12 @@ public class ExtraPage extends GuiProfileViewerPage { float totalSlayerCount = 0; float totalSlayerXP = 0; - List<String> skills = Arrays.asList( - "taming", - "mining", - "foraging", - "enchanting", - "farming", - "combat", - "fishing", - "alchemy", - "carpentry" - ); - for (Map.Entry<String, ProfileViewer.Level> entry : skyblockInfo.entrySet()) { if (skills.contains(entry.getKey())) { totalSkillLVL += entry.getValue().level; totalTrueSkillLVL += Math.floor(entry.getValue().level); totalSkillCount++; - } else if (slayers.containsKey(entry.getKey())) { + } else if (Weight.SLAYER_NAMES.contains(entry.getKey())) { totalSlayerLVL += entry.getValue().level; totalSlayerCount++; totalSlayerXP += entry.getValue().totalXp; @@ -296,7 +285,9 @@ public class ExtraPage extends GuiProfileViewerPage { Utils.renderAlignedString( EnumChatFormatting.RED + "AVG Skill Level", - EnumChatFormatting.WHITE.toString() + Math.floor(avgSkillLVL * 10) / 10, + selectedProfile.skillsApiEnabled() ? + EnumChatFormatting.WHITE.toString() + Math.floor(avgSkillLVL * 10) / 10 : + EnumChatFormatting.RED + "Skills API not enabled!", guiLeft + xStart, guiTop + yStartBottom + yOffset, 76 @@ -304,7 +295,9 @@ public class ExtraPage extends GuiProfileViewerPage { Utils.renderAlignedString( EnumChatFormatting.RED + "True AVG Skill Level", - EnumChatFormatting.WHITE.toString() + Math.floor(avgTrueSkillLVL * 10) / 10, + selectedProfile.skillsApiEnabled() ? + EnumChatFormatting.WHITE.toString() + Math.floor(avgTrueSkillLVL * 10) / 10 : + EnumChatFormatting.RED + "Skills API not enabled!", guiLeft + xStart, guiTop + yStartBottom + yOffset * 2, 76 @@ -532,7 +525,7 @@ public class ExtraPage extends GuiProfileViewerPage { } } - mouseDWheel = Mouse.getDWheel(); + int mouseDWheel = Mouse.getDWheel(); if (mouseX >= killDeathX && mouseX <= killDeathX + 76) { if (mouseY >= guiTop + yStartTop && mouseY <= guiTop + yStartTop + 65) { if (mouseDWheel > 0) { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java index a5229acb..5dabdeaa 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 NotEnoughUpdates contributors + * Copyright (C) 2022-2023 NotEnoughUpdates contributors * * This file is part of NotEnoughUpdates. * @@ -19,8 +19,6 @@ package io.github.moulberry.notenoughupdates.profileviewer; -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.cosmetics.ShaderManager; @@ -29,6 +27,7 @@ import io.github.moulberry.notenoughupdates.profileviewer.bestiary.BestiaryPage; import io.github.moulberry.notenoughupdates.profileviewer.trophy.TrophyFishPage; import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.DungeonsWeight; import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.SkillsWeight; +import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.Weight; import io.github.moulberry.notenoughupdates.util.AsyncDependencyLoader; import io.github.moulberry.notenoughupdates.util.PronounDB; import io.github.moulberry.notenoughupdates.util.Utils; @@ -53,15 +52,13 @@ import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL14; import org.lwjgl.opengl.GL20; +import javax.annotation.Nullable; import java.awt.*; import java.io.IOException; -import java.text.DecimalFormat; -import java.text.NumberFormat; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; -import java.util.Locale; import java.util.Map; import java.util.Optional; import java.util.UUID; @@ -72,12 +69,12 @@ public class GuiProfileViewer extends GuiScreen { public static final ResourceLocation pv_dropdown = new ResourceLocation("notenoughupdates:pv_dropdown.png"); public static final ResourceLocation pv_bg = new ResourceLocation("notenoughupdates:pv_bg.png"); public static final ResourceLocation pv_elements = new ResourceLocation("notenoughupdates:pv_elements.png"); - public static final ResourceLocation pv_ironman = new ResourceLocation("notenoughupdates:pv_ironman.png"); - public static final ResourceLocation pv_bingo = new ResourceLocation("notenoughupdates:pv_bingo.png"); - - public final static DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#.#"); - public static final ResourceLocation pv_stranded = new ResourceLocation("notenoughupdates:pv_stranded.png"); - public static final ResourceLocation pv_unknown = new ResourceLocation("notenoughupdates:pv_unknown.png"); + private static final Map<String, ResourceLocation> gamemodeToIcon = new HashMap<String, ResourceLocation>() {{ + put("ironman", new ResourceLocation("notenoughupdates:pv_ironman.png")); + put("bingo", new ResourceLocation("notenoughupdates:pv_bingo.png")); + put("island", new ResourceLocation("notenoughupdates:pv_stranded.png")); // Stranded + }}; + private static final ResourceLocation gamemodeIconUnknown = new ResourceLocation("notenoughupdates:pv_unknown.png"); public static final ResourceLocation resource_packs = new ResourceLocation("minecraft:textures/gui/resource_packs.png"); public static final ResourceLocation icons = new ResourceLocation("textures/gui/icons.png"); @@ -140,12 +137,7 @@ public class GuiProfileViewer extends GuiScreen { ); } }; - - public static final NumberFormat numberFormat = NumberFormat.getInstance(Locale.US); - - private static final char[] c = new char[]{'k', 'm', 'b', 't'}; - public static ProfileViewerPage currentPage = ProfileViewerPage.BASIC; - public static HashMap<String, String> MINION_RARITY_TO_NUM = new HashMap<String, String>() { + public static final HashMap<String, String> RARITY_TO_NUM = new HashMap<String, String>() { { put("COMMON", "0"); put("UNCOMMON", "1"); @@ -155,10 +147,11 @@ public class GuiProfileViewer extends GuiScreen { put("MYTHIC", "5"); } }; + public static ProfileViewerPage currentPage = ProfileViewerPage.BASIC; private static int guiLeft; private static int guiTop; - private static ProfileViewer.Profile profile; - private static String profileId = null; + private static SkyblockProfiles profile; + private static String profileName = null; public static AsyncDependencyLoader<Optional<PronounDB.PronounChoice>> pronouns = AsyncDependencyLoader.withEqualsInvocation( () -> @@ -183,23 +176,23 @@ public class GuiProfileViewer extends GuiScreen { public long lastTime = 0; public long startTime = 0; public List<String> tooltipToDisplay = null; - Shader blurShaderHorz = null; - Framebuffer blurOutputHorz = null; - Shader blurShaderVert = null; - Framebuffer blurOutputVert = null; + private Shader blurShaderHorz = null; + private Framebuffer blurOutputHorz = null; + private Shader blurShaderVert = null; + private Framebuffer blurOutputVert = null; private boolean profileDropdownSelected = false; - private double lastBgBlurFactor = -1; private boolean showBingoPage; - public GuiProfileViewer(ProfileViewer.Profile profile) { + public GuiProfileViewer(SkyblockProfiles profile) { GuiProfileViewer.profile = profile; - GuiProfileViewer.profileId = profile.getLatestProfile(); - String name = ""; + GuiProfileViewer.profileName = profile.getLatestProfileName(); + + String playerName = ""; if (profile.getHypixelProfile() != null) { - name = profile.getHypixelProfile().get("displayname").getAsString(); + playerName = profile.getHypixelProfile().get("displayname").getAsString(); } - playerNameTextField = new GuiElementTextField(name, GuiElementTextField.SCALE_TEXT); + playerNameTextField = new GuiElementTextField(playerName, GuiElementTextField.SCALE_TEXT); playerNameTextField.setSize(100, 20); if (currentPage == ProfileViewerPage.LOADING) { @@ -219,22 +212,6 @@ public class GuiProfileViewer extends GuiScreen { pages.put(ProfileViewerPage.CRIMSON_ISLE, new CrimsonIslePage(this)); } - private static float getMaxLevelXp(JsonArray levels, int offset, int maxLevel) { - float xpTotal = 0; - - for (int i = offset; i < offset + maxLevel - 1; i++) { - xpTotal += levels.get(i).getAsFloat(); - } - - return xpTotal; - } - - @Deprecated - public static String shortNumberFormat(double n, int iteration) { - return StringUtils.shortNumberFormat(n, iteration - ); - } - public static int getGuiLeft() { return guiLeft; } @@ -243,12 +220,16 @@ public class GuiProfileViewer extends GuiScreen { return guiTop; } - public static ProfileViewer.Profile getProfile() { + public static SkyblockProfiles getProfile() { return profile; } - public static String getProfileId() { - return profileId; + public static String getProfileName() { + return profileName; + } + + public static @Nullable SkyblockProfiles.SkyblockProfile getSelectedProfile() { + return profile.getProfile(profileName); } @Override @@ -259,20 +240,22 @@ public class GuiProfileViewer extends GuiScreen { ProfileViewerPage page = currentPage; if (profile == null) { page = ProfileViewerPage.INVALID_NAME; - } else if (profile.getSkyblockProfiles(null) == null) { + } else if (profile.getOrLoadSkyblockProfiles(null) == null) { page = ProfileViewerPage.LOADING; - } else if (profile.getLatestProfile() == null) { - page = ProfileViewerPage.NO_SKYBLOCK; } - if (profileId == null && profile != null && profile.getLatestProfile() != null) { - profileId = profile.getLatestProfile(); + if (profile != null && profile.getLatestProfileName() == null && + !profile.getUpdatingSkyblockProfilesState().get()) { + page = ProfileViewerPage.NO_SKYBLOCK; } - { - //this is just to cache the guild info - if (profile != null) { - profile.getGuildInformation(null); + + if (profile != null) { + if (profileName == null && profile.getLatestProfileName() != null) { + profileName = profile.getLatestProfileName(); } + + // Preload guild info + profile.getOrLoadGuildInformation(null); } this.sizeX = 431; @@ -280,17 +263,16 @@ public class GuiProfileViewer extends GuiScreen { guiLeft = (this.width - this.sizeX) / 2; guiTop = (this.height - this.sizeY) / 2; - JsonObject currProfileInfo = profile != null ? profile.getProfileInformation(profileId) : null; + SkyblockProfiles.SkyblockProfile selectedProfile = profile != null ? profile.getProfile(profileName) : null; if (NotEnoughUpdates.INSTANCE.config.profileViewer.alwaysShowBingoTab) { showBingoPage = true; } else { - showBingoPage = - currProfileInfo != null && - currProfileInfo.has("game_mode") && - currProfileInfo.get("game_mode").getAsString().equals("bingo"); + showBingoPage = selectedProfile != null && selectedProfile.getGamemode() != null && selectedProfile.getGamemode().equals("bingo"); } - if (!showBingoPage && currentPage == ProfileViewerPage.BINGO) currentPage = ProfileViewerPage.BASIC; + if (!showBingoPage && currentPage == ProfileViewerPage.BINGO) { + currentPage = ProfileViewerPage.BASIC; + } super.drawScreen(mouseX, mouseY, partialTicks); drawDefaultBackground(); @@ -318,7 +300,7 @@ public class GuiProfileViewer extends GuiScreen { Minecraft.getMinecraft().getTextureManager().bindTexture(pv_bg); Utils.drawTexturedRect(guiLeft, guiTop, sizeX, sizeY, GL11.GL_NEAREST); - if (!(page == ProfileViewerPage.LOADING)) { + if (page != ProfileViewerPage.LOADING) { playerNameTextField.render(guiLeft + sizeX - 100, guiTop + sizeY + 5); ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); @@ -328,56 +310,22 @@ public class GuiProfileViewer extends GuiScreen { Minecraft.getMinecraft().getTextureManager().bindTexture(pv_dropdown); Utils.drawTexturedRect(guiLeft, guiTop + sizeY + 3, 100, 20, 0, 100 / 200f, 0, 20 / 185f, GL11.GL_NEAREST); Utils.drawStringCenteredScaledMaxWidth( - profileId, + profileName, guiLeft + 50, guiTop + sizeY + 3 + 10, true, 90, new Color(63, 224, 208, 255).getRGB() ); - //ironman icon - if ( - currProfileInfo != null && - currProfileInfo.has("game_mode") && - currProfileInfo.get("game_mode").getAsString().equals("ironman") - ) { - GlStateManager.color(1, 1, 1, 1); - Minecraft.getMinecraft().getTextureManager().bindTexture(pv_ironman); - Utils.drawTexturedRect(guiLeft - 16 - 5, guiTop + sizeY + 5, 16, 16, GL11.GL_NEAREST); - } - //bingo! icon - if ( - currProfileInfo != null && - currProfileInfo.has("game_mode") && - currProfileInfo.get("game_mode").getAsString().equals("bingo") - ) { - GlStateManager.color(1, 1, 1, 1); - Minecraft.getMinecraft().getTextureManager().bindTexture(pv_bingo); - Utils.drawTexturedRect(guiLeft - 16 - 5, guiTop + sizeY + 5, 16, 16, GL11.GL_NEAREST); - } - //stranded icon - if ( - currProfileInfo != null && - currProfileInfo.has("game_mode") && - currProfileInfo.get("game_mode").getAsString().equals("island") - ) { - GlStateManager.color(1, 1, 1, 1); - Minecraft.getMinecraft().getTextureManager().bindTexture(pv_stranded); - Utils.drawTexturedRect(guiLeft - 16 - 5, guiTop + sizeY + 5, 16, 16, GL11.GL_NEAREST); - } - //icon if game mode is unknown - if ( - currProfileInfo != null && - currProfileInfo.has("game_mode") && - !currProfileInfo.get("game_mode").getAsString().equals("island") && - !currProfileInfo.get("game_mode").getAsString().equals("bingo") && - !currProfileInfo.get("game_mode").getAsString().equals("ironman") - ) { + + if (selectedProfile != null && selectedProfile.getGamemode() != null) { GlStateManager.color(1, 1, 1, 1); - Minecraft.getMinecraft().getTextureManager().bindTexture(pv_unknown); + ResourceLocation gamemodeIcon = gamemodeToIcon.getOrDefault(selectedProfile.getGamemode(), gamemodeIconUnknown); + Minecraft.getMinecraft().getTextureManager().bindTexture(gamemodeIcon); Utils.drawTexturedRect(guiLeft - 16 - 5, guiTop + sizeY + 5, 16, 16, GL11.GL_NEAREST); } - //Render Open In Skycrypt button + + // Render Open In SkyCrypt button renderBlurredBackground(width, height, guiLeft + 100 + 6 + 2, guiTop + sizeY + 3 + 2, 100 - 4, 20 - 4); Minecraft.getMinecraft().getTextureManager().bindTexture(pv_dropdown); Utils.drawTexturedRect( @@ -402,9 +350,7 @@ public class GuiProfileViewer extends GuiScreen { if (profileDropdownSelected && !profile.getProfileNames().isEmpty() && scaledResolution.getScaleFactor() < 4) { int dropdownOptionSize = scaledResolution.getScaleFactor() == 3 ? 10 : 20; - - int numProfiles = profile.getProfileNames().size(); - int sizeYDropdown = numProfiles * dropdownOptionSize; + int sizeYDropdown = profile.getProfileNames().size() * dropdownOptionSize; renderBlurredBackground(width, height, guiLeft + 2, guiTop + sizeY + 23, 100 - 4, sizeYDropdown - 2); Minecraft.getMinecraft().getTextureManager().bindTexture(pv_dropdown); Utils.drawTexturedRect(guiLeft, guiTop + sizeY + 23 - 3, 100, 3, 100 / 200f, 1, 0, 3 / 185f, GL11.GL_NEAREST); @@ -432,70 +378,22 @@ public class GuiProfileViewer extends GuiScreen { ); for (int yIndex = 0; yIndex < profile.getProfileNames().size(); yIndex++) { - String otherProfileId = profile.getProfileNames().get(yIndex); + String otherProfileName = profile.getProfileNames().get(yIndex); + selectedProfile = profile.getProfile(otherProfileName); + Utils.drawStringCenteredScaledMaxWidth( - otherProfileId, + otherProfileName, guiLeft + 50, guiTop + sizeY + 23 + dropdownOptionSize / 2f + dropdownOptionSize * yIndex, true, 90, new Color(33, 112, 104, 255).getRGB() ); - currProfileInfo = profile.getProfileInformation(otherProfileId); - if ( - currProfileInfo != null && - currProfileInfo.has("game_mode") && - currProfileInfo.get("game_mode").getAsString().equals("ironman") - ) { - GlStateManager.color(1, 1, 1, 1); - Minecraft.getMinecraft().getTextureManager().bindTexture(pv_ironman); - Utils.drawTexturedRect( - guiLeft - 16 - 5, - guiTop + sizeY + 2 + 23 + dropdownOptionSize * yIndex, - 16, - 16, - GL11.GL_NEAREST - ); - } - if ( - currProfileInfo != null && - currProfileInfo.has("game_mode") && - currProfileInfo.get("game_mode").getAsString().equals("bingo") - ) { - GlStateManager.color(1, 1, 1, 1); - Minecraft.getMinecraft().getTextureManager().bindTexture(pv_bingo); - Utils.drawTexturedRect( - guiLeft - 16 - 5, - guiTop + sizeY + 2 + 23 + dropdownOptionSize * yIndex, - 16, - 16, - GL11.GL_NEAREST - ); - } - if ( - currProfileInfo != null && - currProfileInfo.has("game_mode") && - currProfileInfo.get("game_mode").getAsString().equals("island") - ) { - GlStateManager.color(1, 1, 1, 1); - Minecraft.getMinecraft().getTextureManager().bindTexture(pv_stranded); - Utils.drawTexturedRect( - guiLeft - 16 - 5, - guiTop + sizeY + 2 + 23 + dropdownOptionSize * yIndex, - 16, - 16, - GL11.GL_NEAREST - ); - } - if ( - currProfileInfo != null && - currProfileInfo.has("game_mode") && - !currProfileInfo.get("game_mode").getAsString().equals("island") && - !currProfileInfo.get("game_mode").getAsString().equals("bingo") && - !currProfileInfo.get("game_mode").getAsString().equals("ironman") - ) { + + if (selectedProfile != null && selectedProfile.getGamemode() != null) { GlStateManager.color(1, 1, 1, 1); - Minecraft.getMinecraft().getTextureManager().bindTexture(pv_unknown); + ResourceLocation gamemodeIcon = gamemodeToIcon.getOrDefault(selectedProfile.getGamemode(), gamemodeIconUnknown); + Minecraft.getMinecraft().getTextureManager().bindTexture(gamemodeIcon); Utils.drawTexturedRect( guiLeft - 16 - 5, guiTop + sizeY + 2 + 23 + dropdownOptionSize * yIndex, @@ -562,35 +460,34 @@ public class GuiProfileViewer extends GuiScreen { guiLeft + sizeX / 2f, guiTop + 151, true, 0 ); Utils.drawStringCentered( - EnumChatFormatting.YELLOW + "" + EnumChatFormatting.BOLD + "What are you doing with your life?", + EnumChatFormatting.YELLOW + String.valueOf(EnumChatFormatting.BOLD) + "What are you doing with your life?", guiLeft + sizeX / 2f, guiTop + 161, true, 0 ); if (timeDiff > 600000) { Utils.drawStringCentered( - EnumChatFormatting.RED + "" + EnumChatFormatting.BOLD + "Maniac", + EnumChatFormatting.RED + String.valueOf(EnumChatFormatting.BOLD) + "Maniac", guiLeft + sizeX / 2f, guiTop + 171, true, 0 ); if (timeDiff > 1200000) { Utils.drawStringCentered( - EnumChatFormatting.RED + "" + EnumChatFormatting.BOLD + "You're a menace to society", + EnumChatFormatting.RED + String.valueOf(EnumChatFormatting.BOLD) + "You're a menace to society", guiLeft + sizeX / 2f, guiTop + 181, true, 0 ); if (timeDiff > 1800000) { Utils.drawStringCentered( - EnumChatFormatting.RED + "" + EnumChatFormatting.BOLD + + EnumChatFormatting.RED + String.valueOf(EnumChatFormatting.BOLD) + "You don't know what's gonna happen to you", guiLeft + sizeX / 2f, guiTop + 191, true, 0 ); if (timeDiff > 3000000) { Utils.drawStringCentered( - EnumChatFormatting.RED + "" + EnumChatFormatting.BOLD + "You really want this?", + EnumChatFormatting.RED + String.valueOf(EnumChatFormatting.BOLD) + "You really want this?", guiLeft + sizeX / 2f, guiTop + 91, true, 0 ); if (timeDiff > 3300000) { Utils.drawStringCentered( EnumChatFormatting.DARK_RED + - "" + - EnumChatFormatting.BOLD + + String.valueOf(EnumChatFormatting.BOLD) + "OW LORD FORGIVE ME FOR THIS", guiLeft + sizeX / 2f, guiTop + 71, true, 0 ); @@ -774,12 +671,12 @@ public class GuiProfileViewer extends GuiScreen { mouseX < guiLeft + 106 + 100 && profile != null && !profile.getProfileNames().isEmpty() && - profileId != null + profileName != null ) { if (mouseY > guiTop + sizeY + 3 && mouseY < guiTop + sizeY + 23) { String url = "https://sky.shiiyu.moe/stats/" + profile.getHypixelProfile().get("displayname").getAsString() + "/" + - profileId; + profileName; Utils.openUrl(url); Utils.playPressSound(); return; @@ -793,7 +690,7 @@ public class GuiProfileViewer extends GuiScreen { profileDropdownSelected = false; int profileNum = 0; for (int index = 0; index < profile.getProfileNames().size(); index++) { - if (profile.getProfileNames().get(index).equals(profileId)) { + if (profile.getProfileNames().get(index).equals(profileName)) { profileNum = index; break; } @@ -806,11 +703,11 @@ public class GuiProfileViewer extends GuiScreen { if (profileNum >= profile.getProfileNames().size()) profileNum = 0; if (profileNum < 0) profileNum = profile.getProfileNames().size() - 1; - String newProfileId = profile.getProfileNames().get(profileNum); - if (profileId != null && !profileId.equals(newProfileId)) { + String newProfileName = profile.getProfileNames().get(profileNum); + if (profileName != null && !profileName.equals(newProfileName)) { resetCache(); } - profileId = newProfileId; + profileName = newProfileName; } else { profileDropdownSelected = !profileDropdownSelected; } @@ -819,11 +716,11 @@ public class GuiProfileViewer extends GuiScreen { int extraY = mouseY - (guiTop + sizeY + 23); int index = extraY / dropdownOptionSize; if (index >= 0 && index < profile.getProfileNames().size()) { - String newProfileId = profile.getProfileNames().get(index); - if (profileId != null && !profileId.equals(newProfileId)) { + String newProfileName = profile.getProfileNames().get(index); + if (profileName != null && !profileName.equals(newProfileName)) { resetCache(); } - profileId = newProfileId; + profileName = newProfileName; } } playerNameTextField.otherComponentClick(); @@ -848,7 +745,7 @@ public class GuiProfileViewer extends GuiScreen { if (playerNameTextField.getFocus()) { if (keyCode == Keyboard.KEY_RETURN) { currentPage = ProfileViewerPage.LOADING; - NotEnoughUpdates.profileViewer.getProfileByName( + NotEnoughUpdates.profileViewer.loadPlayerByName( playerNameTextField.getText(), profile -> { //todo: invalid name if (profile != null) profile.resetCache(); @@ -900,8 +797,8 @@ public class GuiProfileViewer extends GuiScreen { String totalXpStr = null; if (skillName.contains("Catacombs")) { totalXpStr = EnumChatFormatting.GRAY + "Total XP: " + EnumChatFormatting.DARK_PURPLE + - numberFormat.format(levelObj.totalXp) + EnumChatFormatting.DARK_GRAY + " (" + - DECIMAL_FORMAT.format(getPercentage(skillName.toLowerCase(), levelObj)) + "% to 50)"; + StringUtils.formatNumber(levelObj.totalXp) + EnumChatFormatting.DARK_GRAY + " (" + + StringUtils.formatToTenths(getPercentage(skillName.toLowerCase(), levelObj)) + "% to 50)"; } // Adds overflow level to each level object that is maxed, avoids hotm level as there is no overflow xp for it if (levelObj.maxed) { @@ -924,7 +821,7 @@ public class GuiProfileViewer extends GuiScreen { StringUtils.shortNumberFormat(maxXp) + // Since catacombs isn't considered 'maxed' at level 50 (since the cap is '99'), we can add // a conditional here to add the overflow level rather than above - ((skillName.contains("Catacombs") && levelObj.level >= 50) ? + (skillName.contains("Catacombs") && levelObj.level >= 50 ? EnumChatFormatting.GRAY + " (Overflow level: " + String.format("%.2f", levelObj.level) + ")" : ""); } } @@ -1135,7 +1032,7 @@ public class GuiProfileViewer extends GuiScreen { } if (skillName.contains("catacombs")) { return (level.totalXp / DungeonsWeight.CATACOMBS_LEVEL_50_XP) * 100; - } else if (ExtraPage.slayers.containsKey(skillName)) { + } else if (Weight.SLAYER_NAMES.contains(skillName)) { return (level.totalXp / 1000000) * 100; } else if (skillName.equalsIgnoreCase("social")) { return (level.totalXp / 272800) * 100; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewerPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewerPage.java index 2c7fd9f4..bb6baa41 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewerPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewerPage.java @@ -19,6 +19,7 @@ package io.github.moulberry.notenoughupdates.profileviewer; +import javax.annotation.Nullable; import java.io.IOException; public abstract class GuiProfileViewerPage { @@ -36,6 +37,13 @@ public abstract class GuiProfileViewerPage { return instance; } + /** + * @see GuiProfileViewer#getSelectedProfile() + */ + public @Nullable SkyblockProfiles.SkyblockProfile getSelectedProfile() { + return GuiProfileViewer.getSelectedProfile(); + } + public abstract void drawPage(int mouseX, int mouseY, float partialTicks); /** diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/InventoriesPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/InventoriesPage.java index 29f84a5b..5b38a050 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/InventoriesPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/InventoriesPage.java @@ -57,7 +57,7 @@ import static io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewe public class InventoriesPage extends GuiProfileViewerPage { - public static final ResourceLocation pv_invs = new ResourceLocation("notenoughupdates:pv_invs.png"); + private static final ResourceLocation pv_invs = new ResourceLocation("notenoughupdates:pv_invs.png"); private static final ResourceLocation CHEST_GUI_TEXTURE = new ResourceLocation("textures/gui/container/generic_54.png"); private static final Pattern FISHING_SPEED_PATTERN = Pattern.compile("^Fishing Speed: \\+(\\d+)"); @@ -71,7 +71,6 @@ public class InventoriesPage extends GuiProfileViewerPage { "ender_chest_contents", Utils.createItemStack(Item.getItemFromBlock(Blocks.ender_chest), EnumChatFormatting.GRAY + "Ender Chest") ); - // put("backpack_contents", Utils.createItemStack(Item.getItemFromBlock(Blocks.dropper), EnumChatFormatting.GRAY+"Backpacks")); put( "backpack_contents", Utils.editItemStackInfo( @@ -100,7 +99,6 @@ public class InventoriesPage extends GuiProfileViewerPage { }; private final ItemStack fillerStack = new ItemStack(Item.getItemFromBlock(Blocks.stained_glass_pane), 1, 15); private HashMap<String, ItemStack[][][]> inventoryItems = new HashMap<>(); - private ItemStack[] bestWeapons = null; private ItemStack[] bestRods = null; private ItemStack[] armorItems = null; @@ -124,11 +122,12 @@ public class InventoriesPage extends GuiProfileViewerPage { Utils.drawTexturedRect(guiLeft, guiTop, getInstance().sizeX, getInstance().sizeY, GL11.GL_NEAREST); getInstance().inventoryTextField.setSize(88, 20); - ProfileViewer.Profile profile = GuiProfileViewer.getProfile(); - String profileId = GuiProfileViewer.getProfileId(); - JsonObject inventoryInfo = profile.getInventoryInfo(profileId); - JsonObject profileInformation = profile.getProfileInformation(profileId); - if (inventoryInfo == null) return; + SkyblockProfiles.SkyblockProfile selectedProfile = getSelectedProfile(); + if (selectedProfile == null) { + return; + } + + Map<String, JsonArray> inventoryInfo = selectedProfile.getInventoryInfo(); int invNameIndex = 0; for (Map.Entry<String, ItemStack> entry : invNameToDisplayMap.entrySet()) { @@ -147,26 +146,26 @@ public class InventoriesPage extends GuiProfileViewerPage { Utils.drawTexturedRect(guiLeft + x - 2, guiTop + y - 2, 20, 20, 0, 20 / 256f, 0, 20 / 256f, GL11.GL_NEAREST); } - Utils.drawItemStackWithText(entry.getValue(), guiLeft + x, guiTop + y, "" + (invNameIndex + 1), true); + Utils.drawItemStackWithText(entry.getValue(), guiLeft + x, guiTop + y, String.valueOf(invNameIndex + 1), true); if (mouseX >= guiLeft + x && mouseX <= guiLeft + x + 16) { if (mouseY >= guiTop + y && mouseY <= guiTop + y + 16) { getInstance().tooltipToDisplay = entry.getValue().getTooltip(Minecraft.getMinecraft().thePlayer, false); if (Objects.equals(entry.getKey(), "talisman_bag")) { StringBuilder magicalPowerString = new StringBuilder(EnumChatFormatting.DARK_GRAY + "Magical Power: "); - int magicalPower = profile.getMagicalPower(profileId); + int magicalPower = getSelectedProfile().getMagicalPower(); getInstance() .tooltipToDisplay.add( magicalPower == -1 ? magicalPowerString.append(EnumChatFormatting.RED).append("Error while calculating!").toString() : magicalPowerString .append(EnumChatFormatting.GOLD) - .append(GuiProfileViewer.numberFormat.format(magicalPower)) + .append(StringUtils.formatNumber(magicalPower)) .toString() ); StringBuilder selectedPowerString = new StringBuilder(EnumChatFormatting.DARK_GRAY + "Selected Power: "); - String selectedPower = PlayerStats.getSelectedMagicalPower(profile.getProfileInformation(profileId)); + String selectedPower = PlayerStats.getSelectedMagicalPower(getSelectedProfile().getProfileJson()); getInstance() .tooltipToDisplay.add( selectedPower == null @@ -184,10 +183,11 @@ public class InventoriesPage extends GuiProfileViewerPage { if (armorItems == null) { armorItems = new ItemStack[4]; - JsonArray armor = Utils.getElement(inventoryInfo, "inv_armor").getAsJsonArray(); + JsonArray armor = inventoryInfo.get("inv_armor"); for (int i = 0; i < armor.size(); i++) { - if (armor.get(i) == null || !armor.get(i).isJsonObject()) continue; - armorItems[i] = NotEnoughUpdates.INSTANCE.manager.jsonToStack(armor.get(i).getAsJsonObject(), false); + if (armor.get(i) != null && armor.get(i).isJsonObject()) { + armorItems[i] = NotEnoughUpdates.INSTANCE.manager.jsonToStack(armor.get(i).getAsJsonObject(), false); + } } } @@ -211,10 +211,11 @@ public class InventoriesPage extends GuiProfileViewerPage { if (equipmentItems == null) { equipmentItems = new ItemStack[4]; - JsonArray equippment = Utils.getElement(inventoryInfo, "equippment_contents").getAsJsonArray(); + JsonArray equippment = inventoryInfo.get("equippment_contents"); for (int i = 0; i < equippment.size(); i++) { - if (equippment.get(i) == null || !equippment.get(i).isJsonObject()) continue; - equipmentItems[i] = NotEnoughUpdates.INSTANCE.manager.jsonToStack(equippment.get(i).getAsJsonObject(), false); + if (equippment.get(i) != null && equippment.get(i).isJsonObject()) { + equipmentItems[i] = NotEnoughUpdates.INSTANCE.manager.jsonToStack(equippment.get(i).getAsJsonObject(), false); + } } } @@ -236,6 +237,7 @@ public class InventoriesPage extends GuiProfileViewerPage { } } + // TODO: 3D arrays... ItemStack[][][] inventories = getItemsForInventory(inventoryInfo, selectedInventory); if (currentInventoryIndex >= inventories.length) currentInventoryIndex = inventories.length - 1; if (currentInventoryIndex < 0) currentInventoryIndex = 0; @@ -299,7 +301,7 @@ public class InventoriesPage extends GuiProfileViewerPage { .get("ARROW")), guiLeft + 173, guiTop + 101, - "" + (arrowCount > 999 ? StringUtils.shortNumberFormat(arrowCount) : arrowCount), + String.valueOf(arrowCount > 999 ? StringUtils.shortNumberFormat(arrowCount) : arrowCount), true ); Utils.drawItemStackWithText( @@ -308,7 +310,7 @@ public class InventoriesPage extends GuiProfileViewerPage { .get("GREEN_CANDY")), guiLeft + 173, guiTop + 119, - "" + greenCandyCount, + String.valueOf(greenCandyCount), true ); Utils.drawItemStackWithText( @@ -317,13 +319,13 @@ public class InventoriesPage extends GuiProfileViewerPage { .get("PURPLE_CANDY")), guiLeft + 173, guiTop + 137, - "" + purpleCandyCount, + String.valueOf(purpleCandyCount), true ); if (mouseX > guiLeft + 173 && mouseX < guiLeft + 173 + 16) { if (mouseY > guiTop + 101 && mouseY < guiTop + 137 + 16) { if (mouseY < guiTop + 101 + 17) { - QuiverInfo quiverInfo = PlayerStats.getQuiverInfo(inventoryInfo, profile.getProfileInformation(profileId)); + QuiverInfo quiverInfo = PlayerStats.getQuiverInfo(inventoryInfo, getSelectedProfile().getProfileJson()); if (quiverInfo == null) { getInstance().tooltipToDisplay = Utils.createList(EnumChatFormatting.RED + "Error checking Quiver"); } else { @@ -509,7 +511,12 @@ public class InventoriesPage extends GuiProfileViewerPage { i++; } - JsonObject inventoryInfo = GuiProfileViewer.getProfile().getInventoryInfo(GuiProfileViewer.getProfileId()); + SkyblockProfiles.SkyblockProfile selectedProfile = getSelectedProfile(); + if (selectedProfile == null) { + return; + } + + Map<String, JsonArray> inventoryInfo = selectedProfile.getInventoryInfo(); if (inventoryInfo == null) return; ItemStack[][][] inventories = getItemsForInventory(inventoryInfo, selectedInventory); @@ -519,8 +526,6 @@ public class InventoriesPage extends GuiProfileViewerPage { ItemStack[][] inventory = inventories[currentInventoryIndex]; if (inventory == null) return; - int inventoryRows = inventory.length; - int staticSelectorHeight = guiTop + 177; if (mouseY > staticSelectorHeight && mouseY < staticSelectorHeight + 16) { @@ -593,7 +598,7 @@ public class InventoriesPage extends GuiProfileViewerPage { private int countItemsInInventory( String internalname, - JsonObject inventoryInfo, + Map<String, JsonArray> inventoryInfo, boolean specific, String... invsToSearch ) { @@ -619,7 +624,7 @@ public class InventoriesPage extends GuiProfileViewerPage { } private ItemStack[] findBestItems( - JsonObject inventoryInfo, + Map<String, JsonArray> inventoryInfo, int numItems, String[] invsToSearch, String[] typeMatches, @@ -671,10 +676,10 @@ public class InventoriesPage extends GuiProfileViewerPage { return bestItems; } - private ItemStack[][][] getItemsForInventory(JsonObject inventoryInfo, String invName) { + private ItemStack[][][] getItemsForInventory(Map<String, JsonArray> inventoryInfo, String invName) { if (inventoryItems.containsKey(invName)) return inventoryItems.get(invName); - JsonArray jsonInv = Utils.getElement(inventoryInfo, invName).getAsJsonArray(); + JsonArray jsonInv = inventoryInfo.get(invName); if (jsonInv.size() == 0) return new ItemStack[1][][]; @@ -701,14 +706,13 @@ public class InventoriesPage extends GuiProfileViewerPage { int maxInvSize = rowSize * maxRowsPerPage; int numInventories = (jsonInvSize - 1) / maxInvSize + 1; - JsonArray backPackSizes = (JsonArray) inventoryInfo.get("backpack_sizes"); + JsonArray backpackSizes = inventoryInfo.get("backpack_sizes"); if (invName.equals("backpack_contents")) { - numInventories = backPackSizes.size(); + numInventories = backpackSizes.size(); } ItemStack[][][] inventories = new ItemStack[numInventories][][]; - //int availableSlots = getAvailableSlotsForInventory(inventoryInfo, collectionInfo, invName); int startNumberJ = 0; for (int i = 0; i < numInventories; i++) { @@ -716,7 +720,7 @@ public class InventoriesPage extends GuiProfileViewerPage { int invSize; if (invName.equals("backpack_contents")) { - thisRows = backPackSizes.get(i).getAsInt() / 9; + thisRows = backpackSizes.get(i).getAsInt() / 9; invSize = startNumberJ + (thisRows * 9); maxInvSize = thisRows * 9; } else { @@ -773,7 +777,7 @@ public class InventoriesPage extends GuiProfileViewerPage { } inventories[i] = items; if (invName.equals("backpack_contents")) { - startNumberJ = startNumberJ + backPackSizes.get(i).getAsInt(); + startNumberJ = startNumberJ + backpackSizes.get(i).getAsInt(); } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/MiningPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/MiningPage.java index 6c042a39..84f0622b 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/MiningPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/MiningPage.java @@ -20,10 +20,8 @@ package io.github.moulberry.notenoughupdates.profileviewer; import com.google.common.collect.Lists; -import com.google.gson.JsonArray; import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.core.util.StringUtils; -import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GlStateManager; @@ -34,18 +32,27 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; +import org.apache.commons.lang3.text.WordUtils; import org.lwjgl.opengl.GL11; import java.util.ArrayList; import java.util.HashMap; -import java.util.Objects; +import java.util.Map; import java.util.function.Supplier; public class MiningPage extends GuiProfileViewerPage { - public static final ResourceLocation pv_mining = new ResourceLocation("notenoughupdates:pv_mining.png"); - private static final ItemStack iron_pick = new ItemStack(Items.iron_pickaxe); - private final HashMap<String, ProfileViewer.Level> levelObjhotms = new HashMap<>(); + private static final ResourceLocation miningPageTexture = new ResourceLocation("notenoughupdates:pv_mining.png"); + private static final ItemStack hotmSkillIcon = new ItemStack(Items.iron_pickaxe); + private static final Map<String, EnumChatFormatting> crystalToColor = new HashMap<String, EnumChatFormatting>() {{ + put("jade", EnumChatFormatting.GREEN); + put("amethyst", EnumChatFormatting.DARK_PURPLE); + put("amber", EnumChatFormatting.GOLD); + put("sapphire", EnumChatFormatting.AQUA); + put("topaz", EnumChatFormatting.YELLOW); + put("jasper", EnumChatFormatting.LIGHT_PURPLE); + put("ruby", EnumChatFormatting.RED); + }}; public MiningPage(GuiProfileViewer instance) { super(instance); @@ -56,13 +63,15 @@ public class MiningPage extends GuiProfileViewerPage { int guiLeft = GuiProfileViewer.getGuiLeft(); int guiTop = GuiProfileViewer.getGuiTop(); - Minecraft.getMinecraft().getTextureManager().bindTexture(pv_mining); + Minecraft.getMinecraft().getTextureManager().bindTexture(miningPageTexture); Utils.drawTexturedRect(guiLeft, guiTop, getInstance().sizeX, getInstance().sizeY, GL11.GL_NEAREST); - ProfileViewer.Profile profile = GuiProfileViewer.getProfile(); - String profileId = GuiProfileViewer.getProfileId(); - JsonObject profileInfo = profile.getProfileInformation(profileId); - if (profileInfo == null) return; + SkyblockProfiles.SkyblockProfile selectedProfile = getSelectedProfile(); + if (selectedProfile == null) { + return; + } + + JsonObject profileInfo = selectedProfile.getProfileJson(); float xStart = 22; float yStartTop = 27; @@ -70,218 +79,85 @@ public class MiningPage extends GuiProfileViewerPage { int x = guiLeft + 23; int y = guiTop + 25; int sectionWidth = 110; - JsonObject leveling = Constants.LEVELING; - ProfileViewer.Level levelObjhotm = levelObjhotms.get(profileId); - if (levelObjhotm == null) { - float hotmXp = Utils.getElementAsFloat(Utils.getElement(profileInfo, "mining_core.experience"), 0); - levelObjhotm = - ProfileViewer.getLevel( - Utils.getElementOrDefault(leveling, "HOTM", new JsonArray()).getAsJsonArray(), - hotmXp, - 7, - false - ); - levelObjhotms.put(profileId, levelObjhotm); - } - String skillName = EnumChatFormatting.RED + "HOTM"; - //The stats that show - float mithrilPowder = Utils.getElementAsFloat(Utils.getElement(profileInfo, "mining_core.powder_mithril"), 0); - float gemstonePowder = Utils.getElementAsFloat(Utils.getElement(profileInfo, "mining_core.powder_gemstone"), 0); + // Get stats + JsonObject miningCore = profileInfo.getAsJsonObject("mining_core"); + JsonObject nodes = miningCore.getAsJsonObject("nodes"); + + float mithrilPowder = Utils.getElementAsFloat(Utils.getElement(miningCore, "powder_mithril"), 0); + float gemstonePowder = Utils.getElementAsFloat(Utils.getElement(miningCore, "powder_gemstone"), 0); float mithrilPowderTotal = Utils.getElementAsFloat(Utils.getElement( profileInfo, - "mining_core.powder_spent_mithril" + "powder_spent_mithril" ), 0); - float gemstonePowderTotal = (Utils.getElementAsFloat(Utils.getElement( + float gemstonePowderTotal = Utils.getElementAsFloat(Utils.getElement( profileInfo, - "mining_core.powder_spent_gemstone" - ), 0)); - String jadeCrystal = - (Utils.getElementAsString(Utils.getElement(profileInfo, "mining_core.crystals.jade_crystal.state"), "Not Found")); + "powder_spent_gemstone" + ), 0); + float crystalPlacedAmount = - (Utils.getElementAsFloat(Utils.getElement(profileInfo, "mining_core.crystals.jade_crystal.total_placed"), 0)); - String jadeCrystalString = "§c✖"; - String amethystCrystal = - (Utils.getElementAsString( - Utils.getElement(profileInfo, "mining_core.crystals.amethyst_crystal.state"), - "Not Found" - )); - String amethystCrystalString = "§c✖"; - String amberCrystal = - (Utils.getElementAsString( - Utils.getElement(profileInfo, "mining_core.crystals.amber_crystal.state"), - "Not Found" - )); - String amberCrystalString = "§c✖"; - String sapphireCrystal = - (Utils.getElementAsString( - Utils.getElement(profileInfo, "mining_core.crystals.sapphire_crystal.state"), - "Not Found" - )); - String sapphireCrystalString = "§c✖"; - String topazCrystal = - (Utils.getElementAsString( - Utils.getElement(profileInfo, "mining_core.crystals.topaz_crystal.state"), - "Not Found" - )); - String topazCrystalString = "§c✖"; - String jasperCrystal = - (Utils.getElementAsString( - Utils.getElement(profileInfo, "mining_core.crystals.jasper_crystal.state"), - "Not Found" - )); - String jasperCrystalString = "§c✖"; - String rubyCrystal = - (Utils.getElementAsString(Utils.getElement(profileInfo, "mining_core.crystals.ruby_crystal.state"), "Not Found")); - String rubyCrystalString = "§c✖"; - int miningFortune = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.mining_fortune"), 0))); - int miningFortuneStat = ((Utils.getElementAsInt( - Utils.getElement(profileInfo, "mining_core.nodes.mining_fortune"), - 0 - )) * 5); - int miningSpeed = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.mining_speed"), 0))); - int miningSpeedStat = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.mining_speed"), 0)) * - 20); - int dailyPowder = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.daily_powder"), 0))); - int dailyPowderStat = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.daily_powder"), 0)) * - 36 + 364); - int effMiner = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.efficient_miner"), 0))); - float effMinerStat = (float) ( - (Utils.getElementAsFloat(Utils.getElement(profileInfo, "mining_core.nodes.efficient_miner"), 0)) * 0.4 + 10.4 - ); - float effMinerStat2 = (float) ( - (Utils.getElementAsFloat(Utils.getElement(profileInfo, "mining_core.nodes.efficient_miner"), 0)) * .06 + 0.31 - ); - int tittyInsane = ((Utils.getElementAsInt( - Utils.getElement(profileInfo, "mining_core.nodes.titanium_insanium"), - 0 - ))); - float tittyInsaneStat = (float) ( - (Utils.getElementAsFloat(Utils.getElement(profileInfo, "mining_core.nodes.titanium_insanium"), 0)) * .1 + 2 - ); - int luckofcave = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.random_event"), 0))); - int luckofcaveStat = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.random_event"), 0))); - int madMining = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.mining_madness"), 0))); - int skyMall = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.daily_effect"), 0))); - int goblinKiller = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.goblin_killer"), 0))); - int seasonMine = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.mining_experience"), 0))); - float seasonMineStat = (float) ( - (Utils.getElementAsFloat(Utils.getElement(profileInfo, "mining_core.nodes.mining_experience"), 0)) * 0.1 + 5 - ); - int quickForge = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.forge_time"), 0))); - float quickForgeStat = (float) ( - (Utils.getElementAsFloat(Utils.getElement(profileInfo, "mining_core.nodes.forge_time"), 0)) * .5 + 10 - ); - int frontLoad = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.front_loaded"), 0))); - int orbit = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.experience_orbs"), 0))); - float orbitStat = (float) ( - (Utils.getElementAsFloat(Utils.getElement(profileInfo, "mining_core.nodes.experience_orbs"), 0)) * .01 + 0.2 - ); - int crystallized = ((Utils.getElementAsInt( - Utils.getElement(profileInfo, "mining_core.nodes.fallen_star_bonus"), - 0 - ))); - int crystallizedStat = ((Utils.getElementAsInt( - Utils.getElement(profileInfo, "mining_core.nodes.fallen_star_bonus"), - 0 - )) * 6 + 14); - int professional = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.professional"), 0))); - int professionalStat = ((Utils.getElementAsInt( - Utils.getElement(profileInfo, "mining_core.nodes.professional"), - 0 - )) * 5 + 50); - int greatExplorer = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.great_explorer"), 0))); - int greatExplorerStat = ((Utils.getElementAsInt( - Utils.getElement(profileInfo, "mining_core.nodes.great_explorer"), - 0 - )) * 4 + 16); - int fortunate = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.fortunate"), 0))); - int fortunateStat = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.fortunate"), 0)) * 4 + - 20); - int lonesomeMiner = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.lonesome_miner"), 0))); - float lonesomeMinerStat = (float) ( - (Utils.getElementAsFloat(Utils.getElement(profileInfo, "mining_core.nodes.lonesome_miner"), 0)) * .5 + 5 - ); - int miningFortune2 = ((Utils.getElementAsInt( - Utils.getElement(profileInfo, "mining_core.nodes.mining_fortune_2"), - 0 - ))); - int miningFortune2Stat = ((Utils.getElementAsInt(Utils.getElement( - profileInfo, - "mining_core.nodes.mining_fortune_2" - ), 0)) * 5); - int miningSpeed2 = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.mining_speed_2"), 0))); - int miningSpeed2Stat = ((Utils.getElementAsInt( - Utils.getElement(profileInfo, "mining_core.nodes.mining_speed_2"), - 0 - )) * 40); - int miningSpeedBoost = ((Utils.getElementAsInt(Utils.getElement( - profileInfo, - "mining_core.nodes.mining_speed_boost" - ), 0))); - int veinSeeker = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.vein_seeker"), 0))); - int powderBuff = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.powder_buff"), 0))); - int potm = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.special_0"), 0))); - int fortnite = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.precision_mining"), 0))); - int starPowder = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.star_powder"), 0))); - int pickoblus = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.pickaxe_toss"), 0))); - int maniacMiner = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.maniac_miner"), 0))); + Utils.getElementAsFloat(Utils.getElement(miningCore, "crystals.jade_crystal.total_placed"), 0); - if (effMinerStat2 < 1) { - effMinerStat2 = 1; + int miningFortune = Utils.getElementAsInt(Utils.getElement(nodes, "mining_fortune"), 0); + int miningFortuneStat = miningFortune * 5; + int miningSpeed = Utils.getElementAsInt(Utils.getElement(nodes, "mining_speed"), 0); + int miningSpeedStat = miningSpeed * 20; + int dailyPowder = Utils.getElementAsInt(Utils.getElement(nodes, "daily_powder"), 0); + int dailyPowderStat = dailyPowder * 36 + 364; + int effMiner = Utils.getElementAsInt(Utils.getElement(nodes, "efficient_miner"), 0); + float effMinerStat = (float) (effMiner * 0.4 + 10.4); + float effMinerStat2 = Math.max(1, (float) (effMiner * .06 + 0.31)); + int tittyInsane = Utils.getElementAsInt(Utils.getElement(nodes, "titanium_insanium"), 0); + float tittyInsaneStat = (float) (tittyInsane * .1 + 2); + int luckOfCave = Utils.getElementAsInt(Utils.getElement(nodes, "random_event"), 0); + int madMining = Utils.getElementAsInt(Utils.getElement(nodes, "mining_madness"), 0); + int skyMall = Utils.getElementAsInt(Utils.getElement(nodes, "daily_effect"), 0); + int goblinKiller = Utils.getElementAsInt(Utils.getElement(nodes, "goblin_killer"), 0); + int seasonMine = Utils.getElementAsInt(Utils.getElement(nodes, "mining_experience"), 0); + float seasonMineStat = (float) (seasonMine * 0.1 + 5); + int quickForge = Utils.getElementAsInt(Utils.getElement(nodes, "forge_time"), 0); + float quickForgeStat = (float) (quickForge * .5 + 10); + int frontLoad = Utils.getElementAsInt(Utils.getElement(nodes, "front_loaded"), 0); + int orbit = Utils.getElementAsInt(Utils.getElement(nodes, "experience_orbs"), 0); + float orbitStat = (float) (orbit * .01 + 0.2); + int crystallized = Utils.getElementAsInt(Utils.getElement(nodes, "fallen_star_bonus"), 0); + int crystallizedStat = crystallized * 6 + 14; + int professional = Utils.getElementAsInt(Utils.getElement(nodes, "professional"), 0); + int professionalStat = professional * 5 + 50; + int greatExplorer = Utils.getElementAsInt(Utils.getElement(nodes, "great_explorer"), 0); + int greatExplorerStat = greatExplorer * 4 + 16; + int fortunate = Utils.getElementAsInt(Utils.getElement(nodes, "fortunate"), 0); + int fortunateStat = fortunate * 4 + 20; + int lonesomeMiner = ((Utils.getElementAsInt(Utils.getElement(nodes, "lonesome_miner"), 0))); + float lonesomeMinerStat = (float) (lonesomeMiner * .5 + 5); + int miningFortune2 = Utils.getElementAsInt(Utils.getElement(nodes, "mining_fortune_2"), 0); + int miningFortune2Stat = miningFortune2 * 5; + int miningSpeed2 = Utils.getElementAsInt(Utils.getElement(nodes, "mining_speed_2"), 0); + int miningSpeed2Stat = miningSpeed2 * 40; + int miningSpeedBoost = Utils.getElementAsInt(Utils.getElement(nodes, "mining_speed_boost"), 0); + int veinSeeker = Utils.getElementAsInt(Utils.getElement(nodes, "vein_seeker"), 0); + int powderBuff = Utils.getElementAsInt(Utils.getElement(nodes, "powder_buff"), 0); + int potm = ((Utils.getElementAsInt(Utils.getElement(nodes, "special_0"), 0))); + int fortnite = Utils.getElementAsInt(Utils.getElement(nodes, "precision_mining"), 0); + int starPowder = Utils.getElementAsInt(Utils.getElement(nodes, "star_powder"), 0); + int pickoblus = Utils.getElementAsInt(Utils.getElement(nodes, "pickaxe_toss"), 0); + int maniacMiner = Utils.getElementAsInt(Utils.getElement(nodes, "maniac_miner"), 0); + int mole = Utils.getElementAsInt(Utils.getElement(nodes, "mole"), 0); + float moleStat = (float) (mole * 0.051); + double molePerkStat = (double) mole / 20 - 0.55 + 50; + double molePerkStat2 = (double) Math.round(molePerkStat * 100) / 100; + float molePerkPct = Math.round((float) (molePerkStat2 % 1) * 100); + if (molePerkPct == 0) { + molePerkPct = 100; } - int mole = ((Utils.getElementAsInt(Utils.getElement(profileInfo, "mining_core.nodes.mole"), 0))); - float moleStat = (float) ((Utils.getElementAsFloat(Utils.getElement(profileInfo, "mining_core.nodes.mole"), 0)) * - 0.051); - double moleperkstat = (double) mole / 20 - 0.55 + 50; - double moleperkstat2 = (double) Math.round(moleperkstat * 100) / 100; - float output = Math.round((float) (moleperkstat2 % 1) * 100); - if (output == 0) { - output = 100; - } + ProfileViewer.Level hotmLevelingInfo = selectedProfile.getLevelingInfo().get("hotm"); - //The logic for some of the stats - if (Objects.equals(jadeCrystal, "NOT_FOUND")) { - jadeCrystalString = "§c✖"; - } else if (Objects.equals(jadeCrystal, "FOUND")) { - jadeCrystalString = "§a✔"; - } - if (Objects.equals(amethystCrystal, "NOT_FOUND")) { - amethystCrystalString = "§c✖"; - } else if (Objects.equals(amethystCrystal, "FOUND")) { - amethystCrystalString = "§a✔"; - } - if (Objects.equals(amberCrystal, "NOT_FOUND")) { - amberCrystalString = "§c✖"; - } else if (Objects.equals(amberCrystal, "FOUND")) { - amberCrystalString = "§a✔"; - } - if (Objects.equals(sapphireCrystal, "NOT_FOUND")) { - sapphireCrystalString = "§c✖"; - } else if (Objects.equals(sapphireCrystal, "FOUND")) { - sapphireCrystalString = "§a✔"; - } - if (Objects.equals(topazCrystal, "NOT_FOUND")) { - topazCrystalString = "§c✖"; - } else if (Objects.equals(topazCrystal, "FOUND")) { - topazCrystalString = "§a✔"; - } - if (Objects.equals(jasperCrystal, "NOT_FOUND")) { - jasperCrystalString = "§c✖"; - } else if (Objects.equals(jasperCrystal, "FOUND")) { - jasperCrystalString = "§a✔"; - } - if (Objects.equals(rubyCrystal, "NOT_FOUND")) { - rubyCrystalString = "§c✖"; - } else if (Objects.equals(rubyCrystal, "FOUND")) { - rubyCrystalString = "§a✔"; - } + // Render stats + // HOTM + getInstance().renderXpBar(EnumChatFormatting.RED + "HOTM", hotmSkillIcon, x, y, sectionWidth, hotmLevelingInfo, mouseX, mouseY); - //The rendering of the stats - //hotm level - getInstance().renderXpBar(skillName, iron_pick, x, y, sectionWidth, levelObjhotm, mouseX, mouseY); - //Powder + // Powder Utils.renderAlignedString( EnumChatFormatting.DARK_GREEN + "Mithril Powder", EnumChatFormatting.WHITE + StringUtils.shortNumberFormat(mithrilPowder), @@ -310,56 +186,22 @@ public class MiningPage extends GuiProfileViewerPage { guiTop + yStartTop + 54, 115 ); - //Crystals - Utils.renderAlignedString( - EnumChatFormatting.GREEN + "Jade Crystal:", - EnumChatFormatting.WHITE + jadeCrystalString, - guiLeft + xStart, - guiTop + yStartTop + 74, - 110 - ); - Utils.renderAlignedString( - EnumChatFormatting.GOLD + "Amber Crystal:", - EnumChatFormatting.WHITE + amberCrystalString, - guiLeft + xStart, - guiTop + yStartTop + 84, - 110 - ); - Utils.renderAlignedString( - EnumChatFormatting.DARK_PURPLE + "Amethyst Crystal:", - EnumChatFormatting.WHITE + amethystCrystalString, - guiLeft + xStart, - guiTop + yStartTop + 94, - 110 - ); - Utils.renderAlignedString( - EnumChatFormatting.AQUA + "Sapphire Crystal:", - EnumChatFormatting.WHITE + sapphireCrystalString, - guiLeft + xStart, - guiTop + yStartTop + 104, - 110 - ); - Utils.renderAlignedString( - EnumChatFormatting.YELLOW + "Topaz Crystal:", - EnumChatFormatting.WHITE + topazCrystalString, - guiLeft + xStart, - guiTop + yStartTop + 114, - 110 - ); - Utils.renderAlignedString( - EnumChatFormatting.LIGHT_PURPLE + "Jasper Crystal:", - EnumChatFormatting.WHITE + jasperCrystalString, - guiLeft + xStart, - guiTop + yStartTop + 124, - 110 - ); - Utils.renderAlignedString( - EnumChatFormatting.RED + "Ruby Crystal:", - EnumChatFormatting.WHITE + rubyCrystalString, - guiLeft + xStart, - guiTop + yStartTop + 134, - 110 - ); + + // Crystals + int idx = 0; + for (Map.Entry<String, EnumChatFormatting> crystal : crystalToColor.entrySet()) { + String crystalState = Utils.getElementAsString(Utils.getElement(miningCore, "crystals." + crystal.getKey() + "_crystal.state"), "NOT_FOUND"); + String crystalStr = crystalState.equals("FOUND") ? "§a✔" : "§c✖"; + Utils.renderAlignedString( + crystal.getValue() + WordUtils.capitalizeFully(crystal.getKey()) + " Crystal:", + EnumChatFormatting.WHITE + crystalStr, + guiLeft + xStart, + guiTop + yStartTop + 74 + idx * 10, + 110 + ); + idx ++; // Move text down 10 px every crystal + } + Utils.renderAlignedString( EnumChatFormatting.BLUE + "Total Placed Crystals:", EnumChatFormatting.WHITE + StringUtils.shortNumberFormat(crystalPlacedAmount), @@ -368,9 +210,7 @@ public class MiningPage extends GuiProfileViewerPage { 110 ); - //hotm render - //Pain - + // HOTM tree renderHotmPerk( miningSpeed, (int) (guiLeft + xStart + 255), @@ -394,8 +234,7 @@ public class MiningPage extends GuiProfileViewerPage { "", EnumChatFormatting.GRAY + "Cost", EnumChatFormatting.DARK_GREEN + - "" + - GuiProfileViewer.numberFormat.format(Math.pow(miningSpeed + 2, 3)) + + StringUtils.formatNumber(Math.pow(miningSpeed + 2, 3)) + " Mithril Powder" ) : Lists.newArrayList( @@ -437,8 +276,7 @@ public class MiningPage extends GuiProfileViewerPage { "", EnumChatFormatting.GRAY + "Cost", EnumChatFormatting.DARK_GREEN + - "" + - GuiProfileViewer.numberFormat.format(Math.pow(miningFortune + 2, 3)) + + StringUtils.formatNumber(Math.pow(miningFortune + 2, 3)) + " Mithril Powder" ) : Lists.newArrayList( @@ -482,8 +320,7 @@ public class MiningPage extends GuiProfileViewerPage { "", EnumChatFormatting.GRAY + "Cost", EnumChatFormatting.DARK_GREEN + - "" + - GuiProfileViewer.numberFormat.format((int) Math.pow(tittyInsane + 2, 3)) + + StringUtils.formatNumber((int) Math.pow(tittyInsane + 2, 3)) + " Mithril Powder" ) : Lists.newArrayList( @@ -563,34 +400,33 @@ public class MiningPage extends GuiProfileViewerPage { ); renderHotmPerk( - luckofcave, + luckOfCave, (int) (guiLeft + xStart + 207), (int) (guiTop + yStartTop + 90), mouseX, mouseY, () -> - luckofcave != 0 && luckofcave != 45 + luckOfCave != 0 && luckOfCave != 45 ? Lists.newArrayList( "Luck of the Cave", - "§7Level " + luckofcave + EnumChatFormatting.DARK_GRAY + "/45", + "§7Level " + luckOfCave + EnumChatFormatting.DARK_GRAY + "/45", "", "§7Increases the chance for you to", "§7trigger rare occurrences in", - "§2Dwarven Mines " + EnumChatFormatting.GRAY + "by " + EnumChatFormatting.GREEN + luckofcaveStat + "%§7.", + "§2Dwarven Mines " + EnumChatFormatting.GRAY + "by " + EnumChatFormatting.GREEN + luckOfCave + "%§7.", "", EnumChatFormatting.GRAY + "Cost", EnumChatFormatting.DARK_GREEN + - "" + - GuiProfileViewer.numberFormat.format((int) Math.pow(luckofcave + 2, 3.07)) + + StringUtils.formatNumber((int) Math.pow(luckOfCave + 2, 3.07)) + " Mithril Powder" ) : Lists.newArrayList( "Luck of the Cave", - "§7Level " + luckofcave + EnumChatFormatting.DARK_GRAY + "/45", + "§7Level " + luckOfCave + EnumChatFormatting.DARK_GRAY + "/45", "", "§7Increases the chance for you to", "§7trigger rare occurrences in", - "§2Dwarven Mines " + EnumChatFormatting.GRAY + "by " + EnumChatFormatting.GREEN + luckofcaveStat + "%§7." + "§2Dwarven Mines " + EnumChatFormatting.GRAY + "by " + EnumChatFormatting.GREEN + luckOfCave + "%§7." ), 45 ); @@ -618,7 +454,7 @@ public class MiningPage extends GuiProfileViewerPage { EnumChatFormatting.GRAY + "Works for all Powder types.", "", EnumChatFormatting.GRAY + "Cost", - EnumChatFormatting.DARK_GREEN + "" + (200 + ((dailyPowder) * 18)) + " Mithril Powder" + EnumChatFormatting.DARK_GREEN + String.valueOf(200 + ((dailyPowder) * 18)) + " Mithril Powder" ) : Lists.newArrayList( "Daily Powder", @@ -637,7 +473,6 @@ public class MiningPage extends GuiProfileViewerPage { 100 ); - float finalEffMinerStat2 = effMinerStat2; renderHotmPerk( effMiner, (int) (guiLeft + xStart + 255), @@ -652,19 +487,17 @@ public class MiningPage extends GuiProfileViewerPage { "", EnumChatFormatting.GRAY + "When mining ores, you have a", EnumChatFormatting.GREEN + - "" + - effMinerStat + + String.valueOf(effMinerStat) + "%" + EnumChatFormatting.GRAY + " chance to mine " + EnumChatFormatting.GREEN + - Math.round(finalEffMinerStat2), + Math.round(effMinerStat2), EnumChatFormatting.GRAY + "adjacent ores.", "", EnumChatFormatting.GRAY + "Cost", EnumChatFormatting.DARK_GREEN + - "" + - GuiProfileViewer.numberFormat.format((int) Math.pow(effMiner + 2, 2.6)) + + StringUtils.formatNumber((int) Math.pow(effMiner + 2, 2.6)) + " Mithril Powder" ) : Lists.newArrayList( @@ -673,13 +506,12 @@ public class MiningPage extends GuiProfileViewerPage { "", EnumChatFormatting.GRAY + "When mining ores, you have a", EnumChatFormatting.GREEN + - "" + - effMinerStat + + String.valueOf(effMinerStat) + "%" + EnumChatFormatting.GRAY + " chance to mine " + EnumChatFormatting.GREEN + - Math.round(finalEffMinerStat2), + Math.round(effMinerStat2), EnumChatFormatting.GRAY + "adjacent ores." ), 100 @@ -814,7 +646,7 @@ public class MiningPage extends GuiProfileViewerPage { true // A redstone block or bedrock is being rendered, so standard GUI item lighting needs to be enabled. ); - float finalOutput = output; + float finalMolePerkPct = molePerkPct; renderHotmPerk( mole, (int) (guiLeft + xStart + 255), @@ -831,22 +663,20 @@ public class MiningPage extends GuiProfileViewerPage { EnumChatFormatting.GRAY + "a " + EnumChatFormatting.GREEN + - finalOutput + + finalMolePerkPct + "% " + EnumChatFormatting.GRAY + "chance to mine " + EnumChatFormatting.GREEN, EnumChatFormatting.GREEN + - "" + - Math.round(moleStat) + + String.valueOf(Math.round(moleStat)) + EnumChatFormatting.GRAY + " adjacent hard stone block" + (moleStat == 1.0 ? "." : "s."), "", EnumChatFormatting.GRAY + "Cost", EnumChatFormatting.LIGHT_PURPLE + - "" + - GuiProfileViewer.numberFormat.format((int) Math.pow(mole + 2, 2.2)) + + StringUtils.formatNumber((int) Math.pow(mole + 2, 2.2)) + " Gemstone Powder" ) : Lists.newArrayList( @@ -857,14 +687,13 @@ public class MiningPage extends GuiProfileViewerPage { EnumChatFormatting.GRAY + "a " + EnumChatFormatting.GREEN + - finalOutput + + finalMolePerkPct + "% " + EnumChatFormatting.GRAY + "chance to mine " + EnumChatFormatting.GREEN, EnumChatFormatting.GREEN + - "" + - Math.round(moleStat) + + String.valueOf(Math.round(moleStat)) + EnumChatFormatting.GRAY + " adjacent hard stone block" + (moleStat == 1.0 ? "." : "s.") @@ -895,8 +724,7 @@ public class MiningPage extends GuiProfileViewerPage { "", EnumChatFormatting.GRAY + "Cost", EnumChatFormatting.LIGHT_PURPLE + - "" + - GuiProfileViewer.numberFormat.format((int) Math.pow(powderBuff + 2, 3.2)) + + StringUtils.formatNumber((int) Math.pow(powderBuff + 2, 3.2)) + " Gemstone Powder" ) : Lists.newArrayList( @@ -976,8 +804,7 @@ public class MiningPage extends GuiProfileViewerPage { "", EnumChatFormatting.GRAY + "Cost", EnumChatFormatting.DARK_GREEN + - "" + - GuiProfileViewer.numberFormat.format((int) Math.pow(seasonMine + 2, 2.3)) + + StringUtils.formatNumber((int) Math.pow(seasonMine + 2, 2.3)) + " Mithril Powder" ) : Lists.newArrayList( @@ -1019,8 +846,7 @@ public class MiningPage extends GuiProfileViewerPage { "", EnumChatFormatting.GRAY + "Cost", EnumChatFormatting.LIGHT_PURPLE + - "" + - GuiProfileViewer.numberFormat.format((int) Math.pow(lonesomeMiner + 2, 3.07)) + + StringUtils.formatNumber((int) Math.pow(lonesomeMiner + 2, 3.07)) + " Gemstone Powder" ) : Lists.newArrayList( @@ -1052,8 +878,7 @@ public class MiningPage extends GuiProfileViewerPage { "", EnumChatFormatting.GRAY + "Cost", EnumChatFormatting.LIGHT_PURPLE + - "" + - GuiProfileViewer.numberFormat.format((int) Math.pow(professional + 2, 2.3)) + + StringUtils.formatNumber((int) Math.pow(professional + 2, 2.3)) + " Gemstone Powder" ) : Lists.newArrayList( @@ -1083,8 +908,7 @@ public class MiningPage extends GuiProfileViewerPage { "", EnumChatFormatting.GRAY + "Cost", EnumChatFormatting.LIGHT_PURPLE + - "" + - GuiProfileViewer.numberFormat.format(Math.pow(miningSpeed2 + 2, 3)) + + StringUtils.formatNumber(Math.pow(miningSpeed2 + 2, 3)) + " Gemstone Powder" ) : Lists.newArrayList( @@ -1114,8 +938,7 @@ public class MiningPage extends GuiProfileViewerPage { "", EnumChatFormatting.GRAY + "Cost", EnumChatFormatting.DARK_GREEN + - "" + - GuiProfileViewer.numberFormat.format((int) Math.pow(quickForge + 2, 4)) + + StringUtils.formatNumber((int) Math.pow(quickForge + 2, 4)) + " Mithril Powder" ) : Lists.newArrayList( @@ -1145,8 +968,7 @@ public class MiningPage extends GuiProfileViewerPage { "", EnumChatFormatting.GRAY + "Cost", EnumChatFormatting.DARK_GREEN + - "" + - GuiProfileViewer.numberFormat.format((int) Math.pow(fortunate + 2, 3.05)) + + StringUtils.formatNumber((int) Math.pow(fortunate + 2, 3.05)) + " Mithril Powder" ) : Lists.newArrayList( @@ -1177,8 +999,7 @@ public class MiningPage extends GuiProfileViewerPage { "", EnumChatFormatting.GRAY + "Cost", EnumChatFormatting.LIGHT_PURPLE + - "" + - GuiProfileViewer.numberFormat.format((int) Math.pow(greatExplorer + 2, 4)) + + StringUtils.formatNumber((int) Math.pow(greatExplorer + 2, 4)) + " Gemstone Powder" ) : Lists.newArrayList( @@ -1209,8 +1030,7 @@ public class MiningPage extends GuiProfileViewerPage { "", EnumChatFormatting.GRAY + "Cost", EnumChatFormatting.LIGHT_PURPLE + - "" + - GuiProfileViewer.numberFormat.format((int) Math.pow(miningFortune2 + 2, 3.2)) + + StringUtils.formatNumber((int) Math.pow(miningFortune2 + 2, 3.2)) + " Gemstone Powder" ) : Lists.newArrayList( @@ -1236,18 +1056,18 @@ public class MiningPage extends GuiProfileViewerPage { "§7Level " + orbit + EnumChatFormatting.DARK_GRAY + "/80", "", "§7When mining ores, you have a", - EnumChatFormatting.GREEN + "" + orbitStat + "%" + EnumChatFormatting.GRAY + " chance to get a random", + EnumChatFormatting.GREEN + String.valueOf(orbitStat) + "%" + EnumChatFormatting.GRAY + " chance to get a random", "§7amount of experience orbs.", "", EnumChatFormatting.GRAY + "Cost", - EnumChatFormatting.DARK_GREEN + "" + ((orbit + 1) * 70) + " Mithril Powder" + EnumChatFormatting.DARK_GREEN + String.valueOf((orbit + 1) * 70) + " Mithril Powder" ) : Lists.newArrayList( "Orbiter", "§7Level " + orbit + EnumChatFormatting.DARK_GRAY + "/80", "", "§7When mining ores, you have a", - EnumChatFormatting.GREEN + "" + orbitStat + "%" + EnumChatFormatting.GRAY + " chance to get a random", + EnumChatFormatting.GREEN + String.valueOf(orbitStat) + "%" + EnumChatFormatting.GRAY + " chance to get a random", "§7amount of experience orbs." ), 80 @@ -1323,8 +1143,7 @@ public class MiningPage extends GuiProfileViewerPage { "", EnumChatFormatting.GRAY + "Cost", EnumChatFormatting.DARK_GREEN + - "" + - GuiProfileViewer.numberFormat.format((int) Math.pow(crystallized + 2, 2.4)) + + StringUtils.formatNumber((int) Math.pow(crystallized + 2, 2.4)) + " Mithril Powder" ) : Lists.newArrayList( diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/Panorama.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/Panorama.java index af904e1d..07e72a68 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/Panorama.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/Panorama.java @@ -19,7 +19,6 @@ package io.github.moulberry.notenoughupdates.profileviewer; -import io.github.moulberry.notenoughupdates.util.TexLoc; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.ScaledResolution; @@ -30,7 +29,6 @@ import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.texture.DynamicTexture; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.util.ResourceLocation; -import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; import org.lwjgl.util.glu.Project; @@ -39,8 +37,6 @@ import java.util.HashMap; public class Panorama { - private static final TexLoc tl = new TexLoc(97, 19, Keyboard.KEY_P); - private static final TexLoc tl2 = new TexLoc(37, 80, Keyboard.KEY_L); private static final HashMap<String, ResourceLocation[]> panoramasMap = new HashMap<>(); private static ResourceLocation backgroundTexture = null; private static int lastWidth = 0; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PetsPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PetsPage.java index a56662e7..4eda3d9f 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PetsPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PetsPage.java @@ -65,15 +65,23 @@ public class PetsPage extends GuiProfileViewerPage { int guiLeft = GuiProfileViewer.getGuiLeft(); int guiTop = GuiProfileViewer.getGuiTop(); - ProfileViewer.Profile profile = GuiProfileViewer.getProfile(); - String profileId = GuiProfileViewer.getProfileId(); - JsonObject petsInfo = profile.getPetsInfo(profileId); - if (petsInfo == null) return; JsonObject petsJson = Constants.PETS; - if (petsJson == null) return; + if (petsJson == null) { + return; + } + + SkyblockProfiles.SkyblockProfile selectedProfile = getSelectedProfile(); + if (selectedProfile == null) { + return; + } + + JsonObject petsInfo = selectedProfile.getPetsInfo(); + if (petsInfo == null) { + return; + } String location = null; - JsonObject status = profile.getPlayerStatus(); + JsonObject status = GuiProfileViewer.getProfile().getPlayerStatus(); if (status != null && status.has("mode")) { location = status.get("mode").getAsString(); } @@ -98,13 +106,13 @@ public class PetsPage extends GuiProfileViewerPage { } sortedPets.sort((pet1, pet2) -> { String tier1 = pet1.get("tier").getAsString(); - String tierNum1 = GuiProfileViewer.MINION_RARITY_TO_NUM.get(tier1); + String tierNum1 = GuiProfileViewer.RARITY_TO_NUM.get(tier1); if (tierNum1 == null) return 1; int tierNum1I = Integer.parseInt(tierNum1); float exp1 = pet1.get("exp").getAsFloat(); String tier2 = pet2.get("tier").getAsString(); - String tierNum2 = GuiProfileViewer.MINION_RARITY_TO_NUM.get(tier2); + String tierNum2 = GuiProfileViewer.RARITY_TO_NUM.get(tier2); if (tierNum2 == null) return -1; int tierNum2I = Integer.parseInt(tierNum2); float exp2 = pet2.get("exp").getAsFloat(); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PlayerStats.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PlayerStats.java index 9be3eaf4..0d298a71 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PlayerStats.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PlayerStats.java @@ -27,11 +27,9 @@ import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.miscfeatures.PetInfoOverlay; import io.github.moulberry.notenoughupdates.profileviewer.info.QuiverInfo; import io.github.moulberry.notenoughupdates.util.Constants; -import io.github.moulberry.notenoughupdates.util.JsonUtils; import io.github.moulberry.notenoughupdates.util.PetLeveling; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.nbt.CompressedStreamTools; -import net.minecraft.nbt.JsonToNBT; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.EnumChatFormatting; @@ -40,17 +38,11 @@ import org.jetbrains.annotations.Nullable; import java.io.ByteArrayInputStream; import java.io.IOException; -import java.util.AbstractMap; -import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; -import java.util.LinkedHashMap; import java.util.Map; -import java.util.Objects; -import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Collectors; public class PlayerStats { @@ -296,11 +288,11 @@ public class PlayerStats { private static Stats getSetBonuses( Stats stats, - JsonObject inventoryInfo, + Map<String, JsonArray> inventoryInfo, Map<String, ProfileViewer.Level> skyblockInfo, JsonObject profile ) { - JsonArray armor = Utils.getElement(inventoryInfo, "inv_armor").getAsJsonArray(); + JsonArray armor = inventoryInfo.get("inv_armor"); Stats bonuses = new Stats(); @@ -346,7 +338,7 @@ public class PlayerStats { if (chestplateElement != null && chestplateElement.isJsonObject()) { JsonObject chestplate = chestplateElement.getAsJsonObject(); if (chestplate.get("internalname").getAsString().equals("OBSIDIAN_CHESTPLATE")) { - JsonArray inventory = Utils.getElement(inventoryInfo, "inv_contents").getAsJsonArray(); + JsonArray inventory = inventoryInfo.get("inv_contents"); for (int i = 0; i < inventory.size(); i++) { JsonElement itemElement = inventory.get(i); if (itemElement != null && itemElement.isJsonObject()) { @@ -484,7 +476,7 @@ public class PlayerStats { return new Stats(); } - String tierNum = GuiProfileViewer.MINION_RARITY_TO_NUM.get(tier); + String tierNum = GuiProfileViewer.RARITY_TO_NUM.get(tier); float exp = pet.get("exp").getAsFloat(); if (tierNum == null) return new Stats(); @@ -561,10 +553,10 @@ public class PlayerStats { return new Stats(); } - private static float getStatMult(JsonObject inventoryInfo) { + private static float getStatMult(Map<String, JsonArray> inventoryInfo) { float mult = 1f; - JsonArray armor = Utils.getElement(inventoryInfo, "inv_armor").getAsJsonArray(); + JsonArray armor = inventoryInfo.get("inv_armor"); String fullset = getFullset(armor, -1); @@ -577,8 +569,6 @@ public class PlayerStats { if (itemElement == null || !itemElement.isJsonObject()) continue; JsonObject item = itemElement.getAsJsonObject(); - String internalname = item.get("internalname").getAsString(); - String reforge = Utils.getElementAsString(Utils.getElement(item, "ExtraAttributes.modifier"), ""); if (reforge.equals("renowned")) { @@ -589,9 +579,9 @@ public class PlayerStats { return mult; } - private static void applyLimits(Stats stats, JsonObject inventoryInfo) { + private static void applyLimits(Stats stats, Map<String, JsonArray> inventoryInfo) { //>0 - JsonArray armor = Utils.getElement(inventoryInfo, "inv_armor").getAsJsonArray(); + JsonArray armor = inventoryInfo.get("inv_armor"); String fullset = getFullset(armor, 3); @@ -617,19 +607,19 @@ public class PlayerStats { } public static Stats getStats( - Map<String, ProfileViewer.Level> skyblockInfo, - JsonObject inventoryInfo, + Map<String, ProfileViewer.Level> levelingInfo, + Map<String, JsonArray> inventoryInfo, JsonObject petsInfo, JsonObject profile ) { - if (skyblockInfo == null || inventoryInfo == null || profile == null) return null; + if (levelingInfo == null || inventoryInfo == null || profile == null) return null; - JsonArray armor = Utils.getElement(inventoryInfo, "inv_armor").getAsJsonArray(); - JsonArray inventory = Utils.getElement(inventoryInfo, "inv_contents").getAsJsonArray(); - JsonArray talisman_bag = Utils.getElement(inventoryInfo, "talisman_bag").getAsJsonArray(); + JsonArray armor = inventoryInfo.get("inv_armor"); + JsonArray inventory = inventoryInfo.get("inv_contents"); + JsonArray talisman_bag = inventoryInfo.get("talisman_bag"); - Stats passiveBonuses = getPassiveBonuses(skyblockInfo, profile); - Stats hotmBonuses = getHOTMBonuses(skyblockInfo, profile); + Stats passiveBonuses = getPassiveBonuses(levelingInfo, profile); + Stats hotmBonuses = getHOTMBonuses(levelingInfo, profile); Stats armorBonuses = getItemBonuses(false, armor); Stats talismanBonuses = getItemBonuses(true, inventory, talisman_bag); @@ -643,11 +633,10 @@ public class PlayerStats { } Stats petBonus = getPetStatBonuses(petsInfo); - if (petBonus == null) return null; stats = stats.add(passiveBonuses).add(armorBonuses).add(talismanBonuses).add(petBonus).add(hotmBonuses); - stats.add(getSetBonuses(stats, inventoryInfo, skyblockInfo, profile)); + stats.add(getSetBonuses(stats, inventoryInfo, levelingInfo, profile)); stats.scaleAll(getStatMult(inventoryInfo)); @@ -661,7 +650,7 @@ public class PlayerStats { * * @param profileInfo profile information object * @return selected magical power as a String or null - * @see io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer.Profile#getProfileInformation(String) + * @see SkyblockProfiles.SkyblockProfile#getLevelingInfo() */ public static @Nullable String getSelectedMagicalPower(JsonObject profileInfo) { String abs = "accessory_bag_storage"; @@ -678,16 +667,15 @@ public class PlayerStats { return selectedPower.substring(0, 1).toUpperCase() + selectedPower.substring(1); } - public static @Nullable QuiverInfo getQuiverInfo(JsonObject inventoryInfo, JsonObject profileInfo) { + public static @Nullable QuiverInfo getQuiverInfo(Map<String, JsonArray> inventoryInfo, JsonObject profileInfo) { if (inventoryInfo == null - || !inventoryInfo.has("quiver") - || !inventoryInfo.get("quiver").isJsonArray()) { + || !inventoryInfo.containsKey("quiver")) { return null; } QuiverInfo quiverInfo = new QuiverInfo(); quiverInfo.arrows = new HashMap<>(); - JsonArray quiver = inventoryInfo.getAsJsonArray("quiver"); + JsonArray quiver = inventoryInfo.get("quiver"); for (JsonElement quiverEntry : quiver) { if (quiverEntry == null || quiverEntry.isJsonNull() || !quiverEntry.isJsonObject()) { continue; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewer.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewer.java index ea852da3..8c552146 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewer.java @@ -19,57 +19,27 @@ package io.github.moulberry.notenoughupdates.profileviewer; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.google.gson.JsonPrimitive; import io.github.moulberry.notenoughupdates.NEUManager; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; -import io.github.moulberry.notenoughupdates.profileviewer.bestiary.BestiaryData; -import io.github.moulberry.notenoughupdates.profileviewer.weight.senither.SenitherWeight; -import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.Utils; -import io.github.moulberry.notenoughupdates.util.hypixelapi.ProfileCollectionInfo; +import lombok.Getter; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompressedStreamTools; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; import net.minecraft.util.EnumChatFormatting; -import javax.annotation.Nullable; -import java.io.ByteArrayInputStream; -import java.io.IOException; import java.time.Duration; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Base64; -import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; -import java.util.regex.Pattern; public class ProfileViewer { - private static final HashMap<String, String> petRarityToNumMap = new HashMap<String, String>() { - { - put("COMMON", "0"); - put("UNCOMMON", "1"); - put("RARE", "2"); - put("EPIC", "3"); - put("LEGENDARY", "4"); - put("MYTHIC", "5"); - } - }; + @Getter private static final LinkedHashMap<String, ItemStack> skillToSkillDisplayMap = new LinkedHashMap<String, ItemStack>() { { @@ -121,6 +91,7 @@ public class ProfileViewer { Items.fishing_rod, EnumChatFormatting.AQUA + "Fishing" ); + @Getter private static final LinkedHashMap<ItemStack, List<String>> collectionCatToCollectionMap = new LinkedHashMap<ItemStack, List<String>>() { { @@ -213,6 +184,7 @@ public class ProfileViewer { ); } }; + @Getter private static final LinkedHashMap<ItemStack, List<String>> collectionCatToMinionMap = new LinkedHashMap<ItemStack, List<String>>() { { @@ -289,6 +261,7 @@ public class ProfileViewer { put(CAT_FISHING, Utils.createList("FISHING", null, null, null, null, null, "CLAY", null, null, null)); } }; + @Getter private static final LinkedHashMap<String, ItemStack> collectionToCollectionDisplayMap = new LinkedHashMap<String, ItemStack>() { { @@ -448,74 +421,20 @@ public class ProfileViewer { ); } }; - - public static final List<String> SLAYERS = Arrays.asList("zombie", "spider", "wolf", "enderman", "blaze"); - private static final AtomicBoolean updatingResourceCollection = new AtomicBoolean(false); private static JsonObject resourceCollection = null; - private final NEUManager manager; + @Getter private final HashMap<String, JsonObject> uuidToHypixelProfile = new HashMap<>(); - private final HashMap<String, Profile> uuidToProfileMap = new HashMap<>(); - + @Getter + private final NEUManager manager; + private final HashMap<String, SkyblockProfiles> uuidToSkyblockProfiles = new HashMap<>(); private final HashMap<String, String> nameToUuid = new HashMap<>(); public ProfileViewer(NEUManager manager) { this.manager = manager; } - public static LinkedHashMap<ItemStack, List<String>> getCollectionCatToMinionMap() { - return collectionCatToMinionMap; - } - - public static LinkedHashMap<String, ItemStack> getCollectionToCollectionDisplayMap() { - return collectionToCollectionDisplayMap; - } - - public static LinkedHashMap<ItemStack, List<String>> getCollectionCatToCollectionMap() { - return collectionCatToCollectionMap; - } - - public static Map<String, ItemStack> getSkillToSkillDisplayMap() { - return Collections.unmodifiableMap(skillToSkillDisplayMap); - } - - public static Level getLevel(JsonArray levelingArray, float xp, int levelCap, boolean cumulative) { - Level levelObj = new Level(); - levelObj.totalXp = xp; - levelObj.maxLevel = levelCap; - - for (int level = 0; level < levelingArray.size(); level++) { - float levelXp = levelingArray.get(level).getAsFloat(); - - if (levelXp > xp) { - if (cumulative) { - float previous = level > 0 ? levelingArray.get(level - 1).getAsFloat() : 0; - levelObj.maxXpForLevel = (levelXp - previous); - levelObj.level = 1 + level + (xp - levelXp) / levelObj.maxXpForLevel; - } else { - levelObj.maxXpForLevel = levelXp; - levelObj.level = level + xp / levelXp; - } - - if (levelObj.level > levelCap) { - levelObj.level = levelCap; - levelObj.maxed = true; - } - - return levelObj; - } else { - if (!cumulative) { - xp -= levelXp; - } - } - } - - levelObj.level = Math.min(levelingArray.size(), levelCap); - levelObj.maxed = true; - return levelObj; - } - - public static JsonObject getResourceCollectionInformation() { + public static JsonObject getOrLoadCollectionsResource() { if (resourceCollection != null) return resourceCollection; if (updatingResourceCollection.get()) return null; @@ -533,53 +452,26 @@ public class ProfileViewer { return null; } - public void getHypixelProfile(String name, Consumer<JsonObject> callback) { - String nameF = name.toLowerCase(); - manager.apiUtils - .newHypixelApiRequest("player") - .queryArgument("name", nameF) - .maxCacheAge(Duration.ofSeconds(30)) - .requestJson() - .thenAccept(jsonObject -> { - if ( - jsonObject != null && - jsonObject.has("success") && - jsonObject.get("success").getAsBoolean() && - jsonObject.get("player").isJsonObject() - ) { - nameToUuid.put(nameF, jsonObject.get("player").getAsJsonObject().get("uuid").getAsString()); - uuidToHypixelProfile.put( - jsonObject.get("player").getAsJsonObject().get("uuid").getAsString(), - jsonObject.get("player").getAsJsonObject() - ); - if (callback != null) callback.accept(jsonObject); - } else { - if (callback != null) callback.accept(null); - } - } - ); - } - public void putNameUuid(String name, String uuid) { nameToUuid.put(name, uuid); } public void getPlayerUUID(String name, Consumer<String> uuidCallback) { - String nameF = name.toLowerCase(); - if (nameToUuid.containsKey(nameF)) { - uuidCallback.accept(nameToUuid.get(nameF)); + String nameLower = name.toLowerCase(); + if (nameToUuid.containsKey(nameLower)) { + uuidCallback.accept(nameToUuid.get(nameLower)); return; } manager.apiUtils .request() - .url("https://api.mojang.com/users/profiles/minecraft/" + nameF) + .url("https://api.mojang.com/users/profiles/minecraft/" + nameLower) .requestJson() .thenAccept(jsonObject -> { if (jsonObject.has("id") && jsonObject.get("id").isJsonPrimitive() && - ((JsonPrimitive) jsonObject.get("id")).isString()) { + jsonObject.get("id").getAsJsonPrimitive().isString()) { String uuid = jsonObject.get("id").getAsString(); - nameToUuid.put(nameF, uuid); + nameToUuid.put(nameLower, uuid); uuidCallback.accept(uuid); return; } @@ -587,54 +479,60 @@ public class ProfileViewer { }); } - public void getProfileByName(String name, Consumer<Profile> callback) { - String nameF = name.toLowerCase(); + public void loadPlayerByName(String name, Consumer<SkyblockProfiles> callback) { + String nameLower = name.toLowerCase(); - if (nameToUuid.containsKey(nameF) && nameToUuid.get(nameF) == null) { + if (nameToUuid.containsKey(nameLower) && nameToUuid.get(nameLower) == null) { callback.accept(null); return; } getPlayerUUID( - nameF, + nameLower, uuid -> { + nameToUuid.put(nameLower, uuid); if (uuid == null) { - getHypixelProfile( - nameF, - jsonObject -> { - if (jsonObject != null) { - callback.accept(getProfileReset(nameToUuid.get(nameF), ignored -> {})); - } else { - callback.accept(null); - nameToUuid.put(nameF, null); - } - } - ); + callback.accept(null); } else { if (!uuidToHypixelProfile.containsKey(uuid)) { - getHypixelProfile(nameF, jsonObject -> {}); + manager.apiUtils + .newHypixelApiRequest("player") + .queryArgument("uuid", uuid) + .maxCacheAge(Duration.ofSeconds(30)) + .requestJson() + .thenAccept(playerJson -> { + if ( + playerJson != null && + playerJson.has("success") && + playerJson.get("success").getAsBoolean() && + playerJson.get("player").isJsonObject() + ) { + uuidToHypixelProfile.put(uuid, playerJson.get("player").getAsJsonObject()); + } + } + ); } - callback.accept(getProfileReset(uuid, ignored -> {})); + + callback.accept(getOrLoadSkyblockProfiles(uuid, ignored -> {})); } } ); } - public Profile getProfile(String uuid, Consumer<Profile> callback) { - Profile profile = uuidToProfileMap.computeIfAbsent(uuid, k -> new Profile(uuid)); - if (profile.skyblockProfiles != null) { + public SkyblockProfiles getOrLoadSkyblockProfiles(String uuid, Consumer<SkyblockProfiles> callback) { + if (uuidToSkyblockProfiles.containsKey(uuid)) { + uuidToSkyblockProfiles.get(uuid).resetCache(); + } + + SkyblockProfiles profile = uuidToSkyblockProfiles.computeIfAbsent(uuid, key -> new SkyblockProfiles(this, uuid)); + if (profile.getNameToProfile() != null) { callback.accept(profile); } else { - profile.getSkyblockProfiles(() -> callback.accept(profile)); + profile.getOrLoadSkyblockProfiles(() -> callback.accept(profile)); } return profile; } - public Profile getProfileReset(String uuid, Consumer<Profile> callback) { - if (uuidToProfileMap.containsKey(uuid)) uuidToProfileMap.get(uuid).resetCache(); - return getProfile(uuid, callback); - } - public static class Level { public float level = 0; @@ -643,1081 +541,4 @@ public class ProfileViewer { public int maxLevel; public float totalXp; } - - public class Profile { - - private final String uuid; - private final HashMap<String, JsonObject> profileMap = new HashMap<>(); - private final HashMap<String, JsonObject> petsInfoMap = new HashMap<>(); - private final HashMap<String, List<JsonObject>> coopProfileMap = new HashMap<>(); - private final HashMap<String, Map<String, Level>> skyblockInfoCache = new HashMap<>(); - private final HashMap<String, JsonObject> inventoryCacheMap = new HashMap<>(); - private final HashMap<String, CompletableFuture<ProfileCollectionInfo>> collectionInfoMap = new HashMap<>(); - private final HashMap<String, Double> skyBlockExperience = new HashMap<>(); - private final HashMap<String, EnumChatFormatting> skyBlockExperienceColour = new HashMap<>(); - private final List<String> profileNames = new ArrayList<>(); - private final HashMap<String, PlayerStats.Stats> stats = new HashMap<>(); - private final HashMap<String, PlayerStats.Stats> passiveStats = new HashMap<>(); - private final HashMap<String, Long> networth = new HashMap<>(); - private final HashMap<String, Integer> magicalPower = new HashMap<>(); - private final HashMap<String, SoopyNetworthData> soopyNetworth = new HashMap<>(); - private final AtomicBoolean updatingSkyblockProfilesState = new AtomicBoolean(false); - private final AtomicBoolean updatingGuildInfoState = new AtomicBoolean(false); - private final AtomicBoolean updatingPlayerStatusState = new AtomicBoolean(false); - private final AtomicBoolean updatingSoopyNetworth = new AtomicBoolean(false); - private final AtomicBoolean updatingBingoInfo = new AtomicBoolean(false); - private final Pattern COLL_TIER_PATTERN = Pattern.compile("_(-?\\d+)"); - private long soopyNetworthLeaderboardPosition = -1; //-1 = default, -2 = loading, -3 = error - private long soopyWeightLeaderboardPosition = -1; //-1 = default, -2 = loading, -3 = error - private String latestProfile = null; - private JsonArray skyblockProfiles = null; - private JsonObject guildInformation = null; - private JsonObject playerStatus = null; - private JsonObject bingoInformation = null; - private long lastPlayerInfoState = 0; - private long lastStatusInfoState = 0; - private long lastGuildInfoState = 0; - private long lastBingoInfoState = 0; - - public Profile(String uuid) { - this.uuid = uuid; - } - - /** - * Calculates the amount of Magical Power the player has using the list of accessories - * - * @return the amount of Magical Power or -1 - * @see io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer.Profile#getInventoryInfo(String) - */ - public int getMagicalPower(String profileId) { - JsonObject inventoryInfo = getInventoryInfo(profileId); - JsonObject profileInfo = getProfileInformation(profileId); - if (magicalPower.containsKey(profileId)) return magicalPower.get(profileId); - if (inventoryInfo == null || !inventoryInfo.has("talisman_bag") || - !inventoryInfo.get("talisman_bag").isJsonArray()) { - return -1; - } - - int powerAmount = ProfileViewerUtils.getMagicalPower(inventoryInfo, profileInfo); - magicalPower.put(profileId, powerAmount); - return powerAmount; - } - - public JsonObject getPlayerStatus() { - if (playerStatus != null) return playerStatus; - if (updatingPlayerStatusState.get()) return null; - - long currentTime = System.currentTimeMillis(); - if (currentTime - lastStatusInfoState < 15 * 1000) return null; - lastStatusInfoState = currentTime; - updatingPlayerStatusState.set(true); - - HashMap<String, String> args = new HashMap<>(); - args.put("uuid", "" + uuid); - manager.apiUtils - .newHypixelApiRequest("status") - .queryArgument("uuid", "" + uuid) - .requestJson() - .handle((jsonObject, ex) -> { - updatingPlayerStatusState.set(false); - - if (jsonObject != null && jsonObject.has("success") && jsonObject.get("success").getAsBoolean()) { - playerStatus = jsonObject.get("session").getAsJsonObject(); - } - return null; - }); - return null; - } - - public JsonObject getBingoInformation() { - long currentTime = System.currentTimeMillis(); - if (bingoInformation != null && currentTime - lastBingoInfoState < 15 * 1000) return bingoInformation; - if (updatingBingoInfo.get() && bingoInformation != null) return bingoInformation; - if (updatingBingoInfo.get() && bingoInformation == null) return null; - - lastBingoInfoState = currentTime; - updatingBingoInfo.set(true); - - NotEnoughUpdates.INSTANCE.manager.apiUtils - .newHypixelApiRequest("skyblock/bingo") - .queryArgument("uuid", "" + uuid) - .requestJson() - .handle(((jsonObject, throwable) -> { - updatingBingoInfo.set(false); - - if (jsonObject != null && jsonObject.has("success") && jsonObject.get("success").getAsBoolean()) { - bingoInformation = jsonObject; - } else { - bingoInformation = null; - } - return null; - })); - return bingoInformation != null ? bingoInformation : null; - } - - public class SoopyNetworthData { - private HashMap<String, Long> categoryWorth; - private Long totalWorth; - private String[] keys; - - SoopyNetworthData(JsonObject nwData) { - categoryWorth = new HashMap<>(); - - if (nwData == null || nwData.isJsonNull()) { - totalWorth = -1l; - keys = new String[0]; - return; - } - if (nwData.get("total").isJsonNull()) { - totalWorth = -1l; - keys = new String[0]; - return; - } - - totalWorth = nwData.get("total").getAsLong(); - for (Map.Entry<String, JsonElement> entry : nwData.get("categories").getAsJsonObject().entrySet()) { - if (entry.getValue().isJsonNull()) { - continue; - } - categoryWorth.put(entry.getKey(), entry.getValue().getAsLong()); - } - - //Sort keys based on category value - keys = categoryWorth - .keySet() - .stream() - .sorted(Comparator.comparingLong(k -> getCategory((String) k)).reversed()) - .toArray(String[]::new); - } - - private SoopyNetworthData setLoading() { - totalWorth = -2l; - return this; - } - - public long getTotal() { - return totalWorth; - } - - public long getCategory(String name) { - if (categoryWorth.containsKey(name)) return categoryWorth.get(name); - return 0; - } - - public String[] getCategories() { - return keys; - } - } - - /** - * -1 = default, -2 = loading, -3 = error - * >= 0 = actual position - */ - public long getSoopyNetworthLeaderboardPosition() { - if ("d0e05de76067454dbeaec6d19d886191".equals(uuid)) return 1; - return soopyNetworthLeaderboardPosition; - } - - public long getSoopyWeightLeaderboardPosition() { - if ("d0e05de76067454dbeaec6d19d886191".equals(uuid)) return 1; - return soopyWeightLeaderboardPosition; - } - - public boolean isProfileMaxSoopyWeight(ProfileViewer.Profile profile, String profileName) { - String highestProfileName = ""; - double largestProfileWeight = 0; - - for (int yIndex = 0; yIndex < profileNames.size(); yIndex++) { - String otherProfileId = profileNames.get(yIndex); - Map<String, ProfileViewer.Level> skyblockInfo = profile.getSkyblockInfo(otherProfileId); - if (skyblockInfo == null) continue; - SenitherWeight senitherWeight = new SenitherWeight(skyblockInfo); - double weightValue = senitherWeight.getTotalWeight().getRaw(); - - if (weightValue > largestProfileWeight) { - largestProfileWeight = weightValue; - highestProfileName = otherProfileId; - } - } - - return highestProfileName.equals(profileName); - } - - /** - * Returns SoopyNetworthData with total = -1 if error - * Returns null if still loading - */ - public SoopyNetworthData getSoopyNetworth(String profileName, Runnable callback) { - if (profileName == null) profileName = latestProfile; - if (soopyNetworth.get(profileName) != null) { - callback.run(); - return soopyNetworth.get(profileName); - } - - JsonArray playerInfo = getSkyblockProfiles(() -> {}); - if (playerInfo == null) - return null; //Not sure how to support the callback in these cases - if (updatingSoopyNetworth.get()) - return new SoopyNetworthData(null).setLoading(); //It shouldent really matter tho as these should never occur in /peek - updatingSoopyNetworth.set(true); - - soopyNetworthLeaderboardPosition = -2; //loading - manager.apiUtils - .request() - .url("https://soopy.dev/api/v2/leaderboard/networth/user/" + this.uuid) - .requestJson() - .handle((jsonObject, throwable) -> { - if (throwable != null) throwable.printStackTrace(); - if (throwable != null || !jsonObject.has("success") || !jsonObject.get("success").getAsBoolean() - || !jsonObject.has("data") - || !jsonObject.get("data").getAsJsonObject().has("data") - || !jsonObject.get("data").getAsJsonObject().get("data").getAsJsonObject().has("position")) { - //Something went wrong - //Set profile lb position to -3 to indicate that - soopyNetworthLeaderboardPosition = -3; //error - return null; - } - soopyNetworthLeaderboardPosition = jsonObject.get("data").getAsJsonObject().get("data").getAsJsonObject().get( - "position").getAsLong(); - return null; - }); - - soopyWeightLeaderboardPosition = -2; //loading - manager.apiUtils - .request() - .url("https://soopy.dev/api/v2/leaderboard/weight/user/" + this.uuid) - .requestJson() - .handle((jsonObject, throwable) -> { - if (throwable != null) throwable.printStackTrace(); - if (throwable != null || !jsonObject.has("success") || !jsonObject.get("success").getAsBoolean() - || !jsonObject.has("data") - || !jsonObject.get("data").getAsJsonObject().has("data") - || !jsonObject.get("data").getAsJsonObject().get("data").getAsJsonObject().has("position")) { - //Something went wrong - //Set profile lb position to -3 to indicate that - soopyWeightLeaderboardPosition = -3; //error - return null; - } - soopyWeightLeaderboardPosition = jsonObject.get("data").getAsJsonObject().get("data").getAsJsonObject().get( - "position").getAsLong(); - return null; - }); - - manager.apiUtils - .request() - .url("https://soopy.dev/api/v2/player_networth/" + this.uuid) - .method("POST") - .postData("application/json", skyblockProfiles.toString()) - .requestJson() - .handle((jsonObject, throwable) -> { - if (throwable != null) throwable.printStackTrace(); - if (throwable != null || !jsonObject.has("success") || !jsonObject.get("success").getAsBoolean()) { - //Something went wrong - //Set profile networths to null to indicate that - for (int i = 0; i < skyblockProfiles.size(); i++) { - if (!skyblockProfiles.get(i).isJsonObject()) { - return null; - } - JsonObject profile = skyblockProfiles.get(i).getAsJsonObject(); - - String cuteName = profile.get("cute_name").getAsString(); - - soopyNetworth.put(cuteName, new SoopyNetworthData(null)); - } - updatingSoopyNetworth.set(false); - callback.run(); - return null; - } - - //Success, update networth data - for (int i = 0; i < skyblockProfiles.size(); i++) { - if (!skyblockProfiles.get(i).isJsonObject()) { - return null; - } - JsonObject profile = skyblockProfiles.get(i).getAsJsonObject(); - - String cuteName = profile.get("cute_name").getAsString(); - String profileId = profile.get("profile_id").getAsString().replace("-", ""); - - SoopyNetworthData networth; - if (jsonObject.getAsJsonObject("data").get(profileId) == null) { - networth = new SoopyNetworthData(null); - } else { - networth = new SoopyNetworthData(jsonObject.getAsJsonObject("data").get(profileId).getAsJsonObject()); - } - - soopyNetworth.put(cuteName, networth); - } - - updatingSoopyNetworth.set(false); - callback.run(); - return null; - }); - return null; - } - - public EnumChatFormatting getSkyblockLevelColour(String profileName) { - if (Constants.SBLEVELS == null) return EnumChatFormatting.WHITE; - if (skyBlockExperienceColour.containsKey(profileName)) { - return skyBlockExperienceColour.get(profileName); - } - - double skyblockLevel = getSkyblockLevel(profileName); - EnumChatFormatting levelColour = EnumChatFormatting.WHITE; - - if (Constants.SBLEVELS == null || !Constants.SBLEVELS.has("sblevel_colours")) { - Utils.showOutdatedRepoNotification(); - return EnumChatFormatting.WHITE; - } - - JsonObject sblevelColours = Constants.SBLEVELS.getAsJsonObject("sblevel_colours"); - try { - for (Map.Entry<String, JsonElement> stringJsonElementEntry : sblevelColours.entrySet()) { - int nextLevelBracket = Integer.parseInt(stringJsonElementEntry.getKey()); - EnumChatFormatting valueByName = EnumChatFormatting.getValueByName(stringJsonElementEntry - .getValue() - .getAsString()); - if (skyblockLevel >= nextLevelBracket) { - levelColour = valueByName; - } - } - } catch (RuntimeException ignored) { - // catch both numberformat and getValueByName being wrong - } - skyBlockExperienceColour.put(profileName, levelColour); - return levelColour; - } - - public double getSkyblockLevel(String profileName) { - if (skyBlockExperience.containsKey(profileName)) { - return skyBlockExperience.get(profileName); - } - final JsonObject profileInfo = getProfileInformation(profileName); - int element = Utils.getElementAsInt(Utils.getElement(profileInfo, "leveling.experience"), 0); - double level = (element / 100F); - skyBlockExperience.put(profileName, level); - return level; - } - - public long getNetWorth(String profileName) { - if (profileName == null) profileName = latestProfile; - if (networth.get(profileName) != null) return networth.get(profileName); - if (getProfileInformation(profileName) == null) return -1; - if (getInventoryInfo(profileName) == null) return -1; - - JsonObject inventoryInfo = getInventoryInfo(profileName); - JsonObject profileInfo = getProfileInformation(profileName); - - HashMap<String, Long> mostExpensiveInternal = new HashMap<>(); - - long networth = 0; - for (Map.Entry<String, JsonElement> entry : inventoryInfo.entrySet()) { - if (entry.getValue().isJsonArray()) { - for (JsonElement element : entry.getValue().getAsJsonArray()) { - if (element != null && element.isJsonObject()) { - JsonObject item = element.getAsJsonObject(); - String internalname = item.get("internalname").getAsString(); - - if (manager.auctionManager.isVanillaItem(internalname)) continue; - - JsonObject bzInfo = manager.auctionManager.getBazaarInfo(internalname); - - long auctionPrice; - if (bzInfo != null && bzInfo.has("curr_sell")) { - auctionPrice = (int) bzInfo.get("curr_sell").getAsFloat(); - } else { - auctionPrice = (long) manager.auctionManager.getItemAvgBin(internalname); - if (auctionPrice <= 0) { - auctionPrice = manager.auctionManager.getLowestBin(internalname); - } - } - - try { - if (item.has("item_contents")) { - JsonArray bytesArr = item.get("item_contents").getAsJsonArray(); - byte[] bytes = new byte[bytesArr.size()]; - for (int bytesArrI = 0; bytesArrI < bytesArr.size(); bytesArrI++) { - bytes[bytesArrI] = bytesArr.get(bytesArrI).getAsByte(); - } - NBTTagCompound contents_nbt = CompressedStreamTools.readCompressed(new ByteArrayInputStream(bytes)); - NBTTagList items = contents_nbt.getTagList("i", 10); - for (int j = 0; j < items.tagCount(); j++) { - if (items.getCompoundTagAt(j).getKeySet().size() > 0) { - NBTTagCompound nbt = items.getCompoundTagAt(j).getCompoundTag("tag"); - String internalname2 = manager.getInternalnameFromNBT(nbt); - if (internalname2 != null) { - if (manager.auctionManager.isVanillaItem(internalname2)) continue; - - JsonObject bzInfo2 = manager.auctionManager.getBazaarInfo(internalname2); - - long auctionPrice2; - if (bzInfo2 != null && bzInfo2.has("curr_sell")) { - auctionPrice2 = (int) bzInfo2.get("curr_sell").getAsFloat(); - } else { - auctionPrice2 = (long) manager.auctionManager.getItemAvgBin(internalname2); - if (auctionPrice2 <= 0) { - auctionPrice2 = manager.auctionManager.getLowestBin(internalname2); - } - } - - int count2 = items.getCompoundTagAt(j).getByte("Count"); - - mostExpensiveInternal.put( - internalname2, - auctionPrice2 * count2 + mostExpensiveInternal.getOrDefault(internalname2, 0L) - ); - networth += auctionPrice2 * count2; - } - } - } - } - } catch (IOException ignored) { - } - - int count = 1; - if (element.getAsJsonObject().has("count")) { - count = element.getAsJsonObject().get("count").getAsInt(); - } - mostExpensiveInternal.put( - internalname, - auctionPrice * count + mostExpensiveInternal.getOrDefault(internalname, 0L) - ); - networth += auctionPrice * count; - } - } - } - } - if (networth == 0) return -1; - - networth = (int) (networth * 1.3f); - - JsonObject petsInfo = getPetsInfo(profileName); - if (petsInfo != null && petsInfo.has("pets")) { - if (petsInfo.get("pets").isJsonArray()) { - JsonArray pets = petsInfo.get("pets").getAsJsonArray(); - for (JsonElement element : pets) { - if (element.isJsonObject()) { - JsonObject pet = element.getAsJsonObject(); - - String petname = pet.get("type").getAsString(); - String tier = pet.get("tier").getAsString(); - String tierNum = petRarityToNumMap.get(tier); - if (tierNum != null) { - String internalname2 = petname + ";" + tierNum; - JsonObject info2 = manager.auctionManager.getItemAuctionInfo(internalname2); - if (info2 == null || !info2.has("price") || !info2.has("count")) continue; - int auctionPrice2 = (int) (info2.get("price").getAsFloat() / info2.get("count").getAsFloat()); - - networth += auctionPrice2; - } - } - } - } - } - - float bankBalance = Utils.getElementAsFloat(Utils.getElement(profileInfo, "banking.balance"), 0); - float purseBalance = Utils.getElementAsFloat(Utils.getElement(profileInfo, "coin_purse"), 0); - - networth += bankBalance + purseBalance; - - this.networth.put(profileName, networth); - return networth; - } - - public String getLatestProfile() { - return latestProfile; - } - - public JsonArray getSkyblockProfiles(Runnable runnable) { - if (skyblockProfiles != null) return skyblockProfiles; - - long currentTime = System.currentTimeMillis(); - - if (currentTime - lastPlayerInfoState < 15 * 1000 && updatingSkyblockProfilesState.get()) return null; - lastPlayerInfoState = currentTime; - updatingSkyblockProfilesState.set(true); - - manager.apiUtils - .newHypixelApiRequest("skyblock/profiles") - .queryArgument("uuid", "" + uuid) - .requestJson() - .handle((jsonObject, throwable) -> { - updatingSkyblockProfilesState.set(false); - - if (jsonObject != null && jsonObject.has("success") && jsonObject.get("success").getAsBoolean()) { - if (!jsonObject.has("profiles")) return null; - skyblockProfiles = jsonObject.get("profiles").getAsJsonArray(); - - String lastCuteName = null; - - profileNames.clear(); - - for (JsonElement profileEle : skyblockProfiles) { - JsonObject profile = profileEle.getAsJsonObject(); - - if (!profile.has("members")) continue; - JsonObject members = profile.get("members").getAsJsonObject(); - - if (members.has(uuid)) { - JsonObject member = members.get(uuid).getAsJsonObject(); - - if (member.has("coop_invitation")) { - if (!member.get("coop_invitation").getAsJsonObject().get("confirmed").getAsBoolean()) { - continue; - } - } - - String cuteName = profile.get("cute_name").getAsString(); - profileNames.add(cuteName); - if (profile.has("selected") && profile.get("selected").getAsBoolean()) { - lastCuteName = cuteName; - } - } - } - latestProfile = lastCuteName; - - if (runnable != null) runnable.run(); - } - return null; - }); - return null; - } - - public JsonObject getGuildInformation(Runnable runnable) { - if (guildInformation != null) return guildInformation; - - long currentTime = System.currentTimeMillis(); - - if (currentTime - lastGuildInfoState < 15 * 1000 && updatingGuildInfoState.get()) return null; - lastGuildInfoState = currentTime; - updatingGuildInfoState.set(true); - - manager.apiUtils - .newHypixelApiRequest("guild") - .queryArgument("player", "" + uuid) - .requestJson() - .handle((jsonObject, ex) -> { - updatingGuildInfoState.set(false); - - if (jsonObject != null && jsonObject.has("success") && jsonObject.get("success").getAsBoolean()) { - if (!jsonObject.has("guild")) return null; - - guildInformation = jsonObject.get("guild").getAsJsonObject(); - - if (runnable != null) runnable.run(); - } - return null; - }); - return null; - } - - public List<String> getProfileNames() { - return profileNames; - } - - public JsonObject getProfileInformation(String profileName) { - if (profileName == null) profileName = latestProfile; - if (profileMap.containsKey(profileName)) return profileMap.get(profileName); - JsonObject profile = getRawProfileInformation(profileName); - if (profile == null) return null; - if (!profile.has("members")) return null; - JsonObject members = profile.get("members").getAsJsonObject(); - if (!members.has(uuid)) return null; - JsonObject profileInfo = members.get(uuid).getAsJsonObject(); - if (profile.has("banking")) { - profileInfo.add("banking", profile.get("banking").getAsJsonObject()); - } - if (profile.has("game_mode")) { - profileInfo.add("game_mode", profile.get("game_mode")); - } - if (profile.has("community_upgrades")) { - profileInfo.add("community_upgrades", profile.get("community_upgrades")); - } - profileMap.put(profileName, profileInfo); - return profileInfo; - } - - public JsonObject getRawProfileInformation(String profileName) { - JsonArray playerInfo = getSkyblockProfiles(() -> {}); - if (playerInfo == null) return null; - if (profileName == null) profileName = latestProfile; - - for (JsonElement skyblockProfile : skyblockProfiles) { - if (!skyblockProfile.isJsonObject()) { - skyblockProfiles = null; - return null; - } - if (skyblockProfile.getAsJsonObject().get("cute_name").getAsString().equalsIgnoreCase(profileName)) - return skyblockProfile.getAsJsonObject(); - } - return null; - } - - public List<JsonObject> getCoopProfileInformation(String profileName) { - if (profileName == null) profileName = latestProfile; - if (coopProfileMap.containsKey(profileName)) return coopProfileMap.get(profileName); - JsonObject profile = getRawProfileInformation(profileName); - if (profile == null) return null; - - if (!profile.has("members")) return null; - JsonObject members = profile.get("members").getAsJsonObject(); - if (!members.has(uuid)) return null; - List<JsonObject> coopList = new ArrayList<>(); - for (Map.Entry<String, JsonElement> islandMember : members.entrySet()) { - if (!islandMember.getKey().equals(uuid)) { - JsonObject coopProfileInfo = islandMember.getValue().getAsJsonObject(); - coopList.add(coopProfileInfo); - } - } - coopProfileMap.put(profileName, coopList); - return coopList; - - } - - public void resetCache() { - skyblockProfiles = null; - guildInformation = null; - playerStatus = null; - stats.clear(); - passiveStats.clear(); - profileNames.clear(); - profileMap.clear(); - coopProfileMap.clear(); - petsInfoMap.clear(); - skyblockInfoCache.clear(); - inventoryCacheMap.clear(); - collectionInfoMap.clear(); - networth.clear(); - magicalPower.clear(); - skyBlockExperience.clear(); - skyBlockExperienceColour.clear(); - } - - public int getCap(JsonObject leveling, String skillName) { - JsonElement capsElement = Utils.getElement(leveling, "leveling_caps"); - return capsElement != null && capsElement.isJsonObject() && capsElement.getAsJsonObject().has(skillName) - ? capsElement.getAsJsonObject().get(skillName).getAsInt() - : 50; - } - - public int getBestiaryTiers(JsonObject profileInfo) { - int beLevel = 0; - for (ItemStack items : BestiaryData.getBestiaryLocations().keySet()) { - List<String> mobs = BestiaryData.getBestiaryLocations().get(items); - if (mobs != null) { - for (String mob : mobs) { - if (mob != null) { - float kills = Utils.getElementAsFloat(Utils.getElement(profileInfo, "bestiary.kills_" + mob), 0); - String type; - if (BestiaryData.getMobType().get(mob) != null) { - type = BestiaryData.getMobType().get(mob); - } else { - type = "MOB"; - } - JsonObject leveling = Constants.LEVELING; - ProfileViewer.Level level = null; - if (leveling != null && Utils.getElement(leveling, "bestiary." + type) != null) { - JsonArray levelingArray = Utils.getElement(leveling, "bestiary." + type).getAsJsonArray(); - int levelCap = Utils.getElementAsInt(Utils.getElement(leveling, "bestiary.caps." + type), 0); - level = ProfileViewer.getLevel(levelingArray, kills, levelCap, false); - } - - float levelNum = 0; - if (level != null) { - levelNum = level.level; - } - beLevel += (int) Math.floor(levelNum); - } - } - } - } - return beLevel; - } - - public Map<String, Level> getSkyblockInfo(String profileName) { - JsonObject profileInfo = getProfileInformation(profileName); - - if (profileInfo == null) return null; - if (profileName == null) profileName = latestProfile; - List<JsonObject> coopProfileInfo = getCoopProfileInformation(profileName); - if (skyblockInfoCache.containsKey(profileName)) return skyblockInfoCache.get(profileName); - - JsonObject leveling = Constants.LEVELING; - if (leveling == null || !leveling.has("social")) { - Utils.showOutdatedRepoNotification(); - return null; - } - - Map<String, Level> out = new HashMap<>(); - - List<String> skills = Arrays.asList( - "taming", - "mining", - "foraging", - "enchanting", - "carpentry", - "farming", - "combat", - "fishing", - "alchemy", - "runecrafting", - "social" - ); - float totalSkillXP = 0; - for (String skillName : skills) { - float skillExperience = Utils.getElementAsFloat( - Utils.getElement(profileInfo, "experience_skill_" + (skillName.equals("social") ? "social2" : skillName)), - 0 - ); - // Get the coop's social skill experience since social is a shared skill - if (skillName.equals("social")) { - for (JsonObject coopProfile : coopProfileInfo) { - skillExperience += Utils.getElementAsFloat( - Utils.getElement(coopProfile, "experience_skill_social2"), - 0 - ); - } - } - totalSkillXP += skillExperience; - - JsonArray levelingArray = Utils.getElement(leveling, "leveling_xp").getAsJsonArray(); - if (skillName.equals("runecrafting")) { - levelingArray = Utils.getElement(leveling, "runecrafting_xp").getAsJsonArray(); - } else if (skillName.equals("social")) { - levelingArray = Utils.getElement(leveling, "social").getAsJsonArray(); - } - - int maxLevel = - getCap(leveling, skillName) + - ( - skillName.equals("farming") - ? Utils.getElementAsInt(Utils.getElement(profileInfo, "jacob2.perks.farming_level_cap"), 0) - : 0 - ); - out.put(skillName, getLevel(levelingArray, skillExperience, maxLevel, false)); - } - - // Skills API disabled? - if (totalSkillXP <= 0) { - return null; - } - - out.put( - "hotm", - getLevel( - Utils.getElement(leveling, "leveling_xp").getAsJsonArray(), - Utils.getElementAsFloat(Utils.getElement(profileInfo, "mining_core.experience"), 0), - getCap(leveling, "HOTM"), - false - ) - ); - - out.put( - "catacombs", - getLevel( - Utils.getElement(leveling, "catacombs").getAsJsonArray(), - Utils.getElementAsFloat(Utils.getElement(profileInfo, "dungeons.dungeon_types.catacombs.experience"), 0), - getCap(leveling, "catacombs"), - false - ) - ); - - List<String> dungeonClasses = Arrays.asList("healer", "tank", "mage", "archer", "berserk"); - for (String className : dungeonClasses) { - float classExperience = Utils.getElementAsFloat( - Utils.getElement(profileInfo, "dungeons.player_classes." + className + ".experience"), - 0 - ); - out.put( - className, - getLevel( - Utils.getElement(leveling, "catacombs").getAsJsonArray(), - classExperience, - getCap(leveling, "catacombs"), - false - ) - ); - } - for (String slayerName : SLAYERS) { - float slayerExperience = Utils.getElementAsFloat(Utils.getElement( - profileInfo, - "slayer_bosses." + slayerName + ".xp" - ), 0); - out.put( - slayerName, - getLevel(Utils.getElement(leveling, "slayer_xp." + slayerName).getAsJsonArray(), slayerExperience, 9, true) - ); - } - - skyblockInfoCache.put(profileName, out); - - return out; - } - - public JsonObject getInventoryInfo(String profileName) { - JsonObject profileInfo = getProfileInformation(profileName); - if (profileInfo == null) return null; - if (profileName == null) profileName = latestProfile; - if (inventoryCacheMap.containsKey(profileName)) return inventoryCacheMap.get(profileName); - - String inv_armor_bytes = Utils.getElementAsString( - Utils.getElement(profileInfo, "inv_armor.data"), - "Hz8IAAAAAAAAAD9iYD9kYD9kAAMAPwI/Gw0AAAA=" - ); - String fishing_bag_bytes = Utils.getElementAsString( - Utils.getElement(profileInfo, "fishing_bag.data"), - "Hz8IAAAAAAAAAD9iYD9kYD9kAAMAPwI/Gw0AAAA=" - ); - String quiver_bytes = Utils.getElementAsString( - Utils.getElement(profileInfo, "quiver.data"), - "Hz8IAAAAAAAAAD9iYD9kYD9kAAMAPwI/Gw0AAAA=" - ); - String ender_chest_contents_bytes = Utils.getElementAsString( - Utils.getElement(profileInfo, "ender_chest_contents.data"), - "Hz8IAAAAAAAAAD9iYD9kYD9kAAMAPwI/Gw0AAAA=" - ); - //Todo clean this up - //Fake string is so for I loop works the same - String backpack_contents_json_fake = "fake should fix later"; - JsonObject backpack_contents_json = (JsonObject) Utils.getElement(profileInfo, "backpack_contents"); - JsonObject backpack_icons = (JsonObject) Utils.getElement(profileInfo, "backpack_icons"); - String personal_vault_contents_bytes = Utils.getElementAsString( - Utils.getElement(profileInfo, "personal_vault_contents.data"), - "Hz8IAAAAAAAAAD9iYD9kYD9kAAMAPwI/Gw0AAAA=" - ); - String wardrobe_contents_bytes = Utils.getElementAsString( - Utils.getElement(profileInfo, "wardrobe_contents.data"), - "Hz8IAAAAAAAAAD9iYD9kYD9kAAMAPwI/Gw0AAAA=" - ); - String potion_bag_bytes = Utils.getElementAsString( - Utils.getElement(profileInfo, "potion_bag.data"), - "Hz8IAAAAAAAAAD9iYD9kYD9kAAMAPwI/Gw0AAAA=" - ); - String inv_contents_bytes = Utils.getElementAsString( - Utils.getElement(profileInfo, "inv_contents.data"), - "Hz8IAAAAAAAAAD9iYD9kYD9kAAMAPwI/Gw0AAAA=" - ); - String talisman_bag_bytes = Utils.getElementAsString( - Utils.getElement(profileInfo, "talisman_bag.data"), - "Hz8IAAAAAAAAAD9iYD9kYD9kAAMAPwI/Gw0AAAA=" - ); - String candy_inventory_contents_bytes = Utils.getElementAsString( - Utils.getElement(profileInfo, "candy_inventory_contents.data"), - "Hz8IAAAAAAAAAD9iYD9kYD9kAAMAPwI/Gw0AAAA=" - ); - String equipment_contents_bytes = Utils.getElementAsString( - Utils.getElement(profileInfo, "equippment_contents.data"), - "Hz8IAAAAAAAAAD9iYD9kYD9kAAMAPwI/Gw0AAAA=" - ); - - JsonObject inventoryInfo = new JsonObject(); - - String[] inv_names = new String[]{ - "inv_armor", - "fishing_bag", - "quiver", - "ender_chest_contents", - "backpack_contents", - "personal_vault_contents", - "wardrobe_contents", - "potion_bag", - "inv_contents", - "talisman_bag", - "candy_inventory_contents", - "equippment_contents", - }; - String[] inv_bytes = new String[]{ - inv_armor_bytes, - fishing_bag_bytes, - quiver_bytes, - ender_chest_contents_bytes, - backpack_contents_json_fake, - personal_vault_contents_bytes, - wardrobe_contents_bytes, - potion_bag_bytes, - inv_contents_bytes, - talisman_bag_bytes, - candy_inventory_contents_bytes, - equipment_contents_bytes, - }; - for (int i = 0; i < inv_bytes.length; i++) { - try { - String bytes = inv_bytes[i]; - - JsonArray contents = new JsonArray(); - - if (inv_names[i].equals("backpack_contents")) { - JsonObject temp = getBackpackData(backpack_contents_json, backpack_icons); - contents = (JsonArray) temp.get("contents"); - inventoryInfo.add("backpack_sizes", temp.get("backpack_sizes")); - } else { - NBTTagCompound inv_contents_nbt = CompressedStreamTools.readCompressed( - new ByteArrayInputStream(Base64.getDecoder().decode(bytes)) - ); - NBTTagList items = inv_contents_nbt.getTagList("i", 10); - for (int j = 0; j < items.tagCount(); j++) { - JsonObject item = manager.getJsonFromNBTEntry(items.getCompoundTagAt(j)); - contents.add(item); - } - } - inventoryInfo.add(inv_names[i], contents); - } catch (IOException e) { - inventoryInfo.add(inv_names[i], new JsonArray()); - } - } - - inventoryCacheMap.put(profileName, inventoryInfo); - - return inventoryInfo; - } - - public JsonObject getBackpackData(JsonObject backpackContentsJson, JsonObject backpackIcons) { - if (backpackContentsJson == null || backpackIcons == null) { - JsonObject bundledReturn = new JsonObject(); - bundledReturn.add("contents", new JsonArray()); - bundledReturn.add("backpack_sizes", new JsonArray()); - - return bundledReturn; - } - - String[] backpackArray = new String[0]; - - //Create backpack array which sizes up - for (Map.Entry<String, JsonElement> backpackIcon : backpackIcons.entrySet()) { - if (backpackIcon.getValue() instanceof JsonObject) { - JsonObject backpackData = (JsonObject) backpackContentsJson.get(backpackIcon.getKey()); - String bytes = Utils.getElementAsString(backpackData.get("data"), "Hz8IAAAAAAAAAD9iYD9kYD9kAAMAPwI/Gw0AAAA="); - backpackArray = growArray(bytes, Integer.parseInt(backpackIcon.getKey()), backpackArray); - } - } - - //reduce backpack array to filter out not existent backpacks - { - String[] tempBackpackArray = new String[0]; - for (String s : backpackArray) { - if (s != null) { - String[] veryTempBackpackArray = new String[tempBackpackArray.length + 1]; - System.arraycopy(tempBackpackArray, 0, veryTempBackpackArray, 0, tempBackpackArray.length); - - veryTempBackpackArray[veryTempBackpackArray.length - 1] = s; - tempBackpackArray = veryTempBackpackArray; - } - } - backpackArray = tempBackpackArray; - } - - JsonArray backpackSizes = new JsonArray(); - JsonArray contents = new JsonArray(); - - for (String backpack : backpackArray) { - try { - NBTTagCompound inv_contents_nbt = CompressedStreamTools.readCompressed( - new ByteArrayInputStream(Base64.getDecoder().decode(backpack)) - ); - NBTTagList items = inv_contents_nbt.getTagList("i", 10); - - backpackSizes.add(new JsonPrimitive(items.tagCount())); - for (int j = 0; j < items.tagCount(); j++) { - JsonObject item = manager.getJsonFromNBTEntry(items.getCompoundTagAt(j)); - contents.add(item); - } - } catch (IOException ignored) { - } - } - - JsonObject bundledReturn = new JsonObject(); - bundledReturn.add("contents", contents); - bundledReturn.add("backpack_sizes", backpackSizes); - - return bundledReturn; - } - - public String[] growArray(String bytes, int index, String[] oldArray) { - int newSize = Math.max(index + 1, oldArray.length); - - String[] newArray = new String[newSize]; - System.arraycopy(oldArray, 0, newArray, 0, oldArray.length); - newArray[index] = bytes; - - return newArray; - } - - public JsonObject getPetsInfo(String profileName) { - JsonObject profileInfo = getProfileInformation(profileName); - if (profileInfo == null) return null; - if (petsInfoMap.containsKey(profileName)) return petsInfoMap.get(profileName); - - JsonObject petsInfo = new JsonObject(); - JsonElement petsElement = profileInfo.get("pets"); - if (petsElement != null && petsElement.isJsonArray()) { - JsonObject activePet = null; - JsonArray pets = petsElement.getAsJsonArray(); - for (int i = 0; i < pets.size(); i++) { - JsonObject pet = pets.get(i).getAsJsonObject(); - if (pet.has("active") && pet.get("active").getAsBoolean()) { - activePet = pet; - break; - } - } - petsInfo.add("active_pet", activePet); - petsInfo.add("pets", pets); - petsInfoMap.put(profileName, petsInfo); - return petsInfo; - } - return null; - } - - public ProfileCollectionInfo getCollectionInfo(String profileName) { - JsonObject rawProfileInformation = getRawProfileInformation(profileName); - if (rawProfileInformation == null) return null; - CompletableFuture<ProfileCollectionInfo> future = - collectionInfoMap.computeIfAbsent( - profileName.toLowerCase(Locale.ROOT), - ignored -> ProfileCollectionInfo.getCollectionData(rawProfileInformation, uuid) - ); - return future.getNow(null); - } - - public PlayerStats.Stats getPassiveStats(String profileName) { - if (passiveStats.get(profileName) != null) return passiveStats.get(profileName); - JsonObject profileInfo = getProfileInformation(profileName); - if (profileInfo == null) return null; - - PlayerStats.Stats passiveStats = PlayerStats.getPassiveBonuses(getSkyblockInfo(profileName), profileInfo); - - if (passiveStats != null) { - passiveStats.add(PlayerStats.getBaseStats()); - } - - this.passiveStats.put(profileName, passiveStats); - - return passiveStats; - } - - public PlayerStats.Stats getStats(String profileName) { - if (stats.get(profileName) != null) return stats.get(profileName); - JsonObject profileInfo = getProfileInformation(profileName); - if (profileInfo == null) { - return null; - } - - PlayerStats.Stats stats = PlayerStats.getStats( - getSkyblockInfo(profileName), - getInventoryInfo(profileName), - getPetsInfo(profileName), - profileInfo - ); - if (stats == null) return null; - this.stats.put(profileName, stats); - return stats; - } - - public String getUuid() { - return uuid; - } - - public @Nullable JsonObject getHypixelProfile() { - return uuidToHypixelProfile.getOrDefault(uuid, null); - } - } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewerUtils.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewerUtils.java index 66164688..5c7e4b29 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewerUtils.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewerUtils.java @@ -48,34 +48,30 @@ import java.util.stream.Collectors; public class ProfileViewerUtils { - public static JsonObject readInventoryInfo(JsonObject profileInfo, String bagName) { - JsonObject inventoryInfo = new JsonObject(); - JsonElement element = Utils.getElement(profileInfo, bagName + ".data"); + public static JsonArray readInventoryInfo(JsonObject profileInfo, String bagName) { + String bytes = Utils.getElementAsString(Utils.getElement(profileInfo, bagName + ".data"), "Hz8IAAAAAAAAAD9iYD9kYD9kAAMAPwI/Gw0AAAA="); - String bytes = Utils.getElementAsString(element, "Hz8IAAAAAAAAAD9iYD9kYD9kAAMAPwI/Gw0AAAA="); - NBTTagCompound inv_contents_nbt; + NBTTagCompound nbt; try { - inv_contents_nbt = CompressedStreamTools.readCompressed( + nbt = CompressedStreamTools.readCompressed( new ByteArrayInputStream(Base64.getDecoder().decode(bytes)) ); } catch (IOException e) { e.printStackTrace(); return null; } - NBTTagList items = inv_contents_nbt.getTagList("i", 10); + + NBTTagList items = nbt.getTagList("i", 10); JsonArray contents = new JsonArray(); NEUManager manager = NotEnoughUpdates.INSTANCE.manager; for (int j = 0; j < items.tagCount(); j++) { - JsonObject item = manager.getJsonFromNBTEntry(items.getCompoundTagAt(j)); - contents.add(item); + contents.add(manager.getJsonFromNBTEntry(items.getCompoundTagAt(j))); } - inventoryInfo.add(bagName, contents); - return inventoryInfo; + return contents; } - public static int getMagicalPower(JsonObject inventoryInfo, JsonObject profileInfo) { - JsonArray talismanBag = inventoryInfo.get("talisman_bag").getAsJsonArray(); + public static int getMagicalPower(JsonArray talismanBag, JsonObject profileInfo) { Map<String, Integer> accessories = JsonUtils.getJsonArrayAsStream(talismanBag).map(o -> { try { return JsonToNBT.getTagFromJson(o.getAsJsonObject().get("nbttag").getAsString()); @@ -153,4 +149,47 @@ public class ProfileViewerUtils { } return powerAmount; } + + public static int getLevelingCap(JsonObject leveling, String skillName) { + JsonElement capsElement = Utils.getElement(leveling, "leveling_caps"); + return capsElement != null && capsElement.isJsonObject() && capsElement.getAsJsonObject().has(skillName) + ? capsElement.getAsJsonObject().get(skillName).getAsInt() + : 50; + } + + public static ProfileViewer.Level getLevel(JsonArray levelingArray, float xp, int levelCap, boolean cumulative) { + ProfileViewer.Level levelObj = new ProfileViewer.Level(); + levelObj.totalXp = xp; + levelObj.maxLevel = levelCap; + + for (int level = 0; level < levelingArray.size(); level++) { + float levelXp = levelingArray.get(level).getAsFloat(); + + if (levelXp > xp) { + if (cumulative) { + float previous = level > 0 ? levelingArray.get(level - 1).getAsFloat() : 0; + levelObj.maxXpForLevel = (levelXp - previous); + levelObj.level = 1 + level + (xp - levelXp) / levelObj.maxXpForLevel; + } else { + levelObj.maxXpForLevel = levelXp; + levelObj.level = level + xp / levelXp; + } + + if (levelObj.level > levelCap) { + levelObj.level = levelCap; + levelObj.maxed = true; + } + + return levelObj; + } else { + if (!cumulative) { + xp -= levelXp; + } + } + } + + levelObj.level = Math.min(levelingArray.size(), levelCap); + levelObj.maxed = true; + return levelObj; + } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/SkyblockProfiles.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/SkyblockProfiles.java new file mode 100644 index 00000000..614e03f1 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/SkyblockProfiles.java @@ -0,0 +1,974 @@ +/* + * Copyright (C) 2023 NotEnoughUpdates contributors + * + * This file is part of NotEnoughUpdates. + * + * NotEnoughUpdates is free software: you can redistribute it + * and/or modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * NotEnoughUpdates is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>. + */ + +package io.github.moulberry.notenoughupdates.profileviewer; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.profileviewer.bestiary.BestiaryData; +import io.github.moulberry.notenoughupdates.profileviewer.weight.senither.SenitherWeight; +import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.Weight; +import io.github.moulberry.notenoughupdates.util.Constants; +import io.github.moulberry.notenoughupdates.util.Utils; +import io.github.moulberry.notenoughupdates.util.hypixelapi.ProfileCollectionInfo; +import lombok.Getter; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompressedStreamTools; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.EnumChatFormatting; + +import javax.annotation.Nullable; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Base64; +import java.util.Comparator; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +public class SkyblockProfiles { + private static final String defaultNbtData = "Hz8IAAAAAAAAAD9iYD9kYD9kAAMAPwI/Gw0AAAA="; + private static final String moulberryUuid = "d0e05de76067454dbeaec6d19d886191"; + private static final List<String> inventoryNames = Arrays.asList( + "inv_armor", + "fishing_bag", + "quiver", + "ender_chest_contents", + "backpack_contents", + "personal_vault_contents", + "wardrobe_contents", + "potion_bag", + "inv_contents", + "talisman_bag", + "candy_inventory_contents", + "equippment_contents" + ); + private static final List<String> skills = Arrays.asList( + "taming", + "mining", + "foraging", + "enchanting", + "carpentry", + "farming", + "combat", + "fishing", + "alchemy", + "runecrafting", + "social" + ); + private final ProfileViewer profileViewer; + private final String uuid; + private final AtomicBoolean updatingSkyblockProfilesState = new AtomicBoolean(false); + private final AtomicBoolean updatingGuildInfoState = new AtomicBoolean(false); + private final AtomicBoolean updatingPlayerStatusState = new AtomicBoolean(false); + private final AtomicBoolean updatingSoopyData = new AtomicBoolean(false); + private final AtomicBoolean updatingBingoInfo = new AtomicBoolean(false); + @Getter + private Map<String, SkyblockProfile> nameToProfile = null; + private JsonArray profilesArray; + private List<String> profileNames = new ArrayList<>(); + private String latestProfileName; + private long soopyNetworthLeaderboardPosition = -1; // -1 = default, -2 = loading, -3 = error + private long soopyWeightLeaderboardPosition = -1; // -1 = default, -2 = loading, -3 = error + private JsonObject guildInformation = null; + private JsonObject playerStatus = null; + private JsonObject bingoInformation = null; + private long lastPlayerInfoState = 0; + private long lastStatusInfoState = 0; + private long lastGuildInfoState = 0; + private long lastBingoInfoState = 0; + + public SkyblockProfiles(ProfileViewer profileViewer, String uuid) { + this.profileViewer = profileViewer; + this.uuid = uuid; + } + + public JsonObject getPlayerStatus() { + if (playerStatus != null) return playerStatus; + if (updatingPlayerStatusState.get()) return null; + + long currentTime = System.currentTimeMillis(); + if (currentTime - lastStatusInfoState < 15 * 1000) return null; + lastStatusInfoState = currentTime; + updatingPlayerStatusState.set(true); + + profileViewer.getManager().apiUtils + .newHypixelApiRequest("status") + .queryArgument("uuid", uuid) + .requestJson() + .handle((jsonObject, ex) -> { + updatingPlayerStatusState.set(false); + + if (jsonObject != null && jsonObject.has("success") && jsonObject.get("success").getAsBoolean()) { + playerStatus = jsonObject.get("session").getAsJsonObject(); + } + return null; + }); + return null; + } + + public JsonObject getBingoInformation() { + long currentTime = System.currentTimeMillis(); + if (bingoInformation != null && currentTime - lastBingoInfoState < 15 * 1000) return bingoInformation; + if (updatingBingoInfo.get() && bingoInformation != null) return bingoInformation; + if (updatingBingoInfo.get() && bingoInformation == null) return null; + + lastBingoInfoState = currentTime; + updatingBingoInfo.set(true); + + NotEnoughUpdates.INSTANCE.manager.apiUtils + .newHypixelApiRequest("skyblock/bingo") + .queryArgument("uuid", uuid) + .requestJson() + .handle(((jsonObject, throwable) -> { + updatingBingoInfo.set(false); + + if (jsonObject != null && jsonObject.has("success") && jsonObject.get("success").getAsBoolean()) { + bingoInformation = jsonObject; + } else { + bingoInformation = null; + } + return null; + })); + return bingoInformation != null ? bingoInformation : null; + } + + /** + * -1 = default, -2 = loading, -3 = error + * >= 0 = actual position + */ + public long getSoopyNetworthLeaderboardPosition() { + if (soopyNetworthLeaderboardPosition == -1) { + loadSoopyData(() -> {}); + } + return moulberryUuid.equals(uuid) ? 1 : soopyNetworthLeaderboardPosition; + } + + public long getSoopyWeightLeaderboardPosition() { + if (soopyWeightLeaderboardPosition == -1) { + loadSoopyData(() -> {}); + } + return moulberryUuid.equals(uuid) ? 1 : soopyWeightLeaderboardPosition; + } + + public boolean isProfileMaxSoopyWeight(String profileName) { + String highestProfileName = ""; + double largestProfileWeight = 0; + + for (Map.Entry<String, SkyblockProfile> profileEntry : nameToProfile.entrySet()) { + if (!profileEntry.getValue().skillsApiEnabled()) { + continue; + } + + Map<String, ProfileViewer.Level> levelingInfo = profileEntry.getValue().getLevelingInfo(); + if (levelingInfo == null) { + continue; + } + + double weightValue = new SenitherWeight(levelingInfo).getTotalWeight().getRaw(); + if (weightValue > largestProfileWeight) { + largestProfileWeight = weightValue; + highestProfileName = profileEntry.getKey(); + } + } + + return highestProfileName.equals(profileName); + } + + private void loadSoopyData(Runnable callback) { + if (updatingSoopyData.get()) { + return; + } + + updatingSoopyData.set(true); + + soopyNetworthLeaderboardPosition = -2; // Loading + profileViewer.getManager().apiUtils + .request() + .url("https://soopy.dev/api/v2/leaderboard/networth/user/" + this.uuid) + .requestJson() + .handle((jsonObject, throwable) -> { + if (jsonObject == null || !jsonObject.has("success") || !jsonObject.get("success").getAsBoolean() + || !jsonObject.has("data") + || !jsonObject.getAsJsonObject("data").has("data") + || !jsonObject.getAsJsonObject("data").getAsJsonObject("data").has("position")) { + soopyNetworthLeaderboardPosition = -3; // Error + } else { + soopyNetworthLeaderboardPosition = jsonObject.getAsJsonObject("data").getAsJsonObject("data").get( + "position").getAsLong(); + } + return null; + }); + + soopyWeightLeaderboardPosition = -2; // Loading + profileViewer.getManager().apiUtils + .request() + .url("https://soopy.dev/api/v2/leaderboard/weight/user/" + this.uuid) + .requestJson() + .handle((jsonObject, throwable) -> { + if (jsonObject == null || !jsonObject.has("success") || !jsonObject.get("success").getAsBoolean() + || !jsonObject.has("data") + || !jsonObject.getAsJsonObject("data").has("data") + || !jsonObject.getAsJsonObject("data").getAsJsonObject("data").has("position")) { + soopyWeightLeaderboardPosition = -3; // Error + } else { + soopyWeightLeaderboardPosition = jsonObject.getAsJsonObject("data").getAsJsonObject("data").get( + "position").getAsLong(); + } + return null; + }); + + profileViewer.getManager().apiUtils + .request() + .url("https://soopy.dev/api/v2/player_networth/" + this.uuid) + .method("POST") + .postData("application/json", profilesArray.toString()) + .requestJson() + .handle((jsonObject, throwable) -> { + if (jsonObject == null || !jsonObject.has("success") || !jsonObject.get("success").getAsBoolean()) { + for (Map.Entry<String, SkyblockProfile> entry : nameToProfile.entrySet()) { + entry.getValue().soopyNetworth = new SoopyNetworth(null); + } + updatingSoopyData.set(false); + callback.run(); + return null; + } + + for (Map.Entry<String, SkyblockProfile> entry : nameToProfile.entrySet()) { + String profileId = entry.getValue().getOuterProfileJson().get("profile_id").getAsString().replace("-", ""); + JsonElement curProfileData = jsonObject.getAsJsonObject("data").get(profileId); + if (curProfileData == null) { + entry.getValue().soopyNetworth = new SoopyNetworth(null); + } else { + entry.getValue().soopyNetworth = new SoopyNetworth(curProfileData.getAsJsonObject()); + } + } + + updatingSoopyData.set(false); + callback.run(); + return null; + }); + } + + public AtomicBoolean getUpdatingSkyblockProfilesState() { + return updatingSkyblockProfilesState; + } + + public @Nullable SkyblockProfile getProfile(String profileName) { + return nameToProfile == null ? null : nameToProfile.get(profileName); + } + + public SkyblockProfile getLatestProfile() { + return nameToProfile.get(latestProfileName); + } + + public String getLatestProfileName() { + return latestProfileName; + } + + public Map<String, SkyblockProfile> getOrLoadSkyblockProfiles(Runnable runnable) { + if (nameToProfile != null) { + return nameToProfile; + } + + long currentTime = System.currentTimeMillis(); + if (currentTime - lastPlayerInfoState < 15 * 1000 && updatingSkyblockProfilesState.get()) { + return null; + } + lastPlayerInfoState = currentTime; + updatingSkyblockProfilesState.set(true); + + profileViewer.getManager().apiUtils + .newHypixelApiRequest("skyblock/profiles") + .queryArgument("uuid", uuid) + .requestJson() + .handle((profilesJson, throwable) -> { + if (profilesJson != null && profilesJson.has("success") + && profilesJson.get("success").getAsBoolean() && profilesJson.has("profiles")) { + Map<String, SkyblockProfile> nameToProfile = new HashMap<>(); + String latestProfileName = null; + List<String> profileNames = new ArrayList<>(); + + // player has no skyblock profiles + if (profilesJson.get("profiles").isJsonNull()) { + updatingSkyblockProfilesState.set(false); + this.nameToProfile = new HashMap<>(); + return null; + } + + for (JsonElement profileEle : profilesJson.getAsJsonArray("profiles")) { + JsonObject profile = profileEle.getAsJsonObject(); + + if (!profile.has("members")) { + continue; + } + + JsonObject members = profile.getAsJsonObject("members"); + if (members.has(uuid)) { + JsonObject member = members.getAsJsonObject(uuid); + if (member.has("coop_invitation")) { + if (!member.getAsJsonObject("coop_invitation").get("confirmed").getAsBoolean()) { + continue; + } + } + + String profileName = profile.get("cute_name").getAsString(); + if (profile.has("selected") && profile.get("selected").getAsBoolean()) { + latestProfileName = profileName; + } + nameToProfile.put(profileName, new SkyblockProfile(profile)); + profileNames.add(profileName); + } + } + + this.nameToProfile = nameToProfile; + this.profilesArray = profilesJson.getAsJsonArray("profiles"); + this.latestProfileName = latestProfileName; + this.profileNames.addAll(profileNames); + updatingSkyblockProfilesState.set(false); + + if (runnable != null) { + runnable.run(); + } + } + return null; + }); + + return null; + } + + public JsonObject getOrLoadGuildInformation(Runnable runnable) { + if (guildInformation != null) { + return guildInformation; + } + + long currentTime = System.currentTimeMillis(); + if (currentTime - lastGuildInfoState < 15 * 1000 && updatingGuildInfoState.get()) { + return null; + } + lastGuildInfoState = currentTime; + updatingGuildInfoState.set(true); + + profileViewer.getManager().apiUtils + .newHypixelApiRequest("guild") + .queryArgument("player", uuid) + .requestJson() + .handle((jsonObject, ex) -> { + updatingGuildInfoState.set(false); + + if (jsonObject != null && jsonObject.has("success") && jsonObject.get("success").getAsBoolean()) { + if (!jsonObject.has("guild")) { + return null; + } + + guildInformation = jsonObject.getAsJsonObject("guild"); + + if (runnable != null) { + runnable.run(); + } + } + return null; + }); + + return null; + } + + public List<String> getProfileNames() { + return profileNames; + } + + public void resetCache() { + profilesArray = null; + profileNames = new ArrayList<>(); + guildInformation = null; + playerStatus = null; + nameToProfile = null; + } + + public String getUuid() { + return uuid; + } + + public @Nullable JsonObject getHypixelProfile() { + return profileViewer.getUuidToHypixelProfile().getOrDefault(uuid, null); + } + + public static class SoopyNetworth { + private final Map<String, Long> categoryToTotal = new LinkedHashMap<>(); + private long networth; + + private SoopyNetworth(JsonObject nwData) { + if (nwData == null || nwData.isJsonNull() || nwData.get("total").isJsonNull()) { + networth = -2; + return; + } + + networth = nwData.get("total").getAsLong(); + Map<String, Long> categoryToTotal = new HashMap<>(); + for (Map.Entry<String, JsonElement> entry : nwData.get("categories").getAsJsonObject().entrySet()) { + if (!entry.getValue().isJsonNull()) { + categoryToTotal.put(entry.getKey(), entry.getValue().getAsLong()); + } + } + + // Sort based on category value + categoryToTotal.entrySet().stream() + .sorted(Comparator.comparingLong(e -> -e.getValue())) + .forEachOrdered(e -> this.categoryToTotal.put(e.getKey(), e.getValue())); + } + + private SoopyNetworth asLoading() { + networth = -1; + return this; + } + + /** + * @return -2 = error, -1 = loading, >= 0 = success + */ + public long getNetworth() { + return networth; + } + + public Map<String, Long> getCategoryToTotal() { + return categoryToTotal; + } + } + + public class SkyblockProfile { + + private final JsonObject outerProfileJson; + private final String gamemode; + private Integer magicPower = null; + private Double skyblockLevel = null; + private EnumChatFormatting skyBlockExperienceColour = null; + private Map<String, JsonArray> inventoryNameToInfo = null; + private Map<String, ProfileViewer.Level> levelingInfo = null; + private JsonObject petsInfo = null; + private ProfileCollectionInfo collectionsInfo = null; + private PlayerStats.Stats stats; + private Long networth = null; + private SoopyNetworth soopyNetworth = null; + + public SkyblockProfile(JsonObject outerProfileJson) { + this.outerProfileJson = outerProfileJson; + this.gamemode = Utils.getElementAsString(outerProfileJson.get("game_mode"), null); + } + + public JsonObject getOuterProfileJson() { + return outerProfileJson; + } + + /** + * @return Profile json with UUID of {@link SkyblockProfiles#uuid} + */ + public JsonObject getProfileJson() { + return Utils.getElement(outerProfileJson, "members." + SkyblockProfiles.this.uuid).getAsJsonObject(); + } + + public @Nullable String getGamemode() { + return gamemode; + } + + /** + * Calculates the amount of Magical Power the player has using the list of accessories + * + * @return the amount of Magical Power or -1 + */ + public int getMagicalPower() { + if (magicPower != null) { + return magicPower; + } + + Map<String, JsonArray> inventoryInfo = getInventoryInfo(); + if (!inventoryInfo.containsKey("talisman_bag")) { + return -1; + } + + return magicPower = ProfileViewerUtils.getMagicalPower(inventoryInfo.get("talisman_bag"), getProfileJson()); + } + + public Map<String, JsonArray> getInventoryInfo() { + if (inventoryNameToInfo != null) { + return inventoryNameToInfo; + } + + JsonObject profileJson = getProfileJson(); + inventoryNameToInfo = new HashMap<>(); + + for (String invName : inventoryNames) { + JsonArray contents = new JsonArray(); + + if (invName.equals("backpack_contents")) { + JsonObject backpackData = getBackpackData(Utils.getElement(profileJson, "backpack_contents")); + inventoryNameToInfo.put("backpack_sizes", backpackData.getAsJsonArray("backpack_sizes")); + contents = backpackData.getAsJsonArray("contents"); + } else { + String contentBytes = Utils.getElementAsString( + Utils.getElement(profileJson, invName + ".data"), + defaultNbtData + ); + + try { + NBTTagList items = CompressedStreamTools.readCompressed( + new ByteArrayInputStream(Base64.getDecoder().decode(contentBytes)) + ).getTagList("i", 10); + for (int j = 0; j < items.tagCount(); j++) { + JsonObject item = profileViewer.getManager().getJsonFromNBTEntry(items.getCompoundTagAt(j)); + contents.add(item); + } + } catch (IOException ignored) { + } + } + + inventoryNameToInfo.put(invName, contents); + } + + return inventoryNameToInfo; + } + + private JsonObject getBackpackData(JsonElement backpackContentsJson) { + // JsonArray of JsonObjects + JsonArray contents = new JsonArray(); + JsonArray backpackSizes = new JsonArray(); + + JsonObject bundledReturn = new JsonObject(); + bundledReturn.add("contents", contents); + bundledReturn.add("backpack_sizes", backpackSizes); + + if (backpackContentsJson == null || !backpackContentsJson.isJsonObject()) { + return bundledReturn; + } + + for (Map.Entry<String, JsonElement> backpack : backpackContentsJson.getAsJsonObject().entrySet()) { + if (backpack.getValue().isJsonObject()) { + try { + String bytes = Utils.getElementAsString(backpack.getValue().getAsJsonObject().get("data"), defaultNbtData); + NBTTagList items = CompressedStreamTools.readCompressed( + new ByteArrayInputStream(Base64.getDecoder().decode(bytes)) + ).getTagList("i", 10); + + backpackSizes.add(new JsonPrimitive(items.tagCount())); + for (int j = 0; j < items.tagCount(); j++) { + contents.add(profileViewer.getManager().getJsonFromNBTEntry(items.getCompoundTagAt(j))); + } + } catch (IOException ignored) { + } + } + } + return bundledReturn; + } + + public EnumChatFormatting getSkyblockLevelColour() { + if (Constants.SBLEVELS == null || !Constants.SBLEVELS.has("sblevel_colours")) { + Utils.showOutdatedRepoNotification(); + return EnumChatFormatting.WHITE; + } + + if (skyBlockExperienceColour != null) { + return skyBlockExperienceColour; + } + + double skyblockLevel = getSkyblockLevel(); + EnumChatFormatting levelColour = EnumChatFormatting.WHITE; + + JsonObject sblevelColours = Constants.SBLEVELS.getAsJsonObject("sblevel_colours"); + try { + for (Map.Entry<String, JsonElement> stringJsonElementEntry : sblevelColours.entrySet()) { + int nextLevelBracket = Integer.parseInt(stringJsonElementEntry.getKey()); + EnumChatFormatting valueByName = EnumChatFormatting.getValueByName(stringJsonElementEntry + .getValue() + .getAsString()); + if (skyblockLevel >= nextLevelBracket) { + levelColour = valueByName; + } + } + } catch (RuntimeException ignored) { + // catch both numberformat and getValueByName being wrong + } + + return skyBlockExperienceColour = levelColour; + } + + public double getSkyblockLevel() { + if (skyblockLevel != null) { + return skyblockLevel; + } + + int element = Utils.getElementAsInt(Utils.getElement(getProfileJson(), "leveling.experience"), 0); + return skyblockLevel = (element / 100.0); + } + + public boolean skillsApiEnabled() { + return getProfileJson().has("experience_skill_combat"); + } + + /** + * NOTE: will NOT return null if skills api is disabled, use {@link SkyblockProfile#skillsApiEnabled()} instead + * This can still return null if the leveling constant is not up-to-date + * @return Map containing skills, slayers, HOTM, dungeons & dungeon classes + */ + public Map<String, ProfileViewer.Level> getLevelingInfo() { + if (levelingInfo != null) { + return levelingInfo; + } + + JsonObject leveling = Constants.LEVELING; + if (leveling == null || !leveling.has("social")) { + Utils.showOutdatedRepoNotification(); + return null; + } + + JsonObject profileJson = getProfileJson(); + Map<String, ProfileViewer.Level> out = new HashMap<>(); + + for (String skillName : skills) { + float skillExperience = 0; + if (skillName.equals("social")) { + // Get the coop's social skill experience since social is a shared skill + for (Map.Entry<String, JsonElement> memberProfileJson : outerProfileJson.entrySet()) { + skillExperience += Utils.getElementAsFloat( + Utils.getElement(memberProfileJson.getValue(), "experience_skill_social2"), + 0 + ); + } + } else { + skillExperience += Utils.getElementAsFloat( + Utils.getElement(profileJson, "experience_skill_" + skillName), + 0 + ); + } + + JsonArray levelingArray = Utils.getElement(leveling, "leveling_xp").getAsJsonArray(); + if (skillName.equals("runecrafting")) { + levelingArray = Utils.getElement(leveling, "runecrafting_xp").getAsJsonArray(); + } else if (skillName.equals("social")) { + levelingArray = Utils.getElement(leveling, "social").getAsJsonArray(); + } + + int maxLevel = ProfileViewerUtils.getLevelingCap(leveling, skillName); + if (skillName.equals("farming")) { + maxLevel += Utils.getElementAsInt(Utils.getElement(profileJson, "jacob2.perks.farming_level_cap"), 0); + } + + out.put(skillName, ProfileViewerUtils.getLevel(levelingArray, skillExperience, maxLevel, false)); + } + + out.put( + "hotm", + ProfileViewerUtils.getLevel( + Utils.getElement(leveling, "HOTM").getAsJsonArray(), + Utils.getElementAsFloat(Utils.getElement(profileJson, "mining_core.experience"), 0), + ProfileViewerUtils.getLevelingCap(leveling, "HOTM"), + false + ) + ); + + out.put( + "catacombs", + ProfileViewerUtils.getLevel( + Utils.getElement(leveling, "catacombs").getAsJsonArray(), + Utils.getElementAsFloat(Utils.getElement(profileJson, "dungeons.dungeon_types.catacombs.experience"), 0), + ProfileViewerUtils.getLevelingCap(leveling, "catacombs"), + false + ) + ); + out.put( + "cosmetic_catacombs", + ProfileViewerUtils.getLevel( + Utils.getElement(leveling, "catacombs").getAsJsonArray(), + Utils.getElementAsFloat(Utils.getElement(profileJson, "dungeons.dungeon_types.catacombs.experience"), 0), + 99, + false + ) + ); + + for (String className : Weight.DUNGEON_CLASS_NAMES) { + float classExperience = Utils.getElementAsFloat( + Utils.getElement(profileJson, "dungeons.player_classes." + className + ".experience"), + 0 + ); + out.put( + className, + ProfileViewerUtils.getLevel( + Utils.getElement(leveling, "catacombs").getAsJsonArray(), + classExperience, + ProfileViewerUtils.getLevelingCap(leveling, "catacombs"), + false + ) + ); + out.put( + "cosmetic_" + className, + ProfileViewerUtils.getLevel( + Utils.getElement(leveling, "catacombs").getAsJsonArray(), + classExperience, + 99, + false + ) + ); + } + + for (String slayerName : Weight.SLAYER_NAMES) { + float slayerExperience = Utils.getElementAsFloat(Utils.getElement( + profileJson, + "slayer_bosses." + slayerName + ".xp" + ), 0); + out.put( + slayerName, + ProfileViewerUtils.getLevel( + Utils.getElement(leveling, "slayer_xp." + slayerName).getAsJsonArray(), + slayerExperience, + 9, + true + ) + ); + } + + return levelingInfo = out; + } + + public int getBestiaryLevel() { + int beLevel = 0; + for (ItemStack items : BestiaryData.getBestiaryLocations().keySet()) { + List<String> mobs = BestiaryData.getBestiaryLocations().get(items); + if (mobs != null) { + for (String mob : mobs) { + if (mob != null) { + float kills = Utils.getElementAsFloat(Utils.getElement(getProfileJson(), "bestiary.kills_" + mob), 0); + String type; + if (BestiaryData.getMobType().get(mob) != null) { + type = BestiaryData.getMobType().get(mob); + } else { + type = "MOB"; + } + JsonObject leveling = Constants.LEVELING; + ProfileViewer.Level level = null; + if (leveling != null && Utils.getElement(leveling, "bestiary." + type) != null) { + JsonArray levelingArray = Utils.getElement(leveling, "bestiary." + type).getAsJsonArray(); + int levelCap = Utils.getElementAsInt(Utils.getElement(leveling, "bestiary.caps." + type), 0); + level = ProfileViewerUtils.getLevel(levelingArray, kills, levelCap, false); + } + + float levelNum = 0; + if (level != null) { + levelNum = level.level; + } + beLevel += (int) Math.floor(levelNum); + } + } + } + } + return beLevel; + } + + public JsonObject getPetsInfo() { + if (petsInfo != null) { + return petsInfo; + } + + JsonElement petsEle = getProfileJson().get("pets"); + if (petsEle != null && petsEle.isJsonArray()) { + JsonArray petsArr = petsEle.getAsJsonArray(); + JsonObject activePet = null; + + for (JsonElement petEle : petsEle.getAsJsonArray()) { + JsonObject petObj = petEle.getAsJsonObject(); + if (petObj.has("active") && petObj.get("active").getAsBoolean()) { + activePet = petObj; + break; + } + } + + // TODO: STOP DOING THIS AAAAA + petsInfo = new JsonObject(); + petsInfo.add("active_pet", activePet); + petsInfo.add("pets", petsArr); + return petsInfo; + } + + return null; + } + + public ProfileCollectionInfo getCollectionInfo() { + if (collectionsInfo != null) { + return collectionsInfo; + } + + // TODO: Is this supposed to be async? + return collectionsInfo = ProfileCollectionInfo.getCollectionData(outerProfileJson, uuid).getNow(null); + } + + public PlayerStats.Stats getStats() { + if (stats != null) { + return stats; + } + + if (skillsApiEnabled()) { + return null; + } + + return stats = PlayerStats.getStats( + getLevelingInfo(), + getInventoryInfo(), + getPetsInfo(), + getProfileJson() + ); + } + + public long getNetworth() { + if (networth != null) { + return networth; + } + + Map<String, JsonArray> inventoryInfo = getInventoryInfo(); + JsonObject profileInfo = getProfileJson(); + + HashMap<String, Long> mostExpensiveInternal = new HashMap<>(); + + long networth = 0; + for (Map.Entry<String, JsonArray> entry : inventoryInfo.entrySet()) { + for (JsonElement element : entry.getValue()) { + if (element != null && element.isJsonObject()) { + JsonObject item = element.getAsJsonObject(); + String internalName = item.get("internalname").getAsString(); + + if (profileViewer.getManager().auctionManager.isVanillaItem(internalName)) { + continue; + } + + JsonObject bzInfo = profileViewer.getManager().auctionManager.getBazaarInfo(internalName); + + long auctionPrice; + if (bzInfo != null && bzInfo.has("curr_sell")) { + auctionPrice = (int) bzInfo.get("curr_sell").getAsFloat(); + } else { + auctionPrice = (long) profileViewer.getManager().auctionManager.getItemAvgBin(internalName); + if (auctionPrice <= 0) { + auctionPrice = profileViewer.getManager().auctionManager.getLowestBin(internalName); + } + } + + // Backpack, cake bag, etc + try { + if (item.has("item_contents")) { + JsonArray bytesArr = item.get("item_contents").getAsJsonArray(); + byte[] bytes = new byte[bytesArr.size()]; + for (int bytesArrI = 0; bytesArrI < bytesArr.size(); bytesArrI++) { + bytes[bytesArrI] = bytesArr.get(bytesArrI).getAsByte(); + } + NBTTagCompound contents_nbt = CompressedStreamTools.readCompressed(new ByteArrayInputStream(bytes)); + NBTTagList items = contents_nbt.getTagList("i", 10); + for (int j = 0; j < items.tagCount(); j++) { + if (items.getCompoundTagAt(j).getKeySet().size() > 0) { + NBTTagCompound nbt = items.getCompoundTagAt(j).getCompoundTag("tag"); + String internalname2 = + profileViewer.getManager().createItemResolutionQuery().withItemNBT(nbt).resolveInternalName(); + if (internalname2 != null) { + if (profileViewer.getManager().auctionManager.isVanillaItem(internalname2)) continue; + + JsonObject bzInfo2 = profileViewer.getManager().auctionManager.getBazaarInfo(internalname2); + + long auctionPrice2; + if (bzInfo2 != null && bzInfo2.has("curr_sell")) { + auctionPrice2 = (int) bzInfo2.get("curr_sell").getAsFloat(); + } else { + auctionPrice2 = (long) profileViewer.getManager().auctionManager.getItemAvgBin(internalname2); + if (auctionPrice2 <= 0) { + auctionPrice2 = profileViewer.getManager().auctionManager.getLowestBin(internalname2); + } + } + + int count2 = items.getCompoundTagAt(j).getByte("Count"); + + mostExpensiveInternal.put( + internalname2, + auctionPrice2 * count2 + mostExpensiveInternal.getOrDefault(internalname2, 0L) + ); + networth += auctionPrice2 * count2; + } + } + } + } + } catch (IOException ignored) { + } + + int count = 1; + if (element.getAsJsonObject().has("count")) { + count = element.getAsJsonObject().get("count").getAsInt(); + } + mostExpensiveInternal.put( + internalName, + auctionPrice * count + mostExpensiveInternal.getOrDefault(internalName, 0L) + ); + networth += auctionPrice * count; + } + } + } + if (networth == 0) return -1; + + networth = (int) (networth * 1.3f); + + JsonObject petsInfo = getPetsInfo(); + if (petsInfo != null && petsInfo.has("pets")) { + if (petsInfo.get("pets").isJsonArray()) { + JsonArray pets = petsInfo.get("pets").getAsJsonArray(); + for (JsonElement element : pets) { + if (element.isJsonObject()) { + JsonObject pet = element.getAsJsonObject(); + + String petname = pet.get("type").getAsString(); + String tier = pet.get("tier").getAsString(); + String tierNum = GuiProfileViewer.RARITY_TO_NUM.get(tier); + if (tierNum != null) { + String internalname2 = petname + ";" + tierNum; + JsonObject info2 = profileViewer.getManager().auctionManager.getItemAuctionInfo(internalname2); + if (info2 == null || !info2.has("price") || !info2.has("count")) continue; + int auctionPrice2 = (int) (info2.get("price").getAsFloat() / info2.get("count").getAsFloat()); + + networth += auctionPrice2; + } + } + } + } + } + + float bankBalance = Utils.getElementAsFloat(Utils.getElement(profileInfo, "banking.balance"), 0); + float purseBalance = Utils.getElementAsFloat(Utils.getElement(profileInfo, "coin_purse"), 0); + networth += bankBalance + purseBalance; + + return this.networth = networth; + } + + public SoopyNetworth getSoopyNetworth(Runnable callback) { + if (soopyNetworth != null) { + return soopyNetworth; + } + + loadSoopyData(callback); + return new SoopyNetworth(null).asLoading(); + } + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryPage.java index 81b99948..17cd6787 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/bestiary/BestiaryPage.java @@ -25,6 +25,8 @@ import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewerPage; import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer; +import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewerUtils; +import io.github.moulberry.notenoughupdates.profileviewer.SkyblockProfiles; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; @@ -37,16 +39,14 @@ import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; import java.awt.*; -import java.text.NumberFormat; import java.util.ArrayList; import java.util.List; -import java.util.Locale; + +import static io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer.pv_elements; public class BestiaryPage extends GuiProfileViewerPage { - public static final ResourceLocation pv_elements = new ResourceLocation("notenoughupdates:pv_elements.png"); private static final ResourceLocation BESTIARY_TEXTURE = new ResourceLocation("notenoughupdates:pv_bestiary_tab.png"); - private static final NumberFormat numberFormat = NumberFormat.getInstance(Locale.US); private static final int XCOUNT = 7; private static final int YCOUNT = 5; private static final float XPADDING = (190 - XCOUNT * 20) / (float) (XCOUNT + 1); @@ -62,7 +62,13 @@ public class BestiaryPage extends GuiProfileViewerPage { public void drawPage(int mouseX, int mouseY, float partialTicks) { int guiLeft = GuiProfileViewer.getGuiLeft(); int guiTop = GuiProfileViewer.getGuiTop(); - JsonObject profileInfo = GuiProfileViewer.getProfile().getProfileInformation(GuiProfileViewer.getProfileId()); + + SkyblockProfiles.SkyblockProfile selectedProfile = getSelectedProfile(); + if (selectedProfile == null) { + return; + } + + JsonObject profileInfo = selectedProfile.getProfileJson(); int bestiarySize = BestiaryData.getBestiaryLocations().size(); int bestiaryXSize = (int) (350f / (bestiarySize - 1 + 0.0000001f)); @@ -117,7 +123,7 @@ public class BestiaryPage extends GuiProfileViewerPage { Color color = new Color(128, 128, 128, 255); Utils.renderAlignedString( EnumChatFormatting.RED + "Bestiary Level: ", - EnumChatFormatting.GRAY + "" + (float) GuiProfileViewer.getProfile().getBestiaryTiers(profileInfo) / 10, + EnumChatFormatting.GRAY + "" + (float) getSelectedProfile().getBestiaryLevel() / 10, guiLeft + 220, guiTop + 50, 110 @@ -181,7 +187,7 @@ public class BestiaryPage extends GuiProfileViewerPage { if (leveling != null && Utils.getElement(leveling, "bestiary." + type) != null) { JsonArray levelingArray = Utils.getElement(leveling, "bestiary." + type).getAsJsonArray(); int levelCap = Utils.getElementAsInt(Utils.getElement(leveling, "bestiary.caps." + type), 0); - level = ProfileViewer.getLevel(levelingArray, kills, levelCap, false); + level = ProfileViewerUtils.getLevel(levelingArray, kills, levelCap, false); } else { Utils.showOutdatedRepoNotification(); } @@ -197,10 +203,10 @@ public class BestiaryPage extends GuiProfileViewerPage { mobItem.getDisplayName() + " " + ((levelNum == -1) ? "?" : (int) Math.floor(levelNum)) ); tooltipToDisplay.add( - EnumChatFormatting.GRAY + "Kills: " + EnumChatFormatting.GREEN + numberFormat.format(kills) + EnumChatFormatting.GRAY + "Kills: " + EnumChatFormatting.GREEN + StringUtils.formatNumber(kills) ); tooltipToDisplay.add( - EnumChatFormatting.GRAY + "Deaths: " + EnumChatFormatting.GREEN + numberFormat.format(deaths) + EnumChatFormatting.GRAY + "Deaths: " + EnumChatFormatting.GREEN + StringUtils.formatNumber(deaths) ); if (level != null) { String progressStr; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/LevelPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/LevelPage.java index 770b295a..6ce60674 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/LevelPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/LevelPage.java @@ -20,13 +20,16 @@ package io.github.moulberry.notenoughupdates.profileviewer.level; import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.profileviewer.BasicPage; import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; -import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer; +import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewerPage; +import io.github.moulberry.notenoughupdates.profileviewer.SkyblockProfiles; import io.github.moulberry.notenoughupdates.profileviewer.level.task.CoreTaskLevel; import io.github.moulberry.notenoughupdates.profileviewer.level.task.DungeonTaskLevel; import io.github.moulberry.notenoughupdates.profileviewer.level.task.EssenceTaskLevel; import io.github.moulberry.notenoughupdates.profileviewer.level.task.EventTaskLevel; +import io.github.moulberry.notenoughupdates.profileviewer.level.task.GuiTaskLevel; import io.github.moulberry.notenoughupdates.profileviewer.level.task.MiscTaskLevel; import io.github.moulberry.notenoughupdates.profileviewer.level.task.SkillRelatedTaskLevel; import io.github.moulberry.notenoughupdates.profileviewer.level.task.SlayingTaskLevel; @@ -40,52 +43,35 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; -import java.text.NumberFormat; +import java.util.ArrayList; import java.util.Collections; import java.util.List; -public class LevelPage { +public class LevelPage extends GuiProfileViewerPage { - private final GuiProfileViewer instance; + private static final ResourceLocation pv_levels = new ResourceLocation("notenoughupdates:pv_levels.png"); private final BasicPage basicPage; - private ProfileViewer.Profile profile; - - private String profileId; - private final JsonObject constant; - - private final CoreTaskLevel coreTaskLevel; - private final DungeonTaskLevel dungeonTaskLevel; - private final EssenceTaskLevel essenceTaskLevel; - private final MiscTaskLevel miscTaskLevel; - private final SkillRelatedTaskLevel skillRelatedTaskLevel; - private final SlayingTaskLevel slayingTaskLevel; - private final StoryTaskLevel storyTaskLevel; - - private final EventTaskLevel eventTaskLevel; - - private static final ResourceLocation pv_levels = new ResourceLocation("notenoughupdates:pv_levels.png"); + private final List<GuiTaskLevel> tasks = new ArrayList<>(); public LevelPage(GuiProfileViewer instance, BasicPage basicPage) { - this.instance = instance; + super(instance); this.basicPage = basicPage; constant = Constants.SBLEVELS; - coreTaskLevel = new CoreTaskLevel(this); - dungeonTaskLevel = new DungeonTaskLevel(this); - essenceTaskLevel = new EssenceTaskLevel(this); - miscTaskLevel = new MiscTaskLevel(this); - skillRelatedTaskLevel = new SkillRelatedTaskLevel(this); - slayingTaskLevel = new SlayingTaskLevel(this); - storyTaskLevel = new StoryTaskLevel(this); - eventTaskLevel = new EventTaskLevel(this); + tasks.add(new CoreTaskLevel(this)); + tasks.add(new DungeonTaskLevel(this)); + tasks.add(new EssenceTaskLevel(this)); + tasks.add(new MiscTaskLevel(this)); + tasks.add(new SkillRelatedTaskLevel(this)); + tasks.add(new SlayingTaskLevel(this)); + tasks.add(new StoryTaskLevel(this)); + tasks.add(new EventTaskLevel(this)); } - public void drawPage(int mouseX, int mouseY) { + public void drawPage(int mouseX, int mouseY, float partialTicks) { int guiLeft = GuiProfileViewer.getGuiLeft(); int guiTop = GuiProfileViewer.getGuiTop(); - this.profile = GuiProfileViewer.getProfile(); - this.profileId = GuiProfileViewer.getProfileId(); basicPage.drawSideButtons(); @@ -95,20 +81,18 @@ public class LevelPage { } Minecraft.getMinecraft().getTextureManager().bindTexture(pv_levels); - Utils.drawTexturedRect(guiLeft, guiTop, instance.sizeX, instance.sizeY, GL11.GL_NEAREST); + Utils.drawTexturedRect(guiLeft, guiTop, getInstance().sizeX, getInstance().sizeY, GL11.GL_NEAREST); + + SkyblockProfiles.SkyblockProfile selectedProfile = getSelectedProfile(); + if (selectedProfile == null) { + return; + } - double skyblockLevel = profile.getSkyblockLevel(profileId); - JsonObject profileInfo = profile.getProfileInformation(profileId); + double skyblockLevel = selectedProfile.getSkyblockLevel(); + JsonObject profileInfo = selectedProfile.getProfileJson(); drawMainBar(skyblockLevel, mouseX, mouseY, guiLeft, guiTop); - dungeonTaskLevel.drawTask(profileInfo, mouseX, mouseY, guiLeft, guiTop); - essenceTaskLevel.drawTask(profileInfo, mouseX, mouseY, guiLeft, guiTop); - miscTaskLevel.drawTask(profileInfo, mouseX, mouseY, guiLeft, guiTop); - skillRelatedTaskLevel.drawTask(profileInfo, mouseX, mouseY, guiLeft, guiTop); - slayingTaskLevel.drawTask(profileInfo, mouseX, mouseY, guiLeft, guiTop); - storyTaskLevel.drawTask(profileInfo, mouseX, mouseY, guiLeft, guiTop); - eventTaskLevel.drawTask(profileInfo, mouseX, mouseY, guiLeft, guiTop); - coreTaskLevel.drawTask(profileInfo, mouseX, mouseY, guiLeft, guiTop); + tasks.forEach(task -> task.drawTask(profileInfo, mouseX, mouseY, guiLeft, guiTop)); } public void renderLevelBar( @@ -149,9 +133,8 @@ public class LevelPage { String levelStr; if (mouseX > x && mouseX < x + 120) { if (mouseY > y - 4 && mouseY < y + 13) { - NumberFormat numberFormat = NumberFormat.getInstance(); - String xpFormatted = numberFormat.format((int) xp); - String maxFormatted = numberFormat.format((int) max); + String xpFormatted = StringUtils.formatNumber((int) xp); + String maxFormatted = StringUtils.formatNumber((int) max); levelStr = EnumChatFormatting.GRAY + "Progress: " + EnumChatFormatting.DARK_PURPLE + (int) (experienceRequired * 100) + @@ -192,8 +175,8 @@ public class LevelPage { } public String buildLore(String name, double xpGotten, double xpGainful, boolean hasNoLimit) { - String xpGottenFormatted = NumberFormat.getInstance().format((int) xpGotten); - String xpGainfulFormatted = NumberFormat.getInstance().format((int) xpGainful); + String xpGottenFormatted = StringUtils.formatNumber((int) xpGotten); + String xpGainfulFormatted = StringUtils.formatNumber((int) xpGainful); if (xpGainful == 0 && xpGotten == 0 && !hasNoLimit) { return EnumChatFormatting.GOLD + name + ": §c§lNOT DETECTABLE!"; @@ -217,16 +200,4 @@ public class LevelPage { public JsonObject getConstant() { return constant; } - - public ProfileViewer.Profile getProfile() { - return profile; - } - - public String getProfileId() { - return profileId; - } - - public GuiProfileViewer getInstance() { - return instance; - } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/CoreTaskLevel.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/CoreTaskLevel.java index 8eb577d2..de79c0b5 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/CoreTaskLevel.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/CoreTaskLevel.java @@ -22,7 +22,9 @@ package io.github.moulberry.notenoughupdates.profileviewer.level.task; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer; +import io.github.moulberry.notenoughupdates.profileviewer.SkyblockProfiles; import io.github.moulberry.notenoughupdates.profileviewer.level.LevelPage; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.hypixelapi.ProfileCollectionInfo; @@ -34,11 +36,11 @@ import java.util.Arrays; import java.util.List; import java.util.Map; -public class CoreTaskLevel { +public class CoreTaskLevel extends GuiTaskLevel { - private final LevelPage levelPage; - - public CoreTaskLevel(LevelPage levelPage) {this.levelPage = levelPage;} + public CoreTaskLevel(LevelPage levelPage) { + super(levelPage); + } private final List<String> skills = Arrays.asList( "taming", @@ -52,13 +54,18 @@ public class CoreTaskLevel { "alchemy" ); + @Override public void drawTask(JsonObject object, int mouseX, int mouseY, int guiLeft, int guiTop) { JsonObject coreTask = levelPage.getConstant().get("core_task").getAsJsonObject(); - // skills - Map<String, ProfileViewer.Level> skyblockInfo = levelPage.getProfile().getSkyblockInfo(levelPage.getProfileId()); + SkyblockProfiles.SkyblockProfile selectedProfile = GuiProfileViewer.getSelectedProfile(); + if (selectedProfile == null) { + return; + } + + Map<String, ProfileViewer.Level> skyblockInfo = selectedProfile.getLevelingInfo(); int sbXpGainedSkillLVL = 0; - if (skyblockInfo != null) { + if (skyblockInfo != null && selectedProfile.skillsApiEnabled()) { for (String skill : skills) { ProfileViewer.Level level = skyblockInfo.get(skill); for (int i = 1; i <= level.level; i++) { @@ -108,9 +115,7 @@ public class CoreTaskLevel { JsonObject minionXp = Constants.MISC.get("minionXp").getAsJsonObject(); int collectionsXp = coreTask.get("collections_xp").getAsInt(); ProfileCollectionInfo collection; - collection = levelPage.getProfile().getCollectionInfo( - levelPage.getProfileId() - ); + collection = GuiProfileViewer.getSelectedProfile().getCollectionInfo(); if (collection != null) { sbXpCollection = 0; for (Map.Entry<String, ProfileCollectionInfo.CollectionInfo> stringCollectionInfoEntry : collection @@ -122,7 +127,7 @@ public class CoreTaskLevel { for (int tier : collection.getCraftedGenerators().values()) { for (int i = 1; i <= tier; i++) { - if (minionXp.has(i + "")) sbXpMinionTier += minionXp.get(i + "").getAsInt(); + if (minionXp.has(String.valueOf(i))) sbXpMinionTier += minionXp.get(String.valueOf(i)).getAsInt(); } } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/DungeonTaskLevel.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/DungeonTaskLevel.java index 6900cdf3..dfbfb834 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/DungeonTaskLevel.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/DungeonTaskLevel.java @@ -23,26 +23,31 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer; +import io.github.moulberry.notenoughupdates.profileviewer.SkyblockProfiles; import io.github.moulberry.notenoughupdates.profileviewer.level.LevelPage; +import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.Weight; import io.github.moulberry.notenoughupdates.util.Utils; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Map; -public class DungeonTaskLevel { +public class DungeonTaskLevel extends GuiTaskLevel { - private final LevelPage levelPage; - - public DungeonTaskLevel(LevelPage levelPage) {this.levelPage = levelPage;} + public DungeonTaskLevel(LevelPage levelPage) {super(levelPage);} + @Override public void drawTask(JsonObject object, int mouseX, int mouseY, int guiLeft, int guiTop) { JsonObject dungeonTask = levelPage.getConstant().get("dungeon_task").getAsJsonObject(); - Map<String, ProfileViewer.Level> skyblockInfo = - levelPage.getProfile().getSkyblockInfo(levelPage.getProfileId()); + SkyblockProfiles.SkyblockProfile selectedProfile = GuiProfileViewer.getSelectedProfile(); + if (selectedProfile == null) { + return; + } + + Map<String, ProfileViewer.Level> skyblockInfo = selectedProfile.getLevelingInfo(); int sbLevelGainedFloor = 0; int sbXpGainedClass = 0; @@ -60,8 +65,7 @@ public class DungeonTaskLevel { } } - List<String> dungeonClasses = Arrays.asList("healer", "tank", "mage", "archer", "berserk"); - for (String dungeonClass : dungeonClasses) { + for (String dungeonClass : Weight.DUNGEON_CLASS_NAMES) { ProfileViewer.Level level = skyblockInfo.get(dungeonClass); for (int i = 1; i <= level.level; i++) { if (i <= 50) sbXpGainedClass += dungeonTask.get("class_xp").getAsInt(); @@ -72,11 +76,10 @@ public class DungeonTaskLevel { int index = 0; for (JsonElement completeCatacomb : completeCatacombs) { int value = completeCatacomb.getAsInt(); - JsonObject normalCompletions = Utils - .getElement(object, "dungeons.dungeon_types.catacombs.tier_completions") - .getAsJsonObject(); - if (normalCompletions.has(index + "")) { - sbLevelGainedFloor = sbLevelGainedFloor + value; + JsonElement normalCompletions = Utils + .getElementOrDefault(object, "dungeons.dungeon_types.catacombs.tier_completions", null); + if (normalCompletions != null && normalCompletions.getAsJsonObject().has("" + index)) { + sbLevelGainedFloor += value; } index++; } @@ -86,8 +89,8 @@ public class DungeonTaskLevel { JsonElement masterCompletions = Utils .getElementOrDefault(object, "dungeons.dungeon_types.master_catacombs.tier_completions", null); if (masterCompletions != null) { - if (masterCompletions.getAsJsonObject().has(i + "")) { - sbLevelGainedFloor = sbLevelGainedFloor + masterCatacombs; + if (masterCompletions.getAsJsonObject().has("" + i)) { + sbLevelGainedFloor += masterCatacombs; } } } @@ -105,8 +108,6 @@ public class DungeonTaskLevel { lore.add(levelPage.buildLore("Class Level Up", sbXpGainedClass, classLevelUp, false)); lore.add(levelPage.buildLore("Complete Dungeons", sbLevelGainedFloor, completeDungeon, false)); - int totalSbXpGain = sbXpGainedLvl + sbXpGainedClass + sbLevelGainedFloor; - levelPage.renderLevelBar( "Dungeon Task", NotEnoughUpdates.INSTANCE.manager diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/EssenceTaskLevel.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/EssenceTaskLevel.java index c6df6fc1..105c7056 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/EssenceTaskLevel.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/EssenceTaskLevel.java @@ -33,12 +33,13 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -public class EssenceTaskLevel { +public class EssenceTaskLevel extends GuiTaskLevel { - private final LevelPage levelPage; - - public EssenceTaskLevel(LevelPage levelPage) {this.levelPage = levelPage;} + public EssenceTaskLevel(LevelPage levelPage) { + super(levelPage); + } + @Override public void drawTask(JsonObject object, int mouseX, int mouseY, int guiLeft, int guiTop) { List<String> lore = new ArrayList<>(); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/EventTaskLevel.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/EventTaskLevel.java index a5dc994a..ee028683 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/EventTaskLevel.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/EventTaskLevel.java @@ -29,12 +29,13 @@ import net.minecraft.item.ItemStack; import java.util.ArrayList; import java.util.List; -public class EventTaskLevel { +public class EventTaskLevel extends GuiTaskLevel { - private final LevelPage levelPage; - - public EventTaskLevel(LevelPage levelPage) {this.levelPage = levelPage;} + public EventTaskLevel(LevelPage levelPage) { + super(levelPage); + } + @Override public void drawTask(JsonObject object, int mouseX, int mouseY, int guiLeft, int guiTop) { List<String> lore = new ArrayList<>(); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/GuiTaskLevel.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/GuiTaskLevel.java new file mode 100644 index 00000000..01002485 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/GuiTaskLevel.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2023 NotEnoughUpdates contributors + * + * This file is part of NotEnoughUpdates. + * + * NotEnoughUpdates is free software: you can redistribute it + * and/or modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation, either + * version 3 of the License, or (at your option) any later version. + * + * NotEnoughUpdates is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>. + */ + +package io.github.moulberry.notenoughupdates.profileviewer.level.task; + +import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.profileviewer.level.LevelPage; + +public abstract class GuiTaskLevel { + public final LevelPage levelPage; + public GuiTaskLevel(LevelPage levelPage) {this.levelPage = levelPage;} + + public abstract void drawTask(JsonObject object, int mouseX, int mouseY, int guiLeft, int guiTop); +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/MiscTaskLevel.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/MiscTaskLevel.java index f78052f5..3ce2a34d 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/MiscTaskLevel.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/MiscTaskLevel.java @@ -23,6 +23,8 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.profileviewer.CrimsonIslePage; +import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; +import io.github.moulberry.notenoughupdates.profileviewer.SkyblockProfiles; import io.github.moulberry.notenoughupdates.profileviewer.level.LevelPage; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.init.Items; @@ -35,12 +37,13 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Stream; import java.util.stream.StreamSupport; -public class MiscTaskLevel { +public class MiscTaskLevel extends GuiTaskLevel { - private final LevelPage levelPage; - - public MiscTaskLevel(LevelPage levelPage) {this.levelPage = levelPage;} + public MiscTaskLevel(LevelPage levelPage) { + super(levelPage); + } + @Override public void drawTask(JsonObject object, int mouseX, int mouseY, int guiLeft, int guiTop) { JsonObject miscellaneousTask = levelPage.getConstant().getAsJsonObject("miscellaneous_task"); // I love doing this on god!!! @@ -113,9 +116,14 @@ public class MiscTaskLevel { } } + SkyblockProfiles.SkyblockProfile selectedProfile = GuiProfileViewer.getSelectedProfile(); + if (selectedProfile == null) { + return; + } + // community upgrades int sbXpCommunityUpgrade = 0; - JsonObject profileInformation = levelPage.getProfile().getProfileInformation(levelPage.getProfileId()); + JsonObject profileInformation = selectedProfile.getOuterProfileJson(); if (profileInformation != null && profileInformation.has("community_upgrades")) { JsonObject communityUpgrades = profileInformation.getAsJsonObject("community_upgrades"); JsonArray upgradeStates = communityUpgrades.getAsJsonArray("upgrade_states"); @@ -191,8 +199,6 @@ public class MiscTaskLevel { true, lore ); - - totalXp += sbXpAccessoryUpgrade + sbXpUnlockedPowers; } private int getRankIndex(int pointsTotal) { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/SkillRelatedTaskLevel.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/SkillRelatedTaskLevel.java index 176fc899..fd56aca1 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/SkillRelatedTaskLevel.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/SkillRelatedTaskLevel.java @@ -22,9 +22,10 @@ package io.github.moulberry.notenoughupdates.profileviewer.level.task; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer; +import io.github.moulberry.notenoughupdates.profileviewer.SkyblockProfiles; import io.github.moulberry.notenoughupdates.profileviewer.level.LevelPage; -import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; @@ -33,29 +34,32 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -public class SkillRelatedTaskLevel { +public class SkillRelatedTaskLevel extends GuiTaskLevel{ - private final LevelPage levelPage; - - public SkillRelatedTaskLevel(LevelPage levelPage) {this.levelPage = levelPage;} + public SkillRelatedTaskLevel(LevelPage levelPage) { + super(levelPage); + } + @Override public void drawTask(JsonObject object, int mouseX, int mouseY, int guiLeft, int guiTop) { - JsonObject skillRelatedTask = levelPage.getConstant().get("skill_related_task").getAsJsonObject(); - JsonObject miningObj = skillRelatedTask.get("mining").getAsJsonObject(); - - float hotmXp = Utils.getElementAsFloat(Utils.getElement(object, "mining_core.experience"), 0); - ProfileViewer.Level levelObjHotm = - ProfileViewer.getLevel( - Utils.getElementOrDefault(Constants.LEVELING, "HOTM", new JsonArray()).getAsJsonArray(), - hotmXp, - 7, - false - ); + SkyblockProfiles.SkyblockProfile selectedProfile = GuiProfileViewer.getSelectedProfile(); + if (selectedProfile == null) { + return; + } + + Map<String, ProfileViewer.Level> levelingInfo = selectedProfile.getLevelingInfo(); + if (levelingInfo == null) { + return; + } + + JsonObject skillRelatedTask = levelPage.getConstant().getAsJsonObject("skill_related_task"); + JsonObject miningObj = skillRelatedTask.getAsJsonObject("mining"); + + int hotmLevel = (int) levelingInfo.get("hotm").level; int hotmXP = 0; - float level = levelObjHotm.level; JsonArray hotmXpArray = miningObj.get("hotm_xp").getAsJsonArray(); - for (int i = 1; i <= level; i++) { + for (int i = 1; i <= hotmLevel; i++) { hotmXP += hotmXpArray.get(i - 1).getAsInt(); } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/SlayingTaskLevel.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/SlayingTaskLevel.java index 6b624a52..a8301bb6 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/SlayingTaskLevel.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/SlayingTaskLevel.java @@ -24,10 +24,12 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.profileviewer.CrimsonIslePage; -import io.github.moulberry.notenoughupdates.profileviewer.ExtraPage; import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer; +import io.github.moulberry.notenoughupdates.profileviewer.SkyblockProfiles; import io.github.moulberry.notenoughupdates.profileviewer.level.LevelPage; +import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.Weight; +import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; @@ -37,25 +39,31 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -public class SlayingTaskLevel { +public class SlayingTaskLevel extends GuiTaskLevel { - private final LevelPage levelPage; private final int[] bossLow = {25, 50, 100, 150, 250, 1000}; private final int[] thorn = {25, 50, 150, 250, 400, 1000}; private final int[] bossHigh = {50, 100, 150, 250, 500, 750, 1000}; + public SlayingTaskLevel(LevelPage levelPage) { + super(levelPage); + } - public SlayingTaskLevel(LevelPage levelPage) {this.levelPage = levelPage;} - + @Override public void drawTask(JsonObject object, int mouseX, int mouseY, int guiLeft, int guiTop) { // slayer JsonObject slayingTask = levelPage.getConstant().get("slaying_task").getAsJsonObject(); JsonArray slayerLevelUpXp = slayingTask.get("slayer_level_up_xp").getAsJsonArray(); - Map<String, ProfileViewer.Level> skyblockInfo = levelPage.getProfile().getSkyblockInfo(levelPage.getProfileId()); + SkyblockProfiles.SkyblockProfile selectedProfile = GuiProfileViewer.getSelectedProfile(); + if (selectedProfile == null) { + return; + } + + Map<String, ProfileViewer.Level> skyblockInfo = selectedProfile.getLevelingInfo(); int sbXpGainedSlayer = 0; if (skyblockInfo != null) { - for (String slayer : ProfileViewer.SLAYERS) { + for (String slayer : Weight.SLAYER_NAMES) { ProfileViewer.Level level = skyblockInfo.get(slayer); for (int i = 0; i < (int) level.level; i++) { int asInt = slayerLevelUpXp.get(i).getAsInt(); @@ -105,8 +113,8 @@ public class SlayingTaskLevel { int bossCollectionXp = 0; JsonArray dungeonCollectionXp = bossCollectionsXp.getAsJsonArray("dungeon_collection_xp"); for (int i = 1; i <= 7; i++) { - if (!allComps.containsKey(i + "")) continue; - double value = allComps.get(i + ""); + if (!allComps.containsKey(String.valueOf(i))) continue; + double value = allComps.get(String.valueOf(i)); switch (i) { case 1: case 2: @@ -154,7 +162,7 @@ public class SlayingTaskLevel { } int sbXpBestiary = 0; - int bestiaryTiers = GuiProfileViewer.getProfile().getBestiaryTiers(object); + int bestiaryTiers = GuiProfileViewer.getSelectedProfile().getBestiaryLevel(); sbXpBestiary += bestiaryTiers; sbXpBestiary = sbXpBestiary + (sbXpBestiary / 10) * 2; @@ -184,12 +192,17 @@ public class SlayingTaskLevel { int sbXpFromSlayerDefeat = 0; JsonArray defeatSlayersXp = slayingTask.get("defeat_slayers_xp").getAsJsonArray(); - for (String s : ExtraPage.slayers.keySet()) { - int maxLevel = ExtraPage.slayers.get(s); + JsonObject slayerToTier = Constants.LEVELING.getAsJsonObject("slayer_to_highest_tier"); + if (slayerToTier == null) { + Utils.showOutdatedRepoNotification(); + return; + } + for (Map.Entry<String, JsonElement> entry : slayerToTier.entrySet()) { + int maxLevel = entry.getValue().getAsInt(); for (int i = 0; i < 5; i++) { if (i >= maxLevel) break; float tier = Utils.getElementAsFloat( - Utils.getElement(object, "slayer_bosses." + s + ".boss_kills_tier_" + i), + Utils.getElement(object, "slayer_bosses." + entry.getKey() + ".boss_kills_tier_" + i), 0 ); if (tier != 0) { @@ -247,7 +260,6 @@ public class SlayingTaskLevel { true, lore ); - totalXp += sbXpBestiary; } private int loopThroughCollection(int[] array, double value, JsonArray jsonArray) { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/StoryTaskLevel.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/StoryTaskLevel.java index 3846db5f..1cda3e01 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/StoryTaskLevel.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/level/task/StoryTaskLevel.java @@ -29,12 +29,13 @@ import net.minecraft.item.ItemStack; import java.util.ArrayList; import java.util.List; -public class StoryTaskLevel { +public class StoryTaskLevel extends GuiTaskLevel { - private final LevelPage levelPage; - - public StoryTaskLevel(LevelPage levelPage) {this.levelPage = levelPage;} + public StoryTaskLevel(LevelPage levelPage) { + super(levelPage); + } + @Override public void drawTask(JsonObject object, int mouseX, int mouseY, int guiLeft, int guiTop) { JsonObject storyTask = levelPage.getConstant().getAsJsonObject("story_task"); JsonArray storyTaskNames = storyTask.getAsJsonArray("complete_objectives_names"); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/trophy/TrophyFishPage.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/trophy/TrophyFishPage.java index f4378926..9aaf65a4 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/trophy/TrophyFishPage.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/trophy/TrophyFishPage.java @@ -23,11 +23,12 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewerPage; +import io.github.moulberry.notenoughupdates.profileviewer.SkyblockProfiles; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.RenderHelper; import net.minecraft.init.Items; @@ -38,7 +39,6 @@ import org.apache.commons.lang3.text.WordUtils; import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.opengl.GL11; -import java.text.NumberFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; @@ -46,9 +46,10 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import static io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer.pv_elements; + public class TrophyFishPage extends GuiProfileViewerPage { - public static final ResourceLocation pv_elements = new ResourceLocation("notenoughupdates:pv_elements.png"); private static final Map<String, EnumChatFormatting> internalTrophyFish = new HashMap<String, EnumChatFormatting>() { { put("gusher", EnumChatFormatting.WHITE); @@ -122,7 +123,6 @@ public class TrophyFishPage extends GuiProfileViewerPage { } }; private static final ResourceLocation TROPHY_FISH_TEXTURE = new ResourceLocation("notenoughupdates:pv_trophy_fish_tab.png"); - private static final NumberFormat NUMBER_FORMAT = NumberFormat.getInstance(Locale.US); private static final String checkX = "§c✖"; private static final String check = "§a✔"; private final Map<String, Integer> total = new HashMap<>(); @@ -141,19 +141,20 @@ public class TrophyFishPage extends GuiProfileViewerPage { trophyFishList.clear(); - JsonObject profileInformation = GuiProfileViewer.getProfile().getProfileInformation(GuiProfileViewer.getProfileId()); + SkyblockProfiles.SkyblockProfile selectedProfile = getSelectedProfile(); + if (selectedProfile == null) { + return; + } + + JsonObject profileInformation = selectedProfile.getProfileJson(); if (profileInformation == null || !profileInformation.has("trophy_fish")) { Utils.drawStringCentered(EnumChatFormatting.RED + "No data found", guiLeft + 431 / 2f, guiTop + 101, true, 0); return; } - JsonObject trophyObject = profileInformation.get("trophy_fish").getAsJsonObject(); + JsonObject trophyObject = profileInformation.getAsJsonObject("trophy_fish"); loadTrophyInformation(trophyObject); - ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); - int width = scaledResolution.getScaledWidth(); - int height = scaledResolution.getScaledHeight(); - Minecraft.getMinecraft().getTextureManager().bindTexture(TROPHY_FISH_TEXTURE); Utils.drawTexturedRect(guiLeft, guiTop, 431, 202, GL11.GL_NEAREST); @@ -161,7 +162,7 @@ public class TrophyFishPage extends GuiProfileViewerPage { GlStateManager.disableLighting(); RenderHelper.enableGUIStandardItemLighting(); - JsonObject stats = profileInformation.get("stats").getAsJsonObject(); + JsonObject stats = profileInformation.getAsJsonObject("stats"); int thunderKills = 0; if (stats.has("kills_thunder")) { @@ -340,7 +341,7 @@ public class TrophyFishPage extends GuiProfileViewerPage { if (trophyFishList.get(name) != null) { tooltip.add(" "); tooltip.add(EnumChatFormatting.GRAY + "Total: " + EnumChatFormatting.GOLD + - NUMBER_FORMAT.format(trophyFishList.get(name).getTotal())); + StringUtils.formatNumber(trophyFishList.get(name).getTotal())); } return tooltip; } @@ -356,7 +357,7 @@ public class TrophyFishPage extends GuiProfileViewerPage { } if (trophyFishRarityIntegerMap.containsKey(rarity)) { - return color + name + ": " + EnumChatFormatting.GOLD + NUMBER_FORMAT.format(trophyFishRarityIntegerMap.get(rarity)); + return color + name + ": " + EnumChatFormatting.GOLD + StringUtils.formatNumber(trophyFishRarityIntegerMap.get(rarity)); } else { return color + name + ": " + checkX; } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/lily/LilySkillsWeight.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/lily/LilySkillsWeight.java index f47032a4..6935606e 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/lily/LilySkillsWeight.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/lily/LilySkillsWeight.java @@ -21,6 +21,7 @@ package io.github.moulberry.notenoughupdates.profileviewer.weight.lily; import com.google.gson.JsonArray; import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer; +import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewerUtils; import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.SkillsWeight; import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.WeightStruct; import io.github.moulberry.notenoughupdates.util.Constants; @@ -41,7 +42,7 @@ public class LilySkillsWeight extends SkillsWeight { double skillAverage = 0; for (String skill : SKILL_NAMES) { skillAverage += - (int) ProfileViewer.getLevel( + (int) ProfileViewerUtils.getLevel( Utils.getElement(Constants.LEVELING, "leveling_xp").getAsJsonArray(), player.get(skill).totalXp, 60, @@ -52,7 +53,7 @@ public class LilySkillsWeight extends SkillsWeight { skillAverage /= SKILL_NAMES.size(); float currentExp = player.get(skillName).totalXp; - int currentLevel = (int) ProfileViewer.getLevel( + int currentLevel = (int) ProfileViewerUtils.getLevel( Utils.getElement(Constants.LEVELING, "leveling_xp").getAsJsonArray(), currentExp, 60, diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/senither/SenitherSkillsWeight.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/senither/SenitherSkillsWeight.java index 7ac717f7..b97c3624 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/senither/SenitherSkillsWeight.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/senither/SenitherSkillsWeight.java @@ -21,6 +21,7 @@ package io.github.moulberry.notenoughupdates.profileviewer.weight.senither; import com.google.gson.JsonArray; import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer; +import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewerUtils; import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.SkillsWeight; import io.github.moulberry.notenoughupdates.profileviewer.weight.weight.WeightStruct; import io.github.moulberry.notenoughupdates.util.Constants; @@ -46,7 +47,7 @@ public class SenitherSkillsWeight extends SkillsWeight { int maxLevel = skillName.equals("farming") ? 60 : Utils.getElementAsInt(Utils.getElement(Constants.LEVELING, "leveling_caps." + skillName), 50); - double level = ProfileViewer.getLevel( + double level = ProfileViewerUtils.getLevel( Utils.getElement(Constants.LEVELING, "leveling_xp").getAsJsonArray(), currentSkillXp, maxLevel, diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/weight/Weight.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/weight/Weight.java index 129f53fc..83095e96 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/weight/Weight.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/weight/weight/Weight.java @@ -34,8 +34,8 @@ public abstract class Weight { "fishing", "alchemy" ); - protected static final List<String> SLAYER_NAMES = Arrays.asList("wolf", "zombie", "spider", "enderman", "blaze"); - protected static final List<String> DUNGEON_CLASS_NAMES = Arrays.asList("healer", "mage", "berserk", "archer", "tank"); + public static final List<String> SLAYER_NAMES = Arrays.asList("wolf", "zombie", "spider", "enderman", "blaze"); + public static final List<String> DUNGEON_CLASS_NAMES = Arrays.asList("healer", "mage", "berserk", "archer", "tank"); protected final SlayerWeight slayerWeight; protected final SkillsWeight skillsWeight; protected final DungeonsWeight dungeonsWeight; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/recipes/EssenceUpgrades.java b/src/main/java/io/github/moulberry/notenoughupdates/recipes/EssenceUpgrades.java index 15b3c832..9c2f0e75 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/EssenceUpgrades.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/EssenceUpgrades.java @@ -229,7 +229,7 @@ public class EssenceUpgrades implements NeuRecipe { if (essenceItemStack != null) { essenceItemStack = essenceItemStack.copy(); essenceItemStack.setStackDisplayName( - EnumChatFormatting.AQUA + NumberFormat.getInstance().format(tierUpgrade.getEssenceRequired()) + " " + EnumChatFormatting.DARK_GRAY + + EnumChatFormatting.AQUA + StringUtils.formatNumber(tierUpgrade.getEssenceRequired()) + " " + EnumChatFormatting.DARK_GRAY + tierUpgrade.getEssenceType() + " Essence"); essenceItemStack.getTagCompound().setInteger( diff --git a/src/main/java/io/github/moulberry/notenoughupdates/recipes/MobLootRecipe.java b/src/main/java/io/github/moulberry/notenoughupdates/recipes/MobLootRecipe.java index 0e580cb8..3b9daaf2 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/recipes/MobLootRecipe.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/recipes/MobLootRecipe.java @@ -24,6 +24,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import io.github.moulberry.notenoughupdates.NEUManager; +import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.miscfeatures.entityviewer.EntityViewer; import io.github.moulberry.notenoughupdates.miscgui.GuiItemRecipe; import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; @@ -87,7 +88,7 @@ public class MobLootRecipe implements NeuRecipe { return chance; } - String format = GuiProfileViewer.numberFormat.format(chanceIn); + String format = StringUtils.formatNumber(chanceIn); return "1/" + format + " (" + chance + ")"; } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/ItemUtils.java b/src/main/java/io/github/moulberry/notenoughupdates/util/ItemUtils.java index aaae0031..d10ae721 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/ItemUtils.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/ItemUtils.java @@ -25,6 +25,7 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.listener.ItemTooltipListener; import io.github.moulberry.notenoughupdates.miscfeatures.PetInfoOverlay; import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; @@ -81,7 +82,7 @@ public class ItemUtils { "ewogICJ0aW1lc3RhbXAiIDogMTYzNTk1NzQ4ODQxNywKICAicHJvZmlsZUlkIiA6ICJmNThkZWJkNTlmNTA0MjIyOGY2MDIyMjExZDRjMTQwYyIsCiAgInByb2ZpbGVOYW1lIiA6ICJ1bnZlbnRpdmV0YWxlbnQiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2I5NTFmZWQ2YTdiMmNiYzIwMzY5MTZkZWM3YTQ2YzRhNTY0ODE1NjRkMTRmOTQ1YjZlYmMwMzM4Mjc2NmQzYiIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9"; } ItemStack skull = Utils.createSkull( - "§r§6" + NumberFormat.getInstance().format(coinAmount) + " Coins", + "§r§6" + StringUtils.formatNumber(coinAmount) + " Coins", uuid, texture ); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/ProfileApiSyncer.java b/src/main/java/io/github/moulberry/notenoughupdates/util/ProfileApiSyncer.java index b90e8087..67ed7c7b 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/ProfileApiSyncer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/ProfileApiSyncer.java @@ -20,7 +20,7 @@ package io.github.moulberry.notenoughupdates.util; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; -import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer; +import io.github.moulberry.notenoughupdates.profileviewer.SkyblockProfiles; import net.minecraft.client.Minecraft; import java.util.HashMap; @@ -31,7 +31,7 @@ public class ProfileApiSyncer { private final HashMap<String, Long> resyncTimes = new HashMap<>(); private final HashMap<String, Runnable> syncingCallbacks = new HashMap<>(); - private final HashMap<String, Consumer<ProfileViewer.Profile>> finishSyncCallbacks = new HashMap<>(); + private final HashMap<String, Consumer<SkyblockProfiles>> finishSyncCallbacks = new HashMap<>(); private long lastResync; public static ProfileApiSyncer getInstance() { @@ -50,7 +50,7 @@ public class ProfileApiSyncer { String id, long timeBetween, Runnable syncingCallback, - Consumer<ProfileViewer.Profile> finishSyncCallback + Consumer<SkyblockProfiles> finishSyncCallback ) { resyncTimes.put(id, timeBetween); syncingCallbacks.put(id, syncingCallback); @@ -89,8 +89,8 @@ public class ProfileApiSyncer { if (Minecraft.getMinecraft().thePlayer == null) return; String uuid = Minecraft.getMinecraft().thePlayer.getUniqueID().toString().replace("-", ""); - NotEnoughUpdates.profileViewer.getProfileReset(uuid, (profile) -> { - for (Consumer<ProfileViewer.Profile> c : finishSyncCallbacks.values()) c.accept(profile); + NotEnoughUpdates.profileViewer.getOrLoadSkyblockProfiles(uuid, (profile) -> { + for (Consumer<SkyblockProfiles> c : finishSyncCallbacks.values()) c.accept(profile); finishSyncCallbacks.clear(); }); } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/XPInformation.java b/src/main/java/io/github/moulberry/notenoughupdates/util/XPInformation.java index 94bfbee8..c4c85597 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/XPInformation.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/XPInformation.java @@ -25,6 +25,7 @@ import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.autosubscribe.NEUAutoSubscribe; import io.github.moulberry.notenoughupdates.core.util.StringUtils; import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer; +import io.github.moulberry.notenoughupdates.profileviewer.SkyblockProfiles; import net.minecraftforge.client.event.ClientChatReceivedEvent; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @@ -230,8 +231,8 @@ public class XPInformation { "runecrafting" }; - private void onApiUpdated(ProfileViewer.Profile profile) { - Map<String, ProfileViewer.Level> skyblockInfo = profile.getSkyblockInfo(null); + private void onApiUpdated(SkyblockProfiles profile) { + Map<String, ProfileViewer.Level> skyblockInfo = profile.getLatestProfile().getLevelingInfo(); for (String skill : skills) { SkillInfo info = new SkillInfo(); diff --git a/src/main/kotlin/io/github/moulberry/notenoughupdates/commands/misc/PeekCommand.kt b/src/main/kotlin/io/github/moulberry/notenoughupdates/commands/misc/PeekCommand.kt index 61fa6029..28d08048 100644 --- a/src/main/kotlin/io/github/moulberry/notenoughupdates/commands/misc/PeekCommand.kt +++ b/src/main/kotlin/io/github/moulberry/notenoughupdates/commands/misc/PeekCommand.kt @@ -23,7 +23,7 @@ import com.mojang.brigadier.arguments.StringArgumentType.string import io.github.moulberry.notenoughupdates.NotEnoughUpdates import io.github.moulberry.notenoughupdates.autosubscribe.NEUAutoSubscribe import io.github.moulberry.notenoughupdates.events.RegisterBrigadierCommandEvent -import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer +import io.github.moulberry.notenoughupdates.profileviewer.SkyblockProfiles import io.github.moulberry.notenoughupdates.util.Utils import io.github.moulberry.notenoughupdates.util.brigadier.* import net.minecraft.client.Minecraft @@ -50,9 +50,9 @@ class PeekCommand { deleteReply("$YELLOW[PEEK] Getting player information...") - NotEnoughUpdates.profileViewer.getProfileByName( + NotEnoughUpdates.profileViewer.loadPlayerByName( name - ) { profile: ProfileViewer.Profile? -> + ) { profile: SkyblockProfiles? -> if (profile == null) { deleteReply("$RED[PEEK] Unknown player or the Hypixel API is down.") } else { @@ -72,29 +72,28 @@ class PeekCommand { return } val g = GRAY.toString() - val profileInfo = profile.getProfileInformation(null) + val profileInfo = profile.latestProfile.profileJson if (profileInfo == null) { future = executor.schedule(this, 200, TimeUnit.MILLISECONDS) return } var overallScore = 0f val isMe = name.equals("moulberry", ignoreCase = true) - val stats = profile.getStats(null) + val stats = profile.latestProfile.stats if (stats == null) { future = executor.schedule(this, 200, TimeUnit.MILLISECONDS) return } - val skyblockInfo = profile.getSkyblockInfo(null) + val skyblockInfo = profile.latestProfile.levelingInfo if (NotEnoughUpdates.INSTANCE.config.profileViewer.useSoopyNetworth) { deleteReply("$YELLOW[PEEK] Getting the player's Skyblock networth...") val countDownLatch = CountDownLatch(1) - profile.getSoopyNetworth(null, Runnable { countDownLatch.countDown() }) - try { //Wait for async network request + profile.latestProfile.getSoopyNetworth { countDownLatch.countDown() } + try { // Wait for async network request countDownLatch.await(10, TimeUnit.SECONDS) - } catch (e: InterruptedException) { - } + } catch (_: InterruptedException) {} - //Now it's waited for network request the data should be cached (accessed in nw section) + // Now it's waited for network request the data should be cached (accessed in nw section) } deleteReply( "$GREEN $STRIKETHROUGH-=-$RESET$GREEN ${ @@ -104,7 +103,7 @@ class PeekCommand { ) }'s Info $STRIKETHROUGH-=-" ) - if (skyblockInfo == null) { + if (skyblockInfo == null || !profile.latestProfile.skillsApiEnabled()) { Utils.addChatMessage(YELLOW.toString() + "Skills API disabled!") } else { var totalSkillLVL = 0f @@ -216,11 +215,10 @@ class PeekCommand { ), 0f ) val networth = if (NotEnoughUpdates.INSTANCE.config.profileViewer.useSoopyNetworth) { - val nwData = - profile.getSoopyNetworth(null, Runnable {}) - nwData?.total ?: -2L + val nwData = profile.latestProfile.getSoopyNetworth {} + nwData?.networth ?: -2L } else { - profile.getNetWorth(null) + profile.latestProfile.networth } val money = Math.max(bankBalance + purseBalance, networth.toFloat()) @@ -245,16 +243,14 @@ class PeekCommand { val activePet = Utils.getElementAsString( Utils.getElement( - profile.getPetsInfo( - null - ), "active_pet.type" + profile.latestProfile.petsInfo, "active_pet.type" ), "None Active" ) val activePetTier = Utils.getElementAsString( Utils.getElement( - profile.getPetsInfo(null), + profile.latestProfile.petsInfo, "active_pet.tier" ), "UNKNOWN" ) diff --git a/src/main/kotlin/io/github/moulberry/notenoughupdates/commands/misc/ProfileViewerCommands.kt b/src/main/kotlin/io/github/moulberry/notenoughupdates/commands/misc/ProfileViewerCommands.kt index 8a2763f7..da97f0d2 100644 --- a/src/main/kotlin/io/github/moulberry/notenoughupdates/commands/misc/ProfileViewerCommands.kt +++ b/src/main/kotlin/io/github/moulberry/notenoughupdates/commands/misc/ProfileViewerCommands.kt @@ -46,7 +46,7 @@ class ProfileViewerCommands { return } - NotEnoughUpdates.profileViewer.getProfileByName(name) { profile -> + NotEnoughUpdates.profileViewer.loadPlayerByName(name) { profile -> if (profile == null) { reply("${RED}Invalid player name/API key. Maybe the API is down? Try /api new.") } else { diff --git a/src/main/kotlin/io/github/moulberry/notenoughupdates/miscgui/pricegraph/GuiPriceGraph.kt b/src/main/kotlin/io/github/moulberry/notenoughupdates/miscgui/pricegraph/GuiPriceGraph.kt index 0fe6d843..af2b9c2a 100644 --- a/src/main/kotlin/io/github/moulberry/notenoughupdates/miscgui/pricegraph/GuiPriceGraph.kt +++ b/src/main/kotlin/io/github/moulberry/notenoughupdates/miscgui/pricegraph/GuiPriceGraph.kt @@ -20,6 +20,7 @@ package io.github.moulberry.notenoughupdates.miscgui.pricegraph import io.github.moulberry.notenoughupdates.NotEnoughUpdates +import io.github.moulberry.notenoughupdates.core.util.StringUtils import io.github.moulberry.notenoughupdates.util.SpecialColour import io.github.moulberry.notenoughupdates.util.Utils import io.github.moulberry.notenoughupdates.util.roundToDecimals @@ -31,7 +32,6 @@ import net.minecraft.util.EnumChatFormatting import net.minecraft.util.ResourceLocation import org.lwjgl.opengl.GL11 import java.text.DecimalFormat -import java.text.NumberFormat import java.text.SimpleDateFormat import java.time.Duration import java.time.Instant @@ -42,7 +42,6 @@ import kotlin.math.abs private const val X_SIZE = 364 private const val Y_SIZE = 215 private val dateFormat = SimpleDateFormat("'§b'd MMMMM yyyy '§eat§b' HH:mm") -private val numberFormat = NumberFormat.getInstance() private val config = NotEnoughUpdates.INSTANCE.config class GuiPriceGraph(itemId: String) : GuiScreen() { @@ -248,29 +247,29 @@ class GuiPriceGraph(itemId: String) : GuiScreen() { if (closestPoint.value.sellPrice == null) { text.add( "${EnumChatFormatting.YELLOW}${EnumChatFormatting.BOLD}Lowest BIN: ${EnumChatFormatting.GOLD}" + - "${EnumChatFormatting.BOLD}${numberFormat.format(closestPoint.value.buyPrice)}" + "${EnumChatFormatting.BOLD}${StringUtils.formatNumber(closestPoint.value.buyPrice)}" ) if (config.ahGraph.movingAverages && buyMovingAverage[x] != null) text.add( "${EnumChatFormatting.YELLOW}${EnumChatFormatting.BOLD}Lowest BIN Moving Average: ${EnumChatFormatting.GOLD}" + - "${EnumChatFormatting.BOLD}${numberFormat.format(buyMovingAverage[x])}" + "${EnumChatFormatting.BOLD}${StringUtils.formatNumber(buyMovingAverage[x])}" ) } else { text.add( "${EnumChatFormatting.YELLOW}${EnumChatFormatting.BOLD}Bazaar Insta-Buy: ${EnumChatFormatting.GOLD}" + - "${EnumChatFormatting.BOLD}${numberFormat.format(closestPoint.value.buyPrice)}" + "${EnumChatFormatting.BOLD}${StringUtils.formatNumber(closestPoint.value.buyPrice)}" ) text.add( "${EnumChatFormatting.YELLOW}${EnumChatFormatting.BOLD}Bazaar Insta-Sell: ${EnumChatFormatting.GOLD}" + - "${EnumChatFormatting.BOLD}${numberFormat.format(closestPoint.value.sellPrice)}" + "${EnumChatFormatting.BOLD}${StringUtils.formatNumber(closestPoint.value.sellPrice)}" ) if (config.ahGraph.movingAverages) { if (buyMovingAverage[x] != null) text.add( "${EnumChatFormatting.YELLOW}${EnumChatFormatting.BOLD}Bazaar Insta-Buy Moving Average: ${EnumChatFormatting.GOLD}${EnumChatFormatting.BOLD}" + - numberFormat.format(buyMovingAverage[x]) + StringUtils.formatNumber(buyMovingAverage[x]) ) if (sellMovingAverage[x] != null) text.add( "${EnumChatFormatting.YELLOW}${EnumChatFormatting.BOLD}Bazaar Insta-Sell Moving Average: ${EnumChatFormatting.GOLD}${EnumChatFormatting.BOLD}" + - numberFormat.format(sellMovingAverage[x]) + StringUtils.formatNumber(sellMovingAverage[x]) ) } } |