diff options
author | BuildTools <james.jenour@protonmail.com> | 2021-07-19 16:19:14 +0800 |
---|---|---|
committer | BuildTools <james.jenour@protonmail.com> | 2021-07-19 16:19:14 +0800 |
commit | ff2829153c14e0f7ca655bfd4ef64bffae3212b2 (patch) | |
tree | c3855dbc8775fa082b101c5acd818dc63a306b36 /src/main | |
parent | 48f309c1676626e0c8d0128220e50e51247c9abb (diff) | |
download | NotEnoughUpdates-ff2829153c14e0f7ca655bfd4ef64bffae3212b2.tar.gz NotEnoughUpdates-ff2829153c14e0f7ca655bfd4ef64bffae3212b2.tar.bz2 NotEnoughUpdates-ff2829153c14e0f7ca655bfd4ef64bffae3212b2.zip |
PRE29
Diffstat (limited to 'src/main')
47 files changed, 1369 insertions, 143 deletions
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUEventListener.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUEventListener.java index 0c35c56c..7fa81a59 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUEventListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUEventListener.java @@ -320,7 +320,7 @@ public class NEUEventListener { if(neu.config.notifications.doRamNotif) { long maxMemoryMB = Runtime.getRuntime().maxMemory()/1024L/1024L; - if(maxMemoryMB > 4100 || true) { + if(maxMemoryMB > 4100) { notificationDisplayMillis = System.currentTimeMillis(); notificationLines = new ArrayList<>(); notificationLines.add(EnumChatFormatting.GRAY+"Too much memory allocated!"); @@ -447,21 +447,28 @@ public class NEUEventListener { Minecraft.getMinecraft().currentScreen instanceof GuiContainer && neu.overlay.isUsingMobsFilter()) { event.setCanceled(true); } + if(event.type != null && event.type.equals(RenderGameOverlayEvent.ElementType.PLAYER_LIST)) { + GlStateManager.enableDepth(); + } } @SubscribeEvent public void onRenderGameOverlayPost(RenderGameOverlayEvent.Post event) { - if(neu.hasSkyblockScoreboard() && event.type == RenderGameOverlayEvent.ElementType.ALL) { + if(neu.hasSkyblockScoreboard() && event.type.equals(RenderGameOverlayEvent.ElementType.ALL)) { DungeonWin.render(event.partialTicks); + GlStateManager.pushMatrix(); + GlStateManager.translate(0, 0, -200); for(TextOverlay overlay : OverlayManager.textOverlays) { if(OverlayManager.dontRenderOverlay != null && OverlayManager.dontRenderOverlay.isAssignableFrom(overlay.getClass())) { continue; } + GlStateManager.translate(0, 0, -1); + GlStateManager.enableDepth(); overlay.render(); } + GlStateManager.popMatrix(); OverlayManager.dontRenderOverlay = null; } - if(Keyboard.isKeyDown(Keyboard.KEY_X)) { notificationDisplayMillis = 0; } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java index ddef0828..d55bad48 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java @@ -1109,18 +1109,15 @@ public class NEUOverlay extends Gui { if(rarity1 < rarity2) return mult; if(rarity1 > rarity2) return -mult; } else if(getCompareMode() == COMPARE_MODE_VALUE) { - float cost1 = manager.auctionManager.getLowestBin(o1.get("internalname").getAsString()); - float cost2 = manager.auctionManager.getLowestBin(o2.get("internalname").getAsString()); + String internal1 = o1.get("internalname").getAsString(); + String internal2 = o2.get("internalname").getAsString(); - float craftCost1 = manager.auctionManager.getCraftCost(o1.get("internalname").getAsString()).craftCost; - float craftCost2 = manager.auctionManager.getCraftCost(o2.get("internalname").getAsString()).craftCost; + float cost1 = manager.auctionManager.getLowestBin(internal1); + float cost2 = manager.auctionManager.getLowestBin(internal2); - float diff = (cost1 - craftCost1) - (cost2 - craftCost2); - if(diff > 0) return mult; - if(diff < 0) return -mult; - /*if(cost1 < cost2) return mult; - if(cost1 > cost2) return -mult;*/ + if(cost1 < cost2) return mult; + if(cost1 > cost2) return -mult; } String i1 = o1.get("internalname").getAsString(); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java index 78bb6536..86a36f49 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java @@ -6,11 +6,16 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.mojang.authlib.Agent; +import com.mojang.authlib.minecraft.MinecraftSessionService; +import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; +import com.mojang.authlib.yggdrasil.YggdrasilUserAuthentication; import io.github.moulberry.notenoughupdates.auction.CustomAHGui; import io.github.moulberry.notenoughupdates.collectionlog.GuiCollectionLog; import io.github.moulberry.notenoughupdates.commands.SimpleCommand; import io.github.moulberry.notenoughupdates.core.BackgroundBlur; import io.github.moulberry.notenoughupdates.core.GuiScreenElementWrapper; +import io.github.moulberry.notenoughupdates.core.config.GuiPositionEditor; import io.github.moulberry.notenoughupdates.core.util.MiscUtils; import io.github.moulberry.notenoughupdates.cosmetics.CapeManager; import io.github.moulberry.notenoughupdates.cosmetics.GuiCosmetics; @@ -62,6 +67,8 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.text.WordUtils; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.impl.client.HttpClients; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.GL11; @@ -69,6 +76,7 @@ import java.awt.*; import java.awt.datatransfer.StringSelection; import java.io.*; import java.lang.management.ManagementFactory; +import java.net.Proxy; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.List; @@ -711,9 +719,10 @@ public class NotEnoughUpdates { private ScheduledExecutorService devES = Executors.newSingleThreadScheduledExecutor(); private static final String[] devFailStrings = {"No.", "I said no.", "You aren't allowed to use this.", - "Are you sure you want to use this? Type 'Yes' in chat.", "Lmao you thought", "Ok please stop", - "What do you want from me?", "This command almost certainly does nothing useful for you", - "Ok, this is the last message, after this it will repeat", "No.", "Dammit. I thought that would work. Uhh...", + "Are you sure you want to use this? Type 'Yes' in chat.", "Are you sure you want to use this? Type 'Yes' in chat.", + "Lmao you thought", "Ok please stop", "What do you want from me?", + "This command almost certainly does nothing useful for you", + "Ok, this is the last message, after this it will repeat", "No.", "I said no.", "Dammit. I thought that would work. Uhh...", "\u00a7dFrom \u00a7c[ADMIN] Minikloon\u00a77: If you use that command again, I'll have to ban you", "", "Ok, this is actually the last message, use the command again and you'll crash I promise"}; private int devFailIndex = 0; @@ -726,7 +735,7 @@ public class NotEnoughUpdates { throw new Error("L") { @Override public void printStackTrace() { - throw new Error("Double L"); + throw new Error("L"); } }; } @@ -750,9 +759,15 @@ public class NotEnoughUpdates { DupePOC.doDupe(args[0]); return; }*/ + if(args.length == 1 && args[0].equalsIgnoreCase("positiontest")) { + openGui = new GuiPositionEditor(); + return; + } + if(args.length == 2 && args[0].equalsIgnoreCase("pt")) { EnumParticleTypes t = EnumParticleTypes.valueOf(args[1]); FishingHelper.type = t; + return; } if(args.length == 1 && args[0].equalsIgnoreCase("dev")) { NotEnoughUpdates.INSTANCE.config.hidden.dev = true; @@ -1106,13 +1121,8 @@ public class NotEnoughUpdates { */ @EventHandler public void preinit(FMLPreInitializationEvent event) { - //if(!Minecraft.getMinecraft().getSession().getUsername().equalsIgnoreCase("moulberry")) throw new RuntimeException("moulbeBad"); - INSTANCE = this; - String uuid = Minecraft.getMinecraft().getSession().getPlayerID(); - if(uuid.equalsIgnoreCase("ea9b1c5a-bf68-4fa2-9492-2d4e69693228")) throw new RuntimeException("Ding-dong, racism is wrong."); - neuDir = new File(event.getModConfigurationDirectory(), "notenoughupdates"); neuDir.mkdirs(); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/BackgroundBlur.java b/src/main/java/io/github/moulberry/notenoughupdates/core/BackgroundBlur.java index a4001675..8a8655f9 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/core/BackgroundBlur.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/BackgroundBlur.java @@ -121,6 +121,7 @@ public class BackgroundBlur { if(event.type == RenderGameOverlayEvent.ElementType.ALL) { processBlurs(); } + Minecraft.getMinecraft().getFramebuffer().bindFramebuffer(false); } @SubscribeEvent @@ -215,9 +216,8 @@ public class BackgroundBlur { output.blurShaderVert.loadShader(0); GlStateManager.enableDepth(); GL11.glPopMatrix(); - - Minecraft.getMinecraft().getFramebuffer().bindFramebuffer(false); } + Minecraft.getMinecraft().getFramebuffer().bindFramebuffer(false); } public static void renderBlurredBackground(float blurStrength, int screenWidth, int screenHeight, diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementTextField.java b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementTextField.java index 658ab2f2..d221b37e 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementTextField.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementTextField.java @@ -495,7 +495,7 @@ public class GuiElementTextField { if(focus && System.currentTimeMillis()%1000>500) { String textNCBeforeCursor = textNoColor.substring(0, textField.getCursorPosition()+prependText.length()); int colorCodes = org.apache.commons.lang3.StringUtils.countMatches(textNCBeforeCursor, "\u00B6"); - String textBeforeCursor = text.substring(0, textField.getCursorPosition()+prependText.length()+(((options & COLOUR) != 0) ? colorCodes*2 : 0)); + String textBeforeCursor = text.substring(0, Math.min(text.length(), textField.getCursorPosition()+prependText.length()+(((options & COLOUR) != 0) ? colorCodes*2 : 0))); int numLinesBeforeCursor = org.apache.commons.lang3.StringUtils.countMatches(textBeforeCursor, "\n"); int yOff = numLinesBeforeCursor*extraSize; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/GuiPositionEditor.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/GuiPositionEditor.java new file mode 100644 index 00000000..a48f3f1a --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/GuiPositionEditor.java @@ -0,0 +1,115 @@ +package io.github.moulberry.notenoughupdates.core.config; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.gui.ScaledResolution; + +import java.io.IOException; + +public class GuiPositionEditor extends GuiScreen { + + public PositionNew position = new PositionNew(); + + public int clickedX; + public int clickedY; + + @Override + public void drawScreen(int mouseX, int mouseY, float partialTicks) { + super.drawDefaultBackground(); + + ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); + int width = scaledResolution.getScaledWidth(); + int height = scaledResolution.getScaledHeight(); + + int x = position.resolveX(scaledResolution, 200); + int y = position.resolveY(scaledResolution, 100); + + int centerWidth = 176; + int centerHeight = 166; + + float centerWF = centerWidth/2f / (float)width; + float centerHF = centerHeight/2f / (float)height; + + float left = 0; + float top = 0; + float right = 0; + float bottom = 0; + + switch(position.getAnchorX()) { + case MIN: { + left = 0; + right = 0.5f - centerWF; + break; + } + case MID: { + left = 0.5f - centerWF; + right = 0.5f + centerWF; + break; + } + case MAX: { + left = 0.5f + centerWF; + right = 1; + break; + } + } + switch(position.getAnchorY()) { + case MIN: { + top = 0; + bottom = 0.5f - centerHF; + break; + } + case MID: { + top = 0.5f - centerHF; + bottom = 0.5f + centerHF; + break; + } + case MAX: { + top = 0.5f + centerHF; + bottom = 1; + break; + } + } + + Gui.drawRect((int)(left*width), (int)(top*height), (int)(right*width), (int)(bottom*height), 0x40404040); + Gui.drawRect(x, y, x+200, y+100, 0x80404040); + } + + @Override + protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException { + ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); + int x = position.resolveX(scaledResolution, 200); + int y = position.resolveY(scaledResolution, 100); + + if(mouseX > x && mouseX < x+200 && + mouseY > y && mouseY < y+100) { + clickedX = mouseX; + clickedY = mouseY; + } else { + clickedX = -1; + clickedY = -1; + } + } + + @Override + protected void mouseReleased(int mouseX, int mouseY, int state) { + clickedX = -1; + clickedY = -1; + } + + @Override + protected void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) { + if(clickedX >= 0 && clickedY >= 0) { + int deltaX = mouseX - clickedX; + int deltaY = mouseY - clickedY; + + ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); + + deltaX = position.moveX(scaledResolution, deltaX, 200); + deltaY = position.moveY(scaledResolution, deltaY, 100); + + clickedX += deltaX; + clickedY += deltaY; + } + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/PositionNew.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/PositionNew.java new file mode 100644 index 00000000..842df73d --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/PositionNew.java @@ -0,0 +1,160 @@ +package io.github.moulberry.notenoughupdates.core.config; + +import com.google.gson.annotations.Expose; +import net.minecraft.client.gui.ScaledResolution; + +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; + +public class PositionNew { + + public enum Anchor { + MIN(0, 0, 0), + MID(0.5f, -0.5f, 0), + MAX(1f, -1f, 0), + GUI_MIN(0.5f, -1f, -0.5f), + GUI_MAX(0.5f, 0, 0.5f); + + float screenMult; + float elementMult; + float guiMult; + + Anchor(float screenMult, float elementMult, float guiMult) { + this.screenMult = screenMult; + this.elementMult = elementMult; + this.guiMult = guiMult; + } + } + + @Expose + private int x = 0; + @Expose + private int y = 0; + @Expose + private float scaleX = 1; + @Expose + private float scaleY = 1; + + @Expose + private Anchor anchorX = Anchor.MIN; + @Expose + private Anchor anchorY = Anchor.MIN; + + @Expose + private boolean pinned = false; + @Expose + private boolean allowPinToggle = true; + @Expose + private boolean allowResize = true; + + public PositionNew(int x, int y, int scaleX, int scaleY, Anchor anchorX, Anchor anchorY, boolean pinned, boolean allowPinToggle, boolean allowResize) { + this.x = x; + this.y = y; + this.scaleX = scaleX; + this.scaleY = scaleY; + this.anchorX = anchorX; + this.anchorY = anchorY; + this.pinned = pinned; + this.allowPinToggle = allowPinToggle; + this.allowResize = allowResize; + } + + protected PositionNew() { + } + + public int moveX(ScaledResolution scaledResolution, int deltaX, int sizeX) { + int originalX = resolveX(scaledResolution, sizeX); + AtomicInteger atomicInteger = new AtomicInteger(x+deltaX); + AtomicReference<Anchor> atomicReference = new AtomicReference<>(anchorX); + move(atomicInteger, atomicReference, anchorY, (int)Math.ceil(sizeX*scaleX), scaledResolution.getScaledWidth(), 176); + x = atomicInteger.get(); + anchorX = atomicReference.get(); + return resolveX(scaledResolution, sizeX) - originalX; + } + + public int moveY(ScaledResolution scaledResolution, int deltaY, int sizeY) { + int originalY = resolveY(scaledResolution, sizeY); + AtomicInteger atomicInteger = new AtomicInteger(y+deltaY); + AtomicReference<Anchor> atomicReference = new AtomicReference<>(anchorY); + move(atomicInteger, atomicReference, anchorY, (int)Math.ceil(sizeY*scaleY), scaledResolution.getScaledHeight(), 166); + y = atomicInteger.get(); + anchorY = atomicReference.get(); + return resolveY(scaledResolution, sizeY) - originalY; + } + + private void move(AtomicInteger coord, AtomicReference<Anchor> anchor, Anchor oppositeAnchor, int elementSize, int screenSize, int guiSize) { + int centerCoord = resolve(coord.get(), anchor.get(), elementSize, screenSize, guiSize) + elementSize/2; + + if(centerCoord < screenSize/2-guiSize/2) { + if(pinned && centerCoord > screenSize/4-guiSize/4 && oppositeAnchor == Anchor.MID) { + anchor.set(Anchor.GUI_MIN); + } else { + anchor.set(Anchor.MIN); + } + } else if(centerCoord > screenSize/2+guiSize/2) { + if(pinned && centerCoord < screenSize-(screenSize/4-guiSize/4) && oppositeAnchor == Anchor.MID) { + anchor.set(Anchor.GUI_MAX); + } else { + anchor.set(Anchor.MAX); + } + } else { + anchor.set(Anchor.MID); + } + + if(centerCoord - elementSize/2 < 0) centerCoord = elementSize/2; + if(centerCoord + elementSize/2 > screenSize) centerCoord = screenSize - elementSize/2; + + Anchor newAnchor = anchor.get(); + coord.set(Math.round(centerCoord - (elementSize*(newAnchor.elementMult+0.5f)) - screenSize*newAnchor.screenMult - guiSize*newAnchor.guiMult)); + } + + public int resolveX(ScaledResolution scaledResolution, int sizeX) { + return resolve(x, anchorX, (int)Math.ceil(sizeX*scaleX), scaledResolution.getScaledWidth(), 176); + } + + public int resolveY(ScaledResolution scaledResolution, int sizeY) { + return resolve(y, anchorY, (int)Math.ceil(sizeY*scaleY), scaledResolution.getScaledHeight(), 166); + } + + private int resolve(int coord, Anchor anchor, int elementSize, int screenSize, int guiSize) { + return Math.round(screenSize*anchor.screenMult + elementSize*anchor.elementMult + guiSize*anchor.guiMult + coord); + } + + public void setScaleX(float scaleX) { + if(allowResize) { + this.scaleX = scaleX; + } + } + + public void setScaleY(float scaleY) { + if(allowResize) { + this.scaleY = scaleY; + } + } + + public float getScaleX() { + return scaleX; + } + + public float getScaleY() { + return scaleY; + } + + public void setPinned(boolean pinned) { + if(allowPinToggle) { + this.pinned = pinned; + } + } + + public boolean isPinned() { + return pinned; + } + + public Anchor getAnchorX() { + return anchorX; + } + + public Anchor getAnchorY() { + return anchorY; + } +} 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 aeedd5d1..560cdf51 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/CapeManager.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/CapeManager.java @@ -211,24 +211,26 @@ public class CapeManager { public void onRenderPlayer(RenderPlayerEvent.Post e) { if(e.partialRenderTick == 1.0F) return; //rendering in inventory - String uuid = e.entityPlayer.getUniqueID().toString().replace("-", ""); - String clientUuid = Minecraft.getMinecraft().thePlayer.getUniqueID().toString().replace("-", ""); - - if(Minecraft.getMinecraft().thePlayer != null && uuid.equals(clientUuid)) { - String selCape = NotEnoughUpdates.INSTANCE.config.hidden.selectedCape; - if(selCape != null && !selCape.isEmpty()) { - if(localCape == null) { - localCape = new MutablePair<>(new NEUCape(selCape), selCape); - } else { - localCape.setValue(selCape); + try { + String uuid = e.entityPlayer.getUniqueID().toString().replace("-", ""); + String clientUuid = Minecraft.getMinecraft().thePlayer.getUniqueID().toString().replace("-", ""); + + if(Minecraft.getMinecraft().thePlayer != null && uuid.equals(clientUuid)) { + String selCape = NotEnoughUpdates.INSTANCE.config.hidden.selectedCape; + if(selCape != null && !selCape.isEmpty()) { + if(localCape == null) { + localCape = new MutablePair<>(new NEUCape(selCape), selCape); + } else { + localCape.setValue(selCape); + } } } - } - if(uuid.equals(clientUuid) && localCape != null && localCape.getRight() != null && !localCape.getRight().equals("null")) { - localCape.getLeft().onRenderPlayer(e); - } else if(capeMap.containsKey(uuid)) { - capeMap.get(uuid).getLeft().onRenderPlayer(e); - } + if(uuid.equals(clientUuid) && localCape != null && localCape.getRight() != null && !localCape.getRight().equals("null")) { + localCape.getLeft().onRenderPlayer(e); + } else if(capeMap.containsKey(uuid)) { + capeMap.get(uuid).getLeft().onRenderPlayer(e); + } + } catch(Exception ignored) {} } public static void onTickSlow() { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/BetterContainers.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/BetterContainers.java index 5af6e8bb..48601df3 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/BetterContainers.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/BetterContainers.java @@ -348,7 +348,7 @@ public class BetterContainers { return false; } - private static int getCTMIndex(boolean up, boolean right, boolean down, boolean left, boolean upleft, boolean upright, boolean downright, boolean downleft) { + public static int getCTMIndex(boolean up, boolean right, boolean down, boolean left, boolean upleft, boolean upright, boolean downright, boolean downleft) { if(up && right && down && left) { if(upleft && upright && downright && downleft) { return 26; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FishingHelper.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FishingHelper.java index 71fec1c7..32c64f4c 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FishingHelper.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/FishingHelper.java @@ -68,6 +68,10 @@ public class FishingHelper { private static final ResourceLocation FISHING_WARNING_EXCLAM = new ResourceLocation("notenoughupdates:fishing_warning_exclam.png"); public void onRenderBobber(EntityFishHook hook) { if(Minecraft.getMinecraft().thePlayer.fishEntity == hook && warningState != PlayerWarningState.NOTHING) { + + if(!NotEnoughUpdates.INSTANCE.config.fishing.incomingFishWarning && warningState == PlayerWarningState.FISH_INCOMING) return; + if(!NotEnoughUpdates.INSTANCE.config.fishing.incomingFishWarningR && warningState == PlayerWarningState.FISH_HOOKED) return; + GlStateManager.disableCull(); GlStateManager.disableLighting(); GL11.glDepthFunc(GL11.GL_ALWAYS); @@ -134,7 +138,7 @@ public class FishingHelper { if(Minecraft.getMinecraft().thePlayer != null && event.phase == TickEvent.Phase.END) { if(buildupSoundDelay > 0) buildupSoundDelay--; - if(NotEnoughUpdates.INSTANCE.config.fishing.incomingFishWarning) { + if(NotEnoughUpdates.INSTANCE.config.fishing.incomingFishWarning || NotEnoughUpdates.INSTANCE.config.fishing.incomingFishWarningR) { if(Minecraft.getMinecraft().thePlayer.fishEntity != null) { if(!pingDelayList.isEmpty()) { while(pingDelayList.size() > 5) pingDelayList.remove(pingDelayList.size()-1); @@ -270,7 +274,8 @@ public class FishingHelper { public boolean onSpawnParticle(EnumParticleTypes particleType, double x, double y, double z, double xOffset, double yOffset, double zOffset) { if(!NotEnoughUpdates.INSTANCE.config.fishing.hideOtherPlayerAll && !NotEnoughUpdates.INSTANCE.config.fishing.enableCustomParticles && - !NotEnoughUpdates.INSTANCE.config.fishing.incomingFishWarning) { + !NotEnoughUpdates.INSTANCE.config.fishing.incomingFishWarning && + !NotEnoughUpdates.INSTANCE.config.fishing.incomingFishWarningR) { return false; } if(hookEntities.isEmpty()) { @@ -340,12 +345,12 @@ public class FishingHelper { double delta = oldDistance - newDistance; if(newDistance < 0.2 || (delta > -0.1 && delta < 0.3)) { - if(NotEnoughUpdates.INSTANCE.config.fishing.incomingFishWarning && + if((NotEnoughUpdates.INSTANCE.config.fishing.incomingFishWarning || NotEnoughUpdates.INSTANCE.config.fishing.incomingFishWarningR) && Minecraft.getMinecraft().thePlayer.fishEntity != null && Minecraft.getMinecraft().thePlayer.fishEntity.getEntityId() == hookEntityId && chain.particleNum > 3) { - if(newDistance <= 0.2f + 0.1f*pingDelayTicks) { + if(newDistance <= 0.2f + 0.1f*pingDelayTicks && NotEnoughUpdates.INSTANCE.config.fishing.incomingFishWarningR) { if(NotEnoughUpdates.INSTANCE.config.fishing.incomingFishHookedSounds && hookedWarningStateTicks <= 0) { float vol = NotEnoughUpdates.INSTANCE.config.fishing.incomingFishHookedSoundsVol/100f; @@ -369,7 +374,7 @@ public class FishingHelper { } hookedWarningStateTicks = 12; - } else if(newDistance >= 0.4f + 0.1f*pingDelayTicks) { + } else if(newDistance >= 0.4f + 0.1f*pingDelayTicks && NotEnoughUpdates.INSTANCE.config.fishing.incomingFishWarning) { if(NotEnoughUpdates.INSTANCE.config.fishing.incomingFishIncSounds && buildupSoundDelay <= 0) { float vol = NotEnoughUpdates.INSTANCE.config.fishing.incomingFishIncSoundsVol/100f; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/ItemCooldowns.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/ItemCooldowns.java index 546f9d89..59b3d802 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/ItemCooldowns.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/ItemCooldowns.java @@ -109,12 +109,26 @@ public class ItemCooldowns { private static Pattern PICKAXE_COOLDOWN_LORE_REGEX = Pattern.compile("\\u00a78Cooldown: \\u00a7a(\\d+)s"); + private static boolean isPickaxe(String internalname) { + if(internalname == null) return false; + + if(internalname.endsWith("_PICKAXE")) { + return true; + } else if(internalname.contains("_DRILL_")) { + char lastChar = internalname.charAt(internalname.length()-1); + if(lastChar >= '0' && lastChar <= '9') { + return true; + } + } + return false; + } + private static void updatePickaxeCooldown() { if(pickaxeCooldown == -1) { for(ItemStack stack : Minecraft.getMinecraft().thePlayer.inventory.mainInventory) { if(stack != null && stack.hasTagCompound()) { String internalname = NotEnoughUpdates.INSTANCE.manager.getInternalNameForItem(stack); - if(internalname != null && (internalname.endsWith("_PICKAXE") || internalname.contains("_DRILL_"))) { + if(isPickaxe(internalname)) { for(String line : NotEnoughUpdates.INSTANCE.manager.getLoreFromNBT(stack.getTagCompound())) { Matcher matcher = PICKAXE_COOLDOWN_LORE_REGEX.matcher(line); if(matcher.find()) { @@ -154,7 +168,7 @@ public class ItemCooldowns { return -1; } - if(internalname.endsWith("_PICKAXE") || internalname.contains("_DRILL_")) { + if(isPickaxe(internalname)) { updatePickaxeCooldown(); if(pickaxeUseCooldownMillisRemaining < 0) { 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 e7f5c8e6..62a3a5d1 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PetInfoOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/PetInfoOverlay.java @@ -115,6 +115,7 @@ public class PetInfoOverlay extends TextOverlay { private static LinkedList<Float> xpGainQueue = new LinkedList<>(); private static float xpGainHourLast = -1; private static float xpGainHour = -1; + private static int pauseCountdown = 0; private static float xpGainHourSecondPet = -1; @@ -369,7 +370,15 @@ public class PetInfoOverlay extends TextOverlay { if(xpGain < 0) xpGain = 0; String xpGainString = EnumChatFormatting.AQUA + "XP/h: " + EnumChatFormatting.YELLOW + roundFloat(xpGain); - if(xpGain > 0 && xpGainHour == xpGainHourLast) xpGainString += EnumChatFormatting.RED + " (PAUSED)"; + if(!secondPet && xpGain > 0 && levelXp != levelXpLast) { + if(pauseCountdown <= 0) { + xpGainString += EnumChatFormatting.RED + " (PAUSED)"; + } else { + pauseCountdown--; + } + } else { + pauseCountdown = 60; + } String totalXpString = EnumChatFormatting.AQUA + "Total XP: " + EnumChatFormatting.YELLOW + roundFloat(currentPet.petLevel.totalXp); @@ -609,7 +618,7 @@ public class PetInfoOverlay extends TextOverlay { if(petItem) { ItemStack stack = NotEnoughUpdates.INSTANCE.manager.jsonToStack(entry.getValue()); - itemMap.put(stack.getDisplayName(), entry.getKey()); + itemMap.put(stack.getDisplayName().replace("\u00a7f\u00a7f", ""), entry.getKey()); } } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/SlotLocking.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/SlotLocking.java index 3c53c735..1925811d 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/SlotLocking.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/SlotLocking.java @@ -512,7 +512,9 @@ public class SlotLocking { y2 -= vec.y; } + GlStateManager.translate(0, 0, 200); drawLinkArrow((int)x1, (int)y1, (int)x2, (int)y2); + GlStateManager.translate(0, 0, -200); } } else if(NotEnoughUpdates.INSTANCE.config.slotLocking.enableSlotBinding && slot.getSlotIndex() < 8 && pairingSlot != null && lockKeyHeld) { if(!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/StorageManager.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/StorageManager.java index 53607fae..37a60b1b 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/StorageManager.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/StorageManager.java @@ -150,6 +150,7 @@ public class StorageManager { public ItemStack backpackDisplayStack; public String customTitle; public int rows = -1; + public boolean[] shouldDarkenIfNotSelected = new boolean[45]; public transient boolean matchesSearch; public transient int searchedId; @@ -185,7 +186,7 @@ public class StorageManager { private boolean shouldRenderStorageOverlayCached = false; - private static final Pattern WINDOW_REGEX = Pattern.compile(".+ Backpack \\((\\d+)/(\\d+)\\)"); + private static final Pattern WINDOW_REGEX = Pattern.compile(".+ Backpack (?:\u2726 )?\\((\\d+)/(\\d+)\\)"); private static final Pattern ECHEST_WINDOW_REGEX = Pattern.compile("Ender Chest \\((\\d+)/(\\d+)\\)"); public void loadConfig(File file) { @@ -313,7 +314,7 @@ public class StorageManager { public void sendToPage(int page) { if(desiredStoragePage != getCurrentPageId() && - System.currentTimeMillis() - storageOpenSwitchMillis < 1000) return; + System.currentTimeMillis() - storageOpenSwitchMillis < 100) return; if(getCurrentPageId() == page) return; if(page == 0) { @@ -325,6 +326,44 @@ public class StorageManager { sendMouseClick(getCurrentWindowId(), 27+page-MAX_ENDER_CHEST_PAGES); } } else { + boolean onEnderchest = page < MAX_ENDER_CHEST_PAGES && currentStoragePage < MAX_ENDER_CHEST_PAGES; + boolean onStorage = page >= MAX_ENDER_CHEST_PAGES && currentStoragePage >= MAX_ENDER_CHEST_PAGES; + if(currentStoragePage >= 0 && (onEnderchest || (onStorage))) { + int currentPageDisplay = getDisplayIdForStorageId(currentStoragePage); + int desiredPageDisplay = getDisplayIdForStorageId(page); + + if(onEnderchest && desiredPageDisplay > currentPageDisplay) { + boolean isLastPage = true; + for(int pageN=page+1; pageN<MAX_ENDER_CHEST_PAGES; pageN++) { + if(getDisplayIdForStorageId(pageN) >= 0) { + isLastPage = false; + break; + } + } + if(isLastPage) { + sendMouseClick(getCurrentWindowId(), 8); + return; + } + } + + if(onStorage && page == MAX_ENDER_CHEST_PAGES) { + sendMouseClick(getCurrentWindowId(), 5); + return; + } else if(onStorage && desiredPageDisplay == storageConfig.displayToStorageIdMap.size()-1) { + sendMouseClick(getCurrentWindowId(), 8); + return; + } else { + int delta = desiredPageDisplay - currentPageDisplay; + if(delta == -1) { + sendMouseClick(getCurrentWindowId(), 6); + return; + } else if(delta == 1) { + sendMouseClick(getCurrentWindowId(), 7); + return; + } + } + } + storageOpenSwitchMillis = System.currentTimeMillis(); desiredStoragePage = page; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiCustomEnchant.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiCustomEnchant.java index f3cb2ed9..d32d74af 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiCustomEnchant.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiCustomEnchant.java @@ -199,9 +199,12 @@ public class GuiCustomEnchant extends Gui { } public boolean shouldOverride(String containerName) { + shouldOverrideFast = false; + if(true) return shouldOverrideFast; + shouldOverrideFast = containerName != null && NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard() && - containerName.equalsIgnoreCase("Enchant Item") && !Keyboard.isKeyDown(Keyboard.KEY_K); + containerName.equalsIgnoreCase("Enchant Item"); if(!shouldOverrideFast) { currentState = EnchantState.NO_ITEM; applicable.clear(); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/InventoryStorageSelector.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/InventoryStorageSelector.java index 32a7c76a..4119c87b 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/InventoryStorageSelector.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/InventoryStorageSelector.java @@ -6,8 +6,10 @@ import io.github.moulberry.notenoughupdates.miscfeatures.StorageManager; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.entity.RenderItem; import net.minecraft.client.settings.KeyBinding; import net.minecraft.init.Blocks; import net.minecraft.item.Item; @@ -25,6 +27,7 @@ public class InventoryStorageSelector { private static final InventoryStorageSelector INSTANCE = new InventoryStorageSelector(); private static final ResourceLocation ICONS = new ResourceLocation("notenoughupdates:storage_gui/hotbar_icons.png"); + private static final ResourceLocation STORAGE_PANE_CTM_TEXTURE = new ResourceLocation("notenoughupdates:storage_gui/storage_gui_pane_ctm.png"); public boolean isOverridingSlot = false; public int selectedIndex = 0; @@ -178,7 +181,8 @@ public class InventoryStorageSelector { return 0; } - if(resultantSlot == 0 && direction == -1 && !isOverridingSlot) { + if(NotEnoughUpdates.INSTANCE.config.storageGUI.scrollToBackpack && + resultantSlot == 0 && direction == -1 && !isOverridingSlot) { isOverridingSlot = true; Minecraft.getMinecraft().getItemRenderer().resetEquippedProgress(); return 0; @@ -186,7 +190,8 @@ public class InventoryStorageSelector { isOverridingSlot = false; Minecraft.getMinecraft().getItemRenderer().resetEquippedProgress(); return 0; - } else if(resultantSlot == 8 && direction == 1 && !isOverridingSlot) { + } else if(NotEnoughUpdates.INSTANCE.config.storageGUI.scrollToBackpack && + resultantSlot == 8 && direction == 1 && !isOverridingSlot) { isOverridingSlot = true; Minecraft.getMinecraft().getItemRenderer().resetEquippedProgress(); return 0; @@ -262,7 +267,7 @@ public class InventoryStorageSelector { ResourceLocation storagePreviewTexture = StorageOverlay.STORAGE_PREVIEW_TEXTURES[NotEnoughUpdates.INSTANCE.config.storageGUI.displayStyle]; int startX = centerX - 172/2; - int startY = height - 70 - (10+18*rows); + int startY = height - 80 - (10+18*rows); GlStateManager.translate(0, 0, 100); GL11.glDepthMask(false); @@ -278,19 +283,127 @@ public class InventoryStorageSelector { GL11.glDepthMask(true); + int[] isPaneCache = new int[rows*9]; + int[] ctmIndexCache = new int[rows*9]; + for(int i=0; i<rows*9; i++) { ItemStack stack = page.items[i]; if(stack != null) { - Utils.drawItemStack(stack, startX+8+18*(i%9), startY+8+18*(i/9)); + int itemX = startX+8+18*(i%9); + int itemY = startY+8+18*(i/9); + + int paneType = StorageOverlay.getPaneType(stack, i, isPaneCache); + if(paneType > 0) { + GlStateManager.disableAlpha(); + Gui.drawRect(itemX-1, itemY-1, itemX+17, itemY+17, 0x01000000); + GlStateManager.enableAlpha(); + + int ctmIndex = StorageOverlay.getCTMIndex(page, i, isPaneCache, ctmIndexCache); + int startCTMX = (ctmIndex%12)*19; + int startCTMY = (ctmIndex/12)*19; + + ctmIndexCache[i] = ctmIndex; + + if(paneType != 17) { + int rgb = StorageOverlay.getRGBFromPane(paneType-1); + { + int a = (rgb >> 24) & 0xFF; + int r = (rgb >> 16) & 0xFF; + int g = (rgb >> 8) & 0xFF; + int b = rgb & 0xFF; + Minecraft.getMinecraft().getTextureManager().bindTexture(STORAGE_PANE_CTM_TEXTURE); + GlStateManager.color(r/255f, g/255f, b/255f, a/255f); + Utils.drawTexturedRect(itemX-1, itemY-1, 18, 18, + startCTMX/227f, (startCTMX+18)/227f, startCTMY/75f, (startCTMY+18)/75f, GL11.GL_NEAREST); + } + + RenderItem itemRender = Minecraft.getMinecraft().getRenderItem(); + itemRender.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRendererObj, stack, itemX, itemY, null); + GlStateManager.disableLighting(); + } + + page.shouldDarkenIfNotSelected[i] = false; + continue; + } else { + int upIndex = i-9; + int leftIndex = i%9 > 0 ? i-1 : -1; + int rightIndex = i%9 < 8 ? i+1 : -1; + int downIndex = i+9; + + int[] indexArr = {rightIndex, downIndex, leftIndex, upIndex}; + + for(int j=0; j<4; j++) { + int index = indexArr[j]; + int type = index >= 0 && index < isPaneCache.length ? StorageOverlay.getPaneType(page.items[index], index, isPaneCache) : -1; + if(type > 0) { + int ctmIndex = StorageOverlay.getCTMIndex(page, index, isPaneCache, ctmIndexCache); + if(ctmIndex < 0) continue; + + boolean renderConnection; + boolean horizontal = ctmIndex == 1 || ctmIndex == 2 || ctmIndex == 3; + boolean vertical = ctmIndex == 12 || ctmIndex == 24 || ctmIndex == 36; + if((i%9 == 0 && index%9 == 0) || (i%9 == 8 && index%9 == 8)) { + renderConnection = horizontal || vertical; + } else if(index == leftIndex || index == rightIndex) { + renderConnection = horizontal; + } else { + renderConnection = vertical; + } + + if(renderConnection) { + Minecraft.getMinecraft().getTextureManager().bindTexture(STORAGE_PANE_CTM_TEXTURE); + int rgb = StorageOverlay.getRGBFromPane(type-1); + int a = (rgb >> 24) & 0xFF; + int r = (rgb >> 16) & 0xFF; + int g = (rgb >> 8) & 0xFF; + int b = rgb & 0xFF; + GlStateManager.color(r/255f, g/255f, b/255f, a/255f); + + GlStateManager.pushMatrix(); + GlStateManager.translate(itemX-1+9, itemY-1+9, 10); + GlStateManager.rotate(j*90, 0, 0, 1); + GlStateManager.enableAlpha(); + GlStateManager.disableLighting(); + + boolean horzFlip = false; + boolean vertFlip = false; + + if(index == leftIndex) { + vertFlip = true; + } else if(index == downIndex) { + vertFlip = true; + } + + Utils.drawTexturedRect(0, -9, 8, 18, + !horzFlip ? 209/227f : 219/227f, horzFlip ? 227/227f : 217/227f, + !vertFlip ? 57/75f : 75f/75f, vertFlip ? 57/75f : 75f/75f, GL11.GL_NEAREST); + Utils.drawTexturedRect(8, -9, 10, 18, + !horzFlip ? 217/227f : 209/227f, horzFlip ? 219/227f : 227/227f, + !vertFlip ? 57/75f : 75f/75f, vertFlip ? 57/75f : 75f/75f, GL11.GL_NEAREST); + + GlStateManager.popMatrix(); + } + } + } + } + + GlStateManager.translate(0, 0, 20); + Utils.drawItemStack(stack, itemX, itemY); + GlStateManager.translate(0, 0, -20); } } - ItemStack named = getNamedHeldItemOverride(); + String pageTitle; + if(page.customTitle != null && !page.customTitle.isEmpty()) { + pageTitle = page.customTitle; + } else { + pageTitle = getNamedHeldItemOverride().getDisplayName(); + } Utils.drawItemStack(held, centerX-8, startY-8); GlStateManager.translate(0, 0, 100); - Utils.drawStringCentered(named.getDisplayName(), fontRendererObj, centerX, height - 66, true, 0xffff0000); + Utils.drawStringCentered(pageTitle, fontRendererObj, centerX, height - 76, true, 0xffff0000); int keyCode = NotEnoughUpdates.INSTANCE.config.storageGUI.backpackScrollKey; if(KeybindHelper.isKeyValid(keyCode) && !KeybindHelper.isKeyDown(keyCode)) { String keyName = KeybindHelper.getKeyName(keyCode); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/StorageOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/StorageOverlay.java index 24a4f413..b8d6dc38 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/StorageOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/StorageOverlay.java @@ -2,14 +2,13 @@ package io.github.moulberry.notenoughupdates.miscgui; import com.google.common.collect.Lists; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; -import io.github.moulberry.notenoughupdates.core.BackgroundBlur; -import io.github.moulberry.notenoughupdates.core.GlScissorStack; -import io.github.moulberry.notenoughupdates.core.GuiElement; -import io.github.moulberry.notenoughupdates.core.GuiElementTextField; +import io.github.moulberry.notenoughupdates.core.*; import io.github.moulberry.notenoughupdates.core.config.KeybindHelper; import io.github.moulberry.notenoughupdates.core.util.lerp.LerpingInteger; +import io.github.moulberry.notenoughupdates.miscfeatures.BetterContainers; import io.github.moulberry.notenoughupdates.miscfeatures.SlotLocking; import io.github.moulberry.notenoughupdates.miscfeatures.StorageManager; +import io.github.moulberry.notenoughupdates.util.SpecialColour; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; @@ -19,6 +18,10 @@ 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.OpenGlHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.shader.Framebuffer; import net.minecraft.init.Blocks; import net.minecraft.init.Items; @@ -31,14 +34,14 @@ import net.minecraft.util.ResourceLocation; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL14; import org.lwjgl.util.vector.Vector2f; +import org.lwjgl.util.vector.Vector4f; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.awt.*; -import java.util.HashSet; +import java.util.*; import java.util.List; -import java.util.Map; -import java.util.Set; public class StorageOverlay extends GuiElement { @@ -53,7 +56,9 @@ public class StorageOverlay extends GuiElement { public static final ResourceLocation STORAGE_PREVIEW_TEXTURES[] = new ResourceLocation[4]; private static final ResourceLocation STORAGE_TEXTURES[] = new ResourceLocation[4]; private static final ResourceLocation STORAGE_ICONS_TEXTURE = new ResourceLocation("notenoughupdates:storage_gui/storage_icons.png"); + private static final ResourceLocation STORAGE_PANE_CTM_TEXTURE = new ResourceLocation("notenoughupdates:storage_gui/storage_gui_pane_ctm.png"); private static final ResourceLocation[] LOAD_CIRCLE_SEQ = new ResourceLocation[11]; + private static final ResourceLocation[] NOT_RICKROLL_SEQ = new ResourceLocation[19]; static { for(int i=0; i<STORAGE_TEXTURES.length; i++) { STORAGE_TEXTURES[i] = new ResourceLocation("notenoughupdates:storage_gui/storage_gui_"+i+".png"); @@ -62,6 +67,10 @@ public class StorageOverlay extends GuiElement { STORAGE_PREVIEW_TEXTURES[i] = new ResourceLocation("notenoughupdates:storage_gui/storage_preview_"+i+".png"); } + for(int i=0; i<NOT_RICKROLL_SEQ.length; i++) { + NOT_RICKROLL_SEQ[i] = new ResourceLocation("notenoughupdates:storage_gui/we_do_a_little_rolling/"+i+".jpg"); + } + LOAD_CIRCLE_SEQ[0] = new ResourceLocation("notenoughupdates:loading_circle_seq/1.png"); LOAD_CIRCLE_SEQ[1] = new ResourceLocation("notenoughupdates:loading_circle_seq/1.png"); LOAD_CIRCLE_SEQ[2] = new ResourceLocation("notenoughupdates:loading_circle_seq/2.png"); @@ -79,14 +88,20 @@ public class StorageOverlay extends GuiElement { private GuiElementTextField searchBar = new GuiElementTextField("", 88, 10, GuiElementTextField.SCALE_TEXT | GuiElementTextField.DISABLE_BG); + private GuiElementTextField renameStorageField = new GuiElementTextField("", 100, 13, + GuiElementTextField.COLOUR); + + private int editingNameId = -1; private int guiLeft; private int guiTop; private int loadCircleIndex = 0; + private int rollIndex = 0; private int loadCircleRotation = 0; private long millisAccumIndex = 0; + private long millisAccumRoll = 0; private long millisAccumRotation = 0; private long lastMillis = 0; @@ -94,6 +109,9 @@ public class StorageOverlay extends GuiElement { private int scrollVelocity = 0; private long lastScroll = 0; + private int[][] isPaneCaches = new int[40][]; + private int[][] ctmIndexCaches = new int[40][]; + private int desiredHeightSwitch = -1; private int desiredHeightMX = -1; private int desiredHeightMY = -1; @@ -106,10 +124,19 @@ public class StorageOverlay extends GuiElement { private int getMaximumScroll() { synchronized(StorageManager.getInstance().storageConfig.displayToStorageIdMap) { - int lastDisplayId = StorageManager.getInstance().storageConfig.displayToStorageIdMap.size()-1; - int coords = (int)Math.ceil(lastDisplayId/3f)*3+3; - return getPageCoords(coords).y+scroll.getValue()-getStorageViewSize()-14; + int maxH = 0; + + for(int i=0; i<3; i++) { + int lastDisplayId = StorageManager.getInstance().storageConfig.displayToStorageIdMap.size()-1; + int coords = (int)Math.ceil(lastDisplayId/3f)*3+1+i; + + int h = getPageCoords(coords).y+scroll.getValue()-getStorageViewSize()-14; + + if(h > maxH) maxH = h; + } + + return maxH; } } @@ -161,6 +188,8 @@ public class StorageOverlay extends GuiElement { @Override public void render() { if(!(Minecraft.getMinecraft().currentScreen instanceof GuiChest)) return; + GuiChest guiChest = (GuiChest) Minecraft.getMinecraft().currentScreen; + ContainerChest containerChest = (ContainerChest) guiChest.inventorySlots; ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); int width = scaledResolution.getScaledWidth(); @@ -196,10 +225,15 @@ public class StorageOverlay extends GuiElement { millisAccumRotation += deltaTime; loadCircleRotation += millisAccumRotation / (1000/107); millisAccumRotation %= (1000/107); + + millisAccumRoll += deltaTime; + rollIndex += millisAccumRoll/100; + millisAccumRoll %= 100; } lastMillis = currentTime; loadCircleIndex %= LOAD_CIRCLE_SEQ.length; + rollIndex %= NOT_RICKROLL_SEQ.length*2; loadCircleRotation %= 360; Color loadCircleColour = Color.getHSBColor(loadCircleRotation/360f, 0.3f, 0.9f); @@ -283,9 +317,14 @@ public class StorageOverlay extends GuiElement { GlStateManager.enableDepth(); GlStateManager.translate(0, startY, 107.0001f); framebuffer.bindFramebufferTexture(); + GlStateManager.color(1, 1, 1, 1); + GlStateManager.enableAlpha(); + GlStateManager.alphaFunc(GL11.GL_GREATER, 0F); Utils.drawTexturedRect(0, 0, w, h, 0, 1, 1, 0, GL11.GL_NEAREST); + GlStateManager.alphaFunc(GL11.GL_GREATER, 0.1F); + renderEnchOverlay(enchantGlintRenderLocations); GlStateManager.translate(0, -startY, -107.0001f); @@ -338,22 +377,190 @@ public class StorageOverlay extends GuiElement { if(page != null && page.rows > 0) { int rows = page.rows; + isPaneCaches[storageId] = new int[page.rows*9]; + ctmIndexCaches[storageId] = new int[page.rows*9]; + int[] isPaneCache = isPaneCaches[storageId]; + int[] ctmIndexCache = ctmIndexCaches[storageId]; + for(int k=0; k<rows*9; k++) { - ItemStack stack = page.items[k]; + ItemStack stack; - if(stack == null) continue; + if(storageId == currentPage) { + stack = containerChest.getSlot(k+9).getStack(); + } else { + stack = page.items[k]; + } int itemX = storageX+1+18*(k%9); int itemY = storageY+1+18*(k/9); + //Render fancy glass + if(stack != null) { + int paneType = getPaneType(stack, k, isPaneCache); + if(paneType > 0) { + GlStateManager.disableAlpha(); + Gui.drawRect(itemX-1, itemY-1, itemX+17, itemY+17, 0x01000000); + GlStateManager.enableAlpha(); + + int ctmIndex = getCTMIndex(page, k, isPaneCache, ctmIndexCache); + int startCTMX = (ctmIndex%12)*19; + int startCTMY = (ctmIndex/12)*19; + + ctmIndexCache[k] = ctmIndex; + + if(paneType != 17) { + int rgb = getRGBFromPane(paneType-1); + { + int a = (rgb >> 24) & 0xFF; + int r = (rgb >> 16) & 0xFF; + int g = (rgb >> 8) & 0xFF; + int b = rgb & 0xFF; + Minecraft.getMinecraft().getTextureManager().bindTexture(STORAGE_PANE_CTM_TEXTURE); + GlStateManager.color(r/255f, g/255f, b/255f, a/255f); + Utils.drawTexturedRect(itemX-1, itemY-1, 18, 18, + startCTMX/227f, (startCTMX+18)/227f, startCTMY/75f, (startCTMY+18)/75f, GL11.GL_NEAREST); + } + + /*int[] colours = new int[9]; + + for(int xi=-1; xi<=1; xi++) { + for(int yi=-1; yi<=1; yi++) { + List<Integer> indexes = new ArrayList<>(); + List<Integer> coloursList = new ArrayList<>(); + coloursList.add(rgb); + + if(xi != 0) { + indexes.add(k+xi); + } + if(yi != 0) { + indexes.add(k+yi*9); + } + if(xi != 0 && yi != 0) { + indexes.add(k+yi*9+xi); + } + for(int index : indexes) { + if(index >= 0 && index < rows*9) { + int paneTypeI = getPaneType(page.items[index], index, isPaneCache); + if(shouldConnect(paneType, paneTypeI)) { + coloursList.add(getRGBFromPane(paneTypeI-1)); + } + } + } + Vector4f cv = new Vector4f(); + for(int colour : coloursList) { + float a = (colour >> 24) & 0xFF; + float r = (colour >> 16) & 0xFF; + float g = (colour >> 8) & 0xFF; + float b = colour & 0xFF; + cv.x += a/coloursList.size(); + cv.y += r/coloursList.size(); + cv.z += g/coloursList.size(); + cv.w += b/coloursList.size(); + } + int finalCol = (((int)cv.x) << 24) | (((int)cv.y) << 16) | (((int)cv.z) << 8) | ((int)cv.w); + colours[(xi+1)+(yi+1)*3] = finalCol; + } + } + int[] colours4 = new int[16]; + + for(int x=0; x<4; x++) { + for(int y=0; y<4; y++) { + int ya = y < 2 ? y : y-1; + int xa = x < 2 ? x : x-1; + colours4[x+y*4] = colours[xa+ya*3]; + } + } + + GlStateManager.pushMatrix(); + GlStateManager.translate(itemX-1, itemY-1, 0); + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer worldrenderer = tessellator.getWorldRenderer(); + worldrenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX_COLOR); + float uMinCTM = startCTMX/227f; + float uMaxCTM = (startCTMX+18)/227f; + float vMinCTM = startCTMY/75f; + float vMaxCTM = (startCTMY+18)/75f; + for(int xi=-1; xi<=1; xi++) { + for(int yi = -1; yi <= 1; yi++) { + float x = xi == -1 ? 0 : xi == 0 ? 1 : 17; + float y = yi == -1 ? 0 : yi == 0 ? 1 : 17; + float w = xi == 0 ? 16 : 1; + float h = yi == 0 ? 16 : 1; + + int col1 = colours4[(xi+1)+(yi+1)*4]; + int col2 = colours4[(xi+2)+(yi+1)*4]; + int col3 = colours4[(xi+1)+(yi+2)*4]; + int col4 = colours4[(xi+2)+(yi+2)*4]; + + worldrenderer + .pos(x, y+h, 0.0D) + .tex(uMinCTM + (uMaxCTM - uMinCTM) * x/18f, vMinCTM+(vMaxCTM-vMinCTM)*(y+h)/18f) + .color((col3 >> 16) & 0xFF, (col3 >> 8) & 0xFF, col3 & 0xFF, (col3 >> 24) & 0xFF).endVertex(); + worldrenderer + .pos(x+w, y+h, 0.0D) + .tex(uMinCTM+(uMaxCTM-uMinCTM)*(x+w)/18f, vMinCTM+(vMaxCTM-vMinCTM)*(y+h)/18f) + .color((col4 >> 16) & 0xFF, (col4 >> 8) & 0xFF, col4 & 0xFF, (col4 >> 24) & 0xFF).endVertex(); + worldrenderer + .pos(x+w, y, 0.0D) + .tex(uMinCTM+(uMaxCTM-uMinCTM)*(x+w)/18f, vMinCTM+(vMaxCTM-vMinCTM)*y/18f) + .color((col2 >> 16) & 0xFF, (col2 >> 8) & 0xFF, col2 & 0xFF, (col2 >> 24) & 0xFF).endVertex(); + worldrenderer + .pos(x, y, 0.0D) + .tex(uMinCTM + (uMaxCTM - uMinCTM) * x/18f, vMinCTM+(vMaxCTM-vMinCTM)*y/18f) + .color((col1 >> 16) & 0xFF, (col1 >> 8) & 0xFF, col1 & 0xFF, (col1 >> 24) & 0xFF).endVertex(); + } + } + GlStateManager.disableDepth(); + GlStateManager.color(1, 1, 1, 1); + GlStateManager.shadeModel(GL11.GL_SMOOTH); + tessellator.draw(); + GlStateManager.shadeModel(GL11.GL_FLAT); + GlStateManager.enableDepth(); + GlStateManager.popMatrix();*/ + + RenderItem itemRender = Minecraft.getMinecraft().getRenderItem(); + itemRender.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRendererObj, stack, itemX, itemY, null); + GlStateManager.disableLighting(); + } + + page.shouldDarkenIfNotSelected[k] = false; + continue; + } + } + page.shouldDarkenIfNotSelected[k] = true; + + //Render item + GlStateManager.translate(0, 0, 20); if(doRenderFramebuffer) { - Utils.drawItemStackWithoutGlint(stack, itemX, itemY); - if(stack.hasEffect() || stack.getItem() == Items.enchanted_book) { + GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0); + GL14.glBlendFuncSeparate(GL11.GL_ONE, GL11.GL_ZERO, GL11.GL_ONE, GL11.GL_ZERO); + + if(storageId == currentPage) { + Utils.hasEffectOverride = true; + GlStateManager.translate(storageX-7, storageY-17-18, 0); + guiChest.drawSlot(containerChest.getSlot(k+9)); + GlStateManager.translate(-storageX+7, -storageY+17+18, 0); + Utils.hasEffectOverride = false; + } else { + Utils.drawItemStackWithoutGlint(stack, itemX, itemY); + } + + GL14.glBlendFuncSeparate(770, 771, 1, 0); + + if(stack != null && (stack.hasEffect() || stack.getItem() == Items.enchanted_book)) { enchantGlintRenderLocations.add(new Vector2f(itemX, itemY-startY)); } + } else if(storageId == currentPage) { + Utils.hasEffectOverride = true; + GlStateManager.translate(storageX-7, storageY-17-18, 0); + guiChest.drawSlot(containerChest.getSlot(k+9)); + GlStateManager.translate(-storageX+7, -storageY+17+18, 0); + Utils.hasEffectOverride = false; } else { Utils.drawItemStack(stack, itemX, itemY); } + GlStateManager.disableLighting(); + GlStateManager.translate(0, 0, -20); } GlStateManager.disableLighting(); @@ -386,25 +593,26 @@ public class StorageOverlay extends GuiElement { StorageManager.StoragePage page = StorageManager.getInstance().getPage(storageId, false); - String pageTitle; - if(storageId < 9) { - pageTitle = "Ender Chest Page " + (storageId + 1); - } else if(page.customTitle != null && !page.customTitle.isEmpty()) { - pageTitle = page.customTitle; - } else if(page != null && page.backpackDisplayStack != null) { - pageTitle = page.backpackDisplayStack.getDisplayName(); + if(editingNameId == storageId) { + int len = fontRendererObj.getStringWidth(renameStorageField.getTextDisplay())+10; + renameStorageField.setSize(len, 12); + renameStorageField.render(storageX, storageY-13); } else { - pageTitle = "Backpack Slot "+(storageId-8); - } - int titleLen = fontRendererObj.getStringWidth(pageTitle); - fontRendererObj.drawString(pageTitle, storageX, storageY-11, textColour); + String pageTitle; + if(page.customTitle != null && !page.customTitle.isEmpty()) { + pageTitle = Utils.chromaStringByColourCode(page.customTitle); + } else if(entry.getValue() < 9) { + pageTitle = "Ender Chest Page " + (entry.getValue() + 1); + } else { + pageTitle = "Backpack Slot "+(storageId-8); + } + int titleLen = fontRendererObj.getStringWidth(pageTitle); - if(mouseX >= storageX && mouseX <= storageX+titleLen+15 && - mouseY >= storageY-14 && mouseY <= storageY+1) { - Minecraft.getMinecraft().getTextureManager().bindTexture(storageTexture); - GlStateManager.color(1, 1, 1, 1); - Utils.drawTexturedRect(storageX+titleLen, storageY-14, 15, 15, - 24/600f, 39/600f, 250/400f, 265/ 400f, GL11.GL_NEAREST); + if(mouseX >= guiLeft+storageX && mouseX <= guiLeft+storageX+titleLen+15 && + mouseY >= guiTop+storageY-14 && mouseY <= guiTop+storageY+1) { + pageTitle += " \u270E"; + } + fontRendererObj.drawString(pageTitle, storageX, storageY-11, textColour); } if(page == null) { @@ -440,24 +648,137 @@ public class StorageOverlay extends GuiElement { int storageW = 162; int storageH = 18*rows; + GlStateManager.enableDepth(); + + boolean[] shouldLimitBorder = new boolean[rows*9]; + boolean hasCaches = isPaneCaches[storageId] != null && isPaneCaches[storageId].length == rows*9 && + ctmIndexCaches[storageId] != null && ctmIndexCaches[storageId].length == rows*9; + + //Render item connections + for(int k=0; k<rows*9; k++) { + ItemStack stack = page.items[k]; + + if(stack != null && hasCaches) { + int itemX = storageX+1+18*(k%9); + int itemY = storageY+1+18*(k/9); + + int[] isPaneCache = isPaneCaches[storageId]; + int[] ctmIndexCache = ctmIndexCaches[storageId]; + + if(isPaneCache[k] == 17) { + int ctmIndex = getCTMIndex(page, k, isPaneCache, ctmIndexCache); + int startCTMX = (ctmIndex%12)*19; + int startCTMY = (ctmIndex/12)*19; + + int rgb = getRGBFromPane(isPaneCache[k]-1); + int a = (rgb >> 24) & 0xFF; + int r = (rgb >> 16) & 0xFF; + int g = (rgb >> 8) & 0xFF; + int b = rgb & 0xFF; + Minecraft.getMinecraft().getTextureManager().bindTexture(STORAGE_PANE_CTM_TEXTURE); + GlStateManager.color(r/255f, g/255f, b/255f, a/255f); + GlStateManager.translate(0, 0, 110); + Utils.drawTexturedRect(itemX-1, itemY-1, 18, 18, + startCTMX/227f, (startCTMX+18)/227f, startCTMY/75f, (startCTMY+18)/75f, GL11.GL_NEAREST); + GlStateManager.translate(0, 0, -110); + + RenderItem itemRender = Minecraft.getMinecraft().getRenderItem(); + itemRender.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRendererObj, stack, itemX, itemY, null); + GlStateManager.enableDepth(); + } else if(isPaneCache[k] < 0) { + boolean hasConnection = false; + + int upIndex = k-9; + int leftIndex = k%9 > 0 ? k-1 : -1; + int rightIndex = k%9 < 8 ? k+1 : -1; + int downIndex = k+9; + + int[] indexArr = {rightIndex, downIndex, leftIndex, upIndex}; + + for(int j=0; j<4; j++) { + int index = indexArr[j]; + int type = index >= 0 && index < isPaneCache.length ? getPaneType(page.items[index], index, isPaneCache) : -1; + if(type > 0) { + int ctmIndex = getCTMIndex(page, index, isPaneCache, ctmIndexCache); + if(ctmIndex < 0) continue; + + boolean renderConnection; + boolean horizontal = ctmIndex == 1 || ctmIndex == 2 || ctmIndex == 3; + boolean vertical = ctmIndex == 12 || ctmIndex == 24 || ctmIndex == 36; + if((k%9 == 0 && index%9 == 0) || (k%9 == 8 && index%9 == 8)) { + renderConnection = horizontal || vertical; + } else if(index == leftIndex || index == rightIndex) { + renderConnection = horizontal; + } else { + renderConnection = vertical; + } + + if(renderConnection) { + shouldLimitBorder[k] = true; + hasConnection = true; + + Minecraft.getMinecraft().getTextureManager().bindTexture(STORAGE_PANE_CTM_TEXTURE); + int rgb = getRGBFromPane(type-1); + int a = (rgb >> 24) & 0xFF; + int r = (rgb >> 16) & 0xFF; + int g = (rgb >> 8) & 0xFF; + int b = rgb & 0xFF; + GlStateManager.color(r/255f, g/255f, b/255f, a/255f); + + GlStateManager.pushMatrix(); + GlStateManager.translate(itemX-1+9, itemY-1+9, 10); + GlStateManager.rotate(j*90, 0, 0, 1); + GlStateManager.enableAlpha(); + GlStateManager.disableLighting(); + + boolean horzFlip = false; + boolean vertFlip = false; + + if(index == leftIndex) { + vertFlip = true; + } else if(index == downIndex) { + vertFlip = true; + } + + GlStateManager.enableDepth(); + Utils.drawTexturedRect(0, -9, 8, 18, + !horzFlip ? 209/227f : 219/227f, horzFlip ? 227/227f : 217/227f, + !vertFlip ? 57/75f : 75f/75f, vertFlip ? 57/75f : 75f/75f, GL11.GL_NEAREST); + GlStateManager.translate(0, 0, 120); + Utils.drawTexturedRect(8, -9, 10, 18, + !horzFlip ? 217/227f : 209/227f, horzFlip ? 219/227f : 227/227f, + !vertFlip ? 57/75f : 75f/75f, vertFlip ? 57/75f : 75f/75f, GL11.GL_NEAREST); + GlStateManager.translate(0, 0, -120); + + GlStateManager.popMatrix(); + } + } + } + + if(hasConnection) { + page.shouldDarkenIfNotSelected[k] = false; + + GlStateManager.disableAlpha(); + GlStateManager.translate(0, 0, 10); + Gui.drawRect(itemX-1, itemY-1, itemX+17, itemY+17, 0x01000000); + GlStateManager.translate(0, 0, -10); + GlStateManager.enableAlpha(); + } + } + } + } + Minecraft.getMinecraft().getTextureManager().bindTexture(storageTexture); GlStateManager.color(1, 1, 1, 1); Utils.drawTexturedRect(storageX, storageY, storageW, storageH, 0, 162/600f, 265/400f, (265+storageH)/400f, GL11.GL_NEAREST); boolean whiteOverlay = false; - GlStateManager.enableDepth(); for(int k=0; k<rows*9; k++) { ItemStack stack = page.items[k]; int itemX = storageX+1+18*(k%9); int itemY = storageY+1+18*(k/9); - /*if(doItemRender || frameBufferItemRender) { - GlStateManager.colorMask(true, true, true, true); - Utils.drawItemStack(stack, itemX, itemY); - GlStateManager.colorMask(false, false, false, false); - }*/ - if(!searchBar.getText().isEmpty()) { if(stack == null || !NotEnoughUpdates.INSTANCE.manager.doesStackMatchSearch(stack, searchBar.getText())) { GlStateManager.disableDepth(); @@ -469,15 +790,17 @@ public class StorageOverlay extends GuiElement { GlStateManager.disableLighting(); if(mouseInsideStorages && mouseX >= guiLeft+itemX && mouseX < guiLeft+itemX+18 && mouseY >= guiTop+itemY && mouseY < guiTop+itemY+18) { + boolean allowHover = NotEnoughUpdates.INSTANCE.config.storageGUI.fancyPanes != 1 || !hasCaches || isPaneCaches[storageId][k] <= 0; + if(storageId != StorageManager.getInstance().getCurrentPageId()) { hoveringOtherBackpack = true; whiteOverlay = stackOnMouse == null; - } else { + } else if(stack == null || allowHover) { itemHoverX = itemX; itemHoverY = itemY; } - if(stack != null) { + if(stack != null && allowHover) { tooltipToDisplay = stack.getTooltip(Minecraft.getMinecraft().thePlayer, Minecraft.getMinecraft().gameSettings.advancedItemTooltips); } } @@ -485,10 +808,90 @@ public class StorageOverlay extends GuiElement { GlStateManager.disableDepth(); if(storageId == currentPage) { - Gui.drawRect(storageX+1, storageY, storageX, storageY+storageH, 0xffffdf00); - Gui.drawRect(storageX+storageW-1, storageY, storageX+storageW, storageY+storageH, 0xffffdf00); - Gui.drawRect(storageX, storageY, storageX+storageW, storageY+1, 0xffffdf00); - Gui.drawRect(storageX, storageY+storageH-1, storageX+storageW, storageY+storageH, 0xffffdf00); + if(isPaneCaches[storageId] != null && isPaneCaches[storageId].length == rows*9 && + ctmIndexCaches[storageId] != null && ctmIndexCaches[storageId].length == rows*9) { + int[] isPaneCache = isPaneCaches[storageId]; + + int borderStartY = 0; + int borderEndY = storageH; + int borderStartX = 0; + int borderEndX = storageW; + + boolean allChroma = true; + for(int y=0; y<page.rows; y++) { + for(int x=0; x<9; x++) { + int index = x+y*9; + if(isPaneCache[index] != 17) { + allChroma = false; + break; + } + } + } + + out: + for(int y=0; y<page.rows; y++) { + for(int x=0; x<9; x++) { + int index = x+y*9; + if(isPaneCache[index] <= 0 && !shouldLimitBorder[index]) { + borderStartY = y*18; + break out; + } + } + } + out: + for(int y=page.rows-1; y>=0; y--) { + for(int x=0; x<9; x++) { + int index = x+y*9; + if(isPaneCache[index] <= 0 && !shouldLimitBorder[index]) { + borderEndY = y*18+18; //Bottom + break out; + } + } + } + out: + for(int x=0; x<9; x++) { + for(int y=0; y<page.rows; y++) { + int index = x+y*9; + if(isPaneCache[index] <= 0 && !shouldLimitBorder[index]) { + borderStartX = x*18; + break out; + } + } + } + out: + for(int x=8; x>=0; x--) { + for(int y=0; y<page.rows; y++) { + int index = x+y*9; + if(isPaneCache[index] <= 0 && !shouldLimitBorder[index]) { + borderEndX = x*18+18; //Bottom + break out; + } + } + } + int borderColour = ChromaColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.config.storageGUI.selectedStorageColour); + Gui.drawRect(storageX+borderStartX+1, storageY+borderStartY, storageX+borderStartX, storageY+borderEndY, borderColour); //Left + Gui.drawRect(storageX+borderEndX-1, storageY+borderStartY, storageX+borderEndX, storageY+borderEndY, borderColour); //Right + Gui.drawRect(storageX+borderStartX, storageY+borderStartY, storageX+borderEndX, storageY+borderStartY+1, borderColour); //Top + Gui.drawRect(storageX+borderStartX, storageY+borderEndY-1, storageX+borderEndX, storageY+borderEndY, borderColour); //Bottom + + if(allChroma) { + ResourceLocation loc; + if(rollIndex < NOT_RICKROLL_SEQ.length) { + loc = NOT_RICKROLL_SEQ[rollIndex]; + } else { + loc = NOT_RICKROLL_SEQ[NOT_RICKROLL_SEQ.length*2-rollIndex-1]; + } + Minecraft.getMinecraft().getTextureManager().bindTexture(loc); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(storageX, storageY, storageW, storageH, GL11.GL_LINEAR); + } + } else { + int borderColour = ChromaColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.config.storageGUI.selectedStorageColour); + Gui.drawRect(storageX+1, storageY, storageX, storageY+storageH, borderColour); //Left + Gui.drawRect(storageX+storageW-1, storageY, storageX+storageW, storageY+storageH, borderColour); //Right + Gui.drawRect(storageX, storageY-1, storageX+storageW, storageY, borderColour); //Top + Gui.drawRect(storageX, storageY+storageH-1, storageX+storageW, storageY+storageH, borderColour); //Bottom + } } else if(currentTime - StorageManager.getInstance().storageOpenSwitchMillis < 1000 && StorageManager.getInstance().desiredStoragePage == storageId && StorageManager.getInstance().getCurrentPageId() != storageId) { @@ -506,7 +909,17 @@ public class StorageOverlay extends GuiElement { } else if(whiteOverlay) { Gui.drawRect(storageX, storageY, storageX+storageW, storageY+storageH, 0x80ffffff); } else { - Gui.drawRect(storageX, storageY, storageX+storageW, storageY+storageH, 0x30000000); + if(page.rows <= 0) { + Gui.drawRect(storageX, storageY, storageX+storageW, storageY+storageH, 0x40000000); + } else { + for(int i=0; i<page.rows*9; i++) { + if(page.items[i] == null || page.shouldDarkenIfNotSelected[i]) { + int x = storageX+18*(i%9); + int y = storageY+18*(i/9); + Gui.drawRect(x, y, x+18, y+18, 0x40000000); + } + } + } } if(StorageManager.getInstance().desiredStoragePage == storageId && StorageManager.getInstance().onStorageMenu) { @@ -544,8 +957,6 @@ public class StorageOverlay extends GuiElement { searchBar.render(252, storageViewSize+5); //Player Inventory - GuiChest guiChest = (GuiChest) Minecraft.getMinecraft().currentScreen; - ContainerChest containerChest = (ContainerChest) guiChest.inventorySlots; ItemStack[] playerItems = Minecraft.getMinecraft().thePlayer.inventory.mainInventory; int inventoryStartIndex = containerChest.getLowerChestInventory().getSizeInventory(); GlStateManager.enableDepth(); @@ -683,6 +1094,14 @@ public class StorageOverlay extends GuiElement { itemHoverY = itemY; if(NotEnoughUpdates.INSTANCE.config.storageGUI.backpackPreview) slotPreview = i+StorageManager.MAX_ENDER_CHEST_PAGES; tooltipToDisplay = stack.getTooltip(Minecraft.getMinecraft().thePlayer, Minecraft.getMinecraft().gameSettings.advancedItemTooltips); + + if(!StorageManager.getInstance().onStorageMenu) { + List<String> tooltip = new ArrayList<>(); + for(String line : tooltipToDisplay) { + tooltip.add(line.replace("Right-click to remove", "Click \"Edit\" to manage")); + } + tooltipToDisplay = tooltip; + } } } } @@ -709,6 +1128,10 @@ public class StorageOverlay extends GuiElement { vIndex = NotEnoughUpdates.INSTANCE.config.storageGUI.enderchestPreview ? 1 : 0; break; case 5: vIndex = NotEnoughUpdates.INSTANCE.config.storageGUI.masonryMode ? 1 : 0; break; + case 6: + vIndex = NotEnoughUpdates.INSTANCE.config.storageGUI.fancyPanes == 2 ? 0 : NotEnoughUpdates.INSTANCE.config.storageGUI.fancyPanes+1; break; + case 7: + vIndex = NotEnoughUpdates.INSTANCE.config.storageGUI.searchBarAutofocus ? 1 : 0; break; } Utils.drawTexturedRect(buttonX, buttonY, 16, 16, minU, maxU, (vIndex*16)/256f, (vIndex*16+16)/256f, GL11.GL_NEAREST); @@ -774,10 +1197,36 @@ public class StorageOverlay extends GuiElement { "Off" ); break; + case 6: + tooltipToDisplay = createTooltip( + "Fancy Glass Panes", + NotEnoughUpdates.INSTANCE.config.storageGUI.fancyPanes, + "On", + "Locked", + "Off" + ); + tooltipToDisplay.add(1, "\u00a7eReplace the glass pane textures"); + tooltipToDisplay.add(2, "\u00a7ein your storage containers with"); + tooltipToDisplay.add(3, "\u00a7ea fancy connected texture"); + break; + case 7: + tooltipToDisplay = createTooltip( + "Search Bar Autofocus", + NotEnoughUpdates.INSTANCE.config.storageGUI.searchBarAutofocus ? 0 : 1, + "On", + "Off" + ); + break; } } } + if(!StorageManager.getInstance().onStorageMenu) { + Minecraft.getMinecraft().getTextureManager().bindTexture(storageTexture); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(171-36, 41+storageViewSize, 36, 14, 24/600f, 60/600f, 251/400f, 265/400f, GL11.GL_NEAREST); + } + if(itemHoverX >= 0 && itemHoverY >= 0) { GlStateManager.disableDepth(); GlStateManager.colorMask(true, true, true, false); @@ -787,7 +1236,7 @@ public class StorageOverlay extends GuiElement { } GlStateManager.popMatrix(); - GlStateManager.translate(0, 0, 100); + GlStateManager.translate(0, 0, 300); if(stackOnMouse != null) { if(hoveringOtherBackpack) { Utils.drawItemStack(new ItemStack(Item.getItemFromBlock(Blocks.barrier)), mouseX - 8, mouseY - 8); @@ -796,7 +1245,6 @@ public class StorageOverlay extends GuiElement { } } else if(slotPreview >= 0) { StorageManager.StoragePage page = StorageManager.getInstance().getPage(slotPreview, false); - if(page != null && page.rows > 0) { int rows = page.rows; @@ -812,6 +1260,7 @@ public class StorageOverlay extends GuiElement { Utils.drawTexturedRect(mouseX, mouseY+7+18*i, 176, 18, 0, 1, 7/32f, 25/32f, GL11.GL_NEAREST); } Utils.drawTexturedRect(mouseX, mouseY+7+18*rows, 176, 7, 0, 1, 25/32f, 1, GL11.GL_NEAREST); + GlStateManager.enableDepth(); for(int i=0; i<rows*9; i++) { ItemStack stack = page.items[i]; @@ -821,7 +1270,6 @@ public class StorageOverlay extends GuiElement { GlStateManager.disableDepth(); } } - GlStateManager.enableDepth(); GlStateManager.translate(0, 0, -100); } else { Utils.drawHoveringText(tooltipToDisplay, mouseX, mouseY, width, height, -1, Minecraft.getMinecraft().fontRendererObj); @@ -829,7 +1277,102 @@ public class StorageOverlay extends GuiElement { } else if(tooltipToDisplay != null) { Utils.drawHoveringText(tooltipToDisplay, mouseX, mouseY, width, height, -1, Minecraft.getMinecraft().fontRendererObj); } - GlStateManager.translate(0, 0, -100); + GlStateManager.translate(0, 0, -300); + } + + private static boolean shouldConnect(int paneIndex1, int paneIndex2) { + if(paneIndex1 == 16 || paneIndex2 == 16) return false; + if(paneIndex1 < 1 || paneIndex2 < 1) return false; + if(paneIndex1 == paneIndex2) { + return true; + } + /*if((paneIndex1 == 17) == (paneIndex2 == 17)) { + return true; + }*/ + return false; + + } + + public static int getCTMIndex(StorageManager.StoragePage page, int index, int[] isPaneCache, int[] ctmIndexCache) { + if(page.items[index] == null) { + ctmIndexCache[index] = -1; + return -1; + } + + int paneType = getPaneType(page.items[index], index, isPaneCache); + + int upIndex = index-9; + int leftIndex = index%9 > 0 ? index-1 : -1; + int rightIndex = index%9 < 8 ? index+1 : -1; + int downIndex = index+9; + int upleftIndex = index%9 > 0 ? index-10 : -1; + int uprightIndex = index%9 < 8 ? index-8 : -1; + int downleftIndex = index%9 > 0 ? index+8 : -1; + int downrightIndex = index%9 < 8 ?index+10 : -1; + + boolean up = upIndex >= 0 && upIndex < isPaneCache.length && shouldConnect(getPaneType(page.items[upIndex], upIndex, isPaneCache), paneType); + boolean left = leftIndex >= 0 && leftIndex < isPaneCache.length && shouldConnect(getPaneType(page.items[leftIndex], leftIndex, isPaneCache) , paneType); + boolean down = downIndex >= 0 && downIndex < isPaneCache.length && shouldConnect(getPaneType(page.items[downIndex], downIndex, isPaneCache) , paneType); + boolean right = rightIndex >= 0 && rightIndex < isPaneCache.length && shouldConnect(getPaneType(page.items[rightIndex], rightIndex, isPaneCache) , paneType); + boolean upleft = upleftIndex >= 0 && upleftIndex < isPaneCache.length && shouldConnect(getPaneType(page.items[upleftIndex], upleftIndex, isPaneCache) , paneType); + boolean upright = uprightIndex >= 0 && uprightIndex < isPaneCache.length && shouldConnect(getPaneType(page.items[uprightIndex], uprightIndex, isPaneCache) , paneType); + boolean downleft = downleftIndex >= 0 && downleftIndex < isPaneCache.length && shouldConnect(getPaneType(page.items[downleftIndex], downleftIndex, isPaneCache) , paneType); + boolean downright = downrightIndex >= 0 && downrightIndex < isPaneCache.length && shouldConnect(getPaneType(page.items[downrightIndex], downrightIndex, isPaneCache) , paneType); + + int ctmIndex = BetterContainers.getCTMIndex(up, right, down, left, upleft, upright, downright, downleft); + ctmIndexCache[index] = ctmIndex; + return ctmIndex; + } + + private static String CHROMA_STR = "230:255:255:0:0"; + public static int getRGBFromPane(int paneType) { + int rgb = -1; + EnumChatFormatting formatting = EnumChatFormatting.WHITE; + switch(paneType) { + case 0: formatting = EnumChatFormatting.WHITE; break; + case 1: formatting = EnumChatFormatting.GOLD; break; + case 2: formatting = EnumChatFormatting.LIGHT_PURPLE; break; + case 3: formatting = EnumChatFormatting.BLUE; break; + case 4: formatting = EnumChatFormatting.YELLOW; break; + case 5: formatting = EnumChatFormatting.GREEN; break; + case 6: rgb = 0xfff03c96; break; + case 7: formatting = EnumChatFormatting.DARK_GRAY; break; + case 8: formatting = EnumChatFormatting.GRAY; break; + case 9: formatting = EnumChatFormatting.DARK_AQUA; break; + case 10: formatting = EnumChatFormatting.DARK_PURPLE; break; + case 11: formatting = EnumChatFormatting.DARK_BLUE; break; + case 12: rgb = 0xffA0522D; break; + case 13: formatting = EnumChatFormatting.DARK_GREEN; break; + case 14: formatting = EnumChatFormatting.DARK_RED; break; + case 15: rgb = 0x00000000; break; + case 16: rgb = SpecialColour.specialToChromaRGB(CHROMA_STR); break; + } + if(rgb != -1) return rgb; + return 0xff000000 | Minecraft.getMinecraft().fontRendererObj.getColorCode(formatting.toString().charAt(1)); + } + + public static int getPaneType(ItemStack stack, int index, int[] cache) { + if(cache != null && cache[index] != 0) return cache[index]; + + if(NotEnoughUpdates.INSTANCE.config.storageGUI.fancyPanes == 2) { + if(cache != null) cache[index] = -1; + return -1; + } + + if(stack != null && (stack.getItem() == Item.getItemFromBlock(Blocks.stained_glass_pane) || stack.getItem() == Item.getItemFromBlock(Blocks.glass_pane))) { + String internalName = NotEnoughUpdates.INSTANCE.manager.getInternalNameForItem(stack); + if(internalName != null) { + if(internalName.startsWith("STAINED_GLASS_PANE")) { + if(cache != null) cache[index] = stack.getItemDamage()+1; + return stack.getItemDamage()+1; + } else if(internalName.startsWith("THIN_GLASS")) { + if(cache != null) cache[index] = 17; + return 17; + } + } + } + if(cache != null) cache[index] = -1; + return -1; } private List<String> createTooltip(String title, int selectedOption, String... options) { @@ -920,11 +1463,15 @@ public class StorageOverlay extends GuiElement { return true; } + if(Mouse.getEventButtonState()) { + editingNameId = -1; + } + if(Mouse.getEventButton() == 0) { if(!Mouse.getEventButtonState()) { scrollGrabOffset = -1; } else if(mouseX >= guiLeft+519 && mouseX <= guiLeft+519+14 && - mouseY >= guiTop+8 && mouseY <= guiTop+106) { + mouseY >= guiTop+8 && mouseY <= guiTop+2+getStorageViewSize()) { int scrollMouseY = mouseY - (guiTop+8); int scrollBarY = Math.round(getScrollBarHeight()*scroll.getValue()/(float)getMaximumScroll()); @@ -954,6 +1501,35 @@ public class StorageOverlay extends GuiElement { guiLeft = width/2 - (sizeX-searchNobX)/2; guiTop = height/2 - sizeY/2; + if(Mouse.getEventButtonState() && !StorageManager.getInstance().onStorageMenu) { + if(mouseX > guiLeft+171-36 && mouseX < guiLeft+171 && + mouseY > guiTop+41+storageViewSize && mouseY < guiTop+41+storageViewSize+14) { + NotEnoughUpdates.INSTANCE.sendChatMessage("/storage"); + searchBar.setFocus(false); + return true; + } + } + + if(Mouse.getEventButtonState()) { + if(mouseX >= guiLeft+252 && mouseX <= guiLeft+252+searchBar.getWidth() && + mouseY >= guiTop+storageViewSize+5 && mouseY <= guiTop+storageViewSize+5+searchBar.getHeight()) { + if(searchBar.getFocus()) { + searchBar.mouseClicked(mouseX-guiLeft, mouseY-guiTop, Mouse.getEventButton()); + StorageManager.getInstance().searchDisplay(searchBar.getText()); + dirty = true; + } else { + searchBar.setFocus(true); + if(Mouse.getEventButton() == 1) { + searchBar.setText(""); + StorageManager.getInstance().searchDisplay(searchBar.getText()); + dirty = true; + } + } + } else { + searchBar.setFocus(false); + } + } + if(mouseX > guiLeft+181 && mouseX < guiLeft+181+162 && mouseY > guiTop+storageViewSize+18 && mouseY < guiTop+storageViewSize+94) { return false; @@ -969,6 +1545,39 @@ public class StorageOverlay extends GuiElement { StorageManager.StoragePage page = StorageManager.getInstance().getPage(entry.getValue(), false); int rows = page == null ? 3 : page.rows <= 0 ? 3 : page.rows; + + if(page != null) { + String pageTitle; + if(page.customTitle != null && !page.customTitle.isEmpty()) { + pageTitle = page.customTitle; + } else if(entry.getValue() < 9) { + pageTitle = "Ender Chest Page " + (entry.getValue() + 1); + } else { + pageTitle = "Backpack Slot "+(entry.getValue()-8); + } + int titleLen = Minecraft.getMinecraft().fontRendererObj.getStringWidth(pageTitle); + + if(mouseX >= guiLeft+pageCoords.x && mouseX <= guiLeft+pageCoords.x+titleLen+15 && + mouseY >= guiTop+pageCoords.y-14 && mouseY <= guiTop+pageCoords.y+1) { + if(Mouse.getEventButtonState() && (Mouse.getEventButton() == 0 || Mouse.getEventButton() == 1)) { + if(editingNameId != entry.getValue()) { + editingNameId = entry.getValue(); + if(!renameStorageField.getText().equalsIgnoreCase(pageTitle)) { + renameStorageField.setText(pageTitle); + } + } + if(!renameStorageField.getFocus()) { + renameStorageField.setFocus(true); + } else { + renameStorageField.mouseClicked(mouseX-guiLeft, mouseY-guiTop, Mouse.getEventButton()); + } + } else if(Mouse.getEventButton() < 0 && Mouse.isButtonDown(0)) { + renameStorageField.mouseClickMove(mouseX-guiLeft, mouseY-guiTop, 0, 0); + } + return true; + } + } + if(mouseX > guiLeft+pageCoords.x && mouseX < guiLeft+pageCoords.x+162 && mouseY > guiTop+pageCoords.y && mouseY < guiTop+pageCoords.y+rows*18) { if(currentPage >= 0 && entry.getValue() == currentPage) { @@ -1042,9 +1651,9 @@ public class StorageOverlay extends GuiElement { case 2: int displayStyle = NotEnoughUpdates.INSTANCE.config.storageGUI.displayStyle; if(Mouse.getEventButton() == 0) { - displayStyle--; - } else { displayStyle++; + } else { + displayStyle--; } if(displayStyle < 0) displayStyle = STORAGE_TEXTURES.length-1; if(displayStyle >= STORAGE_TEXTURES.length) displayStyle = 0; @@ -1059,6 +1668,20 @@ public class StorageOverlay extends GuiElement { case 5: NotEnoughUpdates.INSTANCE.config.storageGUI.masonryMode = !NotEnoughUpdates.INSTANCE.config.storageGUI.masonryMode; break; + case 6: + int fancyPanes = NotEnoughUpdates.INSTANCE.config.storageGUI.fancyPanes; + if(Mouse.getEventButton() == 0) { + fancyPanes++; + } else { + fancyPanes--; + } + if(fancyPanes < 0) fancyPanes = 2; + if(fancyPanes >= 3) fancyPanes = 0; + + NotEnoughUpdates.INSTANCE.config.storageGUI.fancyPanes = fancyPanes; break; + case 7: + NotEnoughUpdates.INSTANCE.config.storageGUI.searchBarAutofocus = + !NotEnoughUpdates.INSTANCE.config.storageGUI.searchBarAutofocus; break; } dirty = true; } @@ -1183,6 +1806,11 @@ public class StorageOverlay extends GuiElement { if(xClicked >= 0 && xClicked <= 8 && yClicked >= 0 && yClicked <= 5) { if(xClicked + yClicked*9 + 9 == slotId) { + if(NotEnoughUpdates.INSTANCE.config.storageGUI.fancyPanes == 1 && slot.getHasStack() && + getPaneType(slot.getStack(), -1, null) > 0) { + cir.setReturnValue(false); + return; + } cir.setReturnValue(true); return; } @@ -1195,6 +1823,7 @@ public class StorageOverlay extends GuiElement { } public void clearSearch() { + searchBar.setFocus(false); searchBar.setText(""); StorageManager.getInstance().searchDisplay(searchBar.getText()); } @@ -1234,13 +1863,38 @@ public class StorageOverlay extends GuiElement { } } - String prevText = searchBar.getText(); - searchBar.setFocus(true); - searchBar.keyTyped(Keyboard.getEventCharacter(), Keyboard.getEventKey()); - if(!prevText.equals(searchBar.getText())) { - StorageManager.getInstance().searchDisplay(searchBar.getText()); - dirty = true; + if(editingNameId >= 0) { + if(Keyboard.getEventKey() == Keyboard.KEY_RETURN) { + editingNameId = -1; + return true; + } + + String prevText = renameStorageField.getText(); + renameStorageField.setFocus(true); + searchBar.setFocus(false); + renameStorageField.keyTyped(Keyboard.getEventCharacter(), Keyboard.getEventKey()); + if(!prevText.equals(renameStorageField.getText())) { + StorageManager.StoragePage page = StorageManager.getInstance().getPage(editingNameId, false); + if(page != null) { + page.customTitle = renameStorageField.getText(); + } + } + } else if(NotEnoughUpdates.INSTANCE.config.storageGUI.searchBarAutofocus || searchBar.getFocus()) { + String prevText = searchBar.getText(); + searchBar.setFocus(true); + renameStorageField.setFocus(false); + searchBar.keyTyped(Keyboard.getEventCharacter(), Keyboard.getEventKey()); + if(!prevText.equals(searchBar.getText())) { + StorageManager.getInstance().searchDisplay(searchBar.getText()); + dirty = true; + } + if(NotEnoughUpdates.INSTANCE.config.storageGUI.searchBarAutofocus && + searchBar.getText().isEmpty()) { + searchBar.setFocus(false); + } } + + } return true; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java b/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java index a80cc94a..d608159b 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java @@ -153,10 +153,10 @@ public class NEUConfig extends Config { public SkillOverlays skillOverlays = new SkillOverlays(); @Expose - @Category( + /*@Category( name = "Misc Overlays", desc = "Misc Overlays" - ) + )*/ public MiscOverlays miscOverlays = new MiscOverlays(); @Expose @@ -470,7 +470,7 @@ public class NEUConfig extends Config { desc = "Show QuickCommands\u2122 in the NEU toolbar" ) @ConfigEditorBoolean - public boolean quickCommands = true; + public boolean quickCommands = false; @Expose @ConfigOption( @@ -1204,17 +1204,17 @@ public class NEUConfig extends Config { desc = "" ) @ConfigEditorAccordion(id = 1) - public boolean storageOverlayAccordion = false; + public boolean storageOverlayAccordion = true; @Expose @ConfigOption( name = "Enable Storage GUI", - desc = "Show a custom storage overlay when accessing /storage." + + desc = "Show a custom storage overlay when accessing /storage. " + "Makes switching between pages much easier and also allows for searching through all storages" ) @ConfigEditorBoolean @ConfigAccordionId(id = 1) - public boolean enableStorageGUI = false; + public boolean enableStorageGUI = true; @Expose @ConfigOption( @@ -1256,7 +1256,7 @@ public class NEUConfig extends Config { ) @ConfigEditorBoolean @ConfigAccordionId(id = 1) - public boolean backpackPreview = false; + public boolean backpackPreview = true; @Expose @ConfigOption( @@ -1267,6 +1267,35 @@ public class NEUConfig extends Config { @ConfigAccordionId(id = 1) public boolean masonryMode = false; + @Expose + @ConfigOption( + name = "Fancy Glass Panes", + desc = "Replace the glass pane textures in your storage containers with a fancy connected texture" + ) + @ConfigEditorDropdown( + values = {"On", "Locked", "Off"} + ) + @ConfigAccordionId(id = 1) + public int fancyPanes = 0; + + @Expose + @ConfigOption( + name = "Search Bar Autofocus", + desc = "Automatically focus the search bar when pressing keys" + ) + @ConfigEditorBoolean + @ConfigAccordionId(id = 1) + public boolean searchBarAutofocus = true; + + @Expose + @ConfigOption( + name = "Selected Storage Colour", + desc = "Change the colour used to draw the selected backpack border" + ) + @ConfigEditorColour + @ConfigAccordionId(id = 1) + public String selectedStorageColour = "0:255:255:223:0"; + @ConfigOption( name = "Inventory Backpacks", desc = "" @@ -1283,7 +1312,14 @@ public class NEUConfig extends Config { @ConfigAccordionId(id = 0) public boolean showInvBackpack = false; - //public boolean showInvBackpack = false; + @Expose + @ConfigOption( + name = "Scroll to Backpack", + desc = "Allow scrolling to the backpack using the mouse wheel. If you have the hotkey enabled (default: KEY_GRAVE), you can still use that" + ) + @ConfigEditorBoolean + @ConfigAccordionId(id = 0) + public boolean scrollToBackpack = false; @Expose @ConfigOption( @@ -1672,9 +1708,17 @@ public class NEUConfig extends Config { @Expose @ConfigOption( - name = "Incoming Fish Warning", - desc = "Display a yellow '!' when a fish is incoming and a red '!' when you need to pull the fish up. " + - "The red '!' also takes your ping into account" + name = "Fish Warning (R)", + desc = "Display a red '!' when you need to pull the fish up. The warning takes your ping into account" + ) + @ConfigEditorBoolean + @ConfigAccordionId(id = 3) + public boolean incomingFishWarningR = true; + + @Expose + @ConfigOption( + name = "Fish Warning (Y)", + desc = "Display a yellow '!' when a fish is approaching your bobber" ) @ConfigEditorBoolean @ConfigAccordionId(id = 3) diff --git a/src/main/java/io/github/moulberry/notenoughupdates/overlays/MiningOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/overlays/MiningOverlay.java index a486c773..f9853cb1 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/overlays/MiningOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/overlays/MiningOverlay.java @@ -36,7 +36,7 @@ public class MiningOverlay extends TextOverlay { super(position, dummyStrings, styleSupplier); } - private static final Pattern NUMBER_PATTERN = Pattern.compile("\\d+"); + private static final Pattern NUMBER_PATTERN = Pattern.compile("\\d+(?: |$)"); private static Map<String, Integer> commissionMaxes = new HashMap<>(); public static Map<String, Float> commissionProgress = new LinkedHashMap<>(); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java b/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java index acdd4cb4..37e9c600 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java @@ -67,7 +67,7 @@ import java.util.regex.Pattern; public class Utils { - private static boolean hasEffectOverride = false; + public static boolean hasEffectOverride = false; public static boolean disableCustomDungColours = false; private static LinkedList<Integer> guiScales = new LinkedList<>(); private static ScaledResolution lastScale = new ScaledResolution(Minecraft.getMinecraft()); 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 cde93ddf..fc5d3e38 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/XPInformation.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/XPInformation.java @@ -37,7 +37,8 @@ public class XPInformation { private static Splitter SPACE_SPLITTER = Splitter.on(" ").omitEmptyStrings().trimResults(); private static Pattern SKILL_PATTERN = Pattern.compile("\\+(\\d+(?:,\\d+)*(?:\\.\\d+)?) (.+) \\((\\d+(?:,\\d+)*(?:\\.\\d+)?)/(\\d+(?:,\\d+)*(?:\\.\\d+)?)\\)"); - private static Pattern SKILL_PATTERN_ALT = Pattern.compile("\\+(\\d+(?:,\\d+)*(?:\\.\\d+)?) (.+) \\((\\d\\d?(?:\\.\\d\\d?)?)%\\)"); + private static Pattern SKILL_PATTERN_MULTIPLIER = Pattern.compile("\\+(\\d+(?:,\\d+)*(?:\\.\\d+)?) (.+) \\((\\d+(?:,\\d+)*(?:\\.\\d+)?)/(\\d+(?:k|m|b))\\)"); + private static Pattern SKILL_PATTERN_PERCENTAGE = Pattern.compile("\\+(\\d+(?:,\\d+)*(?:\\.\\d+)?) (.+) \\((\\d\\d?(?:\\.\\d\\d?)?)%\\)"); public HashMap<String, SkillInfo> getSkillInfoMap() { return skillInfoMap; @@ -47,13 +48,22 @@ public class XPInformation { return skillInfoMap.get(skillName.toLowerCase()); } + private String lastActionBar = null; + @SubscribeEvent(priority = EventPriority.HIGHEST, receiveCanceled = true) public void onChatReceived(ClientChatReceivedEvent event) { if(event.type == 2) { JsonObject leveling = Constants.LEVELING; if(leveling == null) return; - List<String> components = SPACE_SPLITTER.splitToList(StringUtils.cleanColour(event.message.getUnformattedText())); + String actionBar = StringUtils.cleanColour(event.message.getUnformattedText()); + + if(lastActionBar != null && lastActionBar.equalsIgnoreCase(actionBar)) { + return; + } + lastActionBar = actionBar; + + List<String> components = SPACE_SPLITTER.splitToList(actionBar); for(String component : components) { Matcher matcher = SKILL_PATTERN.matcher(component); @@ -83,14 +93,57 @@ public class XPInformation { skillInfoMap.put(skillS.toLowerCase(), skillInfo); return; - } - matcher = SKILL_PATTERN_ALT.matcher(component); - if(matcher.matches()) { - String skillS = matcher.group(2); - String xpPercentageS = matcher.group(3).replace(",",""); - - float xpPercentage = Float.parseFloat(xpPercentageS); - updateWithPercentage.put(skillS.toLowerCase(), xpPercentage); + } else { + matcher = SKILL_PATTERN_PERCENTAGE.matcher(component); + if(matcher.matches()) { + String skillS = matcher.group(2); + String xpPercentageS = matcher.group(3).replace(",",""); + + float xpPercentage = Float.parseFloat(xpPercentageS); + updateWithPercentage.put(skillS.toLowerCase(), xpPercentage); + } else { + matcher = SKILL_PATTERN_MULTIPLIER.matcher(component); + + if(matcher.matches()) { + String skillS = matcher.group(2); + String currentXpS = matcher.group(3).replace(",",""); + String maxXpS = matcher.group(4).replace(",",""); + + float maxMult = 1; + if(maxXpS.endsWith("k")) { + maxMult = 1000; + maxXpS = maxXpS.substring(0, maxXpS.length()-1); + } else if(maxXpS.endsWith("m")) { + maxMult = 1000000; + maxXpS = maxXpS.substring(0, maxXpS.length()-1); + } else if(maxXpS.endsWith("b")) { + maxMult = 1000000000; + maxXpS = maxXpS.substring(0, maxXpS.length()-1); + } + + float currentXp = Float.parseFloat(currentXpS); + float maxXp = Float.parseFloat(maxXpS) * maxMult; + + SkillInfo skillInfo = new SkillInfo(); + skillInfo.currentXp = currentXp; + skillInfo.currentXpMax = maxXp; + skillInfo.totalXp = currentXp; + + JsonArray levelingArray = leveling.getAsJsonArray("leveling_xp"); + for(int i=0; i<levelingArray.size(); i++) { + float cap = levelingArray.get(i).getAsFloat(); + if(maxXp > 0 && maxXp <= cap) { + break; + } + + skillInfo.totalXp += cap; + skillInfo.level++; + } + + skillInfoMap.put(skillS.toLowerCase(), skillInfo); + return; + } + } } } } diff --git a/src/main/resources/assets/notenoughupdates/storage_gui/storage_gui_0.png b/src/main/resources/assets/notenoughupdates/storage_gui/storage_gui_0.png Binary files differindex ef0fc12c..45e4bb3a 100644 --- a/src/main/resources/assets/notenoughupdates/storage_gui/storage_gui_0.png +++ b/src/main/resources/assets/notenoughupdates/storage_gui/storage_gui_0.png diff --git a/src/main/resources/assets/notenoughupdates/storage_gui/storage_gui_1.png b/src/main/resources/assets/notenoughupdates/storage_gui/storage_gui_1.png Binary files differindex 1ab12908..d9703226 100644 --- a/src/main/resources/assets/notenoughupdates/storage_gui/storage_gui_1.png +++ b/src/main/resources/assets/notenoughupdates/storage_gui/storage_gui_1.png diff --git a/src/main/resources/assets/notenoughupdates/storage_gui/storage_gui_2.png b/src/main/resources/assets/notenoughupdates/storage_gui/storage_gui_2.png Binary files differindex 3c68ca71..5b016cea 100644 --- a/src/main/resources/assets/notenoughupdates/storage_gui/storage_gui_2.png +++ b/src/main/resources/assets/notenoughupdates/storage_gui/storage_gui_2.png diff --git a/src/main/resources/assets/notenoughupdates/storage_gui/storage_gui_3.png b/src/main/resources/assets/notenoughupdates/storage_gui/storage_gui_3.png Binary files differindex e5fecb5e..f6c3e88e 100644 --- a/src/main/resources/assets/notenoughupdates/storage_gui/storage_gui_3.png +++ b/src/main/resources/assets/notenoughupdates/storage_gui/storage_gui_3.png diff --git a/src/main/resources/assets/notenoughupdates/storage_gui/storage_gui_pane_ctm.png b/src/main/resources/assets/notenoughupdates/storage_gui/storage_gui_pane_ctm.png Binary files differnew file mode 100644 index 00000000..429e7a28 --- /dev/null +++ b/src/main/resources/assets/notenoughupdates/storage_gui/storage_gui_pane_ctm.png diff --git a/src/main/resources/assets/notenoughupdates/storage_gui/storage_icons.png b/src/main/resources/assets/notenoughupdates/storage_gui/storage_icons.png Binary files differindex 901f0690..8e435046 100644 --- a/src/main/resources/assets/notenoughupdates/storage_gui/storage_icons.png +++ b/src/main/resources/assets/notenoughupdates/storage_gui/storage_icons.png diff --git a/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/0.jpg b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/0.jpg Binary files differnew file mode 100644 index 00000000..48d7a47f --- /dev/null +++ b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/0.jpg diff --git a/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/1.jpg b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/1.jpg Binary files differnew file mode 100644 index 00000000..ace0d1a0 --- /dev/null +++ b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/1.jpg diff --git a/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/10.jpg b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/10.jpg Binary files differnew file mode 100644 index 00000000..afed0c9b --- /dev/null +++ b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/10.jpg diff --git a/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/11.jpg b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/11.jpg Binary files differnew file mode 100644 index 00000000..0b03bbfb --- /dev/null +++ b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/11.jpg diff --git a/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/12.jpg b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/12.jpg Binary files differnew file mode 100644 index 00000000..b7142650 --- /dev/null +++ b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/12.jpg diff --git a/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/13.jpg b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/13.jpg Binary files differnew file mode 100644 index 00000000..8e62f742 --- /dev/null +++ b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/13.jpg diff --git a/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/14.jpg b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/14.jpg Binary files differnew file mode 100644 index 00000000..6f296154 --- /dev/null +++ b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/14.jpg diff --git a/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/15.jpg b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/15.jpg Binary files differnew file mode 100644 index 00000000..682aae45 --- /dev/null +++ b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/15.jpg diff --git a/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/16.jpg b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/16.jpg Binary files differnew file mode 100644 index 00000000..ea4efa72 --- /dev/null +++ b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/16.jpg diff --git a/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/17.jpg b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/17.jpg Binary files differnew file mode 100644 index 00000000..9be04bea --- /dev/null +++ b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/17.jpg diff --git a/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/18.jpg b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/18.jpg Binary files differnew file mode 100644 index 00000000..d2f1e372 --- /dev/null +++ b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/18.jpg diff --git a/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/2.jpg b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/2.jpg Binary files differnew file mode 100644 index 00000000..11598aec --- /dev/null +++ b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/2.jpg diff --git a/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/3.jpg b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/3.jpg Binary files differnew file mode 100644 index 00000000..6c8a53e7 --- /dev/null +++ b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/3.jpg diff --git a/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/4.jpg b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/4.jpg Binary files differnew file mode 100644 index 00000000..c78a311f --- /dev/null +++ b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/4.jpg diff --git a/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/5.jpg b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/5.jpg Binary files differnew file mode 100644 index 00000000..48080f68 --- /dev/null +++ b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/5.jpg diff --git a/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/6.jpg b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/6.jpg Binary files differnew file mode 100644 index 00000000..382082e2 --- /dev/null +++ b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/6.jpg diff --git a/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/7.jpg b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/7.jpg Binary files differnew file mode 100644 index 00000000..7f3576fe --- /dev/null +++ b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/7.jpg diff --git a/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/8.jpg b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/8.jpg Binary files differnew file mode 100644 index 00000000..de065e28 --- /dev/null +++ b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/8.jpg diff --git a/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/9.jpg b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/9.jpg Binary files differnew file mode 100644 index 00000000..29fdfc1b --- /dev/null +++ b/src/main/resources/assets/notenoughupdates/storage_gui/we_do_a_little_rolling/9.jpg diff --git a/src/main/resources/mixins.notenoughupdates.json b/src/main/resources/mixins.notenoughupdates.json index 1fd1b7ae..0d415976 100644 --- a/src/main/resources/mixins.notenoughupdates.json +++ b/src/main/resources/mixins.notenoughupdates.json @@ -9,7 +9,6 @@ "MixinEntityPlayer", "MixinEntityPlayerSP", "MixinEntityRenderer", - "MixinFontRenderer", "MixinGuiChest", "MixinGuiContainer", "MixinGuiIngame", |