diff options
| author | Madeleaan <70163122+Madeleaan@users.noreply.github.com> | 2024-08-03 17:50:56 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-03 17:50:56 +0200 |
| commit | effe46a69d26d05b5f4d9360b92414e1cee7b387 (patch) | |
| tree | 371424f858e2d3986348d01d3e18dbb57e35e7b0 | |
| parent | cdff3a6ce8f0320a336f89ff165d23048388fddc (diff) | |
| download | notenoughupdates-effe46a69d26d05b5f4d9360b92414e1cee7b387.tar.gz notenoughupdates-effe46a69d26d05b5f4d9360b92414e1cee7b387.tar.bz2 notenoughupdates-effe46a69d26d05b5f4d9360b92414e1cee7b387.zip | |
Add accessory bag overlay features (#1269)
Co-authored-by: nopo <nopotheemail@gmail.com>
6 files changed, 817 insertions, 598 deletions
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/AccessoryBagOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/AccessoryBagOverlay.java index 6e81351a..013807c3 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/AccessoryBagOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/AccessoryBagOverlay.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2022 NotEnoughUpdates contributors + * Copyright (C) 2022-2024 NotEnoughUpdates contributors * * This file is part of NotEnoughUpdates. * @@ -22,41 +22,47 @@ package io.github.moulberry.notenoughupdates.miscgui; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.NEUManager; +import io.github.moulberry.notenoughupdates.NEUOverlay; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.auction.APIManager; import io.github.moulberry.notenoughupdates.autosubscribe.NEUAutoSubscribe; -import io.github.moulberry.notenoughupdates.core.util.StringUtils; +import io.github.moulberry.notenoughupdates.core.util.ArrowPagesUtils; import io.github.moulberry.notenoughupdates.events.ButtonExclusionZoneEvent; -import io.github.moulberry.notenoughupdates.listener.RenderListener; +import io.github.moulberry.notenoughupdates.mixins.AccessorGuiContainer; +import io.github.moulberry.notenoughupdates.options.NEUConfig; +import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; import io.github.moulberry.notenoughupdates.profileviewer.PlayerStats; import io.github.moulberry.notenoughupdates.util.Constants; +import io.github.moulberry.notenoughupdates.util.ItemUtils; import io.github.moulberry.notenoughupdates.util.Rectangle; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.gui.inventory.GuiChest; -import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.RenderHelper; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.inventory.ContainerChest; import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; 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 net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.apache.commons.lang3.tuple.Pair; +import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL14; import java.awt.*; -import java.io.ByteArrayInputStream; -import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; @@ -66,20 +72,35 @@ import java.util.Set; import java.util.TreeMap; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import static io.github.moulberry.notenoughupdates.util.GuiTextures.accessory_bag_overlay; @NEUAutoSubscribe public class AccessoryBagOverlay { - private static final int TAB_BASIC = 0; - private static final int TAB_TOTAL = 1; - private static final int TAB_BONUS = 2; - private static final int TAB_DUP = 3; - private static final int TAB_MISSING = 4; - private static final int TAB_OPTIMIZER = 5; + private enum Tabs { + TAB_BASIC, TAB_TOTAL, TAB_DUP, TAB_MISSING + } public static final AccessoryBagOverlay INSTANCE = new AccessoryBagOverlay(); + // Arrow pages variables + private static int statsPageActive = 0; + private static int statsPagesTotal = 0; + private static int dupePageActive = 0; + private static int dupePagesTotal = 0; + private static int missingPageActive = 0; + private static int missingPagesTotal = 0; + + // Page-specific button variables + private static boolean dupe_highlight = true; + private static boolean dupe_showPersonal = false; + private static boolean missing_showAllTiers = true; + private static boolean missing_useMP = true; + + private static List<String> tooltipToDisplay = null; + private static boolean offsetButtons = false; + @SubscribeEvent public void onButtonExclusionZones(ButtonExclusionZoneEvent event) { if (isInAccessoryBag()) { @@ -87,7 +108,7 @@ public class AccessoryBagOverlay { new Rectangle( event.getGuiBaseRect().getRight(), event.getGuiBaseRect().getTop(), - 80 /*pane*/ + 24 /*tabs*/ + 4 /*space*/, 150 + 168 /*pane*/ + (offsetButtons ? 24 : 0) /*tabs*/ + 5 /*space*/, 128 ), ButtonExclusionZoneEvent.PushDirection.TOWARDS_RIGHT ); @@ -101,23 +122,15 @@ public class AccessoryBagOverlay { Utils.createItemStack(Items.diamond_sword, EnumChatFormatting.DARK_AQUA + "Total Stat Bonuses", 0 ), - Utils.createItemStack( - Item.getItemFromBlock(Blocks.anvil), - EnumChatFormatting.DARK_AQUA + "Total Stat Bonuses (from reforges)", - 0 - ), Utils.createItemStack(Items.dye, EnumChatFormatting.DARK_AQUA + "Duplicates", 8 ), Utils.createItemStack(Item.getItemFromBlock(Blocks.barrier), EnumChatFormatting.DARK_AQUA + "Missing", 0 - ), - Utils.createItemStack(Item.getItemFromBlock(Blocks.redstone_block), EnumChatFormatting.DARK_AQUA + "Optimizer", - 0 - ), + ) }; - private static int currentTab = TAB_BASIC; + private static Tabs currentTab = Tabs.TAB_BASIC; public static boolean mouseClick() { if (Minecraft.getMinecraft().currentScreen instanceof GuiChest) { @@ -133,75 +146,71 @@ public class AccessoryBagOverlay { if (!Mouse.getEventButtonState()) return false; try { - ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); - - int width = scaledResolution.getScaledWidth(); - int height = scaledResolution.getScaledHeight(); + AccessorGuiContainer accessor = (AccessorGuiContainer) Minecraft.getMinecraft().currentScreen; + int xSize = accessor.getXSize(); + int guiLeft = accessor.getGuiLeft(); + int guiTop = accessor.getGuiTop(); + + if (mouseX() < guiLeft + xSize + 3 || mouseX() > guiLeft + xSize + 168 + 28) return false; + if (mouseY() < guiTop || mouseY() > guiTop + 128) return false; + + if (mouseX() > guiLeft + xSize + 168 + 3 && mouseY() < guiTop + 20 * Tabs.values().length + 22) { + int tabClicked = (mouseY() - guiTop) / 20; + tabClicked = Math.min(Math.max(0, tabClicked), Tabs.values().length - 1); + currentTab = Tabs.values()[tabClicked]; + playPressSound(); + } - int mouseX = Mouse.getX() / scaledResolution.getScaleFactor(); - int mouseY = height - Mouse.getY() / scaledResolution.getScaleFactor(); + if (currentTab == Tabs.TAB_TOTAL) { + if (statsPagesTotal > 1) ArrowPagesUtils.onPageSwitchMouse( + guiLeft + xSize + 3, + guiTop, + new int[]{60, 110}, + statsPageActive, + statsPagesTotal, + integer -> statsPageActive = integer + ); + } + if (currentTab == Tabs.TAB_DUP) { + if (dupePagesTotal > 1) ArrowPagesUtils.onPageSwitchMouse( + guiLeft + xSize + 3, + guiTop, + new int[]{60, 110}, + dupePageActive, + dupePagesTotal, + integer -> dupePageActive = integer + ); - int xSize = (int) Utils.getField( - GuiContainer.class, - Minecraft.getMinecraft().currentScreen, - "xSize", - "field_146999_f" - ); - int ySize = (int) Utils.getField( - GuiContainer.class, - Minecraft.getMinecraft().currentScreen, - "ySize", - "field_147000_g" - ); - int guiLeft = (int) Utils.getField( - GuiContainer.class, - Minecraft.getMinecraft().currentScreen, - "guiLeft", - "field_147003_i" - ); - int guiTop = (int) Utils.getField( - GuiContainer.class, - Minecraft.getMinecraft().currentScreen, - "guiTop", - "field_147009_r" - ); + if (new Rectangle(guiLeft + xSize + 3 + 120, guiTop + 108, 16, 16).contains(mouseX(), mouseY())) { + dupe_highlight = !dupe_highlight; + playPressSound(); + } - if (mouseX < guiLeft + xSize + 3 || mouseX > guiLeft + xSize + 80 + 28) return false; - if (mouseY < guiTop || mouseY > guiTop + 166) return false; + if (new Rectangle(guiLeft + xSize + 3 + 141, guiTop + 108, 16, 16).contains(mouseX(), mouseY())) { + dupe_showPersonal = !dupe_showPersonal; + playPressSound(); + } - if (mouseX > guiLeft + xSize + 83 && mouseY < guiTop + 20 * TAB_MISSING + 22) { - currentTab = (mouseY - guiTop) / 20; - if (currentTab < 0) currentTab = 0; - if (currentTab > TAB_MISSING) currentTab = TAB_MISSING; } + if (currentTab == Tabs.TAB_MISSING) { + if (missingPagesTotal > 1) ArrowPagesUtils.onPageSwitchMouse( + guiLeft + xSize + 3, + guiTop, + new int[]{60, 110}, + missingPageActive, + missingPagesTotal, + integer -> missingPageActive = integer + ); - if (currentTab == TAB_OPTIMIZER) { - int x = guiLeft + xSize + 3; - int y = guiTop; - - if (mouseY > y + 92 && mouseY < y + 103) { - if (mouseX > x + 5 && mouseX < x + 75) { - mainWeapon = (int) Math.floor((mouseX - x - 5) / 70f * 9); - if (mainWeapon < 1) { - mainWeapon = 1; - } else if (mainWeapon > 9) { - mainWeapon = 9; - } - } + if (new Rectangle(guiLeft + xSize + 3 + 120, guiTop + 108, 16, 16).contains(mouseX(), mouseY())) { + missing_useMP = !missing_useMP; + missing = null; + playPressSound(); } - - if (mouseX > x + 5 && mouseX < x + 35 || mouseX > x + 45 && mouseX < x + 75) { - boolean set = mouseX > x + 5 && mouseX < x + 35; - - if (mouseY > y + 32 && mouseY < y + 43) { - forceCC = set; - } else if (mouseY > y + 52 && mouseY < y + 63) { - forceAS = set; - } else if (mouseY > y + 72 && mouseY < y + 83) { - useGodPot = set; - } else if (mouseY > y + 92 && mouseY < y + 103) { - allowShaded = set; - } + if (new Rectangle(guiLeft + xSize + 3 + 141, guiTop + 108, 16, 16).contains(mouseX(), mouseY())) { + missing_showAllTiers = !missing_showAllTiers; + missing = null; + playPressSound(); } } @@ -216,7 +225,6 @@ public class AccessoryBagOverlay { pagesVisited = new HashSet<>(); talismanCountRarity = null; totalStats = null; - reforgeStats = null; duplicates = null; missing = null; } @@ -225,8 +233,8 @@ public class AccessoryBagOverlay { private static Set<Integer> pagesVisited = new HashSet<>(); public static void renderVisitOverlay(int x, int y) { - Utils.drawStringCenteredScaledMaxWidth("Please visit all", x + 40, y + 78, true, 70, -1); - Utils.drawStringCenteredScaledMaxWidth("pages of the bag", x + 40, y + 86, true, 70, -1); + Utils.drawStringCenteredScaledMaxWidth("Please visit all", x + 80, y + 60, true, 140, -1); + Utils.drawStringCenteredScaledMaxWidth("pages of the bag", x + 80, y + 72, true, 140, -1); } private static TreeMap<Integer, Integer> talismanCountRarity = null; @@ -242,7 +250,7 @@ public class AccessoryBagOverlay { } } - drawString(x, y, "# By Rarity"); + drawTitle(x, y, "Total Counts By Rarity"); int yIndex = 0; for (Map.Entry<Integer, Integer> entry : talismanCountRarity.descendingMap().entrySet()) { @@ -250,12 +258,21 @@ public class AccessoryBagOverlay { Utils.renderAlignedString( rarityName, EnumChatFormatting.WHITE.toString() + entry.getValue(), - x + 5, + x + 34, y + 20 + 11 * yIndex, - 70 + 100 ); yIndex++; } + + NEUConfig.HiddenProfileSpecific profileSpecific = NotEnoughUpdates.INSTANCE.config.getProfileSpecific(); + int mp = 0; + if (profileSpecific != null) mp = profileSpecific.magicalPower; + Utils.renderAlignedString( + EnumChatFormatting.AQUA + "Magical Power", + mp != 0 ? EnumChatFormatting.WHITE.toString() + mp : EnumChatFormatting.RED + "NO DATA, DO /PV", + x + 20, y + 25 + 88, 130 + ); } private static PlayerStats.Stats totalStats = null; @@ -264,77 +281,37 @@ public class AccessoryBagOverlay { if (totalStats == null) { totalStats = new PlayerStats.Stats(); for (ItemStack stack : accessoryStacks) { - if (stack != null) totalStats.add(getStatForItem(stack, STAT_PATTERN_MAP, true)); + if (stack != null) totalStats.add(getStatForItem(stack, PlayerStats.STAT_PATTERN_MAP, true)); } } - drawString(x, y, "Total Stats"); + drawTitle(x, y, "Total Stats"); int yIndex = 0; + List<Pair<String, Integer>> statPairs = new ArrayList<>(); for (int i = 0; i < PlayerStats.defaultStatNames.length; i++) { String statName = PlayerStats.defaultStatNames[i]; String statNamePretty = PlayerStats.defaultStatNamesPretty[i]; int val = Math.round(totalStats.get(statName)); - if (Math.abs(val) < 1E-5) continue; - - GlStateManager.color(1, 1, 1, 1); - GlStateManager.enableBlend(); - GL14.glBlendFuncSeparate( - GL11.GL_SRC_ALPHA, - GL11.GL_ONE_MINUS_SRC_ALPHA, - GL11.GL_ONE, - GL11.GL_ONE_MINUS_SRC_ALPHA - ); - Utils.renderAlignedString( - statNamePretty, - EnumChatFormatting.WHITE.toString() + val, - x + 5, - y + 20 + 11 * yIndex, - 70 - ); - - yIndex++; + if (Math.abs(val) >= 1E-5) statPairs.add(new ImmutablePair<>(statNamePretty, val)); } - } - - private static PlayerStats.Stats reforgeStats = null; - - public static void renderReforgeStatsOverlay(int x, int y) { - if (reforgeStats == null) { - reforgeStats = new PlayerStats.Stats(); - for (ItemStack stack : accessoryStacks) { - if (stack != null) reforgeStats.add(getStatForItem(stack, STAT_PATTERN_MAP_BONUS, false)); - } - } - - drawString(x, y, "Reforge Stats"); - int yIndex = 0; - for (int i = 0; i < PlayerStats.defaultStatNames.length; i++) { - String statName = PlayerStats.defaultStatNames[i]; - String statNamePretty = PlayerStats.defaultStatNamesPretty[i]; - int val = Math.round(reforgeStats.get(statName)); - - if (Math.abs(val) < 1E-5) continue; - - GlStateManager.color(1, 1, 1, 1); - GlStateManager.enableBlend(); - GL14.glBlendFuncSeparate( - GL11.GL_SRC_ALPHA, - GL11.GL_ONE_MINUS_SRC_ALPHA, - GL11.GL_ONE, - GL11.GL_ONE_MINUS_SRC_ALPHA - ); + statsPageActive = Math.min(statsPageActive, (statPairs.size() / 8)); + for (Pair<String, Integer> pair : statPairs.subList(statsPageActive * 8, statPairs.size())) { Utils.renderAlignedString( - statNamePretty, - EnumChatFormatting.WHITE.toString() + val, - x + 5, - y + 20 + 11 * yIndex, - 70 + pair.getKey(), + EnumChatFormatting.WHITE.toString() + pair.getValue(), + x + 6, + y + 20 + 11 * yIndex, 158 ); + if (yIndex++ >= 7 && statPairs.size() > 9) break; + } - yIndex++; + statsPagesTotal = (int) Math.ceil(statPairs.size() / 8.0); + if (statPairs.size() > 9) { + GlStateManager.color(1f, 1f, 1f, 1f); + ArrowPagesUtils.onDraw(x, y, new int[]{60, 110}, statsPageActive, statsPagesTotal); } } @@ -344,71 +321,68 @@ public class AccessoryBagOverlay { if (duplicates == null) { JsonObject misc = Constants.MISC; if (misc == null) { - drawString(x, y, "Duplicates: ERROR"); - return; - } - JsonElement talisman_upgrades_element = misc.get("talisman_upgrades"); - if (talisman_upgrades_element == null) { - drawString(x, y, "Duplicates: ERROR"); + drawTitle(x, y, "Duplicates: REPO ERROR"); + Utils.showOutdatedRepoNotification("misc.json"); return; } - JsonObject talisman_upgrades = talisman_upgrades_element.getAsJsonObject(); - - duplicates = new HashSet<>(); - - Set<String> prevInternalnames = new HashSet<>(); - for (ItemStack stack : accessoryStacks) { - String internalname = NotEnoughUpdates.INSTANCE.manager.getInternalNameForItem(stack); - - if (prevInternalnames.contains(internalname)) { - duplicates.add(stack); - continue; - } - prevInternalnames.add(internalname); - - if (talisman_upgrades.has(internalname)) { - JsonArray upgrades = talisman_upgrades.get(internalname).getAsJsonArray(); - for (ItemStack stack2 : accessoryStacks) { - if (stack != stack2) { - String internalname2 = NotEnoughUpdates.INSTANCE.manager.getInternalNameForItem(stack2); - for (int j = 0; j < upgrades.size(); j++) { - String upgrade = upgrades.get(j).getAsString(); - if (internalname2.equals(upgrade)) { - duplicates.add(stack); - break; - } - } - } - } - } - } } if (duplicates.isEmpty()) { - drawString(x, y, "No Duplicates"); + drawTitle(x, y, "No Duplicates"); } else { - drawString(x, y, "Duplicates: " + duplicates.size()); + drawTitle(x, y, "Duplicates: " + duplicates.size()); int yIndex = 0; - for (ItemStack duplicate : duplicates) { + List<ItemStack> sortedDupes = + duplicates.stream().sorted((Comparator.comparing(ItemStack::getDisplayName))).collect(Collectors.toList()); + + dupePageActive = Math.min(dupePageActive, (duplicates.size() / 8)); + for (ItemStack duplicate : sortedDupes.subList(dupePageActive * 8, sortedDupes.size())) { String s = duplicate.getDisplayName(); - Utils.renderShadowedString(s, x + 40, y + 20 + 11 * yIndex, 70); - if (duplicates.size() > 11) { - if (++yIndex >= 10) break; - } else { - if (++yIndex >= 11) break; - } + Utils.renderShadowedString(s.substring(0, Math.min(s.length(), 35)), x + 84, y + 20 + 11 * yIndex, 158); + if (++yIndex >= 8 && sortedDupes.size() > 9) break; } - if (duplicates.size() > 11) { - Utils.drawStringCenteredScaledMaxWidth( - "+" + (duplicates.size() - 10) + " More", - x + 40, y + 16 + 121, - false, - 70, - gray() - ); + dupePagesTotal = (int) Math.ceil(sortedDupes.size() / 8.0); + if (sortedDupes.size() > 9) { + GlStateManager.color(1f, 1f, 1f, 1f); + ArrowPagesUtils.onDraw(x, y, new int[]{60, 110}, dupePageActive, dupePagesTotal); } } + + List<String> highlightTooltip = new ArrayList<>(); + if (dupe_highlight) { + highlightTooltip.add("§aHighlight dupes"); + highlightTooltip.add("§7Will highlight accessories"); + highlightTooltip.add("§7you have duplicates of."); + } else { + highlightTooltip.add("§cDon't highlight dupes"); + highlightTooltip.add("§7Will not highlight accessories"); + highlightTooltip.add("§7you have duplicates of."); + } + renderButton( + new ItemStack(dupe_highlight ? Items.ender_eye : Items.ender_pearl), + x + 120, + y + 107, + highlightTooltip + ); + + List<String> compDeletorTooltip = new ArrayList<>(); + if (dupe_showPersonal) { + compDeletorTooltip.add("§aHighlight Compactors & Deletors"); + compDeletorTooltip.add("§7Will highlight all duplicates."); + } else { + compDeletorTooltip.add("§cDon't highlight Compactors & Deletors"); + compDeletorTooltip.add("§7Duplicates allow you to specify"); + compDeletorTooltip.add("§7more things to compact and delete,"); + compDeletorTooltip.add("§7but they do not give more MP!"); + } + renderButton( + NotEnoughUpdates.INSTANCE.manager.createItem(dupe_showPersonal ? "PERSONAL_DELETOR_4000" : "DISPENSER"), + x + 141, + y + 107, + compDeletorTooltip + ); + } private static List<ItemStack> missing = null; @@ -417,12 +391,14 @@ public class AccessoryBagOverlay { if (missing == null) { JsonObject misc = Constants.MISC; if (misc == null) { - drawString(x, y, "Duplicates: ERROR"); + drawTitle(x, y, "Missing: REPO ERROR"); + Utils.showOutdatedRepoNotification("misc.json"); return; } JsonElement talisman_upgrades_element = misc.get("talisman_upgrades"); if (talisman_upgrades_element == null) { - drawString(x, y, "Duplicates: ERROR"); + drawTitle(x, y, "Missing: REPO ERROR"); + Utils.showOutdatedRepoNotification("misc.json talisman_upgrades"); return; } JsonObject talisman_upgrades = talisman_upgrades_element.getAsJsonObject(); @@ -453,7 +429,8 @@ public class AccessoryBagOverlay { } for (ItemStack stack : accessoryStacks) { - String internalname = NotEnoughUpdates.INSTANCE.manager.getInternalNameForItem(stack); + String internalname = + NotEnoughUpdates.INSTANCE.manager.createItemResolutionQuery().withItemStack(stack).resolveInternalName(); missingInternal.remove(internalname); for (Map.Entry<String, JsonElement> talisman_upgrade_element : talisman_upgrades.entrySet()) { @@ -466,9 +443,15 @@ public class AccessoryBagOverlay { } } } - } - missingInternal.sort(getItemComparator()); + if (internalname.contains("ABICASE")) { + missingInternal.removeAll(missingInternal + .stream() + .filter(s -> s.contains("ABICASE")) + .collect(Collectors.toList())); + } + } + missingInternal.sort(getItemComparator(missing_useMP)); Set<String> missingDisplayNames = new HashSet<>(); for (String internal : missingInternal) { @@ -493,222 +476,88 @@ public class AccessoryBagOverlay { missingDisplayNames.add(stack.getDisplayName()); if (hasDup) { + if (!missing_showAllTiers) continue; stack.setStackDisplayName(stack.getDisplayName() + "*"); } missing.add(stack); } } if (missing.isEmpty()) { - drawString(x, y, "No Missing"); + drawTitle(x, y, "No Missing"); } else { - drawString(x, y, "Missing: " + missing.size()); + drawTitle(x, y, "Missing: " + missing.size()); int yIndex = 0; - long currentTime = System.currentTimeMillis(); - for (ItemStack missingStack : missing) { + missingPageActive = Math.min(missingPageActive, missing.size() / 8); + for (ItemStack missingStack : missing.subList(missingPageActive * 8, missing.size())) { String s = missingStack.getDisplayName(); + String internal = NotEnoughUpdates.INSTANCE.manager + .createItemResolutionQuery() + .withItemStack(missingStack) + .resolveInternalName(); + if (internal.equals("RIFT_PRISM") && hasConsumedRiftPrism()) continue; + double price = getItemPrice(internal); + Utils.renderAlignedString( + s, + price != -1 + ? "§6" + Utils.shortNumberFormat(price, 0) + : "§c" + "NO DATA", + x + 5, + y + 20 + 11 * yIndex, + 158 + ); + Rectangle rect = new Rectangle(x, y + 20 + 11 * yIndex, 168, 11); + renderAccessoryHover(rect, missingStack); + if (++yIndex >= 8 && missing.size() > 9) break; + } - s = Minecraft.getMinecraft().fontRendererObj.trimStringToWidth(s, 70); - - String clean = StringUtils.cleanColourNotModifiers(s); - for (int xO = -1; xO <= 1; xO++) { - for (int yO = -1; yO <= 1; yO++) { - int col = 0xff202020; - //if(xO != 0 && yO != 0) col = 0xff252525; - Minecraft.getMinecraft().fontRendererObj.drawString( - clean, - x + 5 + xO, - y + 20 + 11 * yIndex + yO, - col, - false - ); - } - } - Minecraft.getMinecraft().fontRendererObj.drawString(s, x + 5, y + 20 + 11 * yIndex, 0xffffff, false); - if (missing.size() > 11) { - if (++yIndex >= 10) break; - } else { - if (++yIndex >= 11) break; - } + missingPagesTotal = (int) Math.ceil(missing.size() / 8.0); + if (missing.size() > 9) { + GlStateManager.color(1f, 1f, 1f, 1f); + ArrowPagesUtils.onDraw(x, y, new int[]{60, 110}, missingPageActive, missingPagesTotal); } - if (missing.size() > 11) { - Utils.drawStringCenteredScaledMaxWidth("Show All", x + 40, y + 16 + 121, false, 70, gray()); - - final ScaledResolution scaledresolution = new ScaledResolution(Minecraft.getMinecraft()); - final int scaledWidth = scaledresolution.getScaledWidth(); - final int scaledHeight = scaledresolution.getScaledHeight(); - int mouseX = Mouse.getX() * scaledWidth / Minecraft.getMinecraft().displayWidth; - int mouseY = scaledHeight - Mouse.getY() * scaledHeight / Minecraft.getMinecraft().displayHeight - 1; - - if (mouseX > x && mouseX < x + 80 && - mouseY > y + 11 + 121 && mouseY < y + 21 + 121) { - List<String> text = new ArrayList<>(); - StringBuilder line = new StringBuilder(); - int leftMaxSize = 0; - int middleMaxSize = 0; - for (int i = 0; i < missing.size(); i += 3) { - leftMaxSize = Math.max(leftMaxSize, Minecraft.getMinecraft().fontRendererObj. - getStringWidth(missing.get(i).getDisplayName())); - } - for (int i = 1; i < missing.size(); i += 3) { - middleMaxSize = Math.max(middleMaxSize, Minecraft.getMinecraft().fontRendererObj. - getStringWidth(missing.get(i).getDisplayName())); - } - for (int i = 0; i < missing.size(); i++) { - if (i % 3 == 0 && i > 0) { - text.add(line.toString()); - line = new StringBuilder(); - } - StringBuilder name = new StringBuilder(missing.get(i).getDisplayName()); - int nameLen = Minecraft.getMinecraft().fontRendererObj.getStringWidth(name.toString()); - - int padSize = -1; - if (i % 3 == 0) padSize = leftMaxSize; - if (i % 3 == 1) padSize = middleMaxSize; - if (padSize > 0) { - float padNum = (padSize - nameLen) / 4.0f; - int remainder = (int) ((padNum % 1) * 4); - while (padNum >= 1) { - if (remainder > 0) { - name.append(EnumChatFormatting.BOLD).append(" "); - remainder--; - } else { - name.append(EnumChatFormatting.RESET).append(" "); - } - padNum--; - } - } - line.append('\u00A7').append(Utils.getPrimaryColourCode(missing.get(i).getDisplayName())); - if (i < 9) { - line.append((char) ('\u2776' + i)).append(' '); - } else { - line.append("\u2b24 "); - } - line.append(name); - if (i % 3 < 2) line.append(" "); - } + List<String> mpTooltip = new ArrayList<>(); + if (missing_useMP) { + mpTooltip.add("§bSort by Magical Power"); + mpTooltip.add("§7Will sort the accessories"); + mpTooltip.add("§7by the best MP gain."); + } else { + mpTooltip.add("§6Sort by Coins"); + mpTooltip.add("§7Will sort the accessories"); + mpTooltip.add("§7by the cheapest options."); + } + renderButton(ItemUtils.getCoinItemStack(missing_useMP ? 10_000_000 : 100_000), x + 120, y + 107, mpTooltip); - GlStateManager.pushMatrix(); - GlStateManager.scale(2f / scaledresolution.getScaleFactor(), 2f / scaledresolution.getScaleFactor(), 1); - Utils.drawHoveringText(text, - mouseX * scaledresolution.getScaleFactor() / 2, - mouseY * scaledresolution.getScaleFactor() / 2, - scaledWidth * scaledresolution.getScaleFactor() / 2, - scaledHeight * scaledresolution.getScaleFactor() / 2, -1 - ); - GlStateManager.popMatrix(); - } + List<String> tieredTooltip = new ArrayList<>(); + if (missing_showAllTiers) { + tieredTooltip.add("§aShow all tiers"); + tieredTooltip.add("§7Will show all the tiers"); + tieredTooltip.add("§7to get the cheapest options."); + } else { + tieredTooltip.add("§6Show highest tier"); + tieredTooltip.add("§7Will show only the highest tier"); + tieredTooltip.add("§7to avoid wasting money on lower ones."); } + renderButton(new ItemStack(missing_showAllTiers ? Items.coal : Items.diamond), x + 141, y + 107, tieredTooltip); } } - private static void drawString(int x, int y, String abc) { - Utils.drawStringCenteredScaledMaxWidth(abc, x + 40, y + 12, false, 70, gray()); - } - - private static boolean forceCC = false; - private static boolean forceAS = false; - private static boolean useGodPot = true; - private static boolean allowShaded = true; - private static int mainWeapon = 1; - - public static void renderOptimizerOverlay(int x, int y) { - Utils.drawStringCenteredScaledMaxWidth("Optimizer", x + 40, y + 12, false, 70, gray()); - - int light = new Color(220, 220, 220).getRGB(); - int dark = new Color(170, 170, 170).getRGB(); - - Gui.drawRect(x + 5, y + 32, x + 35, y + 43, forceCC ? dark : light); - Gui.drawRect(x + 45, y + 32, x + 75, y + 43, forceCC ? light : dark); - - Gui.drawRect(x + 5, y + 52, x + 35, y + 63, forceAS ? dark : light); - Gui.drawRect(x + 45, y + 52, x + 75, y + 63, forceAS ? light : dark); - - Gui.drawRect(x + 5, y + 72, x + 35, y + 83, useGodPot ? dark : light); - Gui.drawRect(x + 45, y + 72, x + 75, y + 83, useGodPot ? light : dark); - - Gui.drawRect(x + 5, y + 92, x + 35, y + 103, allowShaded ? dark : light); - Gui.drawRect(x + 45, y + 92, x + 75, y + 103, allowShaded ? light : dark); - - Gui.drawRect(x + 5, y + 102, x + 75, y + 113, light); - Gui.drawRect( - x + 5 + (int) ((mainWeapon - 1) / 9f * 70), - y + 102, - x + 5 + (int) (mainWeapon / 9f * 70), - y + 113, - dark - ); - - Utils.drawStringCenteredScaledMaxWidth("Force 100% CC", x + 40, y + 27, false, 70, gray()); - Utils.drawStringCenteredScaledMaxWidth( - (forceCC ? EnumChatFormatting.GREEN : EnumChatFormatting.GRAY) + "YES", x + 20, y + 37, true, 30, gray() - ); - Utils.drawStringCenteredScaledMaxWidth( - (forceCC ? EnumChatFormatting.GRAY : EnumChatFormatting.RED) + "NO", - x + 60, y + 37, true, 30, gray() - ); - - Utils.drawStringCenteredScaledMaxWidth("Force 100% ATKSPEED", x + 40, y + 47, false, 70, gray()); - Utils.drawStringCenteredScaledMaxWidth( - (forceAS ? EnumChatFormatting.GREEN : EnumChatFormatting.GRAY) + "YES", - x + 20, y + 57, true, 30, gray() - ); - Utils.drawStringCenteredScaledMaxWidth( - (forceAS ? EnumChatFormatting.GRAY : EnumChatFormatting.RED) + "NO", - x + 60, y + 57, true, 30, gray() - ); - - Utils.drawStringCenteredScaledMaxWidth("Use God Potion", x + 40, y + 67, false, 70, gray()); - Utils.drawStringCenteredScaledMaxWidth( - (useGodPot ? EnumChatFormatting.GREEN : EnumChatFormatting.GRAY) + "YES", - x + 20, y + 77, true, 30, gray() - ); - Utils.drawStringCenteredScaledMaxWidth( - (useGodPot ? EnumChatFormatting.GRAY : EnumChatFormatting.RED) + "NO", - x + 60, y + 77, true, 30, gray() - ); - - Utils.drawStringCenteredScaledMaxWidth("Use God Potion", x + 40, y + 87, false, 70, gray()); - Utils.drawStringCenteredScaledMaxWidth((allowShaded ? EnumChatFormatting.GREEN : EnumChatFormatting.GRAY) + "YES", - x + 20, y + 97, true, 30, gray() - ); - Utils.drawStringCenteredScaledMaxWidth((allowShaded ? EnumChatFormatting.GRAY : EnumChatFormatting.RED) + "NO", - x + 60, y + 97, - true, 30, gray() - ); - - Utils.drawStringCenteredScaledMaxWidth("Main Weapon", x + 40, y + 107, false, 70, gray()); - Utils.drawStringCenteredScaled("1 2 3 4 5 6 7 8 9", x + 40, y + 117, true, 70, gray()); + private static void drawTitle(int x, int y, String abc) { + Utils.drawStringCenteredScaledMaxWidth(abc, x + 84, y + 12, false, 158, gray()); } private static int gray() { return new Color(80, 80, 80).getRGB(); } - private static Comparator<String> getItemComparator() { + private static Comparator<String> getItemComparator(boolean accountMP) { return (o1, o2) -> { - double cost1; - JsonObject o1Auc = NotEnoughUpdates.INSTANCE.manager.auctionManager.getItemAuctionInfo(o1); - if (o1Auc != null && o1Auc.has("price")) { - cost1 = o1Auc.get("price").getAsFloat(); - } else { - APIManager.CraftInfo info = NotEnoughUpdates.INSTANCE.manager.auctionManager.getCraftCost(o1); - if (info != null) - cost1 = info.craftCost; - else - cost1 = -1; - } - double cost2; - JsonObject o2Auc = NotEnoughUpdates.INSTANCE.manager.auctionManager.getItemAuctionInfo(o2); - if (o2Auc != null && o2Auc.has("price")) { - cost2 = o2Auc.get("price").getAsFloat(); - } else { - APIManager.CraftInfo info = NotEnoughUpdates.INSTANCE.manager.auctionManager.getCraftCost(o2); - if (info != null) - cost2 = info.craftCost; - else - cost2 = -1; + double cost1 = getItemPrice(o1); + double cost2 = getItemPrice(o2); + if (accountMP) { + cost1 /= cost1 != -1 ? getMagicalPowerForItem(o1) : -1E-99; // Artificially push items with -1 price to the end + cost2 /= cost2 != -1 ? getMagicalPowerForItem(o2) : -1E-99; // since they would be put at the start otherwise } if (cost1 == -1 && cost2 == -1) return o1.compareTo(o2); @@ -730,7 +579,8 @@ public class AccessoryBagOverlay { public static void renderOverlay() { inAccessoryBag = false; - if (Minecraft.getMinecraft().currentScreen instanceof GuiChest && RenderListener.inventoryLoaded) { + offsetButtons = false; + if (Minecraft.getMinecraft().currentScreen instanceof GuiChest) { GuiChest eventGui = (GuiChest) Minecraft.getMinecraft().currentScreen; ContainerChest cc = (ContainerChest) eventGui.inventorySlots; String containerName = cc.getLowerChestInventory().getDisplayName().getUnformattedText(); @@ -738,10 +588,10 @@ public class AccessoryBagOverlay { !containerName.contains("Upgrades")) { inAccessoryBag = true; try { - int xSize = (int) Utils.getField(GuiContainer.class, eventGui, "xSize", "field_146999_f"); - int ySize = (int) Utils.getField(GuiContainer.class, eventGui, "ySize", "field_147000_g"); - int guiLeft = (int) Utils.getField(GuiContainer.class, eventGui, "guiLeft", "field_147003_i"); - int guiTop = (int) Utils.getField(GuiContainer.class, eventGui, "guiTop", "field_147009_r"); + AccessorGuiContainer accessor = (AccessorGuiContainer) Minecraft.getMinecraft().currentScreen; + int xSize = accessor.getXSize(); + int guiLeft = accessor.getGuiLeft(); + int guiTop = accessor.getGuiTop(); if (accessoryStacks.isEmpty()) { for (ItemStack stack : Minecraft.getMinecraft().thePlayer.inventory.mainInventory) { @@ -754,42 +604,40 @@ public class AccessoryBagOverlay { if (containerName.trim().contains("(")) { String first = containerName.trim().split("\\(")[1].split("/")[0]; Integer currentPageNumber = Integer.parseInt(first); - //System.out.println("current:"+currentPageNumber); - if (!pagesVisited.contains(currentPageNumber)) { - boolean hasStack = false; - if (Minecraft.getMinecraft().thePlayer.openContainer instanceof ContainerChest) { - IInventory inv = - ((ContainerChest) Minecraft.getMinecraft().thePlayer.openContainer).getLowerChestInventory(); - for (int i = 0; i < inv.getSizeInventory(); i++) { - ItemStack stack = inv.getStackInSlot(i); - if (stack != null) { - hasStack = true; - if (isAccessory(stack)) { - accessoryStacks.add(stack); + boolean hasStack = false; + if (Minecraft.getMinecraft().thePlayer.openContainer instanceof ContainerChest) { + IInventory inv = + ((ContainerChest) Minecraft.getMinecraft().thePlayer.openContainer).getLowerChestInventory(); + for (int i = 0; i < inv.getSizeInventory(); i++) { + ItemStack stack = inv.getStackInSlot(i); + if (stack != null) { + hasStack = true; + if (isAccessory(stack)) { + boolean toAdd = true; + for (ItemStack accessoryStack : accessoryStacks) { + String s = NEUManager.getUUIDForItem(accessoryStack); + + String ss |
