From 3255cfce951367c9303297205f64577ef1eac650 Mon Sep 17 00:00:00 2001 From: BuildTools Date: Mon, 18 Jan 2021 23:59:09 +0800 Subject: gravy --- .../notenoughupdates/ItemPriceInformation.java | 43 ++- .../notenoughupdates/NEUEventListener.java | 106 +++++- .../moulberry/notenoughupdates/NEUOverlay.java | 6 +- .../notenoughupdates/NotEnoughUpdates.java | 25 +- .../notenoughupdates/auction/CustomAH.java | 2 +- .../notenoughupdates/core/GuiElementBoolean.java | 3 + .../core/config/gui/GuiOptionEditor.java | 3 +- .../core/config/gui/GuiOptionEditorColour.java | 7 +- .../core/config/gui/GuiOptionEditorDropdown.java | 56 ++-- .../core/util/GuiElementSlider.java | 2 +- .../core/util/lerp/LerpingInteger.java | 4 + .../notenoughupdates/cosmetics/CapeManager.java | 2 +- .../notenoughupdates/dungeons/DungeonMap.java | 8 +- .../notenoughupdates/dungeons/DungeonWin.java | 1 - .../notenoughupdates/miscfeatures/FairySouls.java | 364 +++++++++++++++++++++ .../notenoughupdates/miscfeatures/MiningStuff.java | 160 +++++++++ .../miscgui/AccessoryBagOverlay.java | 88 ++++- .../notenoughupdates/miscgui/CalendarOverlay.java | 14 +- .../notenoughupdates/miscgui/TradeWindow.java | 34 +- .../mixins/MixinEffectRenderer.java | 55 ++++ .../mixins/MixinLayerCreeperCharge.java | 26 ++ .../mixins/MixinNetHandlerPlayClient.java | 7 + .../mixins/MixinPlayerControllerMP.java | 21 ++ .../notenoughupdates/options/NEUConfig.java | 14 +- .../notenoughupdates/options/NEUConfigEditor.java | 147 +++++++-- .../profileviewer/GuiProfileViewer.java | 73 ++++- .../moulberry/notenoughupdates/util/Constants.java | 4 + .../notenoughupdates/util/GuiTextures.java | 2 +- .../moulberry/notenoughupdates/util/SBInfo.java | 6 +- .../moulberry/notenoughupdates/util/Utils.java | 9 +- 30 files changed, 1161 insertions(+), 131 deletions(-) create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FairySouls.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/MiningStuff.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEffectRenderer.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinLayerCreeperCharge.java create mode 100644 src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinPlayerControllerMP.java (limited to 'src/main/java/io') diff --git a/src/main/java/io/github/moulberry/notenoughupdates/ItemPriceInformation.java b/src/main/java/io/github/moulberry/notenoughupdates/ItemPriceInformation.java index 8d71992e..cafbff05 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/ItemPriceInformation.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/ItemPriceInformation.java @@ -2,6 +2,9 @@ package io.github.moulberry.notenoughupdates; import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.auction.APIManager; +import io.github.moulberry.notenoughupdates.util.Constants; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; import org.lwjgl.input.Keyboard; @@ -11,7 +14,7 @@ import java.util.Locale; public class ItemPriceInformation { - public static boolean addToTooltip(List tooltip, String internalname) { + public static boolean addToTooltip(List tooltip, String internalname, ItemStack stack) { JsonObject auctionInfo = NotEnoughUpdates.INSTANCE.manager.auctionManager.getItemAuctionInfo(internalname); JsonObject bazaarInfo = NotEnoughUpdates.INSTANCE.manager.auctionManager.getBazaarInfo(internalname); float lowestBinAvg = NotEnoughUpdates.INSTANCE.manager.auctionManager.getItemAvgBin(internalname); @@ -106,6 +109,44 @@ public class ItemPriceInformation { EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(lowestBinAvg)+" coins"); } break; + case 6: + if(Constants.ESSENCECOSTS == null) break; + JsonObject essenceCosts = Constants.ESSENCECOSTS; + if(!essenceCosts.has(internalname)) { + break; + } + JsonObject itemCosts = essenceCosts.get(internalname).getAsJsonObject(); + String essenceType = itemCosts.get("type").getAsString(); + + int dungeonItemLevel = -1; + if(stack != null && stack.hasTagCompound() && + stack.getTagCompound().hasKey("ExtraAttributes", 10)) { + NBTTagCompound ea = stack.getTagCompound().getCompoundTag("ExtraAttributes"); + + if (ea.hasKey("dungeon_item_level", 99)) { + dungeonItemLevel = ea.getInteger("dungeon_item_level"); + } + } + if(dungeonItemLevel == -1) { + int dungeonizeCost = 0; + if(itemCosts.has("dungeonize")) { + dungeonizeCost = itemCosts.get("dungeonize").getAsInt(); + } + tooltip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"Dungeonize Cost: " + + EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+dungeonizeCost+" "+essenceType); + } else if(dungeonItemLevel >= 0 && dungeonItemLevel <= 4) { + String costType = (dungeonItemLevel+1)+""; + + int upgradeCost = itemCosts.get(costType).getAsInt(); + StringBuilder star = new StringBuilder(); + for(int i=0; i<=dungeonItemLevel; i++) { + star.append('\u272A'); + } + tooltip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"Upgrade to "+ + EnumChatFormatting.GOLD+star+EnumChatFormatting.YELLOW+EnumChatFormatting.BOLD+": " + + EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+upgradeCost+" "+essenceType); + } + break; } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUEventListener.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUEventListener.java index 1111a580..e0a487b6 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUEventListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUEventListener.java @@ -10,6 +10,7 @@ import io.github.moulberry.notenoughupdates.dungeons.DungeonBlocks; import io.github.moulberry.notenoughupdates.dungeons.DungeonWin; import io.github.moulberry.notenoughupdates.gamemodes.SBGamemodes; import io.github.moulberry.notenoughupdates.miscfeatures.BetterContainers; +import io.github.moulberry.notenoughupdates.miscfeatures.FairySouls; import io.github.moulberry.notenoughupdates.miscfeatures.StreamerMode; import io.github.moulberry.notenoughupdates.miscgui.*; import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; @@ -134,6 +135,8 @@ public class NEUEventListener { private long notificationDisplayMillis = 0; private List notificationLines = null; + private static Pattern BAD_ITEM_REGEX = Pattern.compile("x[0-9]{1,2}$"); + /** * 1)Will send the cached message from #sendChatMessage when at least 200ms has passed since the last message. * This is used in order to prevent the mod spamming messages. @@ -160,6 +163,37 @@ public class NEUEventListener { } DungeonWin.tick(); if(longUpdate) { + FairySouls.tick(); + if(TradeWindow.hypixelTradeWindowActive()) { + for(int i=0; i<16; i++) { + int x = i % 4; + int y = i / 4; + int containerIndex = y*9+x+5; + + GuiContainer chest = ((GuiContainer)Minecraft.getMinecraft().currentScreen); + + ItemStack stack = chest.inventorySlots.getInventory().get(containerIndex); + if(stack != null && BAD_ITEM_REGEX.matcher(Utils.cleanColour(stack.getDisplayName())).find()) { + Minecraft.getMinecraft().ingameGUI.displayTitle( + null, null, + 4, 200, 4); + Minecraft.getMinecraft().ingameGUI.displayTitle( + null, + EnumChatFormatting.RED+"WARNING: GLITCHED ITEM DETECTED IN TRADE WINDOW. CANCELLING TRADE", + -1, -1, -1); + Minecraft.getMinecraft().ingameGUI.displayTitle( + EnumChatFormatting.RED+"YOU ARE TRADING WITH A SCAMMER!", + null, + -1, -1, -1); + Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED+ + "WARNING: The person you are trading with just tried to give you a glitched item.\n" + + "The item is NOT worth what they say it is worth.\n" + + "Report this scammer immediately and ignore them!")); + break; + } + } + } + NotEnoughUpdates.INSTANCE.overlay.redrawItems(); CapeManager.onTickSlow(); @@ -636,10 +670,16 @@ public class NEUEventListener { } if(focusInv) { try { - neu.overlay.render(hoverInv && focusInv); + neu.overlay.render(hoverInv); } catch(ConcurrentModificationException e) {e.printStackTrace();} GL11.glTranslatef(0, 0, 10); } + if(hoverInv) { + renderDungeonChestOverlay(event.gui); + if(neu.config.accessoryBag.enableOverlay) { + AccessoryBagOverlay.renderOverlay(); + } + } } } @@ -708,7 +748,7 @@ public class NEUEventListener { } } - if(shouldRenderOverlay(event.gui) && neu.isOnSkyblock()) { + if(shouldRenderOverlay(event.gui) && neu.isOnSkyblock() && !hoverInv) { renderDungeonChestOverlay(event.gui); if(neu.config.accessoryBag.enableOverlay) { AccessoryBagOverlay.renderOverlay(); @@ -943,6 +983,8 @@ public class NEUEventListener { ScheduledExecutorService ses = Executors.newScheduledThreadPool(1); + JsonObject essenceJson = new JsonObject(); + /** * Sends a kbd event to NEUOverlay, cancelling if NEUOverlay#keyboardInput returns true. * Also includes a dev function used for creating custom named json files with recipes. @@ -975,6 +1017,62 @@ public class NEUEventListener { event.setCanceled(true); } } + if(neu.config.hidden.dev && neu.config.hidden.enableItemEditing && Minecraft.getMinecraft().theWorld != null && + Keyboard.getEventKey() == Keyboard.KEY_N && Keyboard.getEventKeyState()) { + GuiScreen gui = Minecraft.getMinecraft().currentScreen; + if(gui instanceof GuiChest) { + GuiChest eventGui = (GuiChest) event.gui; + ContainerChest cc = (ContainerChest) eventGui.inventorySlots; + IInventory lower = cc.getLowerChestInventory(); + + if(!lower.getDisplayName().getUnformattedText().endsWith("Essence")) return; + + for(int i=0; i= '0' && c <= '9') { + costS.append(c); + } + } + int cost = Integer.parseInt(costS.toString()); + String[] afterSplit = after.split(" "); + String type = afterSplit[afterSplit.length-2]; + + if(!essenceJson.has(internalname)) { + essenceJson.add(internalname, new JsonObject()); + } + JsonObject obj = essenceJson.get(internalname).getAsJsonObject(); + obj.addProperty("type", type); + + if(line.startsWith("\u00A77Convert to Dungeon Item")) { + obj.addProperty("dungeonize", cost); + } else if(line.startsWith("\u00A77Upgrade to")) { + int stars = 0; + for(char c : line.toCharArray()) { + if(c == '\u272A') stars++; + } + if(stars > 0) { + obj.addProperty(stars+"", cost); + } + } + } + } + } + } + System.out.println(essenceJson); + } + } if(neu.config.hidden.dev && neu.config.hidden.enableItemEditing && Minecraft.getMinecraft().theWorld != null && Keyboard.getEventKey() == Keyboard.KEY_O && Keyboard.getEventKeyState()) { GuiScreen gui = Minecraft.getMinecraft().currentScreen; @@ -1284,7 +1382,7 @@ public class NEUEventListener { newTooltip.add(""); newTooltip.add(EnumChatFormatting.GRAY+"[SHIFT for Price Info]"); } else { - ItemPriceInformation.addToTooltip(newTooltip, internalname); + ItemPriceInformation.addToTooltip(newTooltip, internalname, event.itemStack); } } } @@ -1443,7 +1541,7 @@ public class NEUEventListener { event.toolTip.addAll(newTooltip); if(neu.config.tooltipTweaks.showPriceInfoInvItem) { - ItemPriceInformation.addToTooltip(event.toolTip, internalname); + ItemPriceInformation.addToTooltip(event.toolTip, internalname, event.itemStack); } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java index edaa8335..12a95484 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java @@ -264,6 +264,7 @@ public class NEUOverlay extends Gui { @Override public void mouseClick(float x, float y, int mouseX, int mouseY) { if(Mouse.getEventButtonState()) { + Minecraft.getMinecraft().thePlayer.closeScreen(); Minecraft.getMinecraft().displayGuiScreen(new GuiScreenElementWrapper(new NEUConfigEditor(NotEnoughUpdates.INSTANCE.config))); } } @@ -1930,11 +1931,12 @@ public class NEUOverlay extends Gui { //Render tooltip JsonObject json = tooltipToDisplay.get(); if(json != null) { - List text = manager.jsonToStack(json).getTooltip(Minecraft.getMinecraft().thePlayer, false); + ItemStack stack = manager.jsonToStack(json); + List text = stack.getTooltip(Minecraft.getMinecraft().thePlayer, false); String internalname = json.get("internalname").getAsString(); if(!NotEnoughUpdates.INSTANCE.config.tooltipTweaks.showPriceInfoInvItem) { - ItemPriceInformation.addToTooltip(text, internalname); + ItemPriceInformation.addToTooltip(text, internalname, stack); } boolean hasClick = false; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java index d5e6b927..6b787964 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java @@ -17,9 +17,7 @@ import io.github.moulberry.notenoughupdates.dungeons.GuiDungeonMapEditor; import io.github.moulberry.notenoughupdates.gamemodes.GuiGamemodes; import io.github.moulberry.notenoughupdates.gamemodes.SBGamemodes; import io.github.moulberry.notenoughupdates.infopanes.CollectionLogInfoPane; -import io.github.moulberry.notenoughupdates.miscfeatures.CustomItemEffects; -import io.github.moulberry.notenoughupdates.miscfeatures.EnchantingSolvers; -import io.github.moulberry.notenoughupdates.miscfeatures.SunTzu; +import io.github.moulberry.notenoughupdates.miscfeatures.*; import io.github.moulberry.notenoughupdates.miscgui.CalendarOverlay; import io.github.moulberry.notenoughupdates.miscgui.GuiEnchantColour; import io.github.moulberry.notenoughupdates.miscgui.HelpGUI; @@ -160,7 +158,7 @@ public class NotEnoughUpdates { ChatStyle style = new ChatStyle(); style.setChatHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ChatComponentText(EnumChatFormatting.GRAY+"Click to copy to clipboard"))); - style.setChatClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "neurename copyuuid")); + style.setChatClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/neurename copyuuid")); ChatComponentText text = new ChatComponentText(EnumChatFormatting.YELLOW+"[NEU] The UUID of your currently held item is: " + EnumChatFormatting.GREEN + heldUUID); @@ -865,6 +863,7 @@ public class NotEnoughUpdates { }); private Gson gson = new GsonBuilder().setPrettyPrinting().excludeFieldsWithoutExposeAnnotation().create(); + private File neuDir; /** * Instantiates NEUIo, NEUManager and NEUOverlay instances. Registers keybinds and adds a shutdown hook to clear tmp folder. @@ -874,10 +873,10 @@ public class NotEnoughUpdates { public void preinit(FMLPreInitializationEvent event) { INSTANCE = this; - File f = new File(event.getModConfigurationDirectory(), "notenoughupdates"); - f.mkdirs(); + neuDir = new File(event.getModConfigurationDirectory(), "notenoughupdates"); + neuDir.mkdirs(); - configFile = new File(f, "configNew.json"); + configFile = new File(neuDir, "configNew.json"); if(configFile.exists()) { try(BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(configFile), StandardCharsets.UTF_8))) { @@ -885,6 +884,8 @@ public class NotEnoughUpdates { } catch(Exception e) { } } + FairySouls.load(new File(neuDir, "collected_fairy_souls.json"), gson); + if(config == null) { config = new NEUConfig(); saveConfig(); @@ -900,6 +901,8 @@ public class NotEnoughUpdates { MinecraftForge.EVENT_BUS.register(CustomItemEffects.INSTANCE); MinecraftForge.EVENT_BUS.register(new DungeonMap()); MinecraftForge.EVENT_BUS.register(new SunTzu()); + MinecraftForge.EVENT_BUS.register(new MiningStuff()); + MinecraftForge.EVENT_BUS.register(new FairySouls()); ClientCommandHandler.instance.registerCommand(collectionLogCommand); ClientCommandHandler.instance.registerCommand(cosmeticsCommand); @@ -924,10 +927,11 @@ public class NotEnoughUpdates { ClientCommandHandler.instance.registerCommand(settingsCommand3); ClientCommandHandler.instance.registerCommand(dungeonWinTest); ClientCommandHandler.instance.registerCommand(calendarCommand); + ClientCommandHandler.instance.registerCommand(new FairySouls.FairySoulsCommand()); BackgroundBlur.registerListener(); - manager = new NEUManager(this, f); + manager = new NEUManager(this, neuDir); manager.loadItemInformation(); overlay = new NEUOverlay(manager); profileViewer = new ProfileViewer(manager); @@ -937,14 +941,13 @@ public class NotEnoughUpdates { } Runtime.getRuntime().addShutdownHook(new Thread(() -> { - File tmp = new File(f, "tmp"); + File tmp = new File(neuDir, "tmp"); if(tmp.exists()) { for(File tmpFile : tmp.listFiles()) { tmpFile.delete(); } tmp.delete(); } - saveConfig(); })); } @@ -956,6 +959,8 @@ public class NotEnoughUpdates { try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(configFile), StandardCharsets.UTF_8))) { writer.write(gson.toJson(config)); } + + FairySouls.save(new File(neuDir, "collected_fairy_souls.json"), gson); } catch(IOException ignored) {} } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/auction/CustomAH.java b/src/main/java/io/github/moulberry/notenoughupdates/auction/CustomAH.java index aad69686..70cb436b 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/auction/CustomAH.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/auction/CustomAH.java @@ -348,7 +348,7 @@ public class CustomAH extends Gui { tooltip.add(""); tooltip.add(EnumChatFormatting.GRAY+"[SHIFT for Price Info]"); } else { - ItemPriceInformation.addToTooltip(tooltip, internalname); + ItemPriceInformation.addToTooltip(tooltip, internalname, auc.getStack()); } } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementBoolean.java b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementBoolean.java index 97fc3dcc..85f88a9f 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementBoolean.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementBoolean.java @@ -36,6 +36,9 @@ public class GuiElementBoolean extends GuiElement { this.previewValue = value; this.clickRadius = clickRadius; this.toggleCallback = toggleCallback; + this.lastMillis = System.currentTimeMillis(); + + if(value) animation = 36; } @Override diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditor.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditor.java index 5b9509a3..7ca8ddf2 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditor.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditor.java @@ -54,8 +54,9 @@ public abstract class GuiOptionEditor { public abstract boolean mouseInput(int x, int y, int width, int mouseX, int mouseY); public abstract boolean keyboardInput(); - public boolean mouseInputGlobal(int x, int y, int width, int mouseX, int mouseY) { + public boolean mouseInputOverlay(int x, int y, int width, int mouseX, int mouseY) { return false; } + public void renderOverlay(int x, int y, int width) {}; } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorColour.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorColour.java index 482f6823..d9e8f5a9 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorColour.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorColour.java @@ -36,16 +36,17 @@ public class GuiOptionEditorColour extends GuiOptionEditor { GlStateManager.color(r/255f, g/255f, b/255f, 1); Minecraft.getMinecraft().getTextureManager().bindTexture(button_white); RenderUtils.drawTexturedRect(x+width/6-24, y+height-7-14, 48, 16); + } + @Override + public void renderOverlay(int x, int y, int width) { if(colourElement != null) { - GL11.glDisable(GL11.GL_SCISSOR_TEST); colourElement.render(); - GL11.glEnable(GL11.GL_SCISSOR_TEST); } } @Override - public boolean mouseInputGlobal(int x, int y, int width, int mouseX, int mouseY) { + public boolean mouseInputOverlay(int x, int y, int width, int mouseX, int mouseY) { if(colourElement != null && colourElement.mouseInput(mouseX, mouseY)) { return true; } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorDropdown.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorDropdown.java index 8b0d5eb3..20779e01 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorDropdown.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorDropdown.java @@ -27,21 +27,43 @@ public class GuiOptionEditorDropdown extends GuiOptionEditor { @Override public void render(int x, int y, int width) { super.render(x, y, width); - int height = getHeight(); - FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; - int dropdownWidth = Math.min(width/3-10, 80); - int left = x+width/6-dropdownWidth/2; - int top = y+height-7-14; + if(!open) { + int height = getHeight(); + + FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; + int dropdownWidth = Math.min(width/3-10, 80); + int left = x+width/6-dropdownWidth/2; + int top = y+height-7-14; + + String selectedString = " - Select - "; + if(selected >= 0 && selected < values.length) { + selectedString = values[selected]; + } + + RenderUtils.drawFloatingRectWithAlpha(left, top, dropdownWidth, 14, 0xff, false); + TextRenderUtils.drawStringScaled("\u25BC", fr, left+dropdownWidth-10, y+height-7-15, false, 0xff404040, 2); - String selectedString = " - Select - "; - if(selected >= 0 && selected < values.length) { - selectedString = values[selected]; + TextRenderUtils.drawStringScaledMaxWidth(selectedString, fr, left+3, top+3, false, + dropdownWidth-16, 0xff404040); + //fr.drawString(selectedString, left+3, top+3, 0xff404040); } + } + @Override + public void renderOverlay(int x, int y, int width) { if(open) { - GL11.glDisable(GL11.GL_SCISSOR_TEST); - GlStateManager.translate(0, 0, 10); + String selectedString = " - Select - "; + if(selected >= 0 && selected < values.length) { + selectedString = values[selected]; + } + + int height = getHeight(); + + FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; + int dropdownWidth = Math.min(width/3-10, 80); + int left = x+width/6-dropdownWidth/2; + int top = y+height-7-14; int dropdownHeight = 13 + 12*values.length; @@ -61,7 +83,6 @@ public class GuiOptionEditorDropdown extends GuiOptionEditor { option = ""; } TextRenderUtils.drawStringScaledMaxWidth(option, fr, left+3, top+3+dropdownY, false, dropdownWidth-6, 0xff404040); - //fr.drawString(option, left+3, top+3+dropdownY, 0xff404040); dropdownY += 12; } @@ -70,17 +91,6 @@ public class GuiOptionEditorDropdown extends GuiOptionEditor { TextRenderUtils.drawStringScaledMaxWidth(selectedString, fr, left+3, top+3, false, dropdownWidth-16, 0xff404040); - //fr.drawString(selectedString, left+3, top+3, 0xff404040); - - GlStateManager.translate(0, 0, -10); - GL11.glEnable(GL11.GL_SCISSOR_TEST); - } else { - RenderUtils.drawFloatingRectWithAlpha(left, top, dropdownWidth, 14, 0xff, false); - TextRenderUtils.drawStringScaled("\u25BC", fr, left+dropdownWidth-10, y+height-7-15, false, 0xff404040, 2); - - TextRenderUtils.drawStringScaledMaxWidth(selectedString, fr, left+3, top+3, false, - dropdownWidth-16, 0xff404040); - //fr.drawString(selectedString, left+3, top+3, 0xff404040); } } @@ -103,7 +113,7 @@ public class GuiOptionEditorDropdown extends GuiOptionEditor { } @Override - public boolean mouseInputGlobal(int x, int y, int width, int mouseX, int mouseY) { + public boolean mouseInputOverlay(int x, int y, int width, int mouseX, int mouseY) { int height = getHeight(); int left = x+width/6-40; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/util/GuiElementSlider.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/GuiElementSlider.java index cedf368b..89feaf17 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/core/util/GuiElementSlider.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/GuiElementSlider.java @@ -83,7 +83,7 @@ public class GuiElementSlider extends GuiElement { Utils.drawTexturedRect(notchX, y+(HEIGHT-4)/2, 2, 4, GL11.GL_NEAREST); } - Minecraft.getMinecraft().getTextureManager().bindTexture(slider_button); + Minecraft.getMinecraft().getTextureManager().bindTexture(slider_button_new); Utils.drawTexturedRect(x+sliderAmountI-4, y, 8, HEIGHT, GL11.GL_NEAREST); } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/util/lerp/LerpingInteger.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/lerp/LerpingInteger.java index cdc2c4fd..516169c9 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/core/util/lerp/LerpingInteger.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/lerp/LerpingInteger.java @@ -45,6 +45,10 @@ public class LerpingInteger { } } + public int getTimeSpent() { + return timeSpent; + } + public void resetTimer() { this.timeSpent = 0; this.lastMillis = System.currentTimeMillis(); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/CapeManager.java b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/CapeManager.java index 712ac09a..777a91cc 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/CapeManager.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/CapeManager.java @@ -45,7 +45,7 @@ public class CapeManager { private String[] capes = new String[]{"patreon1", "patreon2", "fade", "contrib", "nullzee", "gravy", "space", "mcworld", "lava", "packshq", "mbstaff", "thebakery", "negative", "void", "ironmoon", "krusty" }; - public Boolean[] specialCapes = new Boolean[]{ true, true, false, true, true, true, false, false, false, true, true, true, false, false, true, true }; + public Boolean[] specialCapes = new Boolean[]{ true, true, false, true, true, true, false, false, false, true, true, true, false, false, true, false }; public static CapeManager getInstance() { return INSTANCE; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonMap.java b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonMap.java index ce59b7c6..59cbfee5 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonMap.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonMap.java @@ -383,10 +383,10 @@ public class DungeonMap { } public void render(int centerX, int centerY) { - boolean useFb = NotEnoughUpdates.INSTANCE.config.dungeonMap.dmCompat <= 1; - boolean useShd = NotEnoughUpdates.INSTANCE.config.dungeonMap.dmCompat <= 0; + boolean useFb = NotEnoughUpdates.INSTANCE.config.dungeonMap.dmCompat <= 1 && OpenGlHelper.isFramebufferEnabled(); + boolean useShd = NotEnoughUpdates.INSTANCE.config.dungeonMap.dmCompat <= 0 && OpenGlHelper.areShadersSupported(); - if((useFb && !OpenGlHelper.isFramebufferEnabled()) || (useShd && !OpenGlHelper.areShadersSupported())) { + /*if((useFb && !OpenGlHelper.isFramebufferEnabled()) || (useShd && !OpenGlHelper.areShadersSupported())) { Utils.drawStringCentered(EnumChatFormatting.RED+"NEU Dungeon Map requires framebuffers & shaders", Minecraft.getMinecraft().fontRendererObj, centerX, centerY-10, true, 0); Utils.drawStringCentered(EnumChatFormatting.RED+"Turn off Optifine Fast Render", @@ -394,7 +394,7 @@ public class DungeonMap { Utils.drawStringCentered(EnumChatFormatting.RED+"If that doesn't work, join NEU discord for support", Minecraft.getMinecraft().fontRendererObj, centerX, centerY+10, true, 0); return; - } + }*/ ScaledResolution scaledResolution = Utils.pushGuiScale(2); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonWin.java b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonWin.java index 284ec1a3..1bcd7fe8 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonWin.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonWin.java @@ -150,7 +150,6 @@ public class DungeonWin { lastDungeonFinish = currentTime; String score = matcher.group(1); - System.out.println(score); switch (score.toUpperCase()) { case "S+": TEAM_SCORE = SPLUS; break; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FairySouls.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FairySouls.java new file mode 100644 index 00000000..70a701e0 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FairySouls.java @@ -0,0 +1,364 @@ +package io.github.moulberry.notenoughupdates.miscfeatures; + +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.commands.SimpleCommand; +import io.github.moulberry.notenoughupdates.options.NEUConfig; +import io.github.moulberry.notenoughupdates.util.Constants; +import io.github.moulberry.notenoughupdates.util.SBInfo; +import io.github.moulberry.notenoughupdates.util.SpecialColour; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.command.ICommandSender; +import net.minecraft.entity.Entity; +import net.minecraft.util.*; +import net.minecraftforge.client.event.ClientChatReceivedEvent; +import net.minecraftforge.client.event.RenderWorldLastEvent; +import net.minecraftforge.event.world.WorldEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +import org.lwjgl.opengl.GL11; +import org.lwjgl.util.vector.Vector3f; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.util.*; + +public class FairySouls { + + private static HashMap> foundSouls = new HashMap<>(); + private static List currentSoulList = null; + private static List currentSoulListClose = null; + + private static boolean enabled = false; + + @SubscribeEvent + public void onWorldUnload(WorldEvent.Unload event) { + currentSoulList = null; + } + + public static void load(File file, Gson gson) { + if(file.exists()) { + try(BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8))) { + HashMap> foundSoulsList = gson.fromJson(reader, HashMap.class); + + foundSouls = new HashMap<>(); + for(Map.Entry> entry : foundSoulsList.entrySet()) { + HashSet set = new HashSet<>(); + for(Number n : entry.getValue()) { + set.add(n.intValue()); + } + foundSouls.put(entry.getKey(), set); + } + + return; + } catch(Exception e) {} + } + foundSouls = new HashMap<>(); + } + + public static void save(File file, Gson gson) { + try { + file.createNewFile(); + + try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8))) { + writer.write(gson.toJson(foundSouls)); + } + } catch(IOException ignored) {} + } + + @SubscribeEvent + public void onChatReceived(ClientChatReceivedEvent event) { + if(event.message.getFormattedText().equals("\u00A7r\u00A7dYou have already found that Fairy Soul!\u00A7r") || + event.message.getFormattedText().equals("\u00A7d\u00A7lSOUL! \u00A7fYou found a \u00A7r\u00A7dFairy Soul\u00A7r\u00A7f!\u00A7r")) { + String location = SBInfo.getInstance().getLocation(); + if(location == null) return; + + int closestIndex = -1; + double closestDistSq = 10*10; + for(int i=0; i found = foundSouls.computeIfAbsent(location, k -> new HashSet<>()); + found.add(closestIndex); + } + } + } + + public static void tick() { + if(!enabled) return; + + if(Minecraft.getMinecraft().theWorld == null) { + currentSoulList = null; + return; + } + + JsonObject fairySouls = Constants.FAIRYSOULS; + String location = SBInfo.getInstance().getLocation(); + if(location == null) { + currentSoulList = null; + return; + } + + if(currentSoulList == null) { + if(fairySouls.has(location) && fairySouls.get(location).isJsonArray()) { + JsonArray locations = fairySouls.get(location).getAsJsonArray(); + currentSoulList = new ArrayList<>(); + for(int i=0; i distanceSqMap = new TreeMap<>(); + + Set found = foundSouls.computeIfAbsent(location, k -> new HashSet<>()); + + for(int i=0; i(); + for(BlockPos pos : distanceSqMap.values()) { + currentSoulListClose.add(pos); + if(++souls >= maxSouls) break; + } + } + } + + private static final ResourceLocation beaconBeam = new ResourceLocation("textures/entity/beacon_beam.png"); + + private static void renderBeaconBeam(double x, double y, double z, int rgb, float alphaMult, float partialTicks) { + int height = 300; + int bottomOffset = 0; + int topOffset = bottomOffset + height; + + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer worldrenderer = tessellator.getWorldRenderer(); + + Minecraft.getMinecraft().getTextureManager().bindTexture(beaconBeam); + GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, 10497.0F); + GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, 10497.0F); + GlStateManager.disableLighting(); + GlStateManager.enableCull(); + GlStateManager.enableTexture2D(); + GlStateManager.tryBlendFuncSeparate(770, 1, 1, 0); + GlStateManager.enableBlend(); + GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0); + + double time = Minecraft.getMinecraft().theWorld.getTotalWorldTime() + (double)partialTicks; + double d1 = MathHelper.func_181162_h(-time * 0.2D - (double)MathHelper.floor_double(-time * 0.1D)); + + float r = ((rgb >> 16) & 0xFF) / 255f; + float g = ((rgb >> 8) & 0xFF) / 255f; + float b = (rgb & 0xFF) / 255f; + double d2 = time * 0.025D * -1.5D; + double d4 = 0.5D + Math.cos(d2 + 2.356194490192345D) * 0.2D; + double d5 = 0.5D + Math.sin(d2 + 2.356194490192345D) * 0.2D; + double d6 = 0.5D + Math.cos(d2 + (Math.PI / 4D)) * 0.2D; + double d7 = 0.5D + Math.sin(d2 + (Math.PI / 4D)) * 0.2D; + double d8 = 0.5D + Math.cos(d2 + 3.9269908169872414D) * 0.2D; + double d9 = 0.5D + Math.sin(d2 + 3.9269908169872414D) * 0.2D; + double d10 = 0.5D + Math.cos(d2 + 5.497787143782138D) * 0.2D; + double d11 = 0.5D + Math.sin(d2 + 5.497787143782138D) * 0.2D; + double d14 = -1.0D + d1; + double d15 = (double)(height) * 2.5D + d14; + worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR); + worldrenderer.pos(x + d4, y + topOffset, z + d5).tex(1.0D, d15).color(r, g, b, 1.0F*alphaMult).endVertex(); + worldrenderer.pos(x + d4, y + bottomOffset, z + d5).tex(1.0D, d14).color(r, g, b, 1.0F).endVertex(); + worldrenderer.pos(x + d6, y + bottomOffset, z + d7).tex(0.0D, d14).color(r, g, b, 1.0F).endVertex(); + worldrenderer.pos(x + d6, y + topOffset, z + d7).tex(0.0D, d15).color(r, g, b, 1.0F*alphaMult).endVertex(); + worldrenderer.pos(x + d10, y + topOffset, z + d11).tex(1.0D, d15).color(r, g, b, 1.0F*alphaMult).endVertex(); + worldrenderer.pos(x + d10, y + bottomOffset, z + d11).tex(1.0D, d14).color(r, g, b, 1.0F).endVertex(); + worldrenderer.pos(x + d8, y + bottomOffset, z + d9).tex(0.0D, d14).color(r, g, b, 1.0F).endVertex(); + worldrenderer.pos(x + d8, y + topOffset, z + d9).tex(0.0D, d15).color(r, g, b, 1.0F*alphaMult).endVertex(); + worldrenderer.pos(x + d6, y + topOffset, z + d7).tex(1.0D, d15).color(r, g, b, 1.0F*alphaMult).endVertex(); + worldrenderer.pos(x + d6, y + bottomOffset, z + d7).tex(1.0D, d14).color(r, g, b, 1.0F).endVertex(); + worldrenderer.pos(x + d10, y + bottomOffset, z + d11).tex(0.0D, d14).color(r, g, b, 1.0F).endVertex(); + worldrenderer.pos(x + d10, y + topOffset, z + d11).tex(0.0D, d15).color(r, g, b, 1.0F*alphaMult).endVertex(); + worldrenderer.pos(x + d8, y + topOffset, z + d9).tex(1.0D, d15).color(r, g, b, 1.0F*alphaMult).endVertex(); + worldrenderer.pos(x + d8, y + bottomOffset, z + d9).tex(1.0D, d14).color(r, g, b, 1.0F).endVertex(); + worldrenderer.pos(x + d4, y + bottomOffset, z + d5).tex(0.0D, d14).color(r, g, b, 1.0F).endVertex(); + worldrenderer.pos(x + d4, y + topOffset, z + d5).tex(0.0D, d15).color(r, g, b, 1.0F*alphaMult).endVertex(); + tessellator.draw(); + + GlStateManager.disableCull(); + double d12 = -1.0D + d1; + double d13 = height + d12; + + worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR); + worldrenderer.pos(x + 0.2D, y + topOffset, z + 0.2D).tex(1.0D, d13).color(r, g, b, 0.25F*alphaMult).endVertex(); + worldrenderer.pos(x + 0.2D, y + bottomOffset, z + 0.2D).tex(1.0D, d12).color(r, g, b, 0.25F).endVertex(); + worldrenderer.pos(x + 0.8D, y + bottomOffset, z + 0.2D).tex(0.0D, d12).color(r, g, b, 0.25F).endVertex(); + worldrenderer.pos(x + 0.8D, y + topOffset, z + 0.2D).tex(0.0D, d13).color(r, g, b, 0.25F*alphaMult).endVertex(); + worldrenderer.pos(x + 0.8D, y + topOffset, z + 0.8D).tex(1.0D, d13).color(r, g, b, 0.25F*alphaMult).endVertex(); + worldrenderer.pos(x + 0.8D, y + bottomOffset, z + 0.8D).tex(1.0D, d12).color(r, g, b, 0.25F).endVertex(); + worldrenderer.pos(x + 0.2D, y + bottomOffset, z + 0.8D).tex(0.0D, d12).color(r, g, b, 0.25F).endVertex(); + worldrenderer.pos(x + 0.2D, y + topOffset, z + 0.8D).tex(0.0D, d13).color(r, g, b, 0.25F*alphaMult).endVertex(); + worldrenderer.pos(x + 0.8D, y + topOffset, z + 0.2D).tex(1.0D, d13).color(r, g, b, 0.25F*alphaMult).endVertex(); + worldrenderer.pos(x + 0.8D, y + bottomOffset, z + 0.2D).tex(1.0D, d12).color(r, g, b, 0.25F).endVertex(); + worldrenderer.pos(x + 0.8D, y + bottomOffset, z + 0.8D).tex(0.0D, d12).color(r, g, b, 0.25F).endVertex(); + worldrenderer.pos(x + 0.8D, y + topOffset, z + 0.8D).tex(0.0D, d13).color(r, g, b, 0.25F*alphaMult).endVertex(); + worldrenderer.pos(x + 0.2D, y + topOffset, z + 0.8D).tex(1.0D, d13).color(r, g, b, 0.25F*alphaMult).endVertex(); + worldrenderer.pos(x + 0.2D, y + bottomOffset, z + 0.8D).tex(1.0D, d12).color(r, g, b, 0.25F).endVertex(); + worldrenderer.pos(x + 0.2D, y + bottomOffset, z + 0.2D).tex(0.0D, d12).color(r, g, b, 0.25F).endVertex(); + worldrenderer.pos(x + 0.2D, y + topOffset, z + 0.2D).tex(0.0D, d13).color(r, g, b, 0.25F*alphaMult).endVertex(); + tessellator.draw(); + } + + @SubscribeEvent + public void onRenderLast(RenderWorldLastEvent event) { + if(!enabled) return; + + String location = SBInfo.getInstance().getLocation(); + if(location == null) return; + if(currentSoulList == null || currentSoulList.isEmpty()) return; + + Entity viewer = Minecraft.getMinecraft().getRenderViewEntity(); + double viewerX = viewer.lastTickPosX + (viewer.posX - viewer.lastTickPosX) * event.partialTicks; + double viewerY = viewer.lastTickPosY + (viewer.posY - viewer.lastTickPosY) * event.partialTicks; + double viewerZ = viewer.lastTickPosZ + (viewer.posZ - viewer.lastTickPosZ) * event.partialTicks; + + Vector3f aoteInterpPos = CustomItemEffects.INSTANCE.getCurrentPosition(); + if(aoteInterpPos != null) { + viewerX = aoteInterpPos.x; + viewerY = aoteInterpPos.y; + viewerZ = aoteInterpPos.z; + } + + Set found = foundSouls.computeIfAbsent(location, k -> new HashSet<>()); + + int rgb = 0xa839ce; + for(int i=0; i 10*10) { + renderBeaconBeam(x, y, z, rgb, 1.0f, event.partialTicks); + } + } + + GlStateManager.disableLighting(); + GlStateManager.enableTexture2D(); + GlStateManager.enableDepth(); + } + + public static class FairySoulsCommand extends SimpleCommand { + + public FairySoulsCommand() { + super("neusouls", new ProcessCommandRunnable() { + @Override + public void processCommand(ICommandSender sender, String[] args) { + if(args.length != 1) { + printHelp(); + return; + } + String subcommand = args[0].toLowerCase(); + + switch (subcommand) { + case "help": + printHelp(); + return; + case "on": + case "enable": + print(EnumChatFormatting.DARK_PURPLE+"Enabled fairy soul waypoints"); + enabled = true; + return; + case "off": + case "disable": + print(EnumChatFormatting.DARK_PURPLE+"Disabled fairy soul waypoints"); + enabled = false; + return; + case "clear": { + String location = SBInfo.getInstance().getLocation(); + if(currentSoulList == null || location == null) { + print(EnumChatFormatting.RED+"No fairy souls found in your current world"); + } else { + Set found = foundSouls.computeIfAbsent(location, k -> new HashSet<>()); + for(int i=0; i notifLen-fadeLen) { + alpha = (notifLen-delta)*255/fadeLen; + } + + if(alpha > 10) { + TextRenderUtils.drawStringCenteredScaledMaxWidth("Titanium has spawned nearby!", Minecraft.getMinecraft().fontRendererObj, + 0, 0, true, width/4-20, colour | (colour << 8) | (colour << 16) | (alpha << 24)); + } + + + GlStateManager.popMatrix(); + } + } + + public static Vector3f getCreeperColour() { + return new Vector3f(0, 1, 0); + } + + @SubscribeEvent + public void renderWorldLast(RenderWorldLastEvent event) { + if(overlayLoc == null) return; + + Entity viewer = Minecraft.getMinecraft().getRenderViewEntity(); + double viewerX = viewer.lastTickPosX + (viewer.posX - viewer.lastTickPosX) * event.partialTicks; + double viewerY = viewer.lastTickPosY + (viewer.posY - viewer.lastTickPosY) * event.partialTicks; + double viewerZ = viewer.lastTickPosZ + (viewer.posZ - viewer.lastTickPosZ) * event.partialTicks; + + AxisAlignedBB bb = new AxisAlignedBB( + overlayLoc.getX()-viewerX, + overlayLoc.getY()-viewerY, + overlayLoc.getZ()-viewerZ, + overlayLoc.getX()+1-viewerX, + overlayLoc.getY()+1-viewerY, + overlayLoc.getZ()+1-viewerZ).expand(0.01f, 0.01f, 0.01f); + + //181 / 195 / 135 + + GlStateManager.disableCull(); + CustomItemEffects.drawFilledBoundingBox(bb, 1f, SpecialColour.special(0, 100, 0xff0000)); + GlStateManager.enableCull(); + GlStateManager.enableTexture2D(); + } + + @SubscribeEvent + public void onLoadWorld(WorldEvent.Load event) { + overlayLoc = null; + } + + @SubscribeEvent + public void onChatRecevied(ClientChatReceivedEvent event) { + if(event.message.getFormattedText().startsWith("\u00A7e[NPC] \u00A7dPuzzler") && + event.message.getUnformattedText().contains(":")) { + String clean = Utils.cleanColour(event.message.getUnformattedText()); + clean = clean.split(":")[1].trim(); + + BlockPos pos = new BlockPos(181, 195, 135); + + for(int i=0; i 11) { - Utils.drawStringCenteredScaledMaxWidth("+" + (missing.size()-10) + " More", + Utils.drawStringCenteredScaledMaxWidth("Show All", Minecraft.getMinecraft().fontRendererObj, x+40, y+16+121, false, 70, new Color(80, 80, 80).getRGB()); + + 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 text = new ArrayList<>(); + StringBuilder line = new StringBuilder(); + int leftMaxSize = 0; + int middleMaxSize = 0; + for(int i=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) { +