diff options
Diffstat (limited to 'src/main/java/io')
103 files changed, 6642 insertions, 3948 deletions
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/BetterPortals.java b/src/main/java/io/github/moulberry/notenoughupdates/BetterPortals.java deleted file mode 100644 index 03003d4b..00000000 --- a/src/main/java/io/github/moulberry/notenoughupdates/BetterPortals.java +++ /dev/null @@ -1,209 +0,0 @@ -package io.github.moulberry.notenoughupdates; - -import io.github.moulberry.notenoughupdates.util.TexLoc; -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.Minecraft; -import net.minecraft.client.entity.EntityPlayerSP; -import net.minecraft.client.gui.Gui; -import net.minecraft.client.renderer.*; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.item.EntityArmorStand; -import net.minecraft.init.Blocks; -import net.minecraft.util.BlockPos; -import net.minecraft.util.EnumChatFormatting; -import net.minecraftforge.client.event.RenderGameOverlayEvent; -import net.minecraftforge.client.event.RenderWorldEvent; -import net.minecraftforge.client.event.RenderWorldLastEvent; -import net.minecraftforge.event.world.WorldEvent; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.fml.common.gameevent.TickEvent; -import org.lwjgl.input.Keyboard; -import org.lwjgl.opengl.GL11; -import org.lwjgl.util.glu.GLU; -import org.lwjgl.util.vector.Vector3f; - -import java.nio.FloatBuffer; -import java.nio.IntBuffer; -import java.util.*; - -public class BetterPortals extends Gui { - - private Set<Vector3f> loadedPortals = new HashSet<>(); - private HashMap<BlockPos, String> portalNameMap = new HashMap<>(); - - @SubscribeEvent - public void onWorldChange(WorldEvent.Load event) { - portalNameMap.clear(); - loadedPortals.clear(); - } - - /** The current GL viewport */ - private static final IntBuffer VIEWPORT = GLAllocation.createDirectIntBuffer(16); - /** The current GL modelview matrix */ - private static final FloatBuffer MODELVIEW = GLAllocation.createDirectFloatBuffer(16); - /** The current GL projection matrix */ - private static final FloatBuffer PROJECTION = GLAllocation.createDirectFloatBuffer(16); - private static final FloatBuffer WINCOORDS = GLAllocation.createDirectFloatBuffer(3); - - private float getFOVModifier(float partialTicks) { - Entity entity = Minecraft.getMinecraft().getRenderViewEntity(); - - float f = Minecraft.getMinecraft().gameSettings.fovSetting; - //f = f * (this.fovModifierHandPrev + (this.fovModifierHand - this.fovModifierHandPrev) * partialTicks); - - if (entity instanceof EntityLivingBase && ((EntityLivingBase)entity).getHealth() <= 0.0F) { - float f1 = (float)((EntityLivingBase)entity).deathTime + partialTicks; - f /= (1.0F - 500.0F / (f1 + 500.0F)) * 2.0F + 1.0F; - } - - Block block = ActiveRenderInfo.getBlockAtEntityViewpoint(Minecraft.getMinecraft().theWorld, entity, partialTicks); - - if (block.getMaterial() == Material.water) { - f = f * 60.0F / 70.0F; - } - - return net.minecraftforge.client.ForgeHooksClient.getFOVModifier(Minecraft.getMinecraft().entityRenderer, entity, block, partialTicks, f); - } - - TexLoc tl = new TexLoc(0, 1, Keyboard.KEY_M); - - @SubscribeEvent - public void renderWorld(RenderGameOverlayEvent event) { - - GlStateManager.getFloat(2982, MODELVIEW); - GlStateManager.getFloat(2983, PROJECTION); - GL11.glGetInteger(GL11.GL_VIEWPORT, VIEWPORT); - - EntityPlayerSP player = Minecraft.getMinecraft().thePlayer; - GlStateManager.disableCull(); - - tl.handleKeyboardInput(); - - WINCOORDS.flip().limit(3); - - /*float objx = -(float)(0-player.posX); - float objy = (float)(100-player.posY-player.eyeHeight); - float objz = (float)(0-player.posZ);*/ - - float dX = -(float)(0-player.posX); - float dY = (float)(100-player.posY-player.eyeHeight); - float dZ = (float)(0-player.posZ); - - //GLU.gluProject(objx, objy, objz, MODELVIEW, PROJECTION, VIEWPORT, WINCOORDS); - - double x = dX*Math.cos(Math.toRadians(player.rotationYawHead))-dZ*Math.sin(Math.toRadians(player.rotationYawHead)); - double z = dX*Math.sin(Math.toRadians(player.rotationYawHead))+dZ*Math.cos(Math.toRadians(player.rotationYawHead)); - - float fov = getFOVModifier(event.partialTicks); - x = x / z * Math.toRadians(fov); - dY = (float)(dY / z * Math.toRadians(fov)); - - //System.out.println(z); - - //GLU.gluProject((float)x, dY, (float)z, MODELVIEW, PROJECTION, VIEWPORT, WINCOORDS); - //x = x / z * 2; - //dY = (float)(dY / z * 2); - - GL11.glEnable(GL11.GL_SCISSOR_TEST); - - GL11.glScissor((int)(x*Minecraft.getMinecraft().displayWidth*tl.x/tl.y)+Minecraft.getMinecraft().displayWidth/2, - (int)(dY+Minecraft.getMinecraft().displayHeight/2), 2, 2); - - drawRect(0, 0, 2000, 2000, -1); - - GL11.glDisable(GL11.GL_SCISSOR_TEST); - - /*for(BlockPos pos : portalNameMap.keySet()) { - WINCOORDS.flip().limit(3); - - /*float objx = -(float)((pos.getX()-player.posX)*Math.cos(Math.toRadians(player.rotationYawHead))*Math.cos(Math.toRadians(player.rotationPitch))); - float objy = (float)((pos.getY()-player.posY)*Math.sin(Math.toRadians(player.rotationPitch))); - float objz = (float)((pos.getZ()-player.posZ)*Math.sin(Math.toRadians(player.rotationYawHead))); - - float objx = -(float)(pos.getX()-player.posX); - float objy = (float)(pos.getY()-player.posY-player.eyeHeight); - float objz = (float)(pos.getZ()-player.posZ); - - GLU.gluProject(objx, objy, objz, MODELVIEW, PROJECTION, VIEWPORT, WINCOORDS); - //GLU.glu - - GL11.glEnable(GL11.GL_SCISSOR_TEST); - - //System.out.println(WINCOORDS.get(1)); - - GL11.glScissor((int)WINCOORDS.get(0)*2, - Minecraft.getMinecraft().displayHeight-(int)WINCOORDS.get(1), (int)50, (int)50); - - //0-1 - //-1 - 1 - //0-1920 - - drawRect(0, 0, 2000, 2000, -1); - - GL11.glDisable(GL11.GL_SCISSOR_TEST); - }*/ - - GlStateManager.enableCull(); - } - - @SubscribeEvent - public void tick(TickEvent.ClientTickEvent event) { - if(event.phase != TickEvent.Phase.END) { - return; - } - if(Minecraft.getMinecraft().theWorld != null) { - List<Vector3f> travelToPositions = new ArrayList<>(); - for(Entity entity : Minecraft.getMinecraft().theWorld.loadedEntityList) { - if(entity instanceof EntityArmorStand) { - EntityArmorStand armorStand = (EntityArmorStand) entity; - if(armorStand.isInvisible() && armorStand.hasCustomName()) { - String customName = armorStand.getCustomNameTag(); - if(customName.equals(EnumChatFormatting.AQUA+"Travel to:")) { - travelToPositions.add(new Vector3f((float)armorStand.posX, (float)armorStand.posY, (float)armorStand.posZ)); - } - } - } - } - travelToPositions.removeAll(loadedPortals); - for(Entity entity : Minecraft.getMinecraft().theWorld.loadedEntityList) { - if(entity instanceof EntityArmorStand) { - EntityArmorStand armorStand = (EntityArmorStand) entity; - if(armorStand.isInvisible() && armorStand.hasCustomName()) { - String customName = armorStand.getCustomNameTag(); - for(Vector3f position : travelToPositions) { - if(position.x == (float)armorStand.posX && position.y-0.375 == (float)armorStand.posY && position.z == (float)armorStand.posZ) { - float smallestDist = 999; - BlockPos closestPortal = null; - for(int xOff=-3; xOff<=3; xOff++) { - for(int zOff=-3; zOff<=3; zOff++) { - if(xOff != 0 && zOff != 0) continue; - BlockPos pos = new BlockPos(armorStand.posX+xOff, armorStand.posY+2, armorStand.posZ+zOff); - if(Minecraft.getMinecraft().theWorld.getBlockState(pos).getBlock() == Blocks.portal) { - float dist = (float)(armorStand.posX-(pos.getX()+0.5) + armorStand.posZ-(pos.getZ()+0.5)); - if(closestPortal == null || dist < smallestDist) { - smallestDist = dist; - closestPortal = pos; - } - } - } - } - if(closestPortal != null) { - portalNameMap.put(closestPortal, customName); - } - } - } - } - } - } - loadedPortals.addAll(travelToPositions); - } - } - - public void tryRegisterPortal() { - - } - -} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/ItemPriceInformation.java b/src/main/java/io/github/moulberry/notenoughupdates/ItemPriceInformation.java new file mode 100644 index 00000000..8d71992e --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/ItemPriceInformation.java @@ -0,0 +1,205 @@ +package io.github.moulberry.notenoughupdates; + +import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.auction.APIManager; +import net.minecraft.util.EnumChatFormatting; +import org.lwjgl.input.Keyboard; + +import java.text.NumberFormat; +import java.util.List; +import java.util.Locale; + +public class ItemPriceInformation { + + public static boolean addToTooltip(List<String> tooltip, String internalname) { + JsonObject auctionInfo = NotEnoughUpdates.INSTANCE.manager.auctionManager.getItemAuctionInfo(internalname); + JsonObject bazaarInfo = NotEnoughUpdates.INSTANCE.manager.auctionManager.getBazaarInfo(internalname); + float lowestBinAvg = NotEnoughUpdates.INSTANCE.manager.auctionManager.getItemAvgBin(internalname); + + int lowestBin = NotEnoughUpdates.INSTANCE.manager.auctionManager.getLowestBin(internalname); + APIManager.CraftInfo craftCost = NotEnoughUpdates.INSTANCE.manager.auctionManager.getCraftCost(internalname); + + boolean auctionItem = lowestBin > 0 || lowestBinAvg > 0 || auctionInfo != null; + boolean bazaarItem = bazaarInfo != null; + + NumberFormat format = NumberFormat.getInstance(Locale.US); + + if(auctionItem) { + int[] lines = { + NotEnoughUpdates.INSTANCE.config.priceInfoAuc.line1, + NotEnoughUpdates.INSTANCE.config.priceInfoAuc.line2, + NotEnoughUpdates.INSTANCE.config.priceInfoAuc.line3, + NotEnoughUpdates.INSTANCE.config.priceInfoAuc.line4, + NotEnoughUpdates.INSTANCE.config.priceInfoAuc.line5, + NotEnoughUpdates.INSTANCE.config.priceInfoAuc.line6 + }; + + boolean added = false; + + for(int lineId : lines) { + switch (lineId) { + case 0: + continue; + case 1: + if(lowestBin > 0) { + if(!added) { + tooltip.add(""); + added = true; + } + tooltip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"Lowest BIN: " + + EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(lowestBin)+" coins"); + } + break; + case 2: + if(auctionInfo != null) { + if(!added) { + tooltip.add(""); + added = true; + } + + if(auctionInfo.has("clean_price")) { + tooltip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"AH Price (Clean): "+ EnumChatFormatting.GOLD+ + EnumChatFormatting.BOLD+ + format.format((int)auctionInfo.get("clean_price").getAsFloat())+" coins"); + } else { + int auctionPrice = (int)(auctionInfo.get("price").getAsFloat() / auctionInfo.get("count").getAsFloat()); + tooltip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"AH Price: "+ EnumChatFormatting.GOLD+ + EnumChatFormatting.BOLD+format.format(auctionPrice)+" coins"); + } + + } + break; + case 3: + if(auctionInfo != null) { + if(!added) { + tooltip.add(""); + added = true; + } + if(auctionInfo.has("clean_price")) { + tooltip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"AH Sales (Clean): "+ + EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+ + format.format(auctionInfo.get("clean_sales").getAsFloat())+" sales/day"); + } else { + tooltip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"AH Sales: "+ + EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+ + format.format(auctionInfo.get("sales").getAsFloat())+" sales/day"); + } + } + break; + case 4: + if(craftCost.fromRecipe) { + if(!added) { + tooltip.add(""); + added = true; + } + tooltip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"Raw Craft Cost: "+ + EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format((int)craftCost.craftCost)+" coins"); + } + break; + case 5: + if(lowestBinAvg > 0) { + if(!added) { + tooltip.add(""); + added = true; + } + tooltip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"AVG Lowest BIN: "+ + EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(lowestBinAvg)+" coins"); + } + break; + } + } + + return added; + } else if(bazaarItem) { + int[] lines = { + NotEnoughUpdates.INSTANCE.config.priceInfoBaz.line1, + NotEnoughUpdates.INSTANCE.config.priceInfoBaz.line2, + NotEnoughUpdates.INSTANCE.config.priceInfoBaz.line3, + NotEnoughUpdates.INSTANCE.config.priceInfoBaz.line4, + NotEnoughUpdates.INSTANCE.config.priceInfoBaz.line5, + NotEnoughUpdates.INSTANCE.config.priceInfoBaz.line6 + }; + + boolean added = false; + + boolean shiftPressed = Keyboard.isKeyDown(Keyboard.KEY_LSHIFT); + + int stackMultiplier = 1; + int shiftStackMultiplier = 64; + if(shiftPressed) { + stackMultiplier = shiftStackMultiplier; + } + + //values = {"", "Buy", "Sell", "Buy (Insta)", "Sell (Insta)", "Raw Craft Cost"} + for(int lineId : lines) { + switch (lineId) { + case 0: + continue; + case 1: + if(bazaarInfo.has("avg_buy")) { + if(!added) { + tooltip.add(""); + if(!shiftPressed) tooltip.add(EnumChatFormatting.DARK_GRAY.toString()+"[SHIFT show x"+shiftStackMultiplier+"]"); + added = true; + } + int bazaarBuyPrice = (int)bazaarInfo.get("avg_buy").getAsFloat()*stackMultiplier; + tooltip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"Bazaar Buy: "+ + EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(bazaarBuyPrice)+" coins"); + } + break; + case 2: + if(bazaarInfo.has("avg_sell")) { + if(!added) { + tooltip.add(""); + if(!shiftPressed) tooltip.add(EnumChatFormatting.DARK_GRAY.toString()+"[SHIFT show x"+shiftStackMultiplier+"]"); + added = true; + } + int bazaarSellPrice = (int)bazaarInfo.get("avg_sell").getAsFloat()*stackMultiplier; + tooltip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"Bazaar Sell: "+ + EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(bazaarSellPrice)+" coins"); + } + break; + case 3: + if(bazaarInfo.has("curr_buy")) { + if(!added) { + tooltip.add(""); + if(!shiftPressed) tooltip.add(EnumChatFormatting.DARK_GRAY.toString()+"[SHIFT show x"+shiftStackMultiplier+"]"); + added = true; + } + int bazaarInstantBuyPrice = (int)bazaarInfo.get("curr_buy").getAsFloat()*stackMultiplier; + tooltip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"Bazaar Insta-Buy: "+ + EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(bazaarInstantBuyPrice)+" coins"); + } + break; + case 4: + if(bazaarInfo.has("curr_sell")) { + if(!added) { + tooltip.add(""); + if(!shiftPressed) tooltip.add(EnumChatFormatting.DARK_GRAY.toString()+"[SHIFT show x"+shiftStackMultiplier+"]"); + added = true; + } + int bazaarInstantSellPrice = (int)bazaarInfo.get("curr_sell").getAsFloat()*stackMultiplier; + tooltip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"Bazaar Insta-Sell: "+ + EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(bazaarInstantSellPrice)+" coins"); + } + break; + case 5: + if(craftCost.fromRecipe) { + if(!added) { + tooltip.add(""); + added = true; + } + tooltip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"Raw Craft Cost: "+ + EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format((int)craftCost.craftCost)+" coins"); + } + break; + } + } + + return added; + } + + return false; + } + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUEventListener.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUEventListener.java index 47ea832f..7b08ddf4 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUEventListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUEventListener.java @@ -9,9 +9,12 @@ import io.github.moulberry.notenoughupdates.cosmetics.CapeManager; import io.github.moulberry.notenoughupdates.dungeons.DungeonBlocks; import io.github.moulberry.notenoughupdates.dungeons.DungeonWin; import io.github.moulberry.notenoughupdates.gamemodes.SBGamemodes; +import io.github.moulberry.notenoughupdates.miscfeatures.BetterContainers; +import io.github.moulberry.notenoughupdates.miscfeatures.StreamerMode; +import io.github.moulberry.notenoughupdates.miscgui.*; import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; -import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer; -import io.github.moulberry.notenoughupdates.questing.SBInfo; +import io.github.moulberry.notenoughupdates.util.RequestFocusListener; +import io.github.moulberry.notenoughupdates.util.SBInfo; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; @@ -21,7 +24,6 @@ import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.gui.inventory.GuiChest; import net.minecraft.client.gui.inventory.GuiContainer; -import net.minecraft.client.gui.inventory.GuiCrafting; import net.minecraft.client.gui.inventory.GuiEditSign; import net.minecraft.client.network.NetworkPlayerInfo; import net.minecraft.client.renderer.GlStateManager; @@ -39,7 +41,7 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraftforge.client.event.*; import net.minecraftforge.event.entity.player.EntityInteractEvent; import net.minecraftforge.event.entity.player.ItemTooltipEvent; -import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; @@ -64,7 +66,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.regex.Matcher; import java.util.regex.Pattern; -import static io.github.moulberry.notenoughupdates.GuiTextures.dungeon_chest_worth; +import static io.github.moulberry.notenoughupdates.util.GuiTextures.dungeon_chest_worth; public class NEUEventListener { @@ -124,6 +126,11 @@ public class NEUEventListener { } } + @SubscribeEvent + public void onWorldLoad(WorldEvent.Unload event) { + NotEnoughUpdates.INSTANCE.saveConfig(); + } + private long notificationDisplayMillis = 0; private List<String> notificationLines = null; @@ -146,14 +153,14 @@ public class NEUEventListener { longUpdate = true; lastLongUpdate = currentTime; } - if(!NotEnoughUpdates.INSTANCE.manager.config.slowDungeonBlocks.value) { + if(!neu.config.dungeonBlock.slowDungeonBlocks) { DungeonBlocks.tick(); } DungeonWin.tick(); if(longUpdate) { NotEnoughUpdates.INSTANCE.overlay.redrawItems(); - if(NotEnoughUpdates.INSTANCE.manager.config.slowDungeonBlocks.value) { + if(neu.config.dungeonBlock.slowDungeonBlocks) { DungeonBlocks.tick(); } @@ -181,11 +188,11 @@ public class NEUEventListener { SBGamemodes.loadFromFile(); - if(neu.manager.config.showUpdateMsg.value) { + if(neu.config.notifications.showUpdateMsg) { displayUpdateMessageIfOutOfDate(); } - if(NotEnoughUpdates.INSTANCE.manager.config.doRamNotif.value) { + if(neu.config.hidden.doRamNotif) { long maxMemoryMB = Runtime.getRuntime().maxMemory()/1024L/1024L; if(maxMemoryMB > 4100) { notificationDisplayMillis = System.currentTimeMillis(); @@ -199,9 +206,8 @@ public class NEUEventListener { } } - if(!neu.manager.config.loadedModBefore.value) { - neu.manager.config.loadedModBefore.value = true; - try { neu.manager.saveConfig(); } catch(IOException e) {} + if(!neu.config.hidden.loadedModBefore) { + neu.config.hidden.loadedModBefore = true; Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText("")); Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText( @@ -283,7 +289,7 @@ public class NEUEventListener { if(stack != null && stack.hasTagCompound()) { String internalname = neu.manager.getInternalNameForItem(stack); if(internalname != null) { - ArrayList<String> log = neu.manager.config.collectionLog.value.computeIfAbsent( + /*ArrayList<String> log = neu.manager.config.collectionLog.value.computeIfAbsent( neu.manager.getCurrentProfile(), k -> new ArrayList<>()); if(!log.contains(internalname)) { newItem.add(internalname); @@ -295,7 +301,7 @@ public class NEUEventListener { } else { newItemAddMap.put(internalname, System.currentTimeMillis()); } - } + }*/ } } } @@ -396,16 +402,8 @@ public class NEUEventListener { if(Minecraft.getMinecraft().currentScreen == null && event.gui instanceof GuiContainer) { neu.overlay.reset(); - neu.manager.loadConfig(); } - //CLOSE - if(Minecraft.getMinecraft().currentScreen instanceof GuiContainer - && event.gui == null) { - try { - neu.manager.saveConfig(); - } catch(IOException e) {} - } - if(event.gui != null && neu.manager.config.dev.value) { + if(event.gui != null && neu.config.hidden.dev) { if(event.gui instanceof GuiChest) { GuiChest eventGui = (GuiChest) event.gui; ContainerChest cc = (ContainerChest) eventGui.inventorySlots; @@ -540,8 +538,9 @@ public class NEUEventListener { } else if(unformatted.startsWith("Your profile was changed to: ")) {//Your profile was changed to: neu.manager.setCurrentProfile(unformatted.substring("Your profile was changed to: ".length()).split(" ")[0].trim()); } else if(unformatted.startsWith("Your new API key is ")) { - neu.manager.config.apiKey.value = unformatted.substring("Your new API key is ".length()); - try { neu.manager.saveConfig(); } catch(IOException ioe) {} + neu.config.apiKey.apiKey = unformatted.substring("Your new API key is ".length()); + Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW+ + "[NEU] API Key automatically configured")); } if(e.message.getFormattedText().equals(EnumChatFormatting.RESET.toString()+ EnumChatFormatting.RED+"You haven't unlocked this recipe!"+EnumChatFormatting.RESET)) { @@ -566,7 +565,7 @@ public class NEUEventListener { } //System.out.println(e.message); if(unformatted.startsWith("Sending to server") && - neu.isOnSkyblock() && neu.manager.config.streamerMode.value && e.message instanceof ChatComponentText) { + neu.isOnSkyblock() && neu.config.misc.streamerMode && e.message instanceof ChatComponentText) { String m = e.message.getFormattedText(); String m2 = StreamerMode.filterChat(e.message.getFormattedText()); if(!m.equals(m2)) { @@ -633,13 +632,6 @@ public class NEUEventListener { GL11.glTranslatef(0, 0, 10); } } - - if(shouldRenderOverlay(event.gui) && neu.isOnSkyblock()) { - renderDungeonChestOverlay(event.gui); - if(neu.manager.config.accessoryBagOverlay.value) { - AccessoryBagOverlay.renderOverlay(); - } - } } @SubscribeEvent @@ -706,10 +698,17 @@ public class NEUEventListener { GlStateManager.popMatrix(); } } + + if(shouldRenderOverlay(event.gui) && neu.isOnSkyblock()) { + renderDungeonChestOverlay(event.gui); + if(neu.config.accessoryBag.enableOverlay) { + AccessoryBagOverlay.renderOverlay(); + } + } } private void renderDungeonChestOverlay(GuiScreen gui) { - if(gui instanceof GuiChest && !neu.manager.config.dungeonProfitLore.value) { + if(gui instanceof GuiChest && neu.config.dungeonProfit.profitDisplayLoc != 2) { try { int xSize = (int) Utils.getField(GuiContainer.class, gui, "xSize", "field_146999_f"); int ySize = (int) Utils.getField(GuiContainer.class, gui, "ySize", "field_147000_g"); @@ -722,30 +721,24 @@ public class NEUEventListener { ItemStack rewardChest = lower.getStackInSlot(31); if (rewardChest != null && rewardChest.getDisplayName().endsWith(EnumChatFormatting.GREEN+"Open Reward Chest")) { - Minecraft.getMinecraft().getTextureManager().bindTexture(dungeon_chest_worth); - GL11.glColor4f(1, 1, 1, 1); - GlStateManager.disableLighting(); - Utils.drawTexturedRect(guiLeft+xSize+4, guiTop, 180, 101, 0, 180/256f, 0, 101/256f, GL11.GL_NEAREST); - int chestCost = 0; - String line6 = Utils.cleanColour(neu.manager.getLoreFromNBT(rewardChest.getTagCompound())[6]); - StringBuilder cost = new StringBuilder(); - for(int i=0; i<line6.length(); i++) { - char c = line6.charAt(i); - if("0123456789".indexOf(c) >= 0) { - cost.append(c); + try { + String line6 = Utils.cleanColour(neu.manager.getLoreFromNBT(rewardChest.getTagCompound())[6]); + StringBuilder cost = new StringBuilder(); + for(int i=0; i<line6.length(); i++) { + char c = line6.charAt(i); + if("0123456789".indexOf(c) >= 0) { + cost.append(c); + } } - } - if(cost.length() > 0) { - chestCost = Integer.parseInt(cost.toString()); - } + if(cost.length() > 0) { + chestCost = Integer.parseInt(cost.toString()); + } + } catch(Exception ignored) {} - String missingItemBIN = null; - String missingItemABIN = null; - String missingItemAUC = null; - int totalValueBIN = 0; - int totalValueABIN = 0; - int totalValueAUC = 0; + String missingItem = null; + int totalValue = 0; + HashMap<String, Float> itemValues = new HashMap<>(); for(int i=0; i<5; i++) { ItemStack item = lower.getStackInSlot(11+i); String internal = neu.manager.getInternalNameForItem(item); @@ -757,119 +750,128 @@ public class NEUEventListener { bazaarPrice = bazaarInfo.get("avg_sell").getAsFloat(); } - float worthBIN; - float worthABIN; - float worthAUC = -1; - + float worth = -1; if(bazaarPrice > 0) { - worthBIN = bazaarPrice; - worthABIN = bazaarPrice; - worthAUC = bazaarPrice; + worth = bazaarPrice; } else { - worthABIN = neu.manager.auctionManager.getItemAvgBin(internal); - worthBIN = neu.manager.auctionManager.getLowestBin(internal); - - JsonObject aucInfo = neu.manager.auctionManager.getItemAuctionInfo(internal); - if(aucInfo != null) { - worthAUC = aucInfo.get("price").getAsFloat(); + switch(neu.config.dungeonProfit.profitType) { + case 1: + worth = neu.manager.auctionManager.getItemAvgBin(internal); + break; + case 2: + JsonObject auctionInfo = neu.manager.auctionManager.getItemAuctionInfo(internal); + if(auctionInfo != null) { + if(auctionInfo.has("clean_price")) { + worth = (int)auctionInfo.get("clean_price").getAsFloat(); + } else { + worth = (int)(auctionInfo.get("price").getAsFloat() / auctionInfo.get("count").getAsFloat()); + } + } + break; + default: + worth = neu.manager.auctionManager.getLowestBin(internal); } - } - - if(worthBIN > 0 && totalValueBIN >= 0) { - totalValueBIN += worthBIN; - } else { - if(totalValueBIN != -1) { - missingItemBIN = internal; + if(worth <= 0) { + worth = neu.manager.auctionManager.getLowestBin(internal); + if(worth <= 0) { + worth = neu.manager.auctionManager.getItemAvgBin(internal); + if(worth <= 0) { + JsonObject auctionInfo = neu.manager.auctionManager.getItemAuctionInfo(internal); + if(auctionInfo != null) { + if(auctionInfo.has("clean_price")) { + worth = (int)auctionInfo.get("clean_price").getAsFloat(); + } else { + worth = (int)(auctionInfo.get("price").getAsFloat() / auctionInfo.get("count").getAsFloat()); + } + } + } + } } - totalValueBIN = -1; } - if(worthABIN > 0 && totalValueABIN >= 0) { - totalValueABIN += worthABIN; - } else { - if(totalValueABIN != -1) { - missingItemABIN = internal; + if(worth > 0 && totalValue >= 0) { + totalValue += worth; + String display = item.getDisplayName(); + + if(display.contains("Enchanted Book")) { + NBTTagCompound tag = item.getTagCompound(); + if(tag != null && tag.hasKey("ExtraAttributes", 10)) { + NBTTagCompound ea = tag.getCompoundTag("ExtraAttributes"); + NBTTagCompound enchants = ea.getCompoundTag("enchantments"); + + int highestLevel = -1; + for(String enchname : enchants.getKeySet()) { + int level = enchants.getInteger(enchname); + if(level > highestLevel) { + display = EnumChatFormatting.BLUE+WordUtils.capitalizeFully( + enchname.replace("_", " ") + .replace("Ultimate", "") + .trim()) + " " + level; + } + } + } } - totalValueABIN = -1; - } - if(worthAUC > 0 && totalValueAUC >= 0) { - totalValueAUC += worthAUC; + itemValues.put(display, worth); } else { - if(totalValueAUC != -1) { - missingItemAUC = internal; + if(totalValue != -1) { + missingItem = internal; } - totalValueAUC = -1; + totalValue = -1; } } } NumberFormat format = NumberFormat.getInstance(Locale.US); - String valueStringBIN; - String valueStringABIN; - String valueStringAUC; - if(totalValueBIN >= 0) { - valueStringBIN = EnumChatFormatting.YELLOW+"Value (BIN): " + EnumChatFormatting.GOLD - + EnumChatFormatting.BOLD + format.format(totalValueBIN) + " coins"; - } else { - valueStringBIN = EnumChatFormatting.YELLOW+"Can't find BIN: " + missingItemBIN; - } - if(totalValueABIN >= 0) { - valueStringABIN = EnumChatFormatting.YELLOW+"Value (AVG BIN): " + EnumChatFormatting.GOLD - + EnumChatFormatting.BOLD + format.format(totalValueABIN) + " coins"; + String valueStringBIN1; + String valueStringBIN2; + if(totalValue >= 0) { + valueStringBIN1 = EnumChatFormatting.YELLOW+"Value (BIN): "; + valueStringBIN2 = EnumChatFormatting.GOLD + format.format(totalValue) + " coins"; } else { - valueStringABIN = EnumChatFormatting.YELLOW+"Can't find AVG BIN: " + missingItemABIN; - } - if(totalValueAUC >= 0) { - valueStringAUC = EnumChatFormatting.YELLOW+"Value (AUC): " + EnumChatFormatting.GOLD - + EnumChatFormatting.BOLD + format.format(totalValueAUC) + " coins"; - } else { - valueStringAUC = EnumChatFormatting.YELLOW+"Can't find AUC: " + missingItemAUC; + valueStringBIN1 = EnumChatFormatting.YELLOW+"Can't find BIN: "; + valueStringBIN2 = missingItem; } - String profitPrefix = EnumChatFormatting.YELLOW+"Profit/Loss: " + EnumChatFormatting.DARK_GREEN - + EnumChatFormatting.BOLD + "+"; - String lossPrefix = EnumChatFormatting.YELLOW+"Profit/Loss: " + EnumChatFormatting.RED - + EnumChatFormatting.BOLD + "-"; + int profitLossBIN = totalValue - chestCost; + + String profitPrefix = EnumChatFormatting.DARK_GREEN.toString(); + String lossPrefix = EnumChatFormatting.RED.toString(); + String prefix = profitLossBIN >= 0 ? profitPrefix : lossPrefix; - int profitLossBIN = totalValueBIN - chestCost; String plStringBIN; if(profitLossBIN >= 0) { - plStringBIN = profitPrefix + format.format(profitLossBIN) + " coins"; - } else { - plStringBIN = lossPrefix + format.format(-profitLossBIN) + " coins"; - } - - int profitLossABIN = totalValueABIN - chestCost; - String plStringABIN; - if(profitLossABIN >= 0) { - plStringABIN = profitPrefix + format.format(profitLossABIN) + " coins"; + plStringBIN = prefix + "+" + format.format(profitLossBIN) + " coins"; } else { - plStringABIN = lossPrefix + format.format(-profitLossABIN) + " coins"; + plStringBIN = prefix + "-" + format.format(-profitLossBIN) + " coins"; } - int profitLossAUC = totalValueAUC - chestCost; - String plStringAUC; - if(profitLossAUC >= 0) { - plStringAUC = profitPrefix + format.format(profitLossAUC) + " coins"; - } else { - plStringAUC = lossPrefix + format.format(-profitLossAUC) + " coins"; + if(neu.config.dungeonProfit.profitDisplayLoc == 1 && !valueStringBIN2.equals(missingItem)) { + int w = Minecraft.getMinecraft().fontRendererObj.getStringWidth(plStringBIN); + GlStateManager.disableLighting(); + Minecraft.getMinecraft().fontRendererObj.drawString(plStringBIN, guiLeft+xSize-5-w, guiTop+5, + 0xffffffff, true); + return; } - drawStringShadow(valueStringBIN, guiLeft+xSize+4+90, - guiTop+14, 170); - if(totalValueBIN >= 0) drawStringShadow(plStringBIN, guiLeft+xSize+4+90, - guiTop+26, 170); + Minecraft.getMinecraft().getTextureManager().bindTexture(dungeon_chest_worth); + GL11.glColor4f(1, 1, 1, 1); + GlStateManager.disableLighting(); + Utils.drawTexturedRect(guiLeft+xSize+4, guiTop, 180, 101, 0, 180/256f, 0, 101/256f, GL11.GL_NEAREST); - drawStringShadow(valueStringABIN, guiLeft+xSize+4+90, - guiTop+44, 170); - if(totalValueABIN >= 0) drawStringShadow(plStringABIN, guiLeft+xSize+4+90, - guiTop+56, 170); + Utils.renderAlignedString(valueStringBIN1, valueStringBIN2, + guiLeft+xSize+4+10, guiTop+14, 160); + if(totalValue >= 0) { + Utils.renderAlignedString(EnumChatFormatting.YELLOW+"Profit/Loss: ", plStringBIN, + guiLeft+xSize+4+10, guiTop+24, 160); + } - drawStringShadow(valueStringAUC, guiLeft+xSize+4+90, - guiTop+74, 170); - if(totalValueAUC >= 0) drawStringShadow(plStringAUC, guiLeft+xSize+4+90, - guiTop+86, 170); + int index=0; + for(Map.Entry<String, Float> entry : itemValues.entrySet()) { + Utils.renderAlignedString(entry.getKey(), prefix+ + format.format(entry.getValue().intValue()), + guiLeft+xSize+4+10, guiTop+29+(++index)*10, 160); + } } } catch(Exception e) { e.printStackTrace(); @@ -918,7 +920,7 @@ public class NEUEventListener { return; } if(shouldRenderOverlay(event.gui) && neu.isOnSkyblock()) { - if(!neu.manager.config.accessoryBagOverlay.value || !AccessoryBagOverlay.mouseClick()) { + if(!neu.config.accessoryBag.enableOverlay || !AccessoryBagOverlay.mouseClick()) { if(!(hoverInv && focusInv)) { if(neu.overlay.mouseInput()) { event.setCanceled(true); @@ -964,7 +966,7 @@ public class NEUEventListener { event.setCanceled(true); } } - if(neu.manager.config.dev.value && neu.manager.config.enableItemEditing.value && Minecraft.getMinecraft().theWorld != null && + if(neu.config.hidden.dev && neu.config.hidden.enableItemEditing && Minecraft.getMinecraft().theWorld != null && Keyboard.getEventKey() == Keyboard.KEY_O && Keyboard.getEventKeyState()) { GuiScreen gui = Minecraft.getMinecraft().currentScreen; if(gui instanceof GuiChest) { @@ -1052,7 +1054,7 @@ public class NEUEventListener { JsonObject enchantsConst = Constants.ENCHANTS; JsonArray allItemEnchs = null; Set<String> ignoreFromPool = new HashSet<>(); - if(enchantsConst != null && hasEnchantments && NotEnoughUpdates.INSTANCE.manager.config.missingEnchantList.value) { + if(enchantsConst != null && hasEnchantments && neu.config.tooltipTweaks.missingEnchantList) { try { JsonArray enchantPools = enchantsConst.get("enchant_pools").getAsJsonArray(); for(JsonElement element : enchantPools) { @@ -1104,7 +1106,7 @@ public class NEUEventListener { line = line.replace("\u00A7cR\u00A76a\u00A7ei\u00A7an\u00A7bb\u00A79o\u00A7dw\u00A79 Rune", Utils.chromaString("Rainbow Rune", index, false)+EnumChatFormatting.BLUE); } else if(hasEnchantments) { - if(Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) && NotEnoughUpdates.INSTANCE.manager.config.missingEnchantList.value) { + if(Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) && neu.config.tooltipTweaks.missingEnchantList) { boolean lineHasEnch = false; for(String s : enchantIds) { String enchantName = WordUtils.capitalizeFully(s.replace("_", " ")); @@ -1147,7 +1149,7 @@ public class NEUEventListener { } } } - for(String op : neu.manager.config.enchantColours.value) { + for(String op : neu.config.hidden.enchantColours) { List<String> colourOps = GuiEnchantColour.splitter.splitToList(op); String enchantName = GuiEnchantColour.getColourOpIndex(colourOps, 0); String comparator = GuiEnchantColour.getColourOpIndex(colourOps, 1); @@ -1264,63 +1266,21 @@ public class NEUEventListener { newTooltip.add(line); - if(neu.manager.config.auctionPriceInfo.value) { + if(neu.config.tooltipTweaks.showPriceInfoAucItem) { if(line.contains(EnumChatFormatting.GRAY+"Buy it now: ") || line.contains(EnumChatFormatting.GRAY+"Bidder: ") || line.contains(EnumChatFormatting.GRAY+"Starting bid: ")) { - if(internalname != null) { - newTooltip.add(""); - if(!Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) && !Keyboard.isKeyDown(Keyboard.KEY_RSHIFT)) { - newTooltip.add(EnumChatFormatting.GRAY+"[SHIFT for Price Info]"); - } else { - JsonObject auctionInfo = neu.manager.auctionManager.getItemAuctionInfo(internalname); - float lowestBinAvg = neu.manager.auctionManager.getItemAvgBin(internalname); - - int lowestBin = neu.manager.auctionManager.getLowestBin(internalname); - APIManager.CraftInfo craftCost = neu.manager.auctionManager.getCraftCost(internalname); - - boolean hasAuctionPrice = auctionInfo != null; - boolean hasLowestBinPrice = lowestBin > 0 && neu.manager.config.advancedPriceInfo.value; - boolean hasLowestBinAvgPrice = lowestBinAvg > 0; - - NumberFormat format = NumberFormat.getInstance(Locale.US); - if(hasLowestBinPrice) { - newTooltip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"Lowest BIN: "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(lowestBin)+" coins"); - } - if(hasLowestBinAvgPrice) { - newTooltip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"AVG Lowest BIN: "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(lowestBinAvg)+" coins"); - } - if(hasAuctionPrice) { - int auctionPrice = (int)(auctionInfo.get("price").getAsFloat() / auctionInfo.get("count").getAsFloat()); - newTooltip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"AH Price: "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(auctionPrice)+" coins"); - if(neu.manager.config.advancedPriceInfo.value) { - newTooltip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"AH Sales: "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(auctionInfo.get("sales").getAsFloat())+" sales/day"); - } - if(auctionInfo.has("clean_price")) { - newTooltip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"AH Price (Clean): "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format((int)auctionInfo.get("clean_price").getAsFloat())+" coins"); - if(neu.manager.config.advancedPriceInfo.value) { - newTooltip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"AH Sales (Clean): "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(auctionInfo.get("clean_sales").getAsFloat())+" sales/day"); - } - } - - } - if(hasAuctionPrice && craftCost.fromRecipe) { - newTooltip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"Raw Craft Cost: "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format((int)craftCost.craftCost)+" coins"); - } - } + if(!Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) && !Keyboard.isKeyDown(Keyboard.KEY_RSHIFT)) { + newTooltip.add(""); + newTooltip.add(EnumChatFormatting.GRAY+"[SHIFT for Price Info]"); + } else { + ItemPriceInformation.addToTooltip(newTooltip, internalname); } } } - if(neu.manager.config.dungeonProfitLore.value && Minecraft.getMinecraft().currentScreen instanceof GuiChest) { + if(neu.config.dungeonProfit.profitDisplayLoc == 2 && Minecraft.getMinecraft().currentScreen instanceof GuiChest) { if(line.contains(EnumChatFormatting.GREEN+"Open Reward Chest")) { dungeonProfit = true; } else if(index == 7 && dungeonProfit) { @@ -1329,141 +1289,141 @@ public class NEUEventListener { IInventory lower = cc.getLowerChestInventory(); int chestCost = 0; - String line6 = Utils.cleanColour(line); - StringBuilder cost = new StringBuilder(); - for(int i=0; i<line6.length(); i++) { - char c = line6.charAt(i); - if("0123456789".indexOf(c) >= 0) { - cost.append(c); + try { + String line6 = Utils.cleanColour(line); + StringBuilder cost = new StringBuilder(); + for(int i=0; i<line6.length(); i++) { + char c = line6.charAt(i); + if("0123456789".indexOf(c) >= 0) { + cost.append(c); + } } - } - if(cost.length() > 0) { - chestCost = Integer.parseInt(cost.toString()); - } + if(cost.length() > 0) { + chestCost = Integer.parseInt(cost.toString()); + } + } catch(Exception ignored) {} - String missingItemBIN = null; - String missingItemABIN = null; - String missingItemAUC = null; - int totalValueBIN = 0; - int totalValueABIN = 0; - int totalValueAUC = 0; + String missingItem = null; + int totalValue = 0; + HashMap<String, Float> itemValues = new HashMap<>(); for(int i=0; i<5; i++) { ItemStack item = lower.getStackInSlot(11+i); String internal = neu.manager.getInternalNameForItem(item); if(internal != null) { + internal = internal.replace("\u00CD", "I").replace("\u0130", "I"); float bazaarPrice = -1; JsonObject bazaarInfo = neu.manager.auctionManager.getBazaarInfo(internal); if(bazaarInfo != null && bazaarInfo.has("avg_sell")) { bazaarPrice = bazaarInfo.get("avg_sell").getAsFloat(); } - float worthBIN; - float worthABIN; - float worthAUC = -1; - + float worth = -1; if(bazaarPrice > 0) { - worthBIN = bazaarPrice; - worthABIN = bazaarPrice; - worthAUC = bazaarPrice; + worth = bazaarPrice; } else { - worthABIN = neu.manager.auctionManager.getItemAvgBin(internal); - worthBIN = neu.manager.auctionManager.getLowestBin(internal); - - JsonObject aucInfo = neu.manager.auctionManager.getItemAuctionInfo(internal); - if(aucInfo != null) { - worthAUC = aucInfo.get("price").getAsFloat(); + switch(neu.config.dungeonProfit.profitType) { + case 1: + worth = neu.manager.auctionManager.getItemAvgBin(internal); + break; + case 2: + JsonObject auctionInfo = neu.manager.auctionManager.getItemAuctionInfo(internal); + if(auctionInfo != null) { + if(auctionInfo.has("clean_price")) { + worth = (int)auctionInfo.get("clean_price").getAsFloat(); + } else { + worth = (int)(auctionInfo.get("price").getAsFloat() / auctionInfo.get("count").getAsFloat()); + } + } + break; + default: + worth = neu.manager.auctionManager.getLowestBin(internal); } - } - - if(worthBIN > 0 && totalValueBIN >= 0) { - totalValueBIN += worthBIN; - } else { - if(totalValueBIN != -1) { - missingItemBIN = internal; + if(worth <= 0) { + worth = neu.manager.auctionManager.getLowestBin(internal); + if(worth <= 0) { + worth = neu.manager.auctionManager.getItemAvgBin(internal); + if(worth <= 0) { + JsonObject auctionInfo = neu.manager.auctionManager.getItemAuctionInfo(internal); + if(auctionInfo != null) { + if(auctionInfo.has("clean_price")) { + worth = (int)auctionInfo.get("clean_price").getAsFloat(); + } else { + worth = (int)(auctionInfo.get("price").getAsFloat() / auctionInfo.get("count").getAsFloat()); + } + } + } + } } - totalValueBIN = -1; } - if(worthABIN > 0 && totalValueABIN >= 0) { - totalValueABIN += worthABIN; - } else { - if(totalValueABIN != -1) { - missingItemABIN = internal; + if(worth > 0 && totalValue >= 0) { + totalValue += worth; + + String display = item.getDisplayName(); + + if(display.contains("Enchanted Book")) { + NBTTagCompound tag = item.getTagCompound(); + if(tag != null && tag.hasKey("ExtraAttributes", 10)) { + NBTTagCompound ea = tag.getCompoundTag("ExtraAttributes"); + NBTTagCompound enchants = ea.getCompoundTag("enchantments"); + + int highestLevel = -1; + for(String enchname : enchants.getKeySet()) { + int level = enchants.getInteger(enchname); + if(level > highestLevel) { + display = EnumChatFormatting.BLUE+WordUtils.capitalizeFully( + enchname.replace("_", " ") + .replace("Ultimate", "") + .trim()) + " " + level; + } + } + } } - totalValueABIN = -1; - } - if(worthAUC > 0 && totalValueAUC >= 0) { - totalValueAUC += worthAUC; + itemValues.put(display, worth); } else { - if(totalValueAUC != -1) { - missingItemAUC = internal; + if(totalValue != -1) { + missingItem = internal; } - totalValueAUC = -1; + totalValue = -1; } } } NumberFormat format = NumberFormat.getInstance(Locale.US); - String valueStringBIN; - String valueStringABIN; - String valueStringAUC; - if(totalValueBIN >= 0) { - valueStringBIN = EnumChatFormatting.YELLOW+"Value (BIN): " + EnumChatFormatting.GOLD - + EnumChatFormatting.BOLD + format.format(totalValueBIN) + " coins"; + String valueStringBIN1; + String valueStringBIN2; + if(totalValue >= 0) { + valueStringBIN1 = EnumChatFormatting.YELLOW+"Value (BIN): "; + valueStringBIN2 = EnumChatFormatting.GOLD + format.format(totalValue) + " coins"; } else { - valueStringBIN = EnumChatFormatting.YELLOW+"Can't find BIN: " + missingItemBIN; - } - if(totalValueABIN >= 0) { - valueStringABIN = EnumChatFormatting.YELLOW+"Value (AVG BIN): " + EnumChatFormatting.GOLD - + EnumChatFormatting.BOLD + format.format(totalValueABIN) + " coins"; - } else { - valueStringABIN = EnumChatFormatting.YELLOW+"Can't find AVG BIN: " + missingItemABIN; - } - if(totalValueAUC >= 0) { - valueStringAUC = EnumChatFormatting.YELLOW+"Value (AUC): " + EnumChatFormatting.GOLD - + EnumChatFormatting.BOLD + format.format(totalValueAUC) + " coins"; - } else { - valueStringAUC = EnumChatFormatting.YELLOW+"Can't find AUC: " + missingItemAUC; + valueStringBIN1 = EnumChatFormatting.YELLOW+"Can't find BIN: "; + valueStringBIN2 = missingItem; } - String profitPrefix = EnumChatFormatting.YELLOW+"Profit/Loss: " + EnumChatFormatting.DARK_GREEN - + EnumChatFormatting.BOLD + "+"; - String lossPrefix = EnumChatFormatting.YELLOW+"Profit/Loss: " + EnumChatFormatting.RED - + EnumChatFormatting.BOLD + "-"; + int profitLossBIN = totalValue - chestCost; + String profitPrefix = EnumChatFormatting.DARK_GREEN.toString(); + String lossPrefix = EnumChatFormatting.RED.toString(); + String prefix = profitLossBIN >= 0 ? profitPrefix : lossPrefix; - int profitLossBIN = totalValueBIN - chestCost; String plStringBIN; if(profitLossBIN >= 0) { - plStringBIN = profitPrefix + format.format(profitLossBIN) + " coins"; + plStringBIN = prefix + "+" + format.format(profitLossBIN) + " coins"; } else { - plStringBIN = lossPrefix + format.format(-profitLossBIN) + " coins"; + plStringBIN = prefix + "-"+ format.format(-profitLossBIN) + " coins"; } - int profitLossABIN = totalValueABIN - chestCost; - String plStringABIN; - if(profitLossABIN >= 0) { - plStringABIN = profitPrefix + format.format(profitLossABIN) + " coins"; - } else { - plStringABIN = lossPrefix + format.format(-profitLossABIN) + " coins"; - } + String neu = EnumChatFormatting.YELLOW + "[NEU] "; - int profitLossAUC = totalValueAUC - chestCost; - String plStringAUC; - if(profitLossAUC >= 0) { - plStringAUC = profitPrefix + format.format(profitLossAUC) + " coins"; - } else { - plStringAUC = lossPrefix + format.format(-profitLossAUC) + " coins"; + newTooltip.add(neu + valueStringBIN1 + " " + valueStringBIN2); + if(totalValue >= 0) { + newTooltip.add(neu + EnumChatFormatting.YELLOW+"Profit/Loss: " + plStringBIN); } - String neu = EnumChatFormatting.YELLOW + "[NEU] "; - - newTooltip.add(neu + valueStringBIN); - if(totalValueBIN >= 0) newTooltip.add(neu + plStringBIN); - newTooltip.add(neu + valueStringABIN); - if(totalValueABIN >= 0) newTooltip.add(neu + plStringABIN); - newTooltip.add(neu + valueStringAUC); - if(totalValueAUC >= 0) newTooltip.add(neu + plStringAUC); + for(Map.Entry<String, Float> entry : itemValues.entrySet()) { + newTooltip.add(neu + entry.getKey() + prefix+"+"+ + format.format(entry.getValue().intValue())); + } } } @@ -1473,83 +1433,8 @@ public class NEUEventListener { event.toolTip.clear(); event.toolTip.addAll(newTooltip); - if(neu.manager.config.invAuctionPrice.value || neu.manager.config.invBazaarPrice.value) { - if(internalname != null) { - JsonObject auctionInfo = neu.manager.auctionManager.getItemAuctionInfo(internalname); - JsonObject bazaarInfo = neu.manager.auctionManager.getBazaarInfo(internalname); - float lowestBinAvg = neu.manager.auctionManager.getItemAvgBin(internalname); - - int lowestBin = neu.manager.auctionManager.getLowestBin(internalname); - APIManager.CraftInfo craftCost = neu.manager.auctionManager.getCraftCost(internalname); - - boolean hasAuctionPrice = neu.manager.config.invAuctionPrice.value && auctionInfo != null; - boolean hasBazaarPrice = neu.manager.config.invBazaarPrice.value && bazaarInfo != null; - boolean hasLowestBinPrice = neu.manager.config.invAuctionPrice.value && lowestBin > 0 && neu.manager.config.advancedPriceInfo.value; - boolean hasLowestBinAvgPrice = neu.manager.config.invAuctionPrice.value && lowestBinAvg > 0; - - NumberFormat format = NumberFormat.getInstance(Locale.US); - - if(hasAuctionPrice || hasBazaarPrice || hasLowestBinAvgPrice || hasLowestBinPrice) event.toolTip.add(""); - if(hasLowestBinPrice) { - event.toolTip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"Lowest BIN: "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(lowestBin)+" coins"); - } - if(hasLowestBinAvgPrice) { - event.toolTip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"AVG Lowest BIN: "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(lowestBinAvg)+" coins"); - } - if(hasAuctionPrice) { - int auctionPrice = (int)(auctionInfo.get("price").getAsFloat() / auctionInfo.get("count").getAsFloat()); - event.toolTip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"AH Price: "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(auctionPrice)+" coins"); - if(neu.manager.config.advancedPriceInfo.value) { - event.toolTip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"AH Sales: "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(auctionInfo.get("sales").getAsFloat())+" sales/day"); - } - if(auctionInfo.has("clean_price")) { - event.toolTip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"AH Price (Clean): "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format((int)auctionInfo.get("clean_price").getAsFloat())+" coins"); - if(neu.manager.config.advancedPriceInfo.value) { - event.toolTip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"AH Sales (Clean): "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(auctionInfo.get("clean_sales").getAsFloat())+" sales/day"); - } - } - } else if(hasBazaarPrice) { - int stackMultiplier = 1; - int shiftStackMultiplier = event.itemStack.stackSize > 1 ? event.itemStack.stackSize : 64; - if(Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) { - stackMultiplier = shiftStackMultiplier; - } else { - event.toolTip.add(EnumChatFormatting.DARK_GRAY.toString()+"[SHIFT show x"+shiftStackMultiplier+"]"); - } - if(bazaarInfo.has("avg_buy")) { - int bazaarBuyPrice = (int)bazaarInfo.get("avg_buy").getAsFloat()*stackMultiplier; - event.toolTip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"Bazaar Buy: "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(bazaarBuyPrice)+" coins"); - } - if(bazaarInfo.has("avg_sell")) { - int bazaarSellPrice = (int)bazaarInfo.get("avg_sell").getAsFloat()*stackMultiplier; - event.toolTip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"Bazaar Sell: "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(bazaarSellPrice)+" coins"); - } - if(neu.manager.config.advancedPriceInfo.value) { - if(bazaarInfo.has("curr_buy")) { - int bazaarInstantBuyPrice = (int)bazaarInfo.get("curr_buy").getAsFloat()*stackMultiplier; - event.toolTip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"Bazaar Insta-Buy: "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(bazaarInstantBuyPrice)+" coins"); - } - if(bazaarInfo.has("curr_sell")) { - int bazaarInstantSellPrice = (int)bazaarInfo.get("curr_sell").getAsFloat()*stackMultiplier; - event.toolTip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"Bazaar Insta-Sell: "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(bazaarInstantSellPrice)+" coins"); - } - } - } - if((hasAuctionPrice || hasBazaarPrice) && craftCost.fromRecipe) { - event.toolTip.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"Raw Craft Cost: "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format((int)craftCost.craftCost)+" coins"); - } - } + if(neu.config.tooltipTweaks.showPriceInfoInvItem) { + ItemPriceInformation.addToTooltip(event.toolTip, internalname); } } @@ -1560,7 +1445,7 @@ public class NEUEventListener { @SubscribeEvent public void onItemTooltip(ItemTooltipEvent event) { if(!neu.isOnSkyblock()) return; - if(neu.manager.config.hideEmptyPanes.value && + if(neu.config.improvedSBMenu.hideEmptyPanes && event.itemStack.getItem().equals(Item.getItemFromBlock(Blocks.stained_glass_pane))) { String first = Utils.cleanColour(event.toolTip.get(0)); first = first.replaceAll("\\(.*\\)", "").trim(); @@ -1617,7 +1502,7 @@ public class NEUEventListener { } } }*/ - if(!Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || !neu.manager.config.dev.value) return; + if(!Keyboard.isKeyDown(Keyboard.KEY_LCONTROL)/* || /*!neu.config.hidden.dev*/) return; if(event.toolTip.size()>0&&event.toolTip.get(event.toolTip.size()-1).startsWith(EnumChatFormatting.DARK_GRAY + "NBT: ")) { event.toolTip.remove(event.toolTip.size()-1); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java index d2467176..668ac1fe 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUManager.java @@ -3,8 +3,7 @@ package io.github.moulberry.notenoughupdates; import com.google.common.collect.Lists; import com.google.gson.*; import io.github.moulberry.notenoughupdates.auction.APIManager; -import io.github.moulberry.notenoughupdates.cosmetics.CapeManager; -import io.github.moulberry.notenoughupdates.options.Options; +import io.github.moulberry.notenoughupdates.miscgui.GuiItemRecipe; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.HypixelApi; import io.github.moulberry.notenoughupdates.util.Utils; @@ -25,12 +24,9 @@ import java.io.*; import java.net.URL; import java.net.URLConnection; import java.nio.charset.StandardCharsets; -import java.nio.file.Path; -import java.nio.file.Paths; import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.zip.GZIPInputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; @@ -77,19 +73,13 @@ public class NEUManager { public File configFile; public File itemRenameFile; public JsonObject itemRenameJson; - public Options config; public NEUManager(NotEnoughUpdates neu, File configLocation) { this.neu = neu; this.configLocation = configLocation; this.auctionManager = new APIManager(this); - GsonBuilder gsonBuilder = new GsonBuilder().setPrettyPrinting(); - gsonBuilder.registerTypeAdapter(Options.Option.class, Options.createSerializer()); - gsonBuilder.registerTypeAdapter(Options.Option.class, Options.createDeserializer()); - gson = gsonBuilder.create(); - - this.loadConfig(); + gson = new GsonBuilder().setPrettyPrinting().create(); this.repoLocation = new File(configLocation, "repo"); repoLocation.mkdir(); @@ -130,20 +120,6 @@ public class NEUManager { try { writeJson(itemRenameJson, itemRenameFile); } catch(IOException ignored) {} } - public void saveConfig() throws IOException { - config.saveToFile(gson, configFile); - } - - public void loadConfig() { - this.configFile = new File(configLocation, "config.json"); - try { - configFile.createNewFile(); - config = Options.loadFromFile(gson, configFile); - } catch(Exception e) { - config = new Options(); - } - } - /** * Parses a file in to a JsonObject. */ @@ -201,11 +177,11 @@ public class NEUManager { Thread thread = new Thread(() -> { JDialog dialog = null; try { - if(config.autoupdate.value) { + if(NotEnoughUpdates.INSTANCE.config.hidden.autoupdate) { JOptionPane pane = new JOptionPane("Getting items to download from remote repository."); dialog = pane.createDialog("NotEnoughUpdates Remote Sync"); dialog.setModal(false); - if(config.dev.value) dialog.setVisible(true); + if(NotEnoughUpdates.INSTANCE.config.hidden.dev) dialog.setVisible(true); if (Display.isActive()) dialog.toFront(); @@ -239,7 +215,7 @@ public class NEUManager { pane.setMessage("Downloading NEU Master Archive. (DL# >20)"); dialog.pack(); - if(config.dev.value) dialog.setVisible(true); + if(NotEnoughUpdates.INSTANCE.config.hidden.dev) dialog.setVisible(true); if (Display.isActive()) dialog.toFront(); File itemsZip = new File(repoLocation, "neu-items-master.zip"); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java index 94302007..69cda23a 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlay.java @@ -4,13 +4,17 @@ import com.google.common.collect.Lists; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import io.github.moulberry.notenoughupdates.auction.APIManager; +import io.github.moulberry.notenoughupdates.core.GuiScreenElementWrapper; +import io.github.moulberry.notenoughupdates.core.util.lerp.LerpingInteger; import io.github.moulberry.notenoughupdates.infopanes.*; import io.github.moulberry.notenoughupdates.itemeditor.NEUItemEditor; import io.github.moulberry.notenoughupdates.mbgui.MBAnchorPoint; import io.github.moulberry.notenoughupdates.mbgui.MBGuiElement; import io.github.moulberry.notenoughupdates.mbgui.MBGuiGroupAligned; import io.github.moulberry.notenoughupdates.mbgui.MBGuiGroupFloating; +import io.github.moulberry.notenoughupdates.miscfeatures.SunTzu; +import io.github.moulberry.notenoughupdates.miscgui.HelpGUI; +import io.github.moulberry.notenoughupdates.options.NEUConfigEditor; import io.github.moulberry.notenoughupdates.util.*; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.*; @@ -47,16 +51,12 @@ import org.lwjgl.util.vector.Vector2f; import java.awt.*; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.text.NumberFormat; import java.util.List; import java.util.*; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; -import static io.github.moulberry.notenoughupdates.GuiTextures.*; +import static io.github.moulberry.notenoughupdates.util.GuiTextures.*; public class NEUOverlay extends Gui { @@ -82,8 +82,6 @@ public class NEUOverlay extends Gui { }; //Various constants used for GUI structure - private int searchBarXSize = 200; - private final int searchBarYSize = 40; private final int searchBarYOffset = 10; private final int searchBarPadding = 2; @@ -265,12 +263,7 @@ public class NEUOverlay extends Gui { @Override public void mouseClick(float x, float y, int mouseX, int mouseY) { if(Mouse.getEventButtonState()) { - if(activeInfoPane instanceof SettingsInfoPane) { - displayInformationPane(null); - } else { - displayInformationPane(new SettingsInfoPane(overlay, manager)); - } - Utils.playPressSound(); + Minecraft.getMinecraft().displayGuiScreen(new GuiScreenElementWrapper(new NEUConfigEditor(NotEnoughUpdates.INSTANCE.config))); } } @@ -364,10 +357,10 @@ public class NEUOverlay extends Gui { @Override public void mouseClick(float x, float y, int mouseX, int mouseY) { - if(!manager.config.showQuickCommands.value) return; + if(!NotEnoughUpdates.INSTANCE.config.toolbar.quickCommands) return; - if((manager.config.quickcommandMousePress.value && Mouse.getEventButtonState()) || - (!manager.config.quickcommandMousePress.value && !Mouse.getEventButtonState() && Mouse.getEventButton() != -1)) { + if((NotEnoughUpdates.INSTANCE.config.toolbar.quickCommandsClickType != 0 && Mouse.getEventButtonState()) || + (NotEnoughUpdates.INSTANCE.config.toolbar.quickCommandsClickType == 0 && !Mouse.getEventButtonState() && Mouse.getEventButton() != -1)) { if(quickCommandStr.contains(":")) { String command = quickCommandStr.split(":")[0].trim(); if(command.startsWith("/")) { @@ -386,7 +379,7 @@ public class NEUOverlay extends Gui { @Override public void render(float x, float y) { - if(!manager.config.showQuickCommands.value) return; + if(!NotEnoughUpdates.INSTANCE.config.toolbar.quickCommands) return; int paddingUnscaled = getPaddingUnscaled(); int bigItemSize = getSearchBarYSize(); @@ -461,7 +454,7 @@ public class NEUOverlay extends Gui { private MBGuiGroupAligned createQuickCommandGroup() { List<MBGuiElement> children = new ArrayList<>(); - for(String quickCommand : manager.config.quickCommands.value) { + for(String quickCommand : NotEnoughUpdates.INSTANCE.config.hidden.quickCommands) { children.add(createQuickCommand(quickCommand)); } return new MBGuiGroupAligned(children, false) { @@ -477,14 +470,28 @@ public class NEUOverlay extends Gui { public int getPadding() { return getPaddingUnscaled()*4; } + + @Override + public void mouseClick(float x, float y, int mouseX, int mouseY) { + if(NotEnoughUpdates.INSTANCE.config.toolbar.searchBar) { + super.mouseClick(x, y, mouseX, mouseY); + } + } + + @Override + public void render(float x, float y) { + if(NotEnoughUpdates.INSTANCE.config.toolbar.searchBar) { + super.render(x, y); + } + } }; } private MBGuiGroupFloating createGuiGroup() { LinkedHashMap<MBGuiElement, MBAnchorPoint> map = new LinkedHashMap<>(); - MBAnchorPoint searchBarAnchor = MBAnchorPoint.createFromString(manager.config.overlaySearchBar.value); - MBAnchorPoint quickCommandAnchor = MBAnchorPoint.createFromString(manager.config.overlayQuickCommand.value); + MBAnchorPoint searchBarAnchor = MBAnchorPoint.createFromString(NotEnoughUpdates.INSTANCE.config.hidden.overlaySearchBar); + MBAnchorPoint quickCommandAnchor = MBAnchorPoint.createFromString(NotEnoughUpdates.INSTANCE.config.hidden.overlayQuickCommand); searchBarAnchor = searchBarAnchor != null ? searchBarAnchor : new MBAnchorPoint(MBAnchorPoint.AnchorPoint.BOTMID, new Vector2f(0, -searchBarYOffset)); @@ -499,8 +506,8 @@ public class NEUOverlay extends Gui { } public void resetAnchors(boolean onlyIfNull) { - MBAnchorPoint searchBarAnchor = MBAnchorPoint.createFromString(manager.config.overlaySearchBar.value); - MBAnchorPoint quickCommandAnchor = MBAnchorPoint.createFromString(manager.config.overlayQuickCommand.value); + MBAnchorPoint searchBarAnchor = MBAnchorPoint.createFromString(NotEnoughUpdates.INSTANCE.config.hidden.overlaySearchBar); + MBAnchorPoint quickCommandAnchor = MBAnchorPoint.createFromString(NotEnoughUpdates.INSTANCE.config.hidden.overlayQuickCommand); if(onlyIfNull) { searchBarAnchor = searchBarAnchor != null ? null : @@ -541,12 +548,13 @@ public class NEUOverlay extends Gui { */ public void reset() { searchBarHasFocus = false; - if(!(searchMode || (manager.config.keepopen.value && itemPaneOpen))) { + if(!(searchMode || (NotEnoughUpdates.INSTANCE.config.itemlist.keepopen && itemPaneOpen))) { itemPaneOpen = false; itemPaneOffsetFactor.setValue(1); itemPaneTabOffset.setValue(20); } if(activeInfoPane != null) activeInfoPane.reset(); + guiGroup.recalculate(); } /** @@ -600,7 +608,7 @@ public class NEUOverlay extends Gui { return false; } - Utils.pushGuiScale(manager.config.paneGuiScale.value.intValue()); + Utils.pushGuiScale(NotEnoughUpdates.INSTANCE.config.itemlist.paneGuiScale); int width = Utils.peekGuiScale().getScaledWidth(); int height = Utils.peekGuiScale().getScaledHeight(); @@ -721,11 +729,12 @@ public class NEUOverlay extends Gui { int orderIconX = leftSide+i*scaledItemPaddedSize; if(mouseX >= orderIconX && mouseX <= orderIconX+scaledITEM_SIZE) { if(Mouse.getEventButton() == 0) { - manager.config.compareMode.value = new Double(i); + NotEnoughUpdates.INSTANCE.config.hidden.compareMode = i; updateSearch(); Utils.playPressSound(); } else if(Mouse.getEventButton() == 1) { - manager.config.compareAscending.value.set(i, !manager.config.compareAscending.value.get(i)); + NotEnoughUpdates.INSTANCE.config.hidden.compareAscending.set(i, + !NotEnoughUpdates.INSTANCE.config.hidden.compareAscending.get(i)); updateSearch(); Utils.playPressSound(); } @@ -735,7 +744,7 @@ public class NEUOverlay extends Gui { for(int i=0; i<sortIcons.length; i++) { int sortIconX = rightSide-scaledITEM_SIZE-i*scaledItemPaddedSize; if(mouseX >= sortIconX && mouseX <= sortIconX+scaledITEM_SIZE) { - manager.config.sortMode.value = new Double(i); + NotEnoughUpdates.INSTANCE.config.hidden.sortMode = i; updateSearch(); Utils.playPressSound(); } @@ -747,35 +756,12 @@ public class NEUOverlay extends Gui { } //Clicking on "close info pane" button - if(activeInfoPane instanceof SettingsInfoPane) { - Utils.pushGuiScale(2); - - int widthN = Utils.peekGuiScale().getScaledWidth(); - int heightN = Utils.peekGuiScale().getScaledHeight(); - int mouseXN = Mouse.getX() * widthN / Minecraft.getMinecraft().displayWidth; - int mouseYN = heightN - Mouse.getY() * heightN / Minecraft.getMinecraft().displayHeight - 1; - - if(mouseXN > widthN*getInfoPaneOffsetFactor()-getBoxPadding()-8 && mouseXN < widthN*getInfoPaneOffsetFactor()-getBoxPadding()+8) { - if(mouseYN > getBoxPadding()-8 && mouseYN < getBoxPadding()+8) { - if(Mouse.getEventButtonState() && Mouse.getEventButton() < 2) { //Left or right click up - displayInformationPane(null); - - Utils.pushGuiScale(-1); - Utils.pushGuiScale(-1); - return true; - } - } - } - - Utils.pushGuiScale(-1); - } else { - if(mouseX > width*getInfoPaneOffsetFactor()-getBoxPadding()-8 && mouseX < width*getInfoPaneOffsetFactor()-getBoxPadding()+8) { - if(mouseY > getBoxPadding()-8 && mouseY < getBoxPadding()+8) { - if(Mouse.getEventButtonState() && Mouse.getEventButton() < 2) { //Left or right click up - displayInformationPane(null); - Utils.pushGuiScale(-1); - return true; - } + if(mouseX > width*getInfoPaneOffsetFactor()-getBoxPadding()-8 && mouseX < width*getInfoPaneOffsetFactor()-getBoxPadding()+8) { + if(mouseY > getBoxPadding()-8 && mouseY < getBoxPadding()+8) { + if(Mouse.getEventButtonState() && Mouse.getEventButton() < 2) { //Left or right click up + displayInformationPane(null); + Utils.pushGuiScale(-1); + return true; } } } @@ -805,8 +791,9 @@ public class NEUOverlay extends Gui { * Returns searchBarXSize, scaled by 0.8 if gui scale == AUTO. */ public int getSearchBarXSize() { + int searchBarXSize = NotEnoughUpdates.INSTANCE.config.toolbar.searchBarWidth; if(Utils.peekGuiScale().getScaleFactor()==4) return (int)(searchBarXSize*0.8); - return (int)(searchBarXSize); + return searchBarXSize; } /** @@ -871,12 +858,14 @@ public class NEUOverlay extends Gui { return false; } - if(Keyboard.isKeyDown(Keyboard.KEY_Y) && manager.config.dev.value) { + if(Keyboard.isKeyDown(Keyboard.KEY_Y) && NotEnoughUpdates.INSTANCE.config.hidden.dev) { displayInformationPane(new DevInfoPane(this, manager)); - //displayInformationPane(new QOLInfoPane(this, manager)); } if(Keyboard.getEventKeyState()) { + if(!NotEnoughUpdates.INSTANCE.config.toolbar.searchBar) { + searchBarHasFocus = false; + } if(searchBarHasFocus) { if(keyPressed == 1) { searchBarHasFocus = false; @@ -915,7 +904,7 @@ public class NEUOverlay extends Gui { itemstack.set(hover); } } else if(!hoverInv) { - Utils.pushGuiScale(manager.config.paneGuiScale.value.intValue()); + Utils.pushGuiScale(NotEnoughUpdates.INSTANCE.config.itemlist.paneGuiScale); int width = Utils.peekGuiScale().getScaledWidth(); int height = Utils.peekGuiScale().getScaledHeight(); @@ -950,7 +939,7 @@ public class NEUOverlay extends Gui { } if(internalname.get() != null) { if(itemstack.get() != null) { - if(manager.config.enableItemEditing.value && Keyboard.getEventCharacter() == 'k') { + if(NotEnoughUpdates.INSTANCE.config.hidden.enableItemEditing && Keyboard.getEventCharacter() == 'k') { Minecraft.getMinecraft().displayGuiScreen(new NEUItemEditor(manager, internalname.get(), manager.getJsonForItem(itemstack.get()))); return true; @@ -972,7 +961,7 @@ public class NEUOverlay extends Gui { Minecraft.getMinecraft().thePlayer.inventory.addItemStackToInventory( manager.jsonToStack(item)); } - } else if(manager.config.enableItemEditing.value && Keyboard.getEventCharacter() == 'k') { + } else if(NotEnoughUpdates.INSTANCE.config.hidden.enableItemEditing && Keyboard.getEventCharacter() == 'k') { Minecraft.getMinecraft().displayGuiScreen(new NEUItemEditor(manager, internalname.get(), item)); return true; @@ -1034,16 +1023,16 @@ public class NEUOverlay extends Gui { * Convenience functions that get various compare/sort modes from the config. */ private int getCompareMode() { - return manager.config.compareMode.value.intValue(); + return NotEnoughUpdates.INSTANCE.config.hidden.compareMode; } private int getSortMode() { - return manager.config.sortMode.value.intValue(); + return NotEnoughUpdates.INSTANCE.config.hidden.sortMode; } private List<Boolean> getCompareAscending() { - return manager.config.compareAscending.value; + return NotEnoughUpdates.INSTANCE.config.hidden.compareAscending; } private List<String> getFavourites() { - return manager.config.favourites.value; + return NotEnoughUpdates.INSTANCE.config.hidden.favourites; } /** @@ -1133,7 +1122,7 @@ public class NEUOverlay extends Gui { * Checks whether an item matches the current sort mode. */ public boolean checkMatchesSort(String internalname, JsonObject item) { - if(!manager.config.showVanillaItems.value && item.has("vanilla") && item.get("vanilla").getAsBoolean()) { + if(!NotEnoughUpdates.INSTANCE.config.itemlist.showVanillaItems && item.has("vanilla") && item.get("vanilla").getAsBoolean()) { return false; } @@ -1271,7 +1260,7 @@ public class NEUOverlay extends Gui { } public int getBoxPadding() { - double panePadding = Math.max(0, Math.min(20, manager.config.panePadding.value)); + double panePadding = Math.max(0, Math.min(20, NotEnoughUpdates.INSTANCE.config.itemlist.panePadding)); return (int)(panePadding*2/Utils.peekGuiScale().getScaleFactor()+5); } @@ -1315,7 +1304,7 @@ public class NEUOverlay extends Gui { float scaleFMult = 1; if(Utils.peekGuiScale().getScaleFactor()==4) scaleFMult *= 0.9f; if(manager.auctionManager.customAH.isRenderOverAuctionView()) scaleFMult *= 0.8f; - return (float)Math.max(0.5, Math.min(1.5, manager.config.paneWidthMult.value.floatValue()))*scaleFMult; + return (float)Math.max(0.5, Math.min(1.5, NotEnoughUpdates.INSTANCE.config.itemlist.paneWidthMult))*scaleFMult; } /** @@ -1351,6 +1340,7 @@ public class NEUOverlay extends Gui { } public int getSearchBarYSize() { + int searchBarYSize = NotEnoughUpdates.INSTANCE.config.toolbar.searchBarHeight; return Math.max(searchBarYSize/Utils.peekGuiScale().getScaleFactor(), ITEM_SIZE); } @@ -1596,7 +1586,7 @@ public class NEUOverlay extends Gui { int width = Minecraft.getMinecraft().displayWidth; int height = Minecraft.getMinecraft().displayHeight; - if(manager.config.bgBlurFactor.value <= 0 || !OpenGlHelper.isFramebufferEnabled()) return; + if(NotEnoughUpdates.INSTANCE.config.itemlist.bgBlurFactor <= 0 || !OpenGlHelper.isFramebufferEnabled()) return; if(blurOutputHorz == null) { blurOutputHorz = new Framebuffer(width, height, false); @@ -1634,8 +1624,11 @@ public class NEUOverlay extends Gui { } catch(Exception e) { } } if(blurShaderHorz != null && blurShaderVert != null) { - if(manager.config.bgBlurFactor.value != lastBgBlurFactor) { - lastBgBlurFactor = Math.max(0, Math.min(50, manager.config.bgBlurFactor.value)); + if(NotEnoughUpdates.INSTANCE.config.itemlist.bgBlurFactor != lastBgBlurFactor) { + if(blurShaderHorz.getShaderManager().getShaderUniform("Radius") == null) { + return; + } + lastBgBlurFactor = Math.max(0, Math.min(50, NotEnoughUpdates.INSTANCE.config.itemlist.bgBlurFactor)); blurShaderHorz.getShaderManager().getShaderUniform("Radius").set((float)lastBgBlurFactor); blurShaderVert.getShaderManager().getShaderUniform("Radius").set((float)lastBgBlurFactor); } @@ -1654,7 +1647,7 @@ public class NEUOverlay extends Gui { * Essentially, this method will "blur" the background inside the bounds specified by [x->x+blurWidth, y->y+blurHeight] */ public void renderBlurredBackground(int width, int height, int x, int y, int blurWidth, int blurHeight) { - if(manager.config.bgBlurFactor.value <= 0 || !OpenGlHelper.isFramebufferEnabled()) return; + if(NotEnoughUpdates.INSTANCE.config.itemlist.bgBlurFactor <= 0 || !OpenGlHelper.isFramebufferEnabled()) return; float uMin = x/(float)width; float uMax = (x+blurWidth)/(float)width; @@ -1670,7 +1663,7 @@ public class NEUOverlay extends Gui { } public void updateGuiGroupSize() { - Utils.pushGuiScale(manager.config.paneGuiScale.value.intValue()); + Utils.pushGuiScale(NotEnoughUpdates.INSTANCE.config.itemlist.paneGuiScale); int width = Utils.peekGuiScale().getScaledWidth(); int height = Utils.peekGuiScale().getScaledHeight(); @@ -1702,15 +1695,15 @@ public class NEUOverlay extends Gui { FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; Utils.resetGuiScale(); - Utils.pushGuiScale(manager.config.paneGuiScale.value.intValue()); + Utils.pushGuiScale(NotEnoughUpdates.INSTANCE.config.itemlist.paneGuiScale); int width = Utils.peekGuiScale().getScaledWidth(); int height = Utils.peekGuiScale().getScaledHeight(); int mouseX = Mouse.getX() * width / Minecraft.getMinecraft().displayWidth; int mouseY = height - Mouse.getY() * height / Minecraft.getMinecraft().displayHeight - 1; - if(showVanillaLast != manager.config.showVanillaItems.value) { - showVanillaLast = manager.config.showVanillaItems.value; + if(showVanillaLast != NotEnoughUpdates.INSTANCE.config.itemlist.showVanillaItems) { + showVanillaLast = NotEnoughUpdates.INSTANCE.config.itemlist.showVanillaItems; updateSearch(); } @@ -1740,11 +1733,11 @@ public class NEUOverlay extends Gui { yaw++; yaw %= 360; - bg = new Color(SpecialColour.specialToChromaRGB(manager.config.paneBackgroundColour.value), true); - fg = new Color(SpecialColour.specialToChromaRGB(manager.config.itemBackgroundColour.value)); - Color fgCustomOpacity = new Color(SpecialColour.specialToChromaRGB(manager.config.itemBackgroundColour.value), true); + bg = new Color(SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.config.itemlist.backgroundColour), true); + fg = new Color(SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.config.itemlist.foregroundColour)); + Color fgCustomOpacity = new Color(SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.config.itemlist.foregroundColour), true); - Color fgFavourite2 = new Color(SpecialColour.specialToChromaRGB(manager.config.itemFavouriteColour.value), true); + Color fgFavourite2 = new Color(SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.config.itemlist.favouriteColour), true); Color fgFavourite = new Color((int)(fgFavourite2.getRed()*0.8f), (int)(fgFavourite2.getGreen()*0.8f), (int)(fgFavourite2.getBlue()*0.8f), fgFavourite2.getAlpha()); @@ -1791,7 +1784,7 @@ public class NEUOverlay extends Gui { int rightSide = leftSide+paneWidth-getBoxPadding()-getItemBoxXPadding(); //Tab - if(!manager.config.disableItemTabOpen.value) { + if(NotEnoughUpdates.INSTANCE.config.itemlist.tabOpen) { Minecraft.getMinecraft().getTextureManager().bindTexture(itemPaneTabArrow); GlStateManager.color(1f, 1f, 1f, 0.3f); Utils.drawTexturedRect(width-itemPaneTabOffset.getValue()*64/20f, height/2f - 32, 64, 64); @@ -1945,7 +1938,7 @@ public class NEUOverlay extends Gui { checkFramebufferSizes(width, height); - if(redrawItems || !manager.config.cacheRenderedItempane.value) { + if(redrawItems || !NotEnoughUpdates.INSTANCE.config.hidden.cacheRenderedItempane) { renderItemsToImage(width, height, fgFavourite2, fgFavourite, fgCustomOpacity, true, true); redrawItems = false; } @@ -2014,17 +2007,7 @@ public class NEUOverlay extends Gui { GlStateManager.color(1f, 1f, 1f, 1f); Minecraft.getMinecraft().getTextureManager().bindTexture(close); - if(activeInfoPane instanceof SettingsInfoPane) { - Utils.pushGuiScale(2); - - int widthN = Utils.peekGuiScale().getScaledWidth(); - int rightSideN = (int)(widthN*getInfoPaneOffsetFactor()); - Utils.drawTexturedRect(rightSideN-getBoxPadding()-8, getBoxPadding()-8, 16, 16); - - Utils.pushGuiScale(-1); - } else { - Utils.drawTexturedRect(rightSide-getBoxPadding()-8, getBoxPadding()-8, 16, 16); - } + Utils.drawTexturedRect(rightSide-getBoxPadding()-8, getBoxPadding()-8, 16, 16); GL11.glBindTexture(GL11.GL_TEXTURE_2D, 0); } @@ -2034,80 +2017,8 @@ public class NEUOverlay extends Gui { List<String> text = manager.jsonToStack(json).getTooltip(Minecraft.getMinecraft().thePlayer, false); String internalname = json.get("internalname").getAsString(); - JsonObject auctionInfo = manager.auctionManager.getItemAuctionInfo(internalname); - JsonObject bazaarInfo = manager.auctionManager.getBazaarInfo(internalname); - float lowestBinAvg = manager.auctionManager.getItemAvgBin(internalname); - - int lowestBin = manager.auctionManager.getLowestBin(internalname); - APIManager.CraftInfo craftCost = manager.auctionManager.getCraftCost(internalname); - - boolean hasAuctionPrice = !manager.config.invAuctionPrice.value && auctionInfo != null; - boolean hasBazaarPrice = !manager.config.invBazaarPrice.value && bazaarInfo != null; - boolean hasLowestBinPrice = !manager.config.invAuctionPrice.value && lowestBin > 0 && manager.config.advancedPriceInfo.value; - boolean hasLowestBinAvgPrice = !manager.config.invAuctionPrice.value && lowestBinAvg > 0; - - NumberFormat format = NumberFormat.getInstance(Locale.US); - - if(hasAuctionPrice || hasBazaarPrice || hasLowestBinAvgPrice || hasLowestBinPrice) text.add(""); - if(hasLowestBinPrice) { - text.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"Lowest BIN: "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(lowestBin)+" coins"); - } - if(hasLowestBinAvgPrice) { - text.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"AVG Lowest BIN: "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(lowestBinAvg)+" coins"); - } - if(hasAuctionPrice) { - int auctionPrice = (int)(auctionInfo.get("price").getAsFloat() / auctionInfo.get("count").getAsFloat()); - text.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"AH Price: "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(auctionPrice)+" coins"); - if(manager.config.advancedPriceInfo.value) { - text.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"AH Sales: "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(auctionInfo.get("sales").getAsFloat())+" sales/day"); - } - if(auctionInfo.has("clean_price")) { - text.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"AH Price (Clean): "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format((int)auctionInfo.get("clean_price").getAsFloat())+" coins"); - if(manager.config.advancedPriceInfo.value) { - text.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"AH Sales (Clean): "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(auctionInfo.get("clean_sales").getAsFloat())+" sales/day"); - } - } - - } else if(hasBazaarPrice) { - int stackMultiplier = 1; - int shiftStackMultiplier = 64; - if(Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) { - stackMultiplier = shiftStackMultiplier; - } else { - text.add(EnumChatFormatting.DARK_GRAY.toString()+"[SHIFT show x"+shiftStackMultiplier+"]"); - } - if(bazaarInfo.has("avg_buy")) { - int bazaarBuyPrice = (int)bazaarInfo.get("avg_buy").getAsFloat()*stackMultiplier; - text.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"Bazaar Buy: "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(bazaarBuyPrice)+" coins"); - } - if(bazaarInfo.has("avg_sell")) { - int bazaarSellPrice = (int)bazaarInfo.get("avg_sell").getAsFloat()*stackMultiplier; - text.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"Bazaar Sell: "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(bazaarSellPrice)+" coins"); - } - if(manager.config.advancedPriceInfo.value) { - if(bazaarInfo.has("curr_buy")) { - int bazaarInstantBuyPrice = (int)bazaarInfo.get("curr_buy").getAsFloat()*stackMultiplier; - text.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"Bazaar Insta-Buy: "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(bazaarInstantBuyPrice)+" coins"); - } - if(bazaarInfo.has("curr_sell")) { - int bazaarInstantSellPrice = (int)bazaarInfo.get("curr_sell").getAsFloat()*stackMultiplier; - text.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"Bazaar Insta-Sell: "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format(bazaarInstantSellPrice)+" coins"); - } - } - } - if((hasAuctionPrice || hasBazaarPrice) && craftCost.fromRecipe) { - text.add(EnumChatFormatting.YELLOW.toString()+EnumChatFormatting.BOLD+"Raw Craft Cost: "+ - EnumChatFormatting.GOLD+EnumChatFormatting.BOLD+format.format((int)craftCost.craftCost)+" coins"); + if(!NotEnoughUpdates.INSTANCE.config.tooltipTweaks.showPriceInfoInvItem) { + ItemPriceInformation.addToTooltip(text, internalname); } boolean hasClick = false; @@ -2345,7 +2256,7 @@ public class NEUOverlay extends Gui { Minecraft.getMinecraft().getTextureManager().bindTexture(item_mask); if (getFavourites().contains(json.get("internalname").getAsString())) { - if(manager.config.itemStyle.value) { + if(NotEnoughUpdates.INSTANCE.config.itemlist.itemStyle == 0) { GlStateManager.color(fgFavourite2.getRed() / 255f, fgFavourite2.getGreen() / 255f, fgFavourite2.getBlue() / 255f, fgFavourite2.getAlpha() / 255f); Utils.drawTexturedRect(x - 1, y - 1, ITEM_SIZE + 2, ITEM_SIZE + 2, GL11.GL_NEAREST); @@ -2358,7 +2269,7 @@ public class NEUOverlay extends Gui { drawRect(x, y, x+ITEM_SIZE, y+ITEM_SIZE, fgFavourite.getRGB()); } } else { - if(manager.config.itemStyle.value) { + if(NotEnoughUpdates.INSTANCE.config.itemlist.itemStyle == 0) { GlStateManager.color(fgCustomOpacity.getRed() / 255f, fgCustomOpacity.getGreen() / 255f, fgCustomOpacity.getBlue() / 255f, fgCustomOpacity.getAlpha() / 255f); Utils.drawTexturedRect(x - 1, y - 1, ITEM_SIZE + 2, ITEM_SIZE + 2, GL11.GL_NEAREST); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java index a7f37935..897db723 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java @@ -1,14 +1,14 @@ package io.github.moulberry.notenoughupdates; import com.google.common.collect.Sets; +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.exceptions.AuthenticationException; -import com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; -import com.mojang.authlib.yggdrasil.YggdrasilUserAuthentication; import io.github.moulberry.notenoughupdates.auction.CustomAHGui; 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.cosmetics.CapeManager; import io.github.moulberry.notenoughupdates.cosmetics.GuiCosmetics; import io.github.moulberry.notenoughupdates.dungeons.DungeonMap; @@ -17,12 +17,19 @@ import io.github.moulberry.notenoughupdates.dungeons.GuiDungeonMapEditor; import io.github.moulberry.notenoughupdates.gamemodes.GuiGamemodes; import io.github.moulberry.notenoughupdates.gamemodes.SBGamemodes; import io.github.moulberry.notenoughupdates.infopanes.CollectionLogInfoPane; -import io.github.moulberry.notenoughupdates.infopanes.SettingsInfoPane; +import io.github.moulberry.notenoughupdates.miscfeatures.CustomItemEffects; +import io.github.moulberry.notenoughupdates.miscfeatures.EnchantingSolvers; +import io.github.moulberry.notenoughupdates.miscfeatures.SunTzu; +import io.github.moulberry.notenoughupdates.miscgui.CalendarOverlay; +import io.github.moulberry.notenoughupdates.miscgui.GuiEnchantColour; +import io.github.moulberry.notenoughupdates.miscgui.HelpGUI; +import io.github.moulberry.notenoughupdates.miscgui.NEUOverlayPlacements; +import io.github.moulberry.notenoughupdates.options.NEUConfig; +import io.github.moulberry.notenoughupdates.options.NEUConfigEditor; import io.github.moulberry.notenoughupdates.profileviewer.GuiProfileViewer; import io.github.moulberry.notenoughupdates.profileviewer.PlayerStats; import io.github.moulberry.notenoughupdates.profileviewer.ProfileViewer; -import io.github.moulberry.notenoughupdates.questing.GuiQuestLine; -import io.github.moulberry.notenoughupdates.questing.SBInfo; +import io.github.moulberry.notenoughupdates.util.SBInfo; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.block.material.MapColor; @@ -59,14 +66,10 @@ import org.apache.commons.lang3.text.translate.UnicodeUnescaper; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.GL11; -import javax.swing.*; import java.awt.*; import java.awt.datatransfer.StringSelection; import java.io.*; import java.lang.management.ManagementFactory; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.net.*; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.List; @@ -86,6 +89,9 @@ public class NotEnoughUpdates { public NEUManager manager; public NEUOverlay overlay; + public NEUConfig config; + + private File configFile; private static final long CHAT_MSG_COOLDOWN = 200; private long lastChatMessage = 0; @@ -201,13 +207,6 @@ public class NotEnoughUpdates { } }); - - SimpleCommand questingCommand = new SimpleCommand("neuquest", new SimpleCommand.ProcessCommandRunnable() { - public void processCommand(ICommandSender sender, String[] args) { - openGui = new GuiQuestLine(); - } - }); - SimpleCommand gamemodesCommand = new SimpleCommand("neugamemodes", new SimpleCommand.ProcessCommandRunnable() { public void processCommand(ICommandSender sender, String[] args) { boolean upgradeOverride = args.length == 1 && args[0].equals("upgradeOverride"); @@ -519,7 +518,7 @@ public class NotEnoughUpdates { builder.append("[Loaded Mods]").append("[").append(activeModCount).append("/").append(modCount).append("]").append("\n"); builder.append("[Forge]").append("[").append(ForgeVersion.getVersion()).append("]").append("\n"); builder.append("# Neu Settings").append("\n"); - builder.append("[API Key]").append("[").append(!INSTANCE.manager.config.apiKey.value.isEmpty()).append("]").append("\n"); + builder.append("[API Key]").append("[").append(!config.apiKey.apiKey.isEmpty()).append("]").append("\n"); builder.append("[On Skyblock]").append("[").append(hasSkyblockScoreboard).append("]").append("\n"); builder.append("[Mod Version]").append("[").append(Loader.instance().getIndexedModList().get(MODID).getSource().getName()).append("]").append("\n"); builder.append("# Repo Stats").append("\n"); @@ -566,7 +565,7 @@ public class NotEnoughUpdates { } catch(Exception e) { } } - if (manager.config.apiKey.value == null || manager.config.apiKey.value.trim().isEmpty()) { + if (config.apiKey.apiKey == null || config.apiKey.apiKey.trim().isEmpty()) { Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "Can't view profile, apikey is not set. Run /api new and put the result in settings.")); } else if (args.length == 0) { @@ -717,7 +716,7 @@ public class NotEnoughUpdates { } catch(Exception ignored) { } } - if(!manager.config.dev.value) { + if(!config.hidden.dev) { openGui = new GuiDungeonMapEditor(); return; } @@ -802,28 +801,19 @@ public class NotEnoughUpdates { SimpleCommand settingsCommand = new SimpleCommand("neu", new SimpleCommand.ProcessCommandRunnable() { public void processCommand(ICommandSender sender, String[] args) { - overlay.displayInformationPane(new SettingsInfoPane(overlay, manager)); - if(!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) { - openGui = new GuiInventory(Minecraft.getMinecraft().thePlayer); - } + openGui = new GuiScreenElementWrapper(new NEUConfigEditor(config)); } }); SimpleCommand settingsCommand2 = new SimpleCommand("neusettings", new SimpleCommand.ProcessCommandRunnable() { public void processCommand(ICommandSender sender, String[] args) { - overlay.displayInformationPane(new SettingsInfoPane(overlay, manager)); - if(!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) { - openGui = new GuiInventory(Minecraft.getMinecraft().thePlayer); - } + openGui = new GuiScreenElementWrapper(new NEUConfigEditor(config)); } }); SimpleCommand settingsCommand3 = new SimpleCommand("neuconfig", new SimpleCommand.ProcessCommandRunnable() { public void processCommand(ICommandSender sender, String[] args) { - overlay.displayInformationPane(new SettingsInfoPane(overlay, manager)); - if(!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) { - openGui = new GuiInventory(Minecraft.getMinecraft().thePlayer); - } + openGui = new GuiScreenElementWrapper(new NEUConfigEditor(config)); } }); @@ -841,7 +831,7 @@ public class NotEnoughUpdates { if(!hasSkyblockScoreboard()) { Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED+ "You must be on Skyblock to use this feature.")); - } else if(manager.config.apiKey.value == null || manager.config.apiKey.value.trim().isEmpty()) { + } else if(config.apiKey.apiKey == null || config.apiKey.apiKey.trim().isEmpty()) { Minecraft.getMinecraft().thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED+ "Can't open NeuAH, apikey is not set. Run /api new and put the result in settings.")); } else { @@ -855,6 +845,8 @@ public class NotEnoughUpdates { } }); + private Gson gson = new GsonBuilder().setPrettyPrinting().excludeFieldsWithoutExposeAnnotation().create(); + /** * Instantiates NEUIo, NEUManager and NEUOverlay instances. Registers keybinds and adds a shutdown hook to clear tmp folder. * @param event @@ -863,20 +855,33 @@ public class NotEnoughUpdates { public void preinit(FMLPreInitializationEvent event) { INSTANCE = this; + File f = new File(event.getModConfigurationDirectory(), "notenoughupdates"); + f.mkdirs(); + + configFile = new File(f, "configNew.json"); + + if(configFile.exists()) { + try(BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(configFile), StandardCharsets.UTF_8))) { + config = gson.fromJson(reader, NEUConfig.class); + } catch(Exception e) { } + } + + if(config == null) { + config = new NEUConfig(); + saveConfig(); + } + MinecraftForge.EVENT_BUS.register(this); MinecraftForge.EVENT_BUS.register(new NEUEventListener(this)); MinecraftForge.EVENT_BUS.register(CapeManager.getInstance()); MinecraftForge.EVENT_BUS.register(new SBGamemodes()); + MinecraftForge.EVENT_BUS.register(new EnchantingSolvers()); MinecraftForge.EVENT_BUS.register(new CalendarOverlay()); MinecraftForge.EVENT_BUS.register(SBInfo.getInstance()); MinecraftForge.EVENT_BUS.register(CustomItemEffects.INSTANCE); MinecraftForge.EVENT_BUS.register(new DungeonMap()); MinecraftForge.EVENT_BUS.register(new SunTzu()); - //MinecraftForge.EVENT_BUS.register(new BetterPortals()); - - File f = new File(event.getModConfigurationDirectory(), "notenoughupdates"); - f.mkdirs(); ClientCommandHandler.instance.registerCommand(collectionLogCommand); ClientCommandHandler.instance.registerCommand(cosmeticsCommand); ClientCommandHandler.instance.registerCommand(linksCommand); @@ -900,6 +905,8 @@ public class NotEnoughUpdates { ClientCommandHandler.instance.registerCommand(dungeonWinTest); ClientCommandHandler.instance.registerCommand(calendarCommand); + BackgroundBlur.registerListener(); + manager = new NEUManager(this, f); manager.loadItemInformation(); overlay = new NEUOverlay(manager); @@ -910,54 +917,26 @@ public class NotEnoughUpdates { } Runtime.getRuntime().addShutdownHook(new Thread(() -> { - try { - File tmp = new File(f, "tmp"); - if(tmp.exists()) { - for(File tmpFile : tmp.listFiles()) { - tmpFile.delete(); - } - tmp.delete(); + File tmp = new File(f, "tmp"); + if(tmp.exists()) { + for(File tmpFile : tmp.listFiles()) { + tmpFile.delete(); } + tmp.delete(); + } - manager.saveConfig(); - } catch(IOException e) {} + saveConfig(); })); + } - //TODO: login code. Ignore this, used for testing. - if(manager.config.dev.value) { - try { - Field field = Minecraft.class.getDeclaredField("session"); - YggdrasilUserAuthentication auth = (YggdrasilUserAuthentication) - new YggdrasilAuthenticationService(Proxy.NO_PROXY, UUID.randomUUID().toString()) - .createUserAuthentication(Agent.MINECRAFT); - auth.setUsername("james.jenour@protonmail.com"); - auth.setPassword("Miranda728%"); - - JPasswordField pf = new JPasswordField(); - JOptionPane.showConfirmDialog(null, - pf, - "Enter password:", - JOptionPane.DEFAULT_OPTION, - JOptionPane.PLAIN_MESSAGE); - auth.setPassword(new String(pf.getPassword())); - System.out.print("Attempting login..."); - - auth.logIn(); - - Session session = new Session(auth.getSelectedProfile().getName(), - auth.getSelectedProfile().getId().toString().replace("-", ""), - auth.getAuthenticatedToken(), - auth.getUserType().getName()); - - Field modifiersField = Field.class.getDeclaredField("modifiers"); - modifiersField.setAccessible(true); - modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); - - field.setAccessible(true); - field.set(Minecraft.getMinecraft(), session); - } catch (NoSuchFieldException | AuthenticationException | IllegalAccessException e) { + public void saveConfig() { + try { + configFile.createNewFile(); + + try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(configFile), StandardCharsets.UTF_8))) { + writer.write(gson.toJson(config)); } - } + } catch(IOException ignored) {} } /** @@ -1037,7 +1016,7 @@ public class NotEnoughUpdates { } public boolean isOnSkyblock() { - if(!manager.config.onlyShowOnSkyblock.value) return true; + if(!config.misc.onlyShowOnSkyblock) return true; return hasSkyblockScoreboard(); } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/auction/APIManager.java b/src/main/java/io/github/moulberry/notenoughupdates/auction/APIManager.java index 4013a790..32592397 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/auction/APIManager.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/auction/APIManager.java @@ -4,6 +4,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.NEUManager; +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; @@ -173,8 +174,9 @@ public class APIManager { public void tick() { customAH.tick(); long currentTime = System.currentTimeMillis(); - if(manager.config.neuAuctionHouse.value && manager.config.apiKey.value != null && - !manager.config.apiKey.value.isEmpty()) { + if(NotEnoughUpdates.INSTANCE.config.neuAuctionHouse.enableNeuAuctionHouse && + NotEnoughUpdates.INSTANCE.config.apiKey.apiKey != null && + !NotEnoughUpdates.INSTANCE.config.apiKey.apiKey.isEmpty()) { if(currentTime - lastAuctionUpdate > 60*1000) { lastAuctionUpdate = currentTime; updatePageTick(); @@ -250,13 +252,13 @@ public class APIManager { private void ahNotification() { playerBidsNotified.retainAll(playerBids); playerBidsFinishedNotified.retainAll(playerBids); - if(manager.config.ahNotification.value <= 0) { + if(NotEnoughUpdates.INSTANCE.config.neuAuctionHouse.ahNotification <= 0) { return; } for(String aucid : playerBids) { Auction auc = auctionMap.get(aucid); if(!playerBidsNotified.contains(aucid)) { - if(auc != null && auc.end - System.currentTimeMillis() < 1000*60*manager.config.ahNotification.value) { + if(auc != null && auc.end - System.currentTimeMillis() < 1000*60*NotEnoughUpdates.INSTANCE.config.neuAuctionHouse.ahNotification) { ChatComponentText message = new ChatComponentText( EnumChatFormatting.YELLOW+"The " + auc.getStack().getDisplayName() + EnumChatFormatting.YELLOW + " you have bid on is ending soon! Click here to view."); ChatStyle clickEvent = new ChatStyle().setChatClickEvent( @@ -618,7 +620,7 @@ public class APIManager { } public void updateBazaar() { - manager.hypixelApi.getHypixelApiAsync(manager.config.apiKey.value, "skyblock/bazaar", new HashMap<>(), (jsonObject) -> { + manager.hypixelApi.getHypixelApiAsync(NotEnoughUpdates.INSTANCE.config.apiKey.apiKey, "skyblock/bazaar", new HashMap<>(), (jsonObject) -> { if(!jsonObject.get("success").getAsBoolean()) return; craftCost.clear(); @@ -890,7 +892,7 @@ public class APIManager { args.put("page", "0"); AtomicInteger totalPages = new AtomicInteger(1); AtomicInteger currentPages = new AtomicInteger(0); - manager.hypixelApi.getHypixelApiAsync(manager.config.apiKey.value, "skyblock/auctions", + manager.hypixelApi.getHypixelApiAsync(NotEnoughUpdates.INSTANCE.config.apiKey.apiKey, "skyblock/auctions", args, jsonObject -> { if (jsonObject.get("success").getAsBoolean()) { pages.put(0, jsonObject); @@ -901,7 +903,7 @@ public class APIManager { int j = i; HashMap<String, String> args2 = new HashMap<>(); args2.put("page", "" + i); - manager.hypixelApi.getHypixelApiAsync(manager.config.apiKey.value, "skyblock/auctions", + manager.hypixelApi.getHypixelApiAsync(NotEnoughUpdates.INSTANCE.config.apiKey.apiKey, "skyblock/auctions", args2, jsonObject2 -> { if (jsonObject2.get("success").getAsBoolean()) { pages.put(j, jsonObject2); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/auction/CustomAH.java b/src/main/java/io/github/moulberry/notenoughupdates/auction/CustomAH.java index f7b22db0..aad69686 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/auction/CustomAH.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/auction/CustomAH.java @@ -1,6 +1,7 @@ package io.github.moulberry.notenoughupdates.auction; import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.ItemPriceInformation; import io.github.moulberry.notenoughupdates.NEUManager; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.util.Utils; @@ -41,7 +42,7 @@ import java.util.concurrent.Executors; import java.util.regex.Matcher; import java.util.regex.Pattern; -import static io.github.moulberry.notenoughupdates.GuiTextures.*; +import static io.github.moulberry.notenoughupdates.util.GuiTextures.*; public class CustomAH extends Gui { @@ -206,7 +207,7 @@ public class CustomAH extends Gui { } public void tick() { - if(!manager.config.neuAuctionHouse.value) return; + if(!NotEnoughUpdates.INSTANCE.config.neuAuctionHouse.enableNeuAuctionHouse) return; if(Minecraft.getMinecraft().currentScreen instanceof CustomAHGui || renderOverAuctionView) { if(shouldUpdateSearch) updateSearch(); if(shouldSortItems) { @@ -340,43 +341,14 @@ public class CustomAH extends Gui { } } - if(manager.config.auctionPriceInfo.value) { + if(NotEnoughUpdates.INSTANCE.config.tooltipTweaks.showPriceInfoAucItem) { String internalname = NotEnoughUpdates.INSTANCE.manager.getInternalNameForItem(auc.getStack()); if(internalname != null) { - tooltip.add(""); if(!Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) && !Keyboard.isKeyDown(Keyboard.KEY_RSHIFT)) { + tooltip.add(""); tooltip.add(EnumChatFormatting.GRAY+"[SHIFT for Price Info]"); } else { - JsonObject auctionInfo = NotEnoughUpdates.INSTANCE.manager.auctionManager.getItemAuctionInfo(internalname); - - boolean hasAuctionPrice = auctionInfo != null; - - int lowestBin = NotEnoughUpdates.INSTANCE.manager.auctionManager.getLowestBin(internalname); - - APIManager.CraftInfo craftCost = NotEnoughUpdates.INSTANCE.manager.auctionManager.getCraftCost(internalname); - - if(lowestBin > 0) { - tooltip.add(EnumChatFormatting.GRAY+"Lowest BIN: "+ - EnumChatFormatting.GOLD+format.format(lowestBin)+" coins"); - } - if(hasAuctionPrice) { - int auctionPrice = (int)(auctionInfo.get("price").getAsFloat() / auctionInfo.get("count").getAsFloat()); - tooltip.add(EnumChatFormatting.GRAY+"AH Price: "+ - EnumChatFormatting.GOLD+format.format(auctionPrice)+" coins"); - tooltip.add(EnumChatFormatting.GRAY+"AH Sales: "+ - EnumChatFormatting.GOLD+format.format(auctionInfo.get("sales").getAsFloat())+" sales/day"); - if(auctionInfo.has("clean_price")) { - tooltip.add(EnumChatFormatting.GRAY+"AH Price (Clean): "+ - EnumChatFormatting.GOLD+format.format((int)auctionInfo.get("clean_price").getAsFloat())+" coins"); - tooltip.add(EnumChatFormatting.GRAY+"AH Sales (Clean): "+ - EnumChatFormatting.GOLD+format.format(auctionInfo.get("clean_sales").getAsFloat())+" sales/day"); - } - - } - if(craftCost.fromRecipe) { - tooltip.add(EnumChatFormatting.GRAY+"Raw Craft Cost: "+ - EnumChatFormatting.GOLD+format.format((int)craftCost.craftCost)+" coins"); - } + ItemPriceInformation.addToTooltip(tooltip, internalname); } } } @@ -858,7 +830,7 @@ public class CustomAH extends Gui { int maxItemScroll = Math.max(0, totalItems - (5+splits)*9); itemsScroll = Math.min(itemsScroll, maxItemScroll); - if(manager.config.neuAuctionHouse.value) { + if(NotEnoughUpdates.INSTANCE.config.neuAuctionHouse.enableNeuAuctionHouse) { out: for(int i=0; i<5+splits; i++) { int itemY = guiTop + i*18 + 18; @@ -904,7 +876,7 @@ public class CustomAH extends Gui { this.drawTexturedModalRect(guiLeft+175, guiTop+18+(int)((95+ySplitSize*2)*scrollAmount), 256-(scrollClicked?12:24), 0, 12, 15); - if(!manager.config.neuAuctionHouse.value) { + if(!NotEnoughUpdates.INSTANCE.config.neuAuctionHouse.enableNeuAuctionHouse) { Utils.drawStringCentered(EnumChatFormatting.RED+"NEUAH is DISABLED! Enable in /neusettings.", Minecraft.getMinecraft().fontRendererObj, guiLeft+getXSize()/2, guiTop+getYSize()/2-5, true, 0); } @@ -1052,7 +1024,7 @@ public class CustomAH extends Gui { } public void handleMouseInput() { - if(!manager.config.neuAuctionHouse.value) { + if(!NotEnoughUpdates.INSTANCE.config.neuAuctionHouse.enableNeuAuctionHouse) { return; } @@ -1076,7 +1048,7 @@ public class CustomAH extends Gui { mouseClickMove(mouseX, mouseY, this.eventButton, l); } - if(!manager.config.disableAhScroll.value) { + if(!NotEnoughUpdates.INSTANCE.config.neuAuctionHouse.disableAhScroll) { int dWheel = Mouse.getEventDWheel(); dWheel = Math.max(-1, Math.min(1, dWheel)); @@ -1213,7 +1185,7 @@ public class CustomAH extends Gui { private ExecutorService es = Executors.newSingleThreadExecutor(); public void updateSearch() { - if(!manager.config.neuAuctionHouse.value) { + if(!NotEnoughUpdates.INSTANCE.config.neuAuctionHouse.enableNeuAuctionHouse) { return; } @@ -1321,7 +1293,7 @@ public class CustomAH extends Gui { } public void sortItems() throws ConcurrentModificationException { - if(!manager.config.neuAuctionHouse.value) { + if(!NotEnoughUpdates.INSTANCE.config.neuAuctionHouse.enableNeuAuctionHouse) { return; } @@ -1372,7 +1344,7 @@ public class CustomAH extends Gui { } public boolean keyboardInput() { - if(!manager.config.neuAuctionHouse.value) { + if(!NotEnoughUpdates.INSTANCE.config.neuAuctionHouse.enableNeuAuctionHouse) { return false; } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/BackgroundBlur.java b/src/main/java/io/github/moulberry/notenoughupdates/core/BackgroundBlur.java new file mode 100644 index 00000000..30d056b4 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/BackgroundBlur.java @@ -0,0 +1,181 @@ +package io.github.moulberry.notenoughupdates.core; + +import io.github.moulberry.notenoughupdates.core.util.render.RenderUtils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.shader.Framebuffer; +import net.minecraft.client.shader.Shader; +import net.minecraft.util.Matrix4f; +import net.minecraftforge.client.event.EntityViewRenderEvent; +import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fml.common.eventhandler.EventPriority; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL30; + +public class BackgroundBlur { + + private static int fogColour = 0; + private static boolean registered = false; + public static void registerListener() { + if(!registered) { + MinecraftForge.EVENT_BUS.register(new BackgroundBlur()); + } + } + + private boolean shouldBlur = true; + + @SubscribeEvent + public void onTick(TickEvent.ClientTickEvent event) { + if(Minecraft.getMinecraft().theWorld != null) { + shouldBlur = true; + } + } + + @SubscribeEvent(priority = EventPriority.HIGHEST) + public void onScreenRender(RenderGameOverlayEvent.Pre event) { + if(shouldBlur && event.type == RenderGameOverlayEvent.ElementType.ALL) { + shouldBlur = false; + blurBackground(); + } + } + + @SubscribeEvent + public void onFogColour(EntityViewRenderEvent.FogColors event) { + fogColour = 0xff000000; + fogColour |= ((int)(event.red*255) & 0xFF) << 16; + fogColour |= ((int)(event.green*255) & 0xFF) << 8; + fogColour |= (int)(event.blue*255) & 0xFF; + } + + private static Shader blurShaderHorz = null; + private static Framebuffer blurOutputHorz = null; + private static Shader blurShaderVert = null; + private static Framebuffer blurOutputVert = null; + + /** + * Creates a projection matrix that projects from our coordinate space [0->width; 0->height] to OpenGL coordinate + * space [-1 -> 1; 1 -> -1] (Note: flipped y-axis). + * + * This is so that we can render to and from the framebuffer in a way that is familiar to us, instead of needing to + * apply scales and translations manually. + */ + private static Matrix4f createProjectionMatrix(int width, int height) { + Matrix4f projMatrix = new Matrix4f(); + projMatrix.setIdentity(); + projMatrix.m00 = 2.0F / (float)width; + projMatrix.m11 = 2.0F / (float)(-height); + projMatrix.m22 = -0.0020001999F; + projMatrix.m33 = 1.0F; + projMatrix.m03 = -1.0F; + projMatrix.m13 = 1.0F; + projMatrix.m23 = -1.0001999F; + return projMatrix; + } + + private static double lastBgBlurFactor = -1; + private static void blurBackground() { + if(!OpenGlHelper.isFramebufferEnabled()) return; + + int width = Minecraft.getMinecraft().displayWidth; + int height = Minecraft.getMinecraft().displayHeight; + + GlStateManager.matrixMode(GL11.GL_PROJECTION); + GlStateManager.loadIdentity(); + GlStateManager.ortho(0.0D, width, height, 0.0D, 1000.0D, 3000.0D); + GlStateManager.matrixMode(GL11.GL_MODELVIEW); + GlStateManager.loadIdentity(); + GlStateManager.translate(0.0F, 0.0F, -2000.0F); + + if(blurOutputHorz == null) { + blurOutputHorz = new Framebuffer(width, height, false); + blurOutputHorz.setFramebufferFilter(GL11.GL_NEAREST); + } + if(blurOutputVert == null) { + blurOutputVert = new Framebuffer(width, height, false); + blurOutputVert.setFramebufferFilter(GL11.GL_NEAREST); + } + if(blurOutputHorz == null || blurOutputVert == null) { + return; + } + if(blurOutputHorz.framebufferWidth != width || blurOutputHorz.framebufferHeight != height) { + blurOutputHorz.createBindFramebuffer(width, height); + blurShaderHorz.setProjectionMatrix(createProjectionMatrix(width, height)); + Minecraft.getMinecraft().getFramebuffer().bindFramebuffer(false); + } + if(blurOutputVert.framebufferWidth != width || blurOutputVert.framebufferHeight != height) { + blurOutputVert.createBindFramebuffer(width, height); + blurShaderVert.setProjectionMatrix(createProjectionMatrix(width, height)); + Minecraft.getMinecraft().getFramebuffer().bindFramebuffer(false); + } + + if(blurShaderHorz == null) { + try { + blurShaderHorz = new Shader(Minecraft.getMinecraft().getResourceManager(), "blur", + blurOutputVert, blurOutputHorz); + blurShaderHorz.getShaderManager().getShaderUniform("BlurDir").set(1, 0); + blurShaderHorz.setProjectionMatrix(createProjectionMatrix(width, height)); + } catch(Exception e) { } + } + if(blurShaderVert == null) { + try { + blurShaderVert = new Shader(Minecraft.getMinecraft().getResourceManager(), "blur", + blurOutputHorz, blurOutputVert); + blurShaderVert.getShaderManager().getShaderUniform("BlurDir").set(0, 1); + blurShaderVert.setProjectionMatrix(createProjectionMatrix(width, height)); + } catch(Exception e) { } + } + if(blurShaderHorz != null && blurShaderVert != null) { + if(blurShaderHorz.getShaderManager().getShaderUniform("Radius") == null) { + //Corrupted shader? + return; + } + if(15 != lastBgBlurFactor) { + blurShaderHorz.getShaderManager().getShaderUniform("Radius").set((float)15); + blurShaderVert.getShaderManager().getShaderUniform("Radius").set((float)15); + lastBgBlurFactor = 15; + } + GL11.glPushMatrix(); + GL30.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, Minecraft.getMinecraft().getFramebuffer().framebufferObject); + GL30.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, blurOutputVert.framebufferObject); + GL30.glBlitFramebuffer(0, 0, width, height, + 0, 0, width, height, + GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST); + + blurShaderHorz.loadShader(0); + blurShaderVert.loadShader(0); + GlStateManager.enableDepth(); + GL11.glPopMatrix(); + + Minecraft.getMinecraft().getFramebuffer().bindFramebuffer(false); + } + } + + /** + * Renders a subsection of the blurred framebuffer on to the corresponding section of the screen. + * Essentially, this method will "blur" the background inside the bounds specified by [x->x+blurWidth, y->y+blurHeight] + */ + public static void renderBlurredBackground(int screenWidth, int screenHeight, + int x, int y, int blurWidth, int blurHeight) { + if(!OpenGlHelper.isFramebufferEnabled()) return; + if(blurOutputVert == null) return; + + float uMin = x/(float)screenWidth; + float uMax = (x+blurWidth)/(float)screenWidth; + float vMin = (screenHeight-y)/(float)screenHeight; + float vMax = (screenHeight-y-blurHeight)/(float)screenHeight; + + GlStateManager.depthMask(false); + Gui.drawRect(x, y, x+blurWidth, y+blurHeight, fogColour); + blurOutputVert.bindFramebufferTexture(); + GlStateManager.color(1f, 1f, 1f, 1f); + RenderUtils.drawTexturedRect(x, y, blurWidth, blurHeight, uMin, uMax, vMin, vMax); + blurOutputVert.unbindFramebufferTexture(); + GlStateManager.depthMask(true); + } + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/ChromaColour.java b/src/main/java/io/github/moulberry/notenoughupdates/core/ChromaColour.java new file mode 100644 index 00000000..9509c332 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/ChromaColour.java @@ -0,0 +1,95 @@ +package io.github.moulberry.notenoughupdates.core; + +import java.awt.*; + +public class ChromaColour { + + public static String special(int chromaSpeed, int alpha, int rgb) { + return special(chromaSpeed, alpha, (rgb & 0xFF0000) >> 16, (rgb & 0x00FF00) >> 8, (rgb & 0x0000FF)); + } + + private static final int RADIX = 10; + + public static String special(int chromaSpeed, int alpha, int r, int g, int b) { + StringBuilder sb = new StringBuilder(); + sb.append(Integer.toString(chromaSpeed, RADIX)).append(":"); + sb.append(Integer.toString(alpha, RADIX)).append(":"); + sb.append(Integer.toString(r, RADIX)).append(":"); + sb.append(Integer.toString(g, RADIX)).append(":"); + sb.append(Integer.toString(b, RADIX)); + return sb.toString(); + } + + private static int[] decompose(String csv) { + String[] split = csv.split(":"); + + int[] arr = new int[split.length]; + + + for(int i=0; i<split.length; i++) { + arr[i] = Integer.parseInt(split[split.length-1-i], RADIX); + } + return arr; + } + + public static int specialToSimpleRGB(String special) { + int[] d = decompose(special); + int r = d[2]; + int g = d[1]; + int b = d[0]; + int a = d[3]; + int chr = d[4]; + + return (a & 0xFF) << 24 | (r & 0xFF) << 16 | (g & 0xFF) << 8 | (b & 0xFF); + } + + public static int getSpeed(String special) { + return decompose(special)[4]; + } + + public static float getSecondsForSpeed(int speed) { + return (255-speed)/254f*(MAX_CHROMA_SECS-MIN_CHROMA_SECS)+MIN_CHROMA_SECS; + } + + private static final int MIN_CHROMA_SECS = 1; + private static final int MAX_CHROMA_SECS = 60; + + public static long startTime = -1; + public static int specialToChromaRGB(String special) { + if(startTime < 0) startTime = System.currentTimeMillis(); + + int[] d = decompose(special); + int chr = d[4]; + int a = d[3]; + int r = d[2]; + int g = d[1]; + int b = d[0]; + + float[] hsv = Color.RGBtoHSB(r, g, b, null); + + if(chr > 0) { + float seconds = getSecondsForSpeed(chr); + hsv[0] += (System.currentTimeMillis()-startTime)/1000f/seconds; + hsv[0] %= 1; + if(hsv[0] < 0) hsv[0] += 1; + } + + return (a & 0xFF) << 24 | (Color.HSBtoRGB(hsv[0], hsv[1], hsv[2]) & 0x00FFFFFF); + } + + public static int rotateHue(int argb, int degrees) { + int a = (argb >> 24) & 0xFF; + int r = (argb >> 16) & 0xFF; + int g = (argb >> 8) & 0xFF; + int b = (argb) & 0xFF; + + float[] hsv = Color.RGBtoHSB(r, g, b, null); + + hsv[0] += degrees/360f; + hsv[0] %= 1; + + return (a & 0xFF) << 24 | (Color.HSBtoRGB(hsv[0], hsv[1], hsv[2]) & 0x00FFFFFF); + } + + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/GlScissorStack.java b/src/main/java/io/github/moulberry/notenoughupdates/core/GlScissorStack.java new file mode 100644 index 00000000..f70bec40 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/GlScissorStack.java @@ -0,0 +1,87 @@ +package io.github.moulberry.notenoughupdates.core; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.ScaledResolution; +import org.lwjgl.opengl.GL11; + +import java.util.LinkedList; + +public class GlScissorStack { + + private static class Bounds { + int left; + int top; + int right; + int bottom; + + public Bounds(int left, int top, int right, int bottom) { + this.left = left; + this.top = top; + this.right = right; + this.bottom = bottom; + } + + public Bounds createSubBound(int left, int top, int right, int bottom) { + left = Math.max(left, this.left); + top = Math.max(top, this.top); + right = Math.min(right, this.right); + bottom = Math.min(bottom, this.bottom); + + if(top > bottom) { + top = bottom; + } + if(left > right) { + left = right; + } + + return new Bounds(left, top, right, bottom); + } + + public void set(ScaledResolution scaledResolution) { + int height = Minecraft.getMinecraft().displayHeight; + int scale = scaledResolution.getScaleFactor(); + GL11.glScissor(left*scale, height-bottom*scale, (right-left)*scale, (bottom-top)*scale); + } + } + + private static LinkedList<Bounds> boundsStack = new LinkedList<>(); + + public static void push(int left, int top, int right, int bottom, ScaledResolution scaledResolution) { + if(right < left) { + int temp = right; + right = left; + left = temp; + } + if(bottom < top) { + int temp = bottom; + bottom = top; + top = temp; + } + if(boundsStack.isEmpty()) { + boundsStack.push(new Bounds(left, top, right, bottom)); + } else { + boundsStack.push(boundsStack.peek().createSubBound(left, top, right, bottom)); + } + if(!boundsStack.isEmpty()) { + boundsStack.peek().set(scaledResolution); + } + GL11.glEnable(GL11.GL_SCISSOR_TEST); + } + + public static void pop(ScaledResolution scaledResolution) { + if(!boundsStack.isEmpty()) { + boundsStack.pop(); + } + if(boundsStack.isEmpty()) { + GL11.glDisable(GL11.GL_SCISSOR_TEST); + } else { + boundsStack.peek().set(scaledResolution); + } + } + + public static void clear() { + boundsStack.clear(); + GL11.glDisable(GL11.GL_SCISSOR_TEST); + } + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElement.java b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElement.java new file mode 100644 index 00000000..9210d1fb --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElement.java @@ -0,0 +1,8 @@ +package io.github.moulberry.notenoughupdates.core; + +public abstract class GuiElement { + + public abstract void render(); + public abstract boolean mouseInput(int mouseX, int mouseY); + public abstract boolean keyboardInput(); +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementBoolean.java b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementBoolean.java new file mode 100644 index 00000000..97fc3dcc --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementBoolean.java @@ -0,0 +1,118 @@ +package io.github.moulberry.notenoughupdates.core; + +import io.github.moulberry.notenoughupdates.core.util.lerp.LerpUtils; +import io.github.moulberry.notenoughupdates.core.util.render.RenderUtils; +import io.github.moulberry.notenoughupdates.util.GuiTextures; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.input.Mouse; + +import java.util.function.Consumer; + +public class GuiElementBoolean extends GuiElement { + + public int x; + public int y; + private boolean value; + private int clickRadius; + private Consumer<Boolean> toggleCallback; + + private boolean previewValue; + private int animation = 0; + private long lastMillis = 0; + + private static final int xSize = 48; + private static final int ySize = 14; + + public GuiElementBoolean(int x, int y, boolean value, Consumer<Boolean> toggleCallback) { + this(x, y, value, 0, toggleCallback); + } + + public GuiElementBoolean(int x, int y, boolean value, int clickRadius, Consumer<Boolean> toggleCallback) { + this.x = x; + this.y = y; + this.value = value; + this.previewValue = value; + this.clickRadius = clickRadius; + this.toggleCallback = toggleCallback; + } + + @Override + public void render() { + GlStateManager.color(1, 1, 1, 1); + Minecraft.getMinecraft().getTextureManager().bindTexture(GuiTextures.BAR); + RenderUtils.drawTexturedRect(x, y, xSize, ySize); + + ResourceLocation buttonLoc = GuiTextures.ON; + long currentMillis = System.currentTimeMillis(); + long deltaMillis = currentMillis - lastMillis; + lastMillis = currentMillis; + boolean passedLimit = false; + if(previewValue != value) { + if((previewValue && animation > 12) || + (!previewValue && animation < 24)) { + passedLimit = true; + } + } + if(previewValue != passedLimit) { + animation += deltaMillis/10; + } else { + animation -= deltaMillis/10; + } + lastMillis -= deltaMillis%10; + + if(previewValue == value) { + animation = Math.max(0, Math.min(36, animation)); + } else if(!passedLimit) { + if(previewValue) { + animation = Math.max(0, Math.min(12, animation)); + } else { + animation = Math.max(24, Math.min(36, animation)); + } + } else { + if(previewValue) { + animation = Math.max(12, animation); + } else { + animation = Math.min(24, animation); + } + } + + int animation = (int)(LerpUtils.sigmoidZeroOne(this.animation/36f)*36); + if(animation < 3) { + buttonLoc = GuiTextures.OFF; + } else if(animation < 13) { + buttonLoc = GuiTextures.ONE; + } else if(animation < 23) { + buttonLoc = GuiTextures.TWO; + } else if(animation < 33) { + buttonLoc = GuiTextures.THREE; + } + + Minecraft.getMinecraft().getTextureManager().bindTexture(buttonLoc); + RenderUtils.drawTexturedRect(x+animation, y, 12, 14); + } + + @Override + public boolean mouseInput(int mouseX, int mouseY) { + if(mouseX > x-clickRadius && mouseX < x+xSize+clickRadius && + mouseY > y-clickRadius && mouseY < y+ySize+clickRadius) { + if(Mouse.getEventButton() == 0) { + if(Mouse.getEventButtonState()) { + previewValue = !value; + } else { + value = !value; + toggleCallback.accept(value); + } + } + } else { + previewValue = value; + } + return false; + } + + @Override + public boolean keyboardInput() { + return false; + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementColour.java b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementColour.java new file mode 100644 index 00000000..8de2205d --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementColour.java @@ -0,0 +1,368 @@ +package io.github.moulberry.notenoughupdates.core; + +import io.github.moulberry.notenoughupdates.core.util.render.RenderUtils; +import io.github.moulberry.notenoughupdates.core.util.render.TextRenderUtils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.texture.DynamicTexture; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; + +import java.awt.*; +import java.awt.image.BufferedImage; +import java.util.function.Consumer; + +public class GuiElementColour extends GuiElement { + + public static final ResourceLocation colour_selector_dot = new ResourceLocation("notenoughupdates:core/colour_selector_dot.png"); + public static final ResourceLocation colour_selector_bar = new ResourceLocation("notenoughupdates:core/colour_selector_bar.png"); + public static final ResourceLocation colour_selector_bar_alpha = new ResourceLocation("notenoughupdates:core/colour_selector_bar_alpha.png"); + public static final ResourceLocation colour_selector_chroma = new ResourceLocation("notenoughupdates:core/colour_selector_chroma.png"); + + private static final ResourceLocation colourPickerLocation = new ResourceLocation("mbcore:dynamic/colourpicker"); + private static final ResourceLocation colourPickerBarValueLocation = new ResourceLocation("mbcore:dynamic/colourpickervalue"); + private static final ResourceLocation colourPickerBarOpacityLocation = new ResourceLocation("mbcore:dynamic/colourpickeropacity"); + private final GuiElementTextField hexField = new GuiElementTextField("", + GuiElementTextField.SCALE_TEXT | GuiElementTextField.FORCE_CAPS | GuiElementTextField.NO_SPACE); + + private int x; + private int y; + private final int xSize = 119; + private final int ySize = 89; + + private float wheelAngle = 0; + private float wheelRadius = 0; + + private int clickedComponent = -1; + + private Consumer<String> colourChangedCallback; + private Runnable closeCallback; + private String colour; + + public GuiElementColour(int x, int y, String initialColour, Consumer<String> colourChangedCallback, + Runnable closeCallback) { + + final ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); + + this.y = Math.max(10, Math.min(scaledResolution.getScaledHeight()-ySize-10, y)); + this.x = Math.max(10, Math.min(scaledResolution.getScaledWidth()-xSize-10, x)); + + this.colour = initialColour; + this.colourChangedCallback = colourChangedCallback; + this.closeCallback = closeCallback; + + int colour = ChromaColour.specialToSimpleRGB(initialColour); + Color c = new Color(colour); + float[] hsv = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); + updateAngleAndRadius(hsv); + } + + public void updateAngleAndRadius(float[] hsv) { + this.wheelRadius = hsv[1]; + this.wheelAngle = hsv[0]*360; + } + + public void render() { + RenderUtils.drawFloatingRectDark(x, y, xSize, ySize); + + int currentColour = ChromaColour.specialToSimpleRGB(colour); + Color c = new Color(currentColour, true); + float[] hsv = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); + + BufferedImage bufferedImage = new BufferedImage(288, 288, BufferedImage.TYPE_INT_ARGB); + float borderRadius = 0.05f; + if(Keyboard.isKeyDown(Keyboard.KEY_N)) borderRadius = 0; + for(int x=-16; x<272; x++) { + for(int y=-16; y<272; y++) { + float radius = (float) Math.sqrt(((x-128)*(x-128)+(y-128)*(y-128))/16384f); + float angle = (float) Math.toDegrees(Math.atan((128-x)/(y-128+1E-5))+Math.PI/2); + if(y < 128) angle += 180; + if(radius <= 1) { + int rgb = Color.getHSBColor(angle/360f, (float)Math.pow(radius, 1.5f), hsv[2]).getRGB(); + bufferedImage.setRGB(x+16, y+16, rgb); + } else if(radius <= 1+borderRadius) { + float invBlackAlpha = Math.abs(radius-1-borderRadius/2)/borderRadius*2; + float blackAlpha = 1-invBlackAlpha; + + if(radius > 1+borderRadius/2) { + bufferedImage.setRGB(x+16, y+16, (int)(blackAlpha*255) << 24); + } else { + Color col = Color.getHSBColor(angle/360f, 1, hsv[2]); + int rgb = (int)(col.getRed()*invBlackAlpha) << 16 | + (int)(col.getGreen()*invBlackAlpha) << 8 | + (int)(col.getBlue()*invBlackAlpha); + bufferedImage.setRGB(x+16, y+16, 0xff000000 | rgb); + } + + } + } + } + + BufferedImage bufferedImageValue = new BufferedImage(10, 64, BufferedImage.TYPE_INT_ARGB); + for(int x=0; x<10; x++) { + for(int y=0; y<64; y++) { + if((x == 0 || x == 9) && (y == 0 || y == 63)) continue; + + int rgb = Color.getHSBColor(wheelAngle/360, wheelRadius, (64-y)/64f).getRGB(); + bufferedImageValue.setRGB(x, y, rgb); + } + } + + BufferedImage bufferedImageOpacity = new BufferedImage(10, 64, BufferedImage.TYPE_INT_ARGB); + for(int x=0; x<10; x++) { + for(int y=0; y<64; y++) { + if((x == 0 || x == 9) && (y == 0 || y == 63)) continue; + + int rgb = (currentColour & 0x00FFFFFF) | (Math.min(255, (64-y)*4) << 24); + bufferedImageOpacity.setRGB(x, y, rgb); + } + } + + float selradius = (float)Math.pow(wheelRadius, 1/1.5f)*32; + int selx = (int)(Math.cos(Math.toRadians(wheelAngle))*selradius); + int sely = (int)(Math.sin(Math.toRadians(wheelAngle))*selradius); + + Minecraft.getMinecraft().getTextureManager().bindTexture(colour_selector_bar_alpha); + GlStateManager.color(1, 1, 1, 1); + RenderUtils.drawTexturedRect(x+5+64+5+10+5, y+5, 10, 64, GL11.GL_NEAREST); + + Minecraft.getMinecraft().getTextureManager().loadTexture(colourPickerBarValueLocation, new DynamicTexture(bufferedImageValue)); + Minecraft.getMinecraft().getTextureManager().bindTexture(colourPickerBarValueLocation); + GlStateManager.color(1, 1, 1, 1); + RenderUtils.drawTexturedRect(x+5+64+5, y+5, 10, 64, GL11.GL_NEAREST); + + Minecraft.getMinecraft().getTextureManager().loadTexture(colourPickerBarOpacityLocation, new DynamicTexture(bufferedImageOpacity)); + Minecraft.getMinecraft().getTextureManager().bindTexture(colourPickerBarOpacityLocation); + GlStateManager.color(1, 1, 1, 1); + RenderUtils.drawTexturedRect(x+5+64+5+10+5, y+5, 10, 64, GL11.GL_NEAREST); + + int chromaSpeed = ChromaColour.getSpeed(colour); + int currentColourChroma = ChromaColour.specialToChromaRGB(colour); + Color cChroma = new Color(currentColourChroma, true); + float hsvChroma[] = Color.RGBtoHSB(cChroma.getRed(), cChroma.getGreen(), cChroma.getBlue(), null); + + if(chromaSpeed > 0) { + Gui.drawRect(x+5+64+5+10+5+10+5+1, y+5+1, + x+5+64+5+10+5+10+5+10-1, y+5+64-1, + Color.HSBtoRGB(hsvChroma[0], 0.8f, 0.8f)); + } else { + Gui.drawRect(x+5+64+5+10+5+10+5+1, y+5+27+1, + x+5+64+5+10+5+10+5+10-1, y+5+37-1, + Color.HSBtoRGB((hsvChroma[0]+(System.currentTimeMillis()-ChromaColour.startTime)/1000f)%1, 0.8f, 0.8f)); + } + + Minecraft.getMinecraft().getTextureManager().bindTexture(colour_selector_bar); + GlStateManager.color(1, 1, 1, 1); + RenderUtils.drawTexturedRect(x+5+64+5, y+5, 10, 64, GL11.GL_NEAREST); + RenderUtils.drawTexturedRect(x+5+64+5+10+5, y+5, 10, 64, GL11.GL_NEAREST); + + if(chromaSpeed > 0) { + RenderUtils.drawTexturedRect(x+5+64+5+10+5+10+5, y+5, 10, 64, GL11.GL_NEAREST); + } else { + Minecraft.getMinecraft().getTextureManager().bindTexture(colour_selector_chroma); + RenderUtils.drawTexturedRect(x+5+64+5+10+5+10+5, y+5+27, 10, 10, GL11.GL_NEAREST); + } + + Gui.drawRect(x+5+64+5, y+5+64-(int)(64*hsv[2]), + x+5+64+5+10, y+5+64-(int)(64*hsv[2])+1, 0xFF000000); + Gui.drawRect(x+5+64+5+10+5, y+5+64-c.getAlpha()/4, + x+5+64+5+10+5+10, y+5+64-c.getAlpha()/4-1, 0xFF000000); + if(chromaSpeed > 0) { + Gui.drawRect(x+5+64+5+10+5+10+5, + y+5+64-(int)(chromaSpeed/255f*64), + x+5+64+5+10+5+10+5+10, + y+5+64-(int)(chromaSpeed/255f*64)+1, 0xFF000000); + } + + Minecraft.getMinecraft().getTextureManager().loadTexture(colourPickerLocation, new DynamicTexture(bufferedImage)); + Minecraft.getMinecraft().getTextureManager().bindTexture(colourPickerLocation); + GlStateManager.color(1, 1, 1, 1); + RenderUtils.drawTexturedRect(x+1, y+1, 72, 72, GL11.GL_LINEAR); + + Minecraft.getMinecraft().getTextureManager().bindTexture(colour_selector_dot); + GlStateManager.color(1, 1, 1, 1); + RenderUtils.drawTexturedRect(x+5+32+selx-4, y+5+32+sely-4, 8, 8, GL11.GL_NEAREST); + + TextRenderUtils.drawStringCenteredScaledMaxWidth(EnumChatFormatting.GRAY.toString()+Math.round(hsv[2]*100)+"", + Minecraft.getMinecraft().fontRendererObj, + x+5+64+5+5-(Math.round(hsv[2]*100)==100?1:0), y+5+64+5+5, true, 13, -1); + TextRenderUtils.drawStringCenteredScaledMaxWidth(EnumChatFormatting.GRAY.toString()+Math.round(c.getAlpha()/255f*100)+"", + Minecraft.getMinecraft().fontRendererObj, + x+5+64+5+15+5, y+5+64+5+5, true, 13, -1); + if(chromaSpeed > 0) { + TextRenderUtils.drawStringCenteredScaledMaxWidth(EnumChatFormatting.GRAY.toString()+ + (int)ChromaColour.getSecondsForSpeed(chromaSpeed)+"s", + Minecraft.getMinecraft().fontRendererObj, + x+5+64+5+30+6, y+5+64+5+5, true, 13, -1); + } + + hexField.setSize(48, 10); + if(!hexField.getFocus()) hexField.setText(Integer.toHexString(c.getRGB() & 0xFFFFFF).toUpperCase()); + + StringBuilder sb = new StringBuilder(EnumChatFormatting.GRAY+"#"); + for(int i=0; i<6-hexField.getText().length(); i++) { + sb.append("0"); + } + sb.append(EnumChatFormatting.WHITE); + + hexField.setPrependText(sb.toString()); + hexField.render(x+5+8, y+5+64+5); + } + + public boolean mouseInput(int mouseX, int mouseY) { + ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); + float mouseXF = (float)(Mouse.getX() * scaledResolution.getScaledWidth_double() / + Minecraft.getMinecraft().displayWidth); + float mouseYF = (float)(scaledResolution.getScaledHeight_double() - Mouse.getY() * + scaledResolution.getScaledHeight_double() / Minecraft.getMinecraft().displayHeight - 1); + + if((Mouse.getEventButton() == 0 || Mouse.getEventButton() == 1) && Mouse.getEventButtonState()) { + if(mouseX > x+5+8 && mouseX < x+5+8+48) { + if(mouseY > y+5+64+5 && mouseY < y+5+64+5+10) { + hexField.mouseClicked(mouseX, mouseY, Mouse.getEventButton()); + clickedComponent = -1; + return true; + } + } + } + if(!Mouse.getEventButtonState() && Mouse.getEventButton() == 0) { + clickedComponent = -1; + } + if(Mouse.getEventButtonState() && Mouse.getEventButton() == 0) { + if(mouseX >= x && mouseX <= x+119 && + mouseY >= y && mouseY <= y+89) { + hexField.unfocus(); + + int xWheel = mouseX - x - 5; + int yWheel = mouseY - y - 5; + + if(xWheel > 0 && xWheel < 64) { + if(yWheel > 0 && yWheel < 64) { + clickedComponent = 0; + } + } + + int xValue = mouseX - (x+5+64+5); + int y = mouseY - this.y - 5; + + if(y > -5 && y <= 69) { + if(xValue > 0 && xValue < 10) { + clickedComponent = 1; + } + + int xOpacity = mouseX - (x+5+64+5+10+5); + + if(xOpacity > 0 && xOpacity < 10) { + clickedComponent = 2; + } + } + + int chromaSpeed = ChromaColour.getSpeed(colour); + int xChroma = mouseX - (x+5+64+5+10+5+10+5); + if(xChroma > 0 && xChroma < 10) { + if(chromaSpeed > 0) { + if(y > -5 && y <= 69) { + clickedComponent = 3; + } + } else if(mouseY > this.y+5+27 && mouseY < this.y+5+37) { + int currentColour = ChromaColour.specialToSimpleRGB(colour); + Color c = new Color(currentColour, true); + colour = ChromaColour.special(200, c.getAlpha(), currentColour); + colourChangedCallback.accept(colour); + } + } + } else { + hexField.unfocus(); + closeCallback.run(); + return false; + } + } + if(Mouse.isButtonDown(0) && clickedComponent >= 0) { + int currentColour = ChromaColour.specialToSimpleRGB(colour); + Color c = new Color(currentColour, true); + float[] hsv = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); + + float xWheel = mouseXF - x - 5; + float yWheel = mouseYF - y - 5; + + if(clickedComponent == 0) { + float angle = (float) Math.toDegrees(Math.atan((32-xWheel)/(yWheel-32+1E-5))+Math.PI/2); + xWheel = Math.max(0, Math.min(64, xWheel)); + yWheel = Math.max(0, Math.min(64, yWheel)); + float radius = (float) Math.sqrt(((xWheel-32)*(xWheel-32)+(yWheel-32)*(yWheel-32))/1024f); + if(yWheel < 32) angle += 180; + + this.wheelAngle = angle; + this.wheelRadius = (float)Math.pow(Math.min(1, radius), 1.5f); + int rgb = Color.getHSBColor(angle/360f, wheelRadius, hsv[2]).getRGB(); + colour = ChromaColour.special(ChromaColour.getSpeed(colour), c.getAlpha(), rgb); + colourChangedCallback.accept(colour); + return true; + } + + float y = mouseYF - this.y - 5; + y = Math.max(0, Math.min(64, y)); + System.out.println(y); + + if(clickedComponent == 1) { + int rgb = Color.getHSBColor(wheelAngle/360, wheelRadius, 1-y/64f).getRGB(); + colour = ChromaColour.special(ChromaColour.getSpeed(colour), c.getAlpha(), rgb); + colourChangedCallback.accept(colour); + return true; + } + + if(clickedComponent == 2) { + colour = ChromaColour.special(ChromaColour.getSpeed(colour), + 255-Math.round(y/64f*255), currentColour); + colourChangedCallback.accept(colour); + return true; + } + + if(clickedComponent == 3) { + colour = ChromaColour.special(255-Math.round(y/64f*255), c.getAlpha(), currentColour); + colourChangedCallback.accept(colour); + } + return true; + } + return false; + } + + public boolean keyboardInput() { + if(Keyboard.getEventKeyState() && hexField.getFocus()) { + if (Keyboard.getEventKey() == Keyboard.KEY_ESCAPE) { + hexField.unfocus(); + return true; + } + String old = hexField.getText(); + + hexField.keyTyped(Keyboard.getEventCharacter(), Keyboard.getEventKey()); + + if(hexField.getText().length() > 6) { + hexField.setText(old); + } else { + try { + String text = hexField.getText().toLowerCase(); + + int rgb = Integer.parseInt(text, 16); + int alpha = (ChromaColour.specialToSimpleRGB(colour) >> 24) & 0xFF; + colour = ChromaColour.special(ChromaColour.getSpeed(colour), alpha, rgb); + colourChangedCallback.accept(colour); + + Color c = new Color(rgb); + float[] hsv = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); + updateAngleAndRadius(hsv); + } catch(Exception e) {}; + } + + return true; + } + return false; + } + + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementTextField.java b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementTextField.java new file mode 100644 index 00000000..56dbe77d --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiElementTextField.java @@ -0,0 +1,519 @@ +package io.github.moulberry.notenoughupdates.core; + +import io.github.moulberry.notenoughupdates.core.util.StringUtils; +import io.github.moulberry.notenoughupdates.core.util.render.TextRenderUtils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.gui.GuiTextField; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.renderer.GlStateManager; + +import java.awt.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class GuiElementTextField { + + public static final int SCALE_TEXT = 0b100000; + public static final int NUM_ONLY = 0b10000; + public static final int NO_SPACE = 0b01000; + public static final int FORCE_CAPS = 0b00100; + public static final int COLOUR = 0b00010; + public static final int MULTILINE = 0b00001; + + private int searchBarYSize; + private int searchBarXSize; + private static final int searchBarPadding = 2; + + private int options; + + private boolean focus = false; + + private int x; + private int y; + + private String prependText = ""; + + private final GuiTextField textField = new GuiTextField(0, Minecraft.getMinecraft().fontRendererObj, + 0 , 0, 0, 0); + + private int customBorderColour = -1; + + public GuiElementTextField(String initialText, int options) { + this(initialText, 100, 20, options); + } + + public GuiElementTextField(String initialText, int sizeX, int sizeY, int options) { + textField.setFocused(true); + textField.setCanLoseFocus(false); + textField.setMaxStringLength(999); + textField.setText(initialText); + this.searchBarXSize = sizeX; + this.searchBarYSize = sizeY; + this.options = options; + } + + public void setMaxStringLength(int len) { + textField.setMaxStringLength(len); + } + + public void setCustomBorderColour(int colour) { + this.customBorderColour = colour; + } + + public String getText() { + return textField.getText(); + } + + public void setPrependText(String text) { + this.prependText = text; + } + + public void setText(String text) { + if(textField.getText() == null || !textField.getText().equals(text)) { + textField.setText(text); + } + } + + public void setSize(int searchBarXSize, int searchBarYSize) { + this.searchBarXSize = searchBarXSize; + this.searchBarYSize = searchBarYSize; + } + + public void setOptions(int options) { + this.options = options; + } + + @Override + public String toString() { + return textField.getText(); + } + + public boolean getFocus() { + return focus; + } + + public int getHeight() { + ScaledResolution scaledresolution = new ScaledResolution(Minecraft.getMinecraft()); + int paddingUnscaled = searchBarPadding/scaledresolution.getScaleFactor(); + + int numLines = org.apache.commons.lang3.StringUtils.countMatches(textField.getText(), "\n")+1; + int extraSize = (searchBarYSize-8)/2+8; + int bottomTextBox = searchBarYSize + extraSize*(numLines-1); + + return bottomTextBox + paddingUnscaled*2; + } + + public int getWidth() { + ScaledResolution scaledresolution = new ScaledResolution(Minecraft.getMinecraft()); + int paddingUnscaled = searchBarPadding/scaledresolution.getScaleFactor(); + + return searchBarXSize + paddingUnscaled*2; + } + + private float getScaleFactor(String str) { + return Math.min(1, (searchBarXSize-2)/(float)Minecraft.getMinecraft().fontRendererObj.getStringWidth(str)); + } + + private boolean isScaling() { + return (options & SCALE_TEXT) != 0; + } + + private float getStringWidth(String str) { + if(isScaling()) { + return Minecraft.getMinecraft().fontRendererObj.getStringWidth(str)*getScaleFactor(str); + } else { + return Minecraft.getMinecraft().fontRendererObj.getStringWidth(str); + } + } + + public int getCursorPos(int mouseX, int mouseY) { + int xComp = mouseX - x; + int yComp = mouseY - y; + + int extraSize = (searchBarYSize-8)/2+8; + + String renderText = prependText + textField.getText(); + + int lineNum = Math.round(((yComp - (searchBarYSize-8)/2))/extraSize); + + Pattern patternControlCode = Pattern.compile("(?i)\\u00A7([^\\u00B6])(?!\\u00B6)"); + String text = renderText; + String textNoColour = renderText; + if((options & COLOUR) != 0) { + while(true) { + Matcher matcher = patternControlCode.matcher(text); + if(!matcher.find() || matcher.groupCount() < 1) break; + String code = matcher.group(1); + text = matcher.replaceFirst("\u00A7"+code+"\u00B6"+code); + } + } + while(true) { + Matcher matcher = patternControlCode.matcher(textNoColour); + if(!matcher.find() || matcher.groupCount() < 1) break; + String code = matcher.group(1); + textNoColour = matcher.replaceFirst("\u00B6"+code); + } + + int currentLine = 0; + int cursorIndex = 0; + for(; cursorIndex<textNoColour.length(); cursorIndex++) { + if(currentLine == lineNum) break; + if(textNoColour.charAt(cursorIndex) == '\n') { + currentLine++; + } + } + + + String textNC = textNoColour.substring(0, cursorIndex); + int colorCodes = org.apache.commons.lang3.StringUtils.countMatches(textNC, "\u00B6"); + String line = text.substring(cursorIndex+(((options & COLOUR) != 0)?colorCodes*2:0)).split("\n")[0]; + int padding = Math.min(5, searchBarXSize-strLenNoColor(line))/2; + String trimmed = Minecraft.getMinecraft().fontRendererObj.trimStringToWidth(line, xComp-padding); + int linePos = strLenNoColor(trimmed); + if(linePos != strLenNoColor(line)) { + char after = line.charAt(linePos); + int trimmedWidth = Minecraft.getMinecraft().fontRendererObj.getStringWidth(trimmed); + int charWidth = Minecraft.getMinecraft().fontRendererObj.getCharWidth(after); + if(trimmedWidth + charWidth/2 < xComp-padding) { + linePos++; + } + } + cursorIndex += linePos; + + int pre = StringUtils.cleanColour(prependText).length(); + if(cursorIndex < pre) { + cursorIndex = 0; + } else { + cursorIndex -= pre; + } + + return cursorIndex; + } + + public void mouseClicked(int mouseX, int mouseY, int mouseButton) { + if(mouseButton == 1) { + textField.setText(""); + } else { + textField.setCursorPosition(getCursorPos(mouseX, mouseY)); + } + focus = true; + } + + public void unfocus() { + focus = false; + textField.setSelectionPos(textField.getCursorPosition()); + } + + public int strLenNoColor(String str) { + return str.replaceAll("(?i)\\u00A7.", "").length(); + } + + public void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) { + if(focus) { + textField.setSelectionPos(getCursorPos(mouseX, mouseY)); + } + } + + public void keyTyped(char typedChar, int keyCode) { + if(focus) { + if((options & MULTILINE) != 0) { //Carriage return + Pattern patternControlCode = Pattern.compile("(?i)\\u00A7([^\\u00B6\n])(?!\\u00B6)"); + + String text = textField.getText(); + String textNoColour = textField.getText(); + while(true) { + Matcher matcher = patternControlCode.matcher(text); + if(!matcher.find() || matcher.groupCount() < 1) break; + String code = matcher.group(1); + text = matcher.replaceFirst("\u00A7"+code+"\u00B6"+code); + } + while(true) { + Matcher matcher = patternControlCode.matcher(textNoColour); + if(!matcher.find() || matcher.groupCount() < 1) break; + String code = matcher.group(1); + textNoColour = matcher.replaceFirst("\u00B6"+code); + } + + if(keyCode == 28) { + String before = textField.getText().substring(0, textField.getCursorPosition()); + String after = textField.getText().substring(textField.getCursorPosition()); + int pos = textField.getCursorPosition(); + textField.setText(before + "\n" + after); + textField.setCursorPosition(pos+1); + return; + } else if(keyCode == 200) { //Up + String textNCBeforeCursor = textNoColour.substring(0, textField.getSelectionEnd()); + int colorCodes = org.apache.commons.lang3.StringUtils.countMatches(textNCBeforeCursor, "\u00B6"); + String textBeforeCursor = text.substring(0, textField.getSelectionEnd()+colorCodes*2); + + int numLinesBeforeCursor = org.apache.commons.lang3.StringUtils.countMatches(textBeforeCursor, "\n"); + + String[] split = textBeforeCursor.split("\n"); + int textBeforeCursorWidth; + String lineBefore; + String thisLineBeforeCursor; + if(split.length == numLinesBeforeCursor && split.length > 0) { + textBeforeCursorWidth = 0; + lineBefore = split[split.length-1]; + thisLineBeforeCursor = ""; + } else if(split.length > 1) { + thisLineBeforeCursor = split[split.length-1]; + lineBefore = split[split.length-2]; + textBeforeCursorWidth = Minecraft.getMinecraft().fontRendererObj.getStringWidth(thisLineBeforeCursor); + } else { + return; + } + String trimmed = Minecraft.getMinecraft().fontRendererObj + .trimStringToWidth(lineBefore, textBeforeCursorWidth); + int linePos = strLenNoColor(trimmed); + if(linePos != strLenNoColor(lineBefore)) { + char after = lineBefore.charAt(linePos); + int trimmedWidth = Minecraft.getMinecraft().fontRendererObj.getStringWidth(trimmed); + int charWidth = Minecraft.getMinecraft().fontRendererObj.getCharWidth(after); + if(trimmedWidth + charWidth/2 < textBeforeCursorWidth) { + linePos++; + } + } + int newPos = textField.getSelectionEnd()-strLenNoColor(thisLineBeforeCursor) + -strLenNoColor(lineBefore)-1+linePos; + + if(GuiScreen.isShiftKeyDown()) { + textField.setSelectionPos(newPos); + } else { + textField.setCursorPosition(newPos); + } + } else if(keyCode == 208) { //Down + String textNCBeforeCursor = textNoColour.substring(0, textField.getSelectionEnd()); + int colorCodes = org.apache.commons.lang3.StringUtils.countMatches(textNCBeforeCursor, "\u00B6"); + String textBeforeCursor = text.substring(0, textField.getSelectionEnd()+colorCodes*2); + + int numLinesBeforeCursor = org.apache.commons.lang3.StringUtils.countMatches(textBeforeCursor, "\n"); + + String[] split = textBeforeCursor.split("\n"); + String thisLineBeforeCursor; + int textBeforeCursorWidth; + if(split.length == numLinesBeforeCursor) { + thisLineBeforeCursor = ""; + textBeforeCursorWidth = 0; + } else if(split.length > 0) { + thisLineBeforeCursor = split[split.length-1]; + textBeforeCursorWidth = Minecraft.getMinecraft().fontRendererObj.getStringWidth(thisLineBeforeCursor); + } else { + return; + } + + String[] split2 = textNoColour.split("\n"); + if(split2.length > numLinesBeforeCursor+1) { + String lineAfter = split2[numLinesBeforeCursor+1]; + String trimmed = Minecraft.getMinecraft().fontRendererObj + .trimStringToWidth(lineAfter, textBeforeCursorWidth); + int linePos = strLenNoColor(trimmed); + if(linePos != strLenNoColor(lineAfter)) { + char after = lineAfter.charAt(linePos); + int trimmedWidth = Minecraft.getMinecraft().fontRendererObj.getStringWidth(trimmed); + int charWidth = Minecraft.getMinecraft().fontRendererObj.getCharWidth(after); + if(trimmedWidth + charWidth/2 < textBeforeCursorWidth) { + linePos++; + } + } + int newPos = textField.getSelectionEnd()-strLenNoColor(thisLineBeforeCursor) + +strLenNoColor(split2[numLinesBeforeCursor])+1+linePos; + + if(GuiScreen.isShiftKeyDown()) { + textField.setSelectionPos(newPos); + } else { + textField.setCursorPosition(newPos); + } + } + } + } + + String old = textField.getText(); + if((options & FORCE_CAPS) != 0) typedChar = Character.toUpperCase(typedChar); + if((options & NO_SPACE) != 0 && typedChar == ' ') return; + + textField.setFocused(true); + textField.textboxKeyTyped(typedChar, keyCode); + + if((options & COLOUR) != 0) { + if(typedChar == '&') { + int pos = textField.getCursorPosition()-2; + if(pos >= 0 && pos < textField.getText().length()) { + if(textField.getText().charAt(pos) == '&') { + String before = textField.getText().substring(0, pos); + String after = ""; + if(pos+2 < textField.getText().length()) { + after = textField.getText().substring(pos+2); + } + textField.setText(before + "\u00A7" + after); + textField.setCursorPosition(pos+1); + } + } + } + } + + if((options & NUM_ONLY) != 0 && textField.getText().matches("[^0-9.]")) textField.setText(old); + } + } + + public void render(int x, int y) { + this.x = x; + this.y = y; + drawTextbox(x, y, searchBarXSize, searchBarYSize, searchBarPadding, textField, focus); + } + + private void drawTextbox(int x, int y, int searchBarXSize, int searchBarYSize, int searchBarPadding, + GuiTextField textField, boolean focus) { + ScaledResolution scaledresolution = new ScaledResolution(Minecraft.getMinecraft()); + String renderText = prependText + textField.getText(); + + GlStateManager.disableLighting(); + + /** + * Search bar + */ + int paddingUnscaled = searchBarPadding/scaledresolution.getScaleFactor(); + if(paddingUnscaled < 1) paddingUnscaled = 1; + + int numLines = org.apache.commons.lang3.StringUtils.countMatches(renderText, "\n")+1; + int extraSize = (searchBarYSize-8)/2+8; + int bottomTextBox = y + searchBarYSize + extraSize*(numLines-1); + + int borderColour = focus ? Color.GREEN.getRGB() : Color.WHITE.getRGB(); + if(customBorderColour != -1) { + borderColour = customBorderColour; + } + //bar background + Gui.drawRect(x - paddingUnscaled, + y - paddingUnscaled, + x + searchBarXSize + paddingUnscaled, + bottomTextBox + paddingUnscaled, borderColour); + Gui.drawRect(x, + y, + x + searchBarXSize, + bottomTextBox, Color.BLACK.getRGB()); + + //bar text + Pattern patternControlCode = Pattern.compile("(?i)\\u00A7([^\\u00B6\n])(?!\\u00B6)"); + + String text = renderText; + String textNoColor = renderText; + if((options & COLOUR) != 0) { + while(true) { + Matcher matcher = patternControlCode.matcher(text); + if(!matcher.find() || matcher.groupCount() < 1) break; + String code = matcher.group(1); + text = matcher.replaceFirst("\u00A7"+code+"\u00B6"+code); + } + } + while(true) { + Matcher matcher = patternControlCode.matcher(textNoColor); + if(!matcher.find() || matcher.groupCount() < 1) break; + String code = matcher.group(1); + textNoColor = matcher.replaceFirst("\u00B6"+code); + } + + int xStartOffset = 5; + float scale = 1; + String[] texts = text.split("\n"); + for(int yOffI = 0; yOffI < texts.length; yOffI++) { + int yOff = yOffI*extraSize; + + if(isScaling() && Minecraft.getMinecraft().fontRendererObj.getStringWidth(texts[yOffI])>searchBarXSize-10) { + scale = (searchBarXSize-2)/(float)Minecraft.getMinecraft().fontRendererObj.getStringWidth(texts[yOffI]); + if(scale > 1) scale=1; + float newLen = Minecraft.getMinecraft().fontRendererObj.getStringWidth(texts[yOffI])*scale; + xStartOffset = (int)((searchBarXSize-newLen)/2f); + + TextRenderUtils.drawStringCenteredScaledMaxWidth(texts[yOffI], Minecraft.getMinecraft().fontRendererObj, x+searchBarXSize/2f, + y+searchBarYSize/2f+yOff, false, + searchBarXSize-2, Color.WHITE.getRGB()); + } else { + Minecraft.getMinecraft().fontRendererObj.drawString(StringUtils.trimToWidth(texts[yOffI], searchBarXSize-10), x + 5, + y+(searchBarYSize-8)/2+yOff, Color.WHITE.getRGB()); + } + } + + 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)); + + int numLinesBeforeCursor = org.apache.commons.lang3.StringUtils.countMatches(textBeforeCursor, "\n"); + int yOff = numLinesBeforeCursor*extraSize; + + String[] split = textBeforeCursor.split("\n"); + int textBeforeCursorWidth; + if(split.length <= numLinesBeforeCursor || split.length == 0) { + textBeforeCursorWidth = 0; + } else { + textBeforeCursorWidth = (int)(Minecraft.getMinecraft().fontRendererObj.getStringWidth(split[split.length-1])*scale); + } + Gui.drawRect(x + xStartOffset + textBeforeCursorWidth, + y+(searchBarYSize-8)/2-1 + yOff, + x + xStartOffset + textBeforeCursorWidth+1, + y+(searchBarYSize-8)/2+9 + yOff, Color.WHITE.getRGB()); + } + + String selectedText = textField.getSelectedText(); + if(!selectedText.isEmpty()) { + int leftIndex = Math.min(textField.getCursorPosition()+prependText.length(), textField.getSelectionEnd()+prependText.length()); + int rightIndex = Math.max(textField.getCursorPosition()+prependText.length(), textField.getSelectionEnd()+prependText.length()); + + float texX = 0; + int texY = 0; + boolean sectionSignPrev = false; + boolean bold = false; + for(int i=0; i<textNoColor.length(); i++) { + char c = textNoColor.charAt(i); + if(sectionSignPrev) { + if(c != 'k' && c != 'K' + && c != 'm' && c != 'M' + && c != 'n' && c != 'N' + && c != 'o' && c != 'O') { + bold = c == 'l' || c == 'L'; + } + } + sectionSignPrev = false; + if(c == '\u00B6') sectionSignPrev = true; + + if(c == '\n') { + if(i >= leftIndex && i < rightIndex) { + Gui.drawRect(x + xStartOffset + (int)texX, + y+(searchBarYSize-8)/2-1 + texY, + x + xStartOffset + (int)texX + 3, + y+(searchBarYSize-8)/2+9 + texY, Color.LIGHT_GRAY.getRGB()); + } + + texX = 0; + texY += extraSize; + continue; + } + + //String c2 = bold ? EnumChatFormatting.BOLD.toString() : "" + c; + + int len = Minecraft.getMinecraft().fontRendererObj.getStringWidth(String.valueOf(c)); + if(bold) len++; + if(i >= leftIndex && i < rightIndex) { + Gui.drawRect(x + xStartOffset + (int)texX, + y+(searchBarYSize-8)/2-1 + texY, + x + xStartOffset + (int)(texX + len*scale), + y+(searchBarYSize-8)/2+9 + texY, Color.LIGHT_GRAY.getRGB()); + + TextRenderUtils.drawStringScaled(String.valueOf(c), Minecraft.getMinecraft().fontRendererObj, + x + xStartOffset + texX, + y+searchBarYSize/2f-scale*8/2f + texY, false, Color.BLACK.getRGB(), scale); + if(bold) { + TextRenderUtils.drawStringScaled(String.valueOf(c), Minecraft.getMinecraft().fontRendererObj, + x + xStartOffset + texX + 1, + y+searchBarYSize/2f-scale*8/2f + texY, false, Color.BLACK.getRGB(), scale); + } + } + + texX += len*scale; + } + } + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/GuiScreenElementWrapper.java b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiScreenElementWrapper.java new file mode 100644 index 00000000..c270397b --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/GuiScreenElementWrapper.java @@ -0,0 +1,35 @@ +package io.github.moulberry.notenoughupdates.core; + +import net.minecraft.client.gui.GuiScreen; +import org.lwjgl.input.Mouse; + +import java.io.IOException; + +public class GuiScreenElementWrapper extends GuiScreen { + + private final GuiElement element; + + public GuiScreenElementWrapper(GuiElement element) { + this.element = element; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float partialTicks) { + super.drawScreen(mouseX, mouseY, partialTicks); + element.render(); + } + + @Override + public void handleMouseInput() throws IOException { + super.handleMouseInput(); + int i = Mouse.getEventX() * this.width / this.mc.displayWidth; + int j = this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1; + element.mouseInput(i, j); + } + + @Override + public void handleKeyboardInput() throws IOException { + super.handleKeyboardInput(); + element.keyboardInput(); + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/Config.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/Config.java new file mode 100644 index 00000000..572c9af6 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/Config.java @@ -0,0 +1,4 @@ +package io.github.moulberry.notenoughupdates.core.config; + +public class Config { +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/Category.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/Category.java new file mode 100644 index 00000000..6a91cae5 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/Category.java @@ -0,0 +1,15 @@ +package io.github.moulberry.notenoughupdates.core.config.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Category { + + String name(); + String desc(); + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorBoolean.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorBoolean.java new file mode 100644 index 00000000..3c6465e6 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorBoolean.java @@ -0,0 +1,12 @@ +package io.github.moulberry.notenoughupdates.core.config.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface ConfigEditorBoolean { + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorColour.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorColour.java new file mode 100644 index 00000000..d1dd5808 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorColour.java @@ -0,0 +1,13 @@ +package io.github.moulberry.notenoughupdates.core.config.annotations; + + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface ConfigEditorColour { + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorDropdown.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorDropdown.java new file mode 100644 index 00000000..d9d2235b --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorDropdown.java @@ -0,0 +1,16 @@ +package io.github.moulberry.notenoughupdates.core.config.annotations; + + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface ConfigEditorDropdown { + + String[] values(); + int initialIndex() default 0; + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorSlider.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorSlider.java new file mode 100644 index 00000000..d671f65c --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorSlider.java @@ -0,0 +1,18 @@ +package io.github.moulberry.notenoughupdates.core.config.annotations; + + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface ConfigEditorSlider { + + float minValue(); + float maxValue(); + + float minStep(); + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorText.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorText.java new file mode 100644 index 00000000..9227cf50 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigEditorText.java @@ -0,0 +1,13 @@ +package io.github.moulberry.notenoughupdates.core.config.annotations; + + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface ConfigEditorText { + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigOption.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigOption.java new file mode 100644 index 00000000..63c3366a --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/annotations/ConfigOption.java @@ -0,0 +1,17 @@ +package io.github.moulberry.notenoughupdates.core.config.annotations; + + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface ConfigOption { + + String name(); + String desc(); + int subcategoryId() default -1; + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditor.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditor.java new file mode 100644 index 00000000..5b9509a3 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditor.java @@ -0,0 +1,61 @@ +package io.github.moulberry.notenoughupdates.core.config.gui; + +import io.github.moulberry.notenoughupdates.core.config.struct.ConfigProcessor; +import io.github.moulberry.notenoughupdates.core.util.render.RenderUtils; +import io.github.moulberry.notenoughupdates.core.util.render.TextRenderUtils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.GlStateManager; + +public abstract class GuiOptionEditor { + + protected final ConfigProcessor.ProcessedOption option; + private static final int HEIGHT = 45; + + public GuiOptionEditor(ConfigProcessor.ProcessedOption option) { + this.option = option; + } + + public void render(int x, int y, int width) { + FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; + RenderUtils.drawFloatingRectDark(x, y, width, HEIGHT, true); + TextRenderUtils.drawStringCenteredScaledMaxWidth(option.name, + fr, x+width/6, y+13, true, width/3-10, 0xc0c0c0); + + int height = getHeight(); + + int maxLines = 5; + float scale = 1; + int lineCount = fr.listFormattedStringToWidth(option.desc, width*2/3-10).size(); + + if(lineCount <= 0) return; + + float paraHeight = 9 * lineCount - 1; + + while(paraHeight >= height-10) { + scale -= 1/8f; + lineCount = fr.listFormattedStringToWidth(option.desc, (int)(width*2/3/scale-10)).size(); + paraHeight = (int)(9*scale * lineCount - 1*scale); + } + + GlStateManager.pushMatrix(); + GlStateManager.translate(x+5+width/3f, y+HEIGHT/2f-paraHeight/2, 0); + GlStateManager.scale(scale, scale, 1); + + fr.drawSplitString(option.desc, 0, 0, (int)(width*2/3/scale-10), 0xc0c0c0); + + GlStateManager.popMatrix(); + } + + public int getHeight() { + return HEIGHT; + } + + public abstract boolean mouseInput(int x, int y, int width, int mouseX, int mouseY); + public abstract boolean keyboardInput(); + + public boolean mouseInputGlobal(int x, int y, int width, int mouseX, int mouseY) { + return false; + } + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorBoolean.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorBoolean.java new file mode 100644 index 00000000..ba2c9be9 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorBoolean.java @@ -0,0 +1,38 @@ +package io.github.moulberry.notenoughupdates.core.config.gui; + +import io.github.moulberry.notenoughupdates.core.GuiElementBoolean; +import io.github.moulberry.notenoughupdates.core.config.struct.ConfigProcessor; + +public class GuiOptionEditorBoolean extends GuiOptionEditor { + + private final GuiElementBoolean bool; + + public GuiOptionEditorBoolean(ConfigProcessor.ProcessedOption option) { + super(option); + + bool = new GuiElementBoolean(0, 0, (boolean)option.get(), 10, option::set); + } + + @Override + public void render(int x, int y, int width) { + super.render(x, y, width); + int height = getHeight(); + + bool.x = x+width/6-24; + bool.y = y+height-7-14; + bool.render(); + } + + @Override + public boolean mouseInput(int x, int y, int width, int mouseX, int mouseY) { + int height = getHeight(); + bool.x = x+width/6-24; + bool.y = y+height-7-14; + return bool.mouseInput(mouseX, mouseY); + } + + @Override + public boolean keyboardInput() { + return false; + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorColour.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorColour.java new file mode 100644 index 00000000..482f6823 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorColour.java @@ -0,0 +1,80 @@ +package io.github.moulberry.notenoughupdates.core.config.gui; + +import io.github.moulberry.notenoughupdates.core.ChromaColour; +import io.github.moulberry.notenoughupdates.core.GlScissorStack; +import io.github.moulberry.notenoughupdates.core.GuiElementBoolean; +import io.github.moulberry.notenoughupdates.core.GuiElementColour; +import io.github.moulberry.notenoughupdates.core.config.struct.ConfigProcessor; +import io.github.moulberry.notenoughupdates.core.util.render.RenderUtils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GlStateManager; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; + +import static io.github.moulberry.notenoughupdates.util.GuiTextures.*; + +public class GuiOptionEditorColour extends GuiOptionEditor { + + private String chromaColour; + private GuiElementColour colourElement = null; + + public GuiOptionEditorColour(ConfigProcessor.ProcessedOption option) { + super(option); + + this.chromaColour = (String)option.get(); + } + + @Override + public void render(int x, int y, int width) { + super.render(x, y, width); + int height = getHeight(); + + int argb = ChromaColour.specialToChromaRGB(chromaColour); + int r = (argb >> 16) & 0xFF; + int g = (argb >> 8) & 0xFF; + int b = argb & 0xFF; + GlStateManager.color(r/255f, g/255f, b/255f, 1); + Minecraft.getMinecraft().getTextureManager().bindTexture(button_white); + RenderUtils.drawTexturedRect(x+width/6-24, y+height-7-14, 48, 16); + + if(colourElement != null) { + GL11.glDisable(GL11.GL_SCISSOR_TEST); + colourElement.render(); + GL11.glEnable(GL11.GL_SCISSOR_TEST); + } + } + + @Override + public boolean mouseInputGlobal(int x, int y, int width, int mouseX, int mouseY) { + if(colourElement != null && colourElement.mouseInput(mouseX, mouseY)) { + return true; + } + return false; + } + + @Override + public boolean mouseInput(int x, int y, int width, int mouseX, int mouseY) { + int height = getHeight(); + + if(Mouse.getEventButtonState() && Mouse.getEventButton() == 0 && + mouseX > x+width/6-24 && mouseX < x+width/6+24 && + mouseY > y+height-7-14 && mouseY < y+height-7+2) { + colourElement = new GuiElementColour(mouseX, mouseY, (String) option.get(), (val) -> { + option.set(val); + chromaColour = val; + }, () -> colourElement = null); + } + + return false; + } + + @Override + public boolean keyboardInput() { + if(colourElement != null && colourElement.keyboardInput()) { + return true; + } + + return false; + } + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorDropdown.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorDropdown.java new file mode 100644 index 00000000..8b0d5eb3 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorDropdown.java @@ -0,0 +1,142 @@ +package io.github.moulberry.notenoughupdates.core.config.gui; + +import io.github.moulberry.notenoughupdates.core.config.struct.ConfigProcessor; +import io.github.moulberry.notenoughupdates.core.util.render.RenderUtils; +import io.github.moulberry.notenoughupdates.core.util.render.TextRenderUtils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.renderer.GlStateManager; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; + +public class GuiOptionEditorDropdown extends GuiOptionEditor { + + private final String[] values; + private final boolean useOrdinal; + private int selected; + private boolean open = false; + + public GuiOptionEditorDropdown(ConfigProcessor.ProcessedOption option, String[] values, int selected, boolean useOrdinal) { + super(option); + this.values = values; + this.selected = selected; + this.useOrdinal = useOrdinal; + } + + @Override + public void render(int x, int y, int width) { + super.render(x, y, width); + int height = getHeight(); + + FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; + int dropdownWidth = Math.min(width/3-10, 80); + int left = x+width/6-dropdownWidth/2; + int top = y+height-7-14; + + String selectedString = " - Select - "; + if(selected >= 0 && selected < values.length) { + selectedString = values[selected]; + } + + if(open) { + GL11.glDisable(GL11.GL_SCISSOR_TEST); + GlStateManager.translate(0, 0, 10); + + int dropdownHeight = 13 + 12*values.length; + + int main = 0xffc0c0c0; + int blue = 0xff3365bd; + Gui.drawRect(left, top, left+1, top+dropdownHeight, blue); //Left + Gui.drawRect(left+1, top, left+dropdownWidth, top+1, blue); //Top + Gui.drawRect(left+dropdownWidth-1, top+1, left+dropdownWidth, top+dropdownHeight, blue); //Right + Gui.drawRect(left+1, top+dropdownHeight-1, left+dropdownWidth-1, top+dropdownHeight, blue); //Bottom + Gui.drawRect(left+1, top+1, left+dropdownWidth-1, top+dropdownHeight-1, main); //Middle + + Gui.drawRect(left+1, top+14-1, left+dropdownWidth-1, top+14, blue); //Bar + + int dropdownY = 13; + for(String option : values) { + if(option.isEmpty()) { + option = "<NONE>"; + } + TextRenderUtils.drawStringScaledMaxWidth(option, fr, left+3, top+3+dropdownY, false, dropdownWidth-6, 0xff404040); + //fr.drawString(option, left+3, top+3+dropdownY, 0xff404040); + dropdownY += 12; + } + + TextRenderUtils.drawStringScaled("\u25B2", fr, left+dropdownWidth-10, y+height-7-15, false, 0xff404040, 2); + + + TextRenderUtils.drawStringScaledMaxWidth(selectedString, fr, left+3, top+3, false, + dropdownWidth-16, 0xff404040); + //fr.drawString(selectedString, left+3, top+3, 0xff404040); + + GlStateManager.translate(0, 0, -10); + GL11.glEnable(GL11.GL_SCISSOR_TEST); + } else { + RenderUtils.drawFloatingRectWithAlpha(left, top, dropdownWidth, 14, 0xff, false); + TextRenderUtils.drawStringScaled("\u25BC", fr, left+dropdownWidth-10, y+height-7-15, false, 0xff404040, 2); + + TextRenderUtils.drawStringScaledMaxWidth(selectedString, fr, left+3, top+3, false, + dropdownWidth-16, 0xff404040); + //fr.drawString(selectedString, left+3, top+3, 0xff404040); + } + } + + @Override + public boolean mouseInput(int x, int y, int width, int mouseX, int mouseY) { + int height = getHeight(); + + int left = x+width/6-40; + int top = y+height-7-14; + + if(Mouse.getEventButtonState() && Mouse.getEventButton() == 0) { + if(mouseX >= left && mouseX <= left+80 && + mouseY >= top && mouseY <= top+14) { + open = !open; + return true; + } + } + + return false; + } + + @Override + public boolean mouseInputGlobal(int x, int y, int width, int mouseX, int mouseY) { + int height = getHeight(); + + int left = x+width/6-40; + int top = y+height-7-14; + + if(Mouse.getEventButtonState() && Mouse.getEventButton() == 0) { + if(!(mouseX >= left && mouseX <= left+80 && + mouseY >= top && mouseY <= top+14) && open) { + open = false; + if(mouseX >= left && mouseX <= left+80) { + int dropdownY = 13; + for(int ordinal=0; ordinal < values.length; ordinal++) { + if(mouseY >= top+3+dropdownY && mouseY <= top+3+dropdownY+12) { + selected = ordinal; + if(useOrdinal) { + option.set(selected); + } else { + option.set(values[selected]); + } + return true; + } + dropdownY += 12; + } + } + return true; + } + } + + return false; + } + + @Override + public boolean keyboardInput() { + return false; + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorSlider.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorSlider.java new file mode 100644 index 00000000..a3665436 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorSlider.java @@ -0,0 +1,132 @@ +package io.github.moulberry.notenoughupdates.core.config.gui; + +import io.github.moulberry.notenoughupdates.core.GuiElementBoolean; +import io.github.moulberry.notenoughupdates.core.GuiElementTextField; +import io.github.moulberry.notenoughupdates.core.config.struct.ConfigProcessor; +import io.github.moulberry.notenoughupdates.core.util.GuiElementSlider; +import net.minecraft.client.Minecraft; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; + +public class GuiOptionEditorSlider extends GuiOptionEditor { + + private final GuiElementSlider slider; + private final GuiElementTextField textField; + + public GuiOptionEditorSlider(ConfigProcessor.ProcessedOption option, float minValue, float maxValue, float minStep) { + super(option); + if(minStep < 0) minStep = 0.01f; + + float floatVal = ((Number)option.get()).floatValue(); + { + String strVal; + if(floatVal % 1 == 0) { + strVal = Integer.toString((int)floatVal); + } else { + strVal = Float.toString(floatVal); + } + textField = new GuiElementTextField(strVal, + GuiElementTextField.NO_SPACE | GuiElementTextField.NUM_ONLY | GuiElementTextField.SCALE_TEXT); + } + + slider = new GuiElementSlider(0, 0, 80, minValue, maxValue, minStep, floatVal, (val) -> { + option.set(val); + + String strVal; + if(val % 1 == 0) { + strVal = Integer.toString(val.intValue()); + } else { + strVal = Float.toString(val); + strVal = strVal.replaceAll("(\\.\\d\\d\\d)(?:\\d)+", "$1"); + strVal = strVal.replaceAll("0+$", ""); + } + textField.setText(strVal); + }); + } + + @Override + public void render(int x, int y, int width) { + super.render(x, y, width); + int height = getHeight(); + + int fullWidth = Math.min(width/3-10, 80); + int sliderWidth = (fullWidth-5)*3/4; + int textFieldWidth = (fullWidth-5)/4; + + slider.x = x+width/6-fullWidth/2; + slider.y = y+height-7-14; + slider.width = sliderWidth; + slider.render(); + + if(textField.getFocus()) { + textField.setOptions(GuiElementTextField.NO_SPACE | GuiElementTextField.NUM_ONLY); + textField.setSize(Minecraft.getMinecraft().fontRendererObj.getStringWidth(textField.getText())+10, + 16); + } else { + textField.setSize(textFieldWidth, 16); + textField.setOptions(GuiElementTextField.NO_SPACE | GuiElementTextField.NUM_ONLY | GuiElementTextField.SCALE_TEXT); + } + + textField.render(x+width/6-fullWidth/2+sliderWidth+5, y+height-7-14); + } + + @Override + public boolean mouseInput(int x, int y, int width, int mouseX, int mouseY) { + int height = getHeight(); + + int fullWidth = Math.min(width/3-10, 80); + int sliderWidth = (fullWidth-5)*3/4; + int textFieldWidth = (fullWidth-5)/4; + + slider.x = x+width/6-fullWidth/2; + slider.y = y+height-7-14; + slider.width = sliderWidth; + if(slider.mouseInput(mouseX, mouseY)) { + textField.unfocus(); + return true; + } + + if(textField.getFocus()) { + textFieldWidth = Minecraft.getMinecraft().fontRendererObj.getStringWidth(textField.getText())+10; + } + + int textFieldX = x+width/6-fullWidth/2+sliderWidth+5; + int textFieldY = y+height-7-14; + textField.setSize(textFieldWidth, 16); + + if(Mouse.getEventButtonState() && (Mouse.getEventButton() == 0 || Mouse.getEventButton() == 1)) { + if(mouseX > textFieldX && mouseX < textFieldX+textFieldWidth && + mouseY > textFieldY && mouseY < textFieldY+16) { + textField.mouseClicked(mouseX, mouseY, Mouse.getEventButton()); + return true; + } + textField.unfocus(); + } + + return false; + } + + @Override + public boolean keyboardInput() { + if(Keyboard.getEventKeyState() && textField.getFocus()) { + textField.keyTyped(Keyboard.getEventCharacter(), Keyboard.getEventKey()); + + try { + textField.setCustomBorderColour(0xffffffff); + float f = Float.parseFloat(textField.getText()); + if(option.set(f)) { + slider.setValue(f); + } else { + textField.setCustomBorderColour(0xff0000ff); + } + } catch(Exception e) { + textField.setCustomBorderColour(0xffff0000); + } + + return true; + } + return false; + } + + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorText.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorText.java new file mode 100644 index 00000000..bf50bda8 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/gui/GuiOptionEditorText.java @@ -0,0 +1,84 @@ +package io.github.moulberry.notenoughupdates.core.config.gui; + +import io.github.moulberry.notenoughupdates.core.GuiElementBoolean; +import io.github.moulberry.notenoughupdates.core.GuiElementTextField; +import io.github.moulberry.notenoughupdates.core.config.struct.ConfigProcessor; +import io.github.moulberry.notenoughupdates.core.util.GuiElementSlider; +import net.minecraft.client.Minecraft; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; + +public class GuiOptionEditorText extends GuiOptionEditor { + + private final GuiElementTextField textField; + + public GuiOptionEditorText(ConfigProcessor.ProcessedOption option) { + super(option); + + textField = new GuiElementTextField((String)option.get(), 0); + } + + @Override + public void render(int x, int y, int width) { + super.render(x, y, width); + int height = getHeight(); + + int fullWidth = Math.min(width/3-10, 80); + + int textFieldX = x+width/6-fullWidth/2; + if(textField.getFocus()) { + fullWidth = Math.max(fullWidth, Minecraft.getMinecraft().fontRendererObj.getStringWidth(textField.getText())+10); + } + + textField.setSize(fullWidth, 16); + + textField.render(textFieldX, y+height-7-14); + } + + @Override + public boolean mouseInput(int x, int y, int width, int mouseX, int mouseY) { + int height = getHeight(); + + int fullWidth = Math.min(width/3-10, 80); + + int textFieldX = x+width/6-fullWidth/2; + + if(textField.getFocus()) { + fullWidth = Math.max(fullWidth, Minecraft.getMinecraft().fontRendererObj.getStringWidth(textField.getText())+10); + } + + int textFieldY = y+height-7-14; + textField.setSize(fullWidth, 16); + + if(Mouse.getEventButtonState() && (Mouse.getEventButton() == 0 || Mouse.getEventButton() == 1)) { + if(mouseX > textFieldX && mouseX < textFieldX+fullWidth && + mouseY > textFieldY && mouseY < textFieldY+16) { + textField.mouseClicked(mouseX, mouseY, Mouse.getEventButton()); + return true; + } + textField.unfocus(); + } + + return false; + } + + @Override + public boolean keyboardInput() { + if(Keyboard.getEventKeyState() && textField.getFocus()) { + Keyboard.enableRepeatEvents(true); + textField.keyTyped(Keyboard.getEventCharacter(), Keyboard.getEventKey()); + + try { + textField.setCustomBorderColour(0xffffffff); + option.set(textField.getText()); + } catch(Exception e) { + textField.setCustomBorderColour(0xffff0000); + } + + return true; + } + return false; + } + + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/config/struct/ConfigProcessor.java b/src/main/java/io/github/moulberry/notenoughupdates/core/config/struct/ConfigProcessor.java new file mode 100644 index 00000000..f91b8410 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/config/struct/ConfigProcessor.java @@ -0,0 +1,157 @@ +package io.github.moulberry.notenoughupdates.core.config.struct; + +import com.google.gson.annotations.Expose; +import io.github.moulberry.notenoughupdates.core.config.Config; +import io.github.moulberry.notenoughupdates.core.config.annotations.*; +import io.github.moulberry.notenoughupdates.core.config.gui.*; +import io.github.moulberry.notenoughupdates.core.config.Config; + +import java.lang.reflect.Field; +import java.util.LinkedHashMap; + +public class ConfigProcessor { + + public static class ProcessedCategory { + public final String name; + public final String desc; + public final LinkedHashMap<String, ProcessedOption> options = new LinkedHashMap<>(); + + public ProcessedCategory(String name, String desc) { + this.name = name; + this.desc = desc; + } + } + + public static class ProcessedOption { + public final String name; + public final String desc; + public final int subcategoryId; + public GuiOptionEditor editor; + + private final Field field; + private final Object container; + + public ProcessedOption(String name, String desc, int subcategoryId, Field field, Object container) { + this.name = name; + this.desc = desc; + this.subcategoryId = subcategoryId; + + this.field = field; + this.container = container; + } + + public Object get() { + try { + return field.get(container); + } catch(Exception e) { + return null; + } + } + + public boolean set(Object value) { + try { + if(field.getType() == int.class && value instanceof Number) { + field.set(container, ((Number)value).intValue()); + } else { + field.set(container, value); + } + return true; + } catch(Exception e) { + e.printStackTrace(); + return false; + } + } + } + + public static LinkedHashMap<String, ProcessedCategory> create(Config config) { + LinkedHashMap<String, ProcessedCategory> processedConfig = new LinkedHashMap<>(); + for(Field categoryField : config.getClass().getDeclaredFields()) { + boolean exposePresent = categoryField.isAnnotationPresent(Expose.class); + boolean categoryPresent = categoryField.isAnnotationPresent(Category.class); + + if(exposePresent && categoryPresent) { + Object categoryObj; + try { + categoryObj = categoryField.get(config); + } catch(Exception e) { + //System.err.printf("Failed to load config category %s. Field was not accessible.\n", categoryField.getName()); + continue; + } + + Category categoryAnnotation = categoryField.getAnnotation(Category.class); + ProcessedCategory cat = new ProcessedCategory( + categoryAnnotation.name(), + categoryAnnotation.desc() + ); + processedConfig.put(categoryField.getName(), cat); + + for(Field optionField : categoryObj.getClass().getDeclaredFields()) { + boolean optionExposePresent = optionField.isAnnotationPresent(Expose.class); + boolean optionPresent = optionField.isAnnotationPresent(ConfigOption.class); + + if(optionExposePresent && optionPresent) { + ConfigOption optionAnnotation = optionField.getAnnotation(ConfigOption.class); + ProcessedOption option = new ProcessedOption( + optionAnnotation.name(), + optionAnnotation.desc(), + optionAnnotation.subcategoryId(), + optionField, + categoryObj + ); + + GuiOptionEditor editor = null; + Class<?> optionType = optionField.getType(); + if(optionType.isAssignableFrom(boolean.class) && + optionField.isAnnotationPresent(ConfigEditorBoolean.class)) { + editor = new GuiOptionEditorBoolean(option); + } + if(optionType.isAssignableFrom(int.class)) { + if(optionField.isAnnotationPresent(ConfigEditorDropdown.class)) { + ConfigEditorDropdown configEditorAnnotation = optionField.getAnnotation(ConfigEditorDropdown.class); + editor = new GuiOptionEditorDropdown(option, configEditorAnnotation.values(), (int)option.get(), true); + } + } + if(optionType.isAssignableFrom(String.class)) { + if(optionField.isAnnotationPresent(ConfigEditorDropdown.class)) { + ConfigEditorDropdown configEditorAnnotation = optionField.getAnnotation(ConfigEditorDropdown.class); + editor = new GuiOptionEditorDropdown(option, configEditorAnnotation.values(), + configEditorAnnotation.initialIndex(), false); + } else if(optionField.isAnnotationPresent(ConfigEditorColour.class)) { + editor = new GuiOptionEditorColour(option); + } else if(optionField.isAnnotationPresent(ConfigEditorText.class)) { + editor = new GuiOptionEditorText(option); + } + } + if(optionType.isAssignableFrom(int.class) || + optionType.isAssignableFrom(float.class) || + optionType.isAssignableFrom(double.class)) { + if(optionField.isAnnotationPresent(ConfigEditorSlider.class)) { + ConfigEditorSlider configEditorAnnotation = optionField.getAnnotation(ConfigEditorSlider.class); + editor = new GuiOptionEditorSlider(option, configEditorAnnotation.minValue(), + configEditorAnnotation.maxValue(), configEditorAnnotation.minStep()); + } + } + if(optionType.isAssignableFrom(String.class)) { + if(optionField.isAnnotationPresent(ConfigEditorDropdown.class)) { + ConfigEditorDropdown configEditorAnnotation = optionField.getAnnotation(ConfigEditorDropdown.class); + editor = new GuiOptionEditorDropdown(option, configEditorAnnotation.values(), 0,false); + } + } + if(editor == null) { + //System.err.printf("Failed to load config option %s. Could not find suitable editor.\n", optionField.getName()); + continue; + } + option.editor = editor; + cat.options.put(optionField.getName(), option); + } else if(optionExposePresent || optionPresent) { + //System.err.printf("Failed to load config option %s. Both @Expose and @ConfigOption must be present.\n", optionField.getName()); + } + } + } else if(exposePresent || categoryPresent) { + //System.err.printf("Failed to load config category %s. Both @Expose and @Category must be present.\n", categoryField.getName()); + } + } + return processedConfig; + } + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/util/GuiElementSlider.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/GuiElementSlider.java new file mode 100644 index 00000000..4cffb479 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/GuiElementSlider.java @@ -0,0 +1,124 @@ +package io.github.moulberry.notenoughupdates.core.util; + +import io.github.moulberry.notenoughupdates.core.GuiElement; +import io.github.moulberry.notenoughupdates.util.Utils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.ScaledResolution; +import net.minecraft.client.renderer.GlStateManager; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; + +import java.util.function.Consumer; + +import static io.github.moulberry.notenoughupdates.util.GuiTextures.*; + +public class GuiElementSlider extends GuiElement { + + public int x; + public int y; + public int width; + private static final int HEIGHT = 16; + + private float minValue; + private float maxValue; + private float minStep; + + private float value; + private Consumer<Float> setCallback; + + private boolean clicked = false; + + public GuiElementSlider(int x, int y, int width, float minValue, float maxValue, float minStep, + float value, Consumer<Float> setCallback) { + if(minStep < 0) minStep = 0.01f; + + this.x = x; + this.y = y; + this.width = width; + this.minValue = minValue; + this.maxValue = maxValue; + this.minStep = minStep; + this.value = value; + this.setCallback = setCallback; + } + + public void setValue(float value) { + this.value = value; + } + + @Override + public void render() { + final ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); + int mouseX = Mouse.getX() * scaledResolution.getScaledWidth() / Minecraft.getMinecraft().displayWidth; + + float value = this.value; + if(clicked) { + value = (mouseX-x)*(maxValue-minValue)/width+minValue; + value = Math.max(minValue, Math.min(maxValue, value)); + value = Math.round(value/minStep)*minStep; + } + + float sliderAmount = Math.max(0, Math.min(1, (value-minValue)/(maxValue-minValue))); + int sliderAmountI = (int)(width*sliderAmount); + + GlStateManager.color(1f, 1f, 1f, 1f); + Minecraft.getMinecraft().getTextureManager().bindTexture(slider_on_cap); + Utils.drawTexturedRect(x, y, 4, HEIGHT, GL11.GL_NEAREST); + Minecraft.getMinecraft().getTextureManager().bindTexture(slider_off_cap); + Utils.drawTexturedRect(x+width-4, y, 4, HEIGHT, GL11.GL_NEAREST); + + if(sliderAmountI > 5) { + Minecraft.getMinecraft().getTextureManager().bindTexture(slider_on_segment); + Utils.drawTexturedRect(x+4, y, sliderAmountI-4, HEIGHT, GL11.GL_NEAREST); + } + + if(sliderAmountI < width-5) { + Minecraft.getMinecraft().getTextureManager().bindTexture(slider_off_segment); + Utils.drawTexturedRect(x+sliderAmountI, y, width-4-sliderAmountI, HEIGHT, GL11.GL_NEAREST); + } + + for(int i=1; i<4; i++) { + int notchX = x+width*i/4-1; + Minecraft.getMinecraft().getTextureManager().bindTexture(notchX > x+sliderAmountI ? slider_off_notch : slider_on_notch); + Utils.drawTexturedRect(notchX, y+(HEIGHT-4)/2, 2, 4, GL11.GL_NEAREST); + } + + Minecraft.getMinecraft().getTextureManager().bindTexture(slider_button); + Utils.drawTexturedRect(x+sliderAmountI-4, y, 8, HEIGHT, GL11.GL_NEAREST); + } + + @Override + public boolean mouseInput(int mouseX, int mouseY) { + if(!Mouse.isButtonDown(0)) { + clicked = false; + } + + if(Mouse.getEventButton() == 0) { + clicked = Mouse.getEventButtonState() && mouseX > x && mouseX < x+width && mouseY > y && mouseY < y+HEIGHT; + if(clicked) { + value = (mouseX-x)*(maxValue-minValue)/width+minValue; + value = Math.max(minValue, Math.min(maxValue, value)); + value = (float)(Math.round(value/minStep)*(double)minStep); + setCallback.accept(value); + return true; + } + } + + if(!Mouse.getEventButtonState() && Mouse.getEventButton() == -1 && clicked) { + value = (mouseX-x)*(maxValue-minValue)/width+minValue; + value = Math.max(minValue, Math.min(maxValue, value)); + value = Math.round(value/minStep)*minStep; + setCallback.accept(value); + return true; + } + + + return false; + } + + @Override + public boolean keyboardInput() { + return false; + } + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/util/MiscUtils.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/MiscUtils.java new file mode 100644 index 00000000..3e9fc4ca --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/MiscUtils.java @@ -0,0 +1,104 @@ +package io.github.moulberry.notenoughupdates.core.util; + +import net.minecraft.client.Minecraft; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.BufferUtils; +import org.lwjgl.input.Cursor; +import org.lwjgl.input.Mouse; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.datatransfer.StringSelection; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.IntBuffer; +import java.nio.file.Files; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +public class MiscUtils { + + public static void copyToClipboard(String str) { + Toolkit.getDefaultToolkit().getSystemClipboard() + .setContents(new StringSelection(str), null); + } + private static void unzip(InputStream src, File dest) { + //buffer for read and write data to file + byte[] buffer = new byte[1024]; + try { + ZipInputStream zis = new ZipInputStream(src); + ZipEntry ze = zis.getNextEntry(); + while(ze != null){ + if(!ze.isDirectory()) { + String fileName = ze.getName(); + File newFile = new File(dest, fileName); + //create directories for sub directories in zip + new File(newFile.getParent()).mkdirs(); + FileOutputStream fos = new FileOutputStream(newFile); + int len; + while ((len = zis.read(buffer)) > 0) { + fos.write(buffer, 0, len); + } + fos.close(); + } + //close this ZipEntry + zis.closeEntry(); + ze = zis.getNextEntry(); + } + //close last ZipEntry + zis.closeEntry(); + zis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void recursiveDelete(File file) { + if(file.isDirectory() && !Files.isSymbolicLink(file.toPath())) { + for(File child : file.listFiles()) { + recursiveDelete(child); + } + } + file.delete(); + } + + private static String currentCursor = null; + + public static void resetCursor() { + if(currentCursor == null) { + return; + } + currentCursor = null; + try { Mouse.setNativeCursor(null); } catch(Exception ignored) {} + } + + public static void setCursor(ResourceLocation loc, int hotspotX, int hotspotY) { + if(currentCursor != null && loc.getResourcePath().equals(currentCursor)) { + return; + } + currentCursor = loc.getResourcePath(); + try { + BufferedImage image = ImageIO.read(Minecraft.getMinecraft() + .getResourceManager().getResource(loc).getInputStream()); + int maxSize = Cursor.getMaxCursorSize(); + IntBuffer buffer = BufferUtils.createIntBuffer(maxSize*maxSize); + for(int i=0; i<maxSize*maxSize; i++) { + int cursorX = i%maxSize; + int cursorY = i/maxSize; + if(cursorX >= image.getWidth() || cursorY >= image.getHeight()) { + buffer.put(0x00000000); + } else { + buffer.put(image.getRGB(cursorX, image.getHeight()-1-cursorY)); + } + } + buffer.flip(); + Mouse.setNativeCursor(new Cursor(maxSize, maxSize, hotspotX, hotspotY, 1, + buffer, null)); + } catch(Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/util/Splitters.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/Splitters.java new file mode 100644 index 00000000..555e0d79 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/Splitters.java @@ -0,0 +1,10 @@ +package io.github.moulberry.notenoughupdates.core.util; + +import com.google.common.base.Splitter; + +public class Splitters { + + public static final Splitter NEWLINE_SPLITTER = Splitter.on('\n'); + + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/util/StringUtils.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/StringUtils.java new file mode 100644 index 00000000..a3d8204a --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/StringUtils.java @@ -0,0 +1,39 @@ +package io.github.moulberry.notenoughupdates.core.util; + +import com.google.common.collect.Sets; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; + +import java.util.Set; + +public class StringUtils { + + public static final Set<String> PROTOCOLS = Sets.newHashSet("http", "https"); + + public static String cleanColour(String in) { + return in.replaceAll("(?i)\\u00A7.", ""); + } + + public static String cleanColourNotModifiers(String in) { + return in.replaceAll("(?i)\\u00A7[0-9a-f]", "\u00A7r"); + } + + public static String trimToWidth(String str, int len) { + FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; + String trim = fr.trimStringToWidth(str, len); + + if(str.length() != trim.length() && !trim.endsWith(" ")) { + char next = str.charAt(trim.length()); + if(next != ' ') { + String[] split = trim.split(" "); + String last = split[split.length-1]; + if(last.length() < 8) { + trim = trim.substring(0, trim.length()-last.length()); + } + } + } + + return trim; + } + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/util/lerp/LerpUtils.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/lerp/LerpUtils.java new file mode 100644 index 00000000..b7e05009 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/lerp/LerpUtils.java @@ -0,0 +1,22 @@ +package io.github.moulberry.notenoughupdates.core.util.lerp; + +public class LerpUtils { + + public static float clampZeroOne(float f) { + return Math.max(0, Math.min(1, f)); + } + + public static float sigmoid(float val) { + return (float)(1/(1 + Math.exp(-val))); + } + + private static final float sigmoidStr = 8; + private static final float sigmoidA = -1/(sigmoid(-0.5f * sigmoidStr) - sigmoid(0.5f * sigmoidStr)); + private static final float sigmoidB = sigmoidA*sigmoid(-0.5f * sigmoidStr); + public static float sigmoidZeroOne(float f) { + f = clampZeroOne(f); + return sigmoidA*sigmoid(sigmoidStr*(f-0.5f))-sigmoidB; + } + + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/util/lerp/LerpingFloat.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/lerp/LerpingFloat.java new file mode 100644 index 00000000..250facfc --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/lerp/LerpingFloat.java @@ -0,0 +1,68 @@ +package io.github.moulberry.notenoughupdates.core.util.lerp; + +public class LerpingFloat { + + private int timeSpent; + private long lastMillis; + private int timeToReachTarget; + + private float targetValue; + private float lerpValue; + + public LerpingFloat(float initialValue, int timeToReachTarget) { + this.targetValue = this.lerpValue = initialValue; + this.timeToReachTarget = timeToReachTarget; + } + + public LerpingFloat(int initialValue) { + this(initialValue, 200); + } + + public void tick() { + int lastTimeSpent = timeSpent; + this.timeSpent += System.currentTimeMillis() - lastMillis; + + float lastDistPercentToTarget = lastTimeSpent/(float)timeToReachTarget; + float distPercentToTarget = timeSpent/(float)timeToReachTarget; + float fac = (1-lastDistPercentToTarget)/lastDistPercentToTarget; + + float startValue = lerpValue - (targetValue - lerpValue)/fac; + + float dist = targetValue - startValue; + if(dist == 0) return; + + float oldLerpValue = lerpValue; + if(distPercentToTarget >= 1) { + lerpValue = targetValue; + } else { + lerpValue = startValue + dist*distPercentToTarget; + } + + if(lerpValue == oldLerpValue) { + timeSpent = lastTimeSpent; + } else { + this.lastMillis = System.currentTimeMillis(); + } + } + + public void resetTimer() { + this.timeSpent = 0; + this.lastMillis = System.currentTimeMillis(); + } + + public void setTarget(float targetValue) { + this.targetValue = targetValue; + } + + public void setValue(float value) { + this.targetValue = this.lerpValue = value; + } + + public float getValue() { + return lerpValue; + } + + public float getTarget() { + return targetValue; + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/util/LerpingInteger.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/lerp/LerpingInteger.java index 93c011e1..cdc2c4fd 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/LerpingInteger.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/lerp/LerpingInteger.java @@ -1,4 +1,4 @@ -package io.github.moulberry.notenoughupdates.util; +package io.github.moulberry.notenoughupdates.core.util.lerp; public class LerpingInteger { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/util/render/RenderUtils.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/render/RenderUtils.java new file mode 100644 index 00000000..0cc34fa4 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/render/RenderUtils.java @@ -0,0 +1,144 @@ +package io.github.moulberry.notenoughupdates.core.util.render; + +import io.github.moulberry.notenoughupdates.core.BackgroundBlur; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.ScaledResolution; +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.vertex.DefaultVertexFormats; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL14; + +public class RenderUtils { + + public static void drawFloatingRectDark(int x, int y, int width, int height) { + drawFloatingRectDark(x, y, width, height, true); + } + + public static void drawFloatingRectDark(int x, int y, int width, int height, boolean shadow) { + int alpha = 0xf0000000; + + if(OpenGlHelper.isFramebufferEnabled()) { + ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); + BackgroundBlur.renderBlurredBackground(scaledResolution.getScaledWidth(), + scaledResolution.getScaledHeight(), x, y, width, height); + } else { + alpha = 0xff000000; + } + + int main = alpha | 0x202026; + int light = 0xff303036; + int dark = 0xff101016; + Gui.drawRect(x, y, x+1, y+height, light); //Left + Gui.drawRect(x+1, y, x+width, y+1, light); //Top + Gui.drawRect(x+width-1, y+1, x+width, y+height, dark); //Right + Gui.drawRect(x+1, y+height-1, x+width-1, y+height, dark); //Bottom + Gui.drawRect(x+1, y+1, x+width-1, y+height-1, main); //Middle + if(shadow) { + Gui.drawRect(x+width, y+2, x+width+2, y+height+2, 0x70000000); //Right shadow + Gui.drawRect(x+2, y+height, x+width, y+height+2, 0x70000000); //Bottom shadow + } + } + + public static void drawFloatingRect(int x, int y, int width, int height) { + drawFloatingRectWithAlpha(x, y, width, height, 0xFF, true); + } + + public static void drawFloatingRectWithAlpha(int x, int y, int width, int height, int alpha, boolean shadow) { + int main = (alpha << 24) | 0xc0c0c0; + int light = (alpha << 24) | 0xf0f0f0; + int dark = (alpha << 24) | 0x909090; + Gui.drawRect(x, y, x+1, y+height, light); //Left + Gui.drawRect(x+1, y, x+width, y+1, light); //Top + Gui.drawRect(x+width-1, y+1, x+width, y+height, dark); //Right + Gui.drawRect(x+1, y+height-1, x+width-1, y+height, dark); //Bottom + Gui.drawRect(x+1, y+1, x+width-1, y+height-1, main); //Middle + if(shadow) { + Gui.drawRect(x+width, y+2, x+width+2, y+height+2, (alpha*3/5) << 24); //Right shadow + Gui.drawRect(x+2, y+height, x+width, y+height+2, (alpha*3/5) << 24); //Bottom shadow + } + } + + public static void drawTexturedRect(float x, float y, float width, float height) { + drawTexturedRect(x, y, width, height, 0, 1, 0 , 1); + } + + public static void drawTexturedRect(float x, float y, float width, float height, int filter) { + drawTexturedRect(x, y, width, height, 0, 1, 0 , 1, filter); + } + + public static void drawTexturedRect(float x, float y, float width, float height, float uMin, float uMax, float vMin, float vMax) { + drawTexturedRect(x, y, width, height, uMin, uMax, vMin , vMax, GL11.GL_NEAREST); + } + + public static void drawTexturedRect(float x, float y, float width, float height, float uMin, float uMax, float vMin, float vMax, int filter) { + GlStateManager.enableBlend(); + GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); + + drawTexturedRectNoBlend(x, y, width, height, uMin, uMax, vMin, vMax, filter); + + GlStateManager.disableBlend(); + } + + public static void drawTexturedRectNoBlend(float x, float y, float width, float height, float uMin, float uMax, float vMin, float vMax, int filter) { + GlStateManager.enableTexture2D(); + + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, filter); + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, filter); + + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer worldrenderer = tessellator.getWorldRenderer(); + worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX); + worldrenderer + .pos(x, y+height, 0.0D) + .tex(uMin, vMax).endVertex(); + worldrenderer + .pos(x+width, y+height, 0.0D) + .tex(uMax, vMax).endVertex(); + worldrenderer + .pos(x+width, y, 0.0D) + .tex(uMax, vMin).endVertex(); + worldrenderer + .pos(x, y, 0.0D) + .tex(uMin, vMin).endVertex(); + tessellator.draw(); + + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST); + GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); + } + + public static void drawGradientRect(int zLevel, int left, int top, int right, int bottom, int startColor, int endColor) { + float startAlpha = (float)(startColor >> 24 & 255) / 255.0F; + float startRed = (float)(startColor >> 16 & 255) / 255.0F; + float startGreen = (float)(startColor >> 8 & 255) / 255.0F; + float startBlue = (float)(startColor & 255) / 255.0F; + float endAlpha = (float)(endColor >> 24 & 255) / 255.0F; + float endRed = (float)(endColor >> 16 & 255) / 255.0F; + float endGreen = (float)(endColor >> 8 & 255) / 255.0F; + float endBlue = (float)(endColor & 255) / 255.0F; + + GlStateManager.disableTexture2D(); + GlStateManager.enableBlend(); + GlStateManager.disableAlpha(); + GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0); + GlStateManager.shadeModel(7425); + + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer worldrenderer = tessellator.getWorldRenderer(); + worldrenderer.begin(7, DefaultVertexFormats.POSITION_COLOR); + worldrenderer.pos(right, top, zLevel).color(startRed, startGreen, startBlue, startAlpha).endVertex(); + worldrenderer.pos(left, top, zLevel).color(startRed, startGreen, startBlue, startAlpha).endVertex(); + worldrenderer.pos(left, bottom, zLevel).color(endRed, endGreen, endBlue, endAlpha).endVertex(); + worldrenderer.pos(right, bottom, zLevel).color(endRed, endGreen, endBlue, endAlpha).endVertex(); + tessellator.draw(); + + GlStateManager.shadeModel(7424); + GlStateManager.disableBlend(); + GlStateManager.enableAlpha(); + GlStateManager.enableTexture2D(); + } + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/core/util/render/TextRenderUtils.java b/src/main/java/io/github/moulberry/notenoughupdates/core/util/render/TextRenderUtils.java new file mode 100644 index 00000000..541fd67a --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/core/util/render/TextRenderUtils.java @@ -0,0 +1,215 @@ +package io.github.moulberry.notenoughupdates.core.util.render; + +import io.github.moulberry.notenoughupdates.core.util.StringUtils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import org.lwjgl.opengl.GL11; + +import java.util.ArrayList; +import java.util.List; + +public class TextRenderUtils { + + public static int getCharVertLen(char c) { + if("acegmnopqrsuvwxyz".indexOf(c) >= 0) { + return 5; + } else { + return 7; + } + } + + public static float getVerticalHeight(String str) { + str = StringUtils.cleanColour(str); + float height = 0; + for(int i=0; i<str.length(); i++) { + char c = str.charAt(i); + int charHeight = getCharVertLen(c); + height += charHeight + 1.5f; + } + return height; + } + + public static void drawStringVertical(String str, FontRenderer fr, float x, float y, boolean shadow, int colour) { + String format = FontRenderer.getFormatFromString(str); + str = StringUtils.cleanColour(str); + for(int i=0; i<str.length(); i++) { + char c = str.charAt(i); + + int charHeight = getCharVertLen(c); + int charWidth = fr.getCharWidth(c); + fr.drawString(format+c, x+(5-charWidth)/2f, y-7+charHeight, colour, shadow); + + y += charHeight + 1.5f; + } + } + + public static void drawStringScaledMaxWidth(String str, FontRenderer fr, float x, float y, boolean shadow, int len, int colour) { + int strLen = fr.getStringWidth(str); + float factor = len/(float)strLen; + factor = Math.min(1, factor); + + drawStringScaled(str, fr, x, y, shadow, colour, factor); + } + + public static void drawStringCentered(String str, FontRenderer fr, float x, float y, boolean shadow, int colour) { + int strLen = fr.getStringWidth(str); + + float x2 = x - strLen/2f; + float y2 = y - fr.FONT_HEIGHT/2f; + + GL11.glTranslatef(x2, y2, 0); + fr.drawString(str, 0, 0, colour, shadow); + GL11.glTranslatef(-x2, -y2, 0); + } + + public static void drawStringScaled(String str, FontRenderer fr, float x, float y, boolean shadow, int colour, float factor) { + GlStateManager.scale(factor, factor, 1); + fr.drawString(str, x/factor, y/factor, colour, shadow); + GlStateManager.scale(1/factor, 1/factor, 1); + } + + public static void drawStringCenteredScaledMaxWidth(String str, FontRenderer fr, float x, float y, boolean shadow, int len, int colour) { + int strLen = fr.getStringWidth(str); + float factor = len/(float)strLen; + factor = Math.min(1, factor); + int newLen = Math.min(strLen, len); + + float fontHeight = 8*factor; + + drawStringScaled(str, fr, x-newLen/2, y-fontHeight/2, shadow, colour, factor); + } + + public static void renderToolTip(ItemStack stack, int mouseX, int mouseY, int screenWidth, int screenHeight, FontRenderer fontStd) { + List<String> list = stack.getTooltip(Minecraft.getMinecraft().thePlayer, + Minecraft.getMinecraft().gameSettings.advancedItemTooltips); + + for (int i = 0; i < list.size(); ++i) { + if (i == 0) { + list.set(i, stack.getRarity().rarityColor + list.get(i)); + } else { + list.set(i, EnumChatFormatting.GRAY + list.get(i)); + } + } + + FontRenderer font = stack.getItem().getFontRenderer(stack); + drawHoveringText(list, mouseX, mouseY, screenWidth, screenHeight, -1, font == null ? fontStd : font); + } + + public static void drawHoveringText(List<String> textLines, final int mouseX, final int mouseY, final int screenWidth, final int screenHeight, final int maxTextWidth, FontRenderer font) { + if (!textLines.isEmpty()) { + GlStateManager.disableRescaleNormal(); + RenderHelper.disableStandardItemLighting(); + GlStateManager.disableLighting(); + GlStateManager.disableDepth(); + int tooltipTextWidth = 0; + + for (String textLine : textLines) { + int textLineWidth = font.getStringWidth(textLine); + + if (textLineWidth > tooltipTextWidth) { + tooltipTextWidth = textLineWidth; + } + } + + boolean needsWrap = false; + + int titleLinesCount = 1; + int tooltipX = mouseX + 12; + if (tooltipX + tooltipTextWidth + 4 > screenWidth) { + tooltipX = mouseX - 16 - tooltipTextWidth; + if (tooltipX < 4) // if the tooltip doesn't fit on the screen + { + if (mouseX > screenWidth / 2) { + tooltipTextWidth = mouseX - 12 - 8; + } else { + tooltipTextWidth = screenWidth - 16 - mouseX; + } + needsWrap = true; + } + } + + if (maxTextWidth > 0 && tooltipTextWidth > maxTextWidth) { + tooltipTextWidth = maxTextWidth; + needsWrap = true; + } + + if (needsWrap) { + int wrappedTooltipWidth = 0; + List<String> wrappedTextLines = new ArrayList<String>(); + for (int i = 0; i < textLines.size(); i++) { + String textLine = textLines.get(i); + List<String> wrappedLine = font.listFormattedStringToWidth(textLine, tooltipTextWidth); + if (i == 0) { + titleLinesCount = wrappedLine.size(); + } + + for (String line : wrappedLine) { + int lineWidth = font.getStringWidth(line); + if (lineWidth > wrappedTooltipWidth) { + wrappedTooltipWidth = lineWidth; + } + wrappedTextLines.add(line); + } + } + tooltipTextWidth = wrappedTooltipWidth; + textLines = wrappedTextLines; + + if (mouseX > screenWidth / 2) { + tooltipX = mouseX - 16 - tooltipTextWidth; + } else { + tooltipX = mouseX + 12; + } + } + + int tooltipY = mouseY - 12; + int tooltipHeight = 8; + + if (textLines.size() > 1) { + tooltipHeight += (textLines.size() - 1) * 10; + if (textLines.size() > titleLinesCount) { + tooltipHeight += 2; // gap between title lines and next lines + } + } + + if (tooltipY + tooltipHeight + 6 > screenHeight) { + tooltipY = screenHeight - tooltipHeight - 6; + } + + final int zLevel = 300; + final int backgroundColor = 0xF0100010; + RenderUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY - 4, tooltipX + tooltipTextWidth + 3, tooltipY - 3, backgroundColor, backgroundColor); + RenderUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY + tooltipHeight + 3, tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 4, backgroundColor, backgroundColor); + RenderUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3, backgroundColor, backgroundColor); + RenderUtils.drawGradientRect(zLevel, tooltipX - 4, tooltipY - 3, tooltipX - 3, tooltipY + tooltipHeight + 3, backgroundColor, backgroundColor); + RenderUtils.drawGradientRect(zLevel, tooltipX + tooltipTextWidth + 3, tooltipY - 3, tooltipX + tooltipTextWidth + 4, tooltipY + tooltipHeight + 3, backgroundColor, backgroundColor); + final int borderColorStart = 0x505000FF; + final int borderColorEnd = (borderColorStart & 0xFEFEFE) >> 1 | borderColorStart & 0xFF000000; + RenderUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY - 3 + 1, tooltipX - 3 + 1, tooltipY + tooltipHeight + 3 - 1, borderColorStart, borderColorEnd); + RenderUtils.drawGradientRect(zLevel, tooltipX + tooltipTextWidth + 2, tooltipY - 3 + 1, tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3 - 1, borderColorStart, borderColorEnd); + RenderUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, tooltipY - 3 + 1, borderColorStart, borderColorStart); + RenderUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY + tooltipHeight + 2, tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3, borderColorEnd, borderColorEnd); + + for (int lineNumber = 0; lineNumber < textLines.size(); ++lineNumber) { + String line = textLines.get(lineNumber); + font.drawStringWithShadow(line, (float) tooltipX, (float) tooltipY, -1); + + if (lineNumber + 1 == titleLinesCount) { + tooltipY += 2; + } + + tooltipY += 10; + } + + GlStateManager.enableLighting(); + GlStateManager.enableDepth(); + RenderHelper.enableStandardItemLighting(); + GlStateManager.enableRescaleNormal(); + } + GlStateManager.disableLighting(); + } + +} 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 76885703..6f2ab3f1 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/CapeManager.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/CapeManager.java @@ -1,14 +1,22 @@ package io.github.moulberry.notenoughupdates.cosmetics; +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import com.google.common.collect.Maps; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.NEUManager; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.util.HypixelApi; import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.EntityPlayerSP; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.shader.Framebuffer; import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.client.event.RenderPlayerEvent; +import net.minecraftforge.client.event.RenderWorldEvent; +import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; import org.apache.commons.lang3.ArrayUtils; @@ -36,8 +44,8 @@ public class CapeManager { private HashSet<String> availableCapes = new HashSet<>(); private String[] capes = new String[]{"patreon1", "patreon2", "fade", "contrib", "nullzee", - "gravy", "space", "mcworld", "lava", "packshq", "mbstaff", "thebakery", "negative" }; - public Boolean[] specialCapes = new Boolean[]{ true, true, false, true, true, true, false, false, false, true, true, true, false }; + "gravy", "space", "mcworld", "lava", "packshq", "mbstaff", "thebakery", "negative", "void" }; + public Boolean[] specialCapes = new Boolean[]{ true, true, false, true, true, true, false, false, false, true, true, true, false, false }; public static CapeManager getInstance() { return INSTANCE; @@ -109,8 +117,7 @@ public class CapeManager { updateConfig = updateConfig && playerUUID.equals(Minecraft.getMinecraft().thePlayer.getUniqueID().toString().replace("-", "")); if(updateConfig) { - NotEnoughUpdates.INSTANCE.manager.config.selectedCape.value = String.valueOf(capename); - try { NotEnoughUpdates.INSTANCE.manager.saveConfig(); } catch(IOException ignored) {} + NotEnoughUpdates.INSTANCE.config.hidden.selectedCape = String.valueOf(capename); } if(updateConfig) { @@ -138,13 +145,14 @@ public class CapeManager { return null; } + private static BiMap<String, EntityPlayer> playerMap = null; + public EntityPlayer getPlayerForUUID(String uuid) { - if(Minecraft.getMinecraft().theWorld != null) { - for(EntityPlayer player : Minecraft.getMinecraft().theWorld.playerEntities) { - if(player.getUniqueID().toString().replace("-", "").equals(uuid)) { - return player; - } - } + if(playerMap == null) { + return null; + } + if(playerMap.containsKey(uuid)) { + return playerMap.get(uuid); } return null; } @@ -161,21 +169,26 @@ public class CapeManager { return framebuffer; } + public boolean updateWorldFramebuffer = false; public Framebuffer backgroundFramebuffer = null; - @SubscribeEvent - public void onRenderPlayer(RenderPlayerEvent.Pre e) { + + public void postRenderBlocks() { int width = Minecraft.getMinecraft().displayWidth; int height = Minecraft.getMinecraft().displayHeight; backgroundFramebuffer = checkFramebufferSizes(backgroundFramebuffer, width, height); - GL30.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, Minecraft.getMinecraft().getFramebuffer().framebufferObject); - GL30.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, backgroundFramebuffer.framebufferObject); - GL30.glBlitFramebuffer(0, 0, width, height, - 0, 0, width, height, - GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST); + if(OpenGlHelper.isFramebufferEnabled() && updateWorldFramebuffer) { + GL30.glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, Minecraft.getMinecraft().getFramebuffer().framebufferObject); + GL30.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, backgroundFramebuffer.framebufferObject); + GL30.glBlitFramebuffer(0, 0, width, height, + 0, 0, width, height, + GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST); + + Minecraft.getMinecraft().getFramebuffer().bindFramebuffer(true); + } - Minecraft.getMinecraft().getFramebuffer().bindFramebuffer(true); + updateWorldFramebuffer = false; } @SubscribeEvent @@ -186,7 +199,7 @@ public class CapeManager { String clientUuid = Minecraft.getMinecraft().thePlayer.getUniqueID().toString().replace("-", ""); if(Minecraft.getMinecraft().thePlayer != null && uuid.equals(clientUuid)) { - String selCape = NotEnoughUpdates.INSTANCE.manager.config.selectedCape.value; + String selCape = NotEnoughUpdates.INSTANCE.config.hidden.selectedCape; if(selCape != null && !selCape.isEmpty()) { if(localCape == null) { localCape = new MutablePair<>(new NEUCape(selCape), selCape); @@ -205,20 +218,41 @@ public class CapeManager { @SubscribeEvent public void onTick(TickEvent.ClientTickEvent event) { if (event.phase != TickEvent.Phase.END) return; + if(Minecraft.getMinecraft().theWorld == null) return; String clientUuid = null; if(Minecraft.getMinecraft().thePlayer != null) { clientUuid = Minecraft.getMinecraft().thePlayer.getUniqueID().toString().replace("-", ""); } + if(playerMap == null) { + playerMap = HashBiMap.create(Minecraft.getMinecraft().theWorld.playerEntities.size()); + } + HashSet<String> contains = new HashSet<>(); + for(EntityPlayer player : Minecraft.getMinecraft().theWorld.playerEntities) { + String uuid = player.getUniqueID().toString().replace("-", ""); + contains.add(uuid); + if(!playerMap.containsValue(player)) { + playerMap.put(uuid, player); + } + } + playerMap.keySet().retainAll(contains); + + boolean hasLocalCape = localCape != null && localCape.getRight() != null && !localCape.getRight().equals("null"); + Set<String> toRemove = new HashSet<>(); try { for(String playerUUID : capeMap.keySet()) { - EntityPlayer player = getPlayerForUUID(playerUUID); + EntityPlayer player; + if(playerUUID.equals(clientUuid)) { + player = Minecraft.getMinecraft().thePlayer; + } else { + player = getPlayerForUUID(playerUUID); + } if(player != null) { String capeName = capeMap.get(playerUUID).getRight(); if(capeName != null && !capeName.equals("null")) { - if(playerUUID.equals(clientUuid) && localCape != null && localCape.getRight() != null && !localCape.getRight().equals("null")) { + if(player == Minecraft.getMinecraft().thePlayer && hasLocalCape) { continue; } capeMap.get(playerUUID).getLeft().setCapeTexture(capeName); @@ -230,7 +264,7 @@ public class CapeManager { } } catch(Exception e) {} - if(localCape != null) { + if(hasLocalCape) { localCape.getLeft().setCapeTexture(localCape.getValue()); localCape.getLeft().onTick(event, Minecraft.getMinecraft().thePlayer); } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/NEUCape.java b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/NEUCape.java index 9de2731c..d93b8bb0 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/NEUCape.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/cosmetics/NEUCape.java @@ -88,6 +88,8 @@ public class NEUCape { shaderName = "biscuit_cape"; } else if(capeName.equalsIgnoreCase("negative")) { shaderName = "negative"; + } else if(capeName.equalsIgnoreCase("void")) { + shaderName = "void"; } else { shaderName = "shiny_cape"; } @@ -119,7 +121,10 @@ public class NEUCape { private void bindTexture() { if(capeName.equalsIgnoreCase("negative")) { - CapeManager.getInstance().backgroundFramebuffer.bindFramebufferTexture(); + CapeManager.getInstance().updateWorldFramebuffer = true; + if(CapeManager.getInstance().backgroundFramebuffer != null) { + CapeManager.getInstance().backgroundFramebuffer.bindFramebufferTexture(); + } } else if(capeTextures != null && capeTextures.length>0) { long currentTime = System.currentTimeMillis(); if(currentTime - lastFrameUpdate > 100) { @@ -325,6 +330,12 @@ public class NEUCape { Minecraft.getMinecraft().displayWidth, Minecraft.getMinecraft().displayHeight )); + } else if(shaderName.equalsIgnoreCase("void")) { + shaderManager.loadData(shaderName, "millis", (int) (System.currentTimeMillis() - startTime)); + shaderManager.loadData(shaderName, "screensize", new Vector2f( + Minecraft.getMinecraft().displayWidth, + Minecraft.getMinecraft().displayHeight + )); } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonBlocks.java b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonBlocks.java index fb9de198..6fd3db78 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonBlocks.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonBlocks.java @@ -1,7 +1,7 @@ package io.github.moulberry.notenoughupdates.dungeons; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; -import io.github.moulberry.notenoughupdates.questing.SBInfo; +import io.github.moulberry.notenoughupdates.util.SBInfo; import io.github.moulberry.notenoughupdates.util.SpecialColour; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; @@ -9,17 +9,12 @@ import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.texture.*; -import net.minecraft.client.resources.IResourceManager; -import net.minecraft.client.resources.IResourceManagerReloadListener; import net.minecraft.client.shader.Framebuffer; import net.minecraft.util.ResourceLocation; import org.lwjgl.BufferUtils; -import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.*; -import java.awt.*; import java.nio.FloatBuffer; -import java.nio.IntBuffer; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -47,8 +42,8 @@ public class DungeonBlocks { } public static boolean isOverriding() { - return OpenGlHelper.isFramebufferEnabled() && !NotEnoughUpdates.INSTANCE.manager.config.disableDungeonBlocks.value && - (NotEnoughUpdates.INSTANCE.manager.config.dungeonBlocksEverywhere.value || + return OpenGlHelper.isFramebufferEnabled() && NotEnoughUpdates.INSTANCE.config.dungeonBlock.enableDungBlockOverlay && + (NotEnoughUpdates.INSTANCE.config.dungeonBlock.dungeonBlocksEverywhere || (SBInfo.getInstance().getLocation() != null && SBInfo.getInstance().getLocation().equals("dungeon"))); } @@ -146,15 +141,15 @@ public class DungeonBlocks { static { dynamicPreloadMap.put(new ResourceLocation("textures/entity/bat.png"), - NotEnoughUpdates.INSTANCE.manager.config.dungBatColour.value); + NotEnoughUpdates.INSTANCE.config.dungeonBlock.dungBatColour); dynamicPreloadMap.put(new ResourceLocation("textures/entity/chest/normal.png"), - NotEnoughUpdates.INSTANCE.manager.config.dungChestColour.value); + NotEnoughUpdates.INSTANCE.config.dungeonBlock.dungChestColour); dynamicPreloadMap.put(new ResourceLocation("textures/entity/chest/normal_double.png"), - NotEnoughUpdates.INSTANCE.manager.config.dungChestColour.value); + NotEnoughUpdates.INSTANCE.config.dungeonBlock.dungChestColour); dynamicPreloadMap.put(new ResourceLocation("textures/entity/chest/trapped.png"), - NotEnoughUpdates.INSTANCE.manager.config.dungTrappedChestColour.value); + NotEnoughUpdates.INSTANCE.config.dungeonBlock.dungTrappedChestColour); dynamicPreloadMap.put(new ResourceLocation("textures/entity/chest/trapped_double.png"), - NotEnoughUpdates.INSTANCE.manager.config.dungTrappedChestColour.value); + NotEnoughUpdates.INSTANCE.config.dungeonBlock.dungTrappedChestColour); } public static void tick() { @@ -197,13 +192,13 @@ public class DungeonBlocks { HashMap<TextureAtlasSprite, Integer> spriteMap = new HashMap<>(); spriteMap.put(Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite("minecraft:blocks/stonebrick_cracked"), - SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.manager.config.dungCrackedColour.value)); + SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.config.dungeonBlock.dungCrackedColour)); spriteMap.put(Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite("minecraft:blocks/dispenser_front_horizontal"), - SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.manager.config.dungDispenserColour.value)); + SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.config.dungeonBlock.dungDispenserColour)); spriteMap.put(Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite("minecraft:blocks/lever"), - SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.manager.config.dungLeverColour.value)); + SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.config.dungeonBlock.dungLeverColour)); spriteMap.put(Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite("minecraft:blocks/trip_wire"), - SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.manager.config.dungTripWireColour.value)); + SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.config.dungeonBlock.dungTripWireColour)); for(Map.Entry<TextureAtlasSprite, Integer> entry : spriteMap.entrySet()) { if(((entry.getValue() >> 24) & 0xFF) < 10) continue; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonMap.java b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonMap.java index 4a209cd9..bbb5fd31 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonMap.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonMap.java @@ -1,30 +1,23 @@ package io.github.moulberry.notenoughupdates.dungeons; import com.google.common.collect.Iterables; -import com.google.common.math.BigIntegerMath; import com.google.gson.JsonObject; -import io.github.moulberry.notenoughupdates.NEUResourceManager; +import io.github.moulberry.notenoughupdates.util.NEUResourceManager; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; -import io.github.moulberry.notenoughupdates.questing.SBInfo; import io.github.moulberry.notenoughupdates.util.SpecialColour; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.block.material.MapColor; -import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.AbstractClientPlayer; import net.minecraft.client.gui.Gui; -import net.minecraft.client.gui.MapItemRenderer; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.renderer.*; -import net.minecraft.client.renderer.entity.RenderItem; -import net.minecraft.client.renderer.texture.DynamicTexture; import net.minecraft.client.renderer.texture.TextureUtil; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.resources.DefaultPlayerSkin; import net.minecraft.client.shader.Framebuffer; import net.minecraft.client.shader.Shader; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemMap; import net.minecraft.item.ItemStack; @@ -35,19 +28,12 @@ import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import org.lwjgl.BufferUtils; -import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL14; -import org.lwjgl.opengl.GL30; -import org.lwjgl.opengl.GL45; import java.awt.*; -import java.awt.image.BufferedImage; import java.io.BufferedReader; import java.io.InputStreamReader; -import java.nio.ByteBuffer; -import java.nio.IntBuffer; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.List; @@ -198,7 +184,7 @@ public class DungeonMap { float x = 0; float y = 0; - if(NotEnoughUpdates.INSTANCE.manager.config.dmCenterCheck.value) { + if(NotEnoughUpdates.INSTANCE.config.dungeonMap.dmCenterCheck) { if(fillCorner) { x += -(roomSize+connectorSize)/2f*Math.cos(Math.toRadians(rotation-45))*1.414f; y += (roomSize+connectorSize)/2f*Math.sin(Math.toRadians(rotation-45))*1.414; @@ -212,17 +198,17 @@ public class DungeonMap { } } GlStateManager.translate(x, y, 0); - if(!NotEnoughUpdates.INSTANCE.manager.config.dmOrientCheck.value) { + if(!NotEnoughUpdates.INSTANCE.config.dungeonMap.dmOrientCheck) { GlStateManager.rotate(-rotation+180, 0, 0, 1); } GlStateManager.pushMatrix(); - GlStateManager.scale(NotEnoughUpdates.INSTANCE.manager.config.dmIconScale.value, - NotEnoughUpdates.INSTANCE.manager.config.dmIconScale.value, 1); + GlStateManager.scale(NotEnoughUpdates.INSTANCE.config.dungeonMap.dmIconScale, + NotEnoughUpdates.INSTANCE.config.dungeonMap.dmIconScale, 1); Utils.drawTexturedRect(-5, -5, 10, 10, GL11.GL_NEAREST); GlStateManager.popMatrix(); - if(!NotEnoughUpdates.INSTANCE.manager.config.dmOrientCheck.value) { + if(!NotEnoughUpdates.INSTANCE.config.dungeonMap.dmOrientCheck) { GlStateManager.rotate(rotation-180, 0, 0, 1); } GlStateManager.translate(-x, -y, 0); @@ -361,23 +347,23 @@ public class DungeonMap { } public int getRenderRoomSize() { - double roomSizeOption = NotEnoughUpdates.INSTANCE.manager.config.dmRoomSize.value; + double roomSizeOption = NotEnoughUpdates.INSTANCE.config.dungeonMap.dmRoomSize; if(roomSizeOption <= 0) return 12; return 12 + (int)Math.round(roomSizeOption*4); } public int getRenderConnSize() { - int roomSizeOption = (int)Math.round(NotEnoughUpdates.INSTANCE.manager.config.dmRoomSize.value); + int roomSizeOption = (int)Math.round(NotEnoughUpdates.INSTANCE.config.dungeonMap.dmRoomSize); if(roomSizeOption <= 0) return 3; return 3 + roomSizeOption; } private HashMap<Integer, Float> borderRadiusCache = new HashMap<>(); public float getBorderRadius() { - int borderSizeOption = (int)Math.round(NotEnoughUpdates.INSTANCE.manager.config.dmBorderSize.value.doubleValue()); + int borderSizeOption = NotEnoughUpdates.INSTANCE.config.dungeonMap.dmBorderSize; String sizeId = borderSizeOption == 0 ? "small" : borderSizeOption == 2 ? "large" : "medium"; - int style = NotEnoughUpdates.INSTANCE.manager.config.dmBorderStyle.value.intValue(); + int style = NotEnoughUpdates.INSTANCE.config.dungeonMap.dmBorderStyle; if(borderRadiusCache.containsKey(style)) { return borderRadiusCache.get(style); } @@ -396,8 +382,8 @@ public class DungeonMap { } public void render(int centerX, int centerY) { - boolean useFb = NotEnoughUpdates.INSTANCE.manager.config.dmCompat.value <= 1; - boolean useShd = NotEnoughUpdates.INSTANCE.manager.config.dmCompat.value <= 0; + boolean useFb = NotEnoughUpdates.INSTANCE.config.dungeonMap.dmCompat <= 1; + boolean useShd = NotEnoughUpdates.INSTANCE.config.dungeonMap.dmCompat <= 0; if((useFb && !OpenGlHelper.isFramebufferEnabled()) || (useShd && !OpenGlHelper.areShadersSupported())) { Utils.drawStringCentered(EnumChatFormatting.RED+"NEU Dungeon Map requires framebuffers & shaders", @@ -422,7 +408,7 @@ public class DungeonMap { maxRoomY = Math.max(offset.y, maxRoomY); } - int borderSizeOption = NotEnoughUpdates.INSTANCE.manager.config.dmBorderSize.value.intValue(); + int borderSizeOption = NotEnoughUpdates.INSTANCE.config.dungeonMap.dmBorderSize; int renderRoomSize = getRenderRoomSize(); int renderConnSize = getRenderConnSize(); @@ -435,14 +421,14 @@ public class DungeonMap { } int rotation = 180; - if(playerPos != null && NotEnoughUpdates.INSTANCE.manager.config.dmRotatePlayer.value) { + if(playerPos != null && NotEnoughUpdates.INSTANCE.config.dungeonMap.dmRotatePlayer) { rotation = (int)playerPos.rotation; } int mapSizeX; int mapSizeY; - if(NotEnoughUpdates.INSTANCE.manager.config.dmBorderStyle.value <= 1) { - mapSizeX = 80 + (int)Math.round(40*NotEnoughUpdates.INSTANCE.manager.config.dmBorderSize.value); + if(NotEnoughUpdates.INSTANCE.config.dungeonMap.dmBorderStyle <= 1) { + mapSizeX = 80 + (int)Math.round(40*NotEnoughUpdates.INSTANCE.config.dungeonMap.dmBorderSize); } else { mapSizeX = borderSizeOption == 0 ? 90 : borderSizeOption == 1 ? 120 : borderSizeOption == 2 ? 160 : 240; } @@ -470,7 +456,7 @@ public class DungeonMap { return; } - int backgroundColour = SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.manager.config.dmBackgroundColour.value); + int backgroundColour = SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.config.dungeonMap.dmBackgroundColour); mapFramebuffer1.framebufferColor[0] = ((backgroundColour >> 16) & 0xFF)/255f; mapFramebuffer1.framebufferColor[1] = ((backgroundColour >> 8) & 0xFF)/255f; @@ -506,7 +492,7 @@ public class DungeonMap { GlStateManager.translate(centerX-mapSizeX/2, centerY-mapSizeY/2, 100); } - if(NotEnoughUpdates.INSTANCE.manager.config.dmBackgroundBlur.value > 0.1) { + if(NotEnoughUpdates.INSTANCE.config.dungeonMap.dmBackgroundBlur > 0.1) { GlStateManager.translate(-centerX+mapSizeX/2, -centerY+mapSizeY/2, 0); renderBlurredBackground(scaledResolution.getScaledWidth(), scaledResolution.getScaledHeight(), centerX-mapSizeX/2, centerY-mapSizeY/2, mapSizeX, mapSizeY); @@ -515,7 +501,7 @@ public class DungeonMap { GlStateManager.translate(mapCenterX, mapCenterY, 10); - if(!useFb || NotEnoughUpdates.INSTANCE.manager.config.dmBackgroundBlur.value > 0.1) { + if(!useFb || NotEnoughUpdates.INSTANCE.config.dungeonMap.dmBackgroundBlur > 0.1) { GlStateManager.enableBlend(); GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); } @@ -523,7 +509,7 @@ public class DungeonMap { GlStateManager.rotate(-rotation+180, 0, 0, 1); - if(NotEnoughUpdates.INSTANCE.manager.config.dmCenterPlayer.value && playerPos != null) { + if(NotEnoughUpdates.INSTANCE.config.dungeonMap.dmCenterPlayer && playerPos != null) { float x = playerPos.getRenderX(); float y = playerPos.getRenderY(); x -= minRoomX*(renderRoomSize+renderConnSize); @@ -597,7 +583,7 @@ public class DungeonMap { float y = pos.getRenderY(); float angle = pos.rotation; - boolean doInterp = NotEnoughUpdates.INSTANCE.manager.config.dmPlayerInterp.value; + boolean doInterp = NotEnoughUpdates.INSTANCE.config.dungeonMap.dmPlayerInterp; if(playerEntityMapPositions.containsKey(name)) { MapPosition entityPos = playerEntityMapPositions.get(name); angle = entityPos.rotation; @@ -605,7 +591,7 @@ public class DungeonMap { float deltaX = entityPos.getRenderX() - pos.getRenderX(); float deltaY = entityPos.getRenderY() - pos.getRenderY(); - if(deltaX > (renderRoomSize + renderConnSize)/2) { + /*if(deltaX > (renderRoomSize + renderConnSize)/2) { deltaX -= (renderRoomSize + renderConnSize); } else if(deltaX < -(renderRoomSize + renderConnSize)/2) { deltaX += (renderRoomSize + renderConnSize); @@ -614,7 +600,7 @@ public class DungeonMap { deltaY -= (renderRoomSize + renderConnSize); } else if(deltaY < -(renderRoomSize + renderConnSize)/2) { deltaY += (renderRoomSize + renderConnSize); - } + }*/ x += deltaX; y += deltaY; @@ -661,7 +647,7 @@ public class DungeonMap { pixelWidth = pixelHeight = 12; } GlStateManager.color(1, 1, 1, 1); - if(NotEnoughUpdates.INSTANCE.manager.config.dmPlayerHeads.value >= 1 && + if(NotEnoughUpdates.INSTANCE.config.dungeonMap.dmPlayerHeads >= 1 && playerSkinMap.containsKey(entry.getKey())) { Minecraft.getMinecraft().getTextureManager().bindTexture(playerSkinMap.get(entry.getKey())); @@ -671,7 +657,7 @@ public class DungeonMap { maxV = 16/64f; headLayer = true; - if(NotEnoughUpdates.INSTANCE.manager.config.dmPlayerHeads.value >= 2) { + if(NotEnoughUpdates.INSTANCE.config.dungeonMap.dmPlayerHeads >= 2) { blackBorder = true; } } else { @@ -688,8 +674,8 @@ public class DungeonMap { GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); GlStateManager.translate(x, y, -0.02F); - GlStateManager.scale(NotEnoughUpdates.INSTANCE.manager.config.dmIconScale.value, - NotEnoughUpdates.INSTANCE.manager.config.dmIconScale.value, 1); + GlStateManager.scale(NotEnoughUpdates.INSTANCE.config.dungeonMap.dmIconScale, + NotEnoughUpdates.INSTANCE.config.dungeonMap.dmIconScale, 1); GlStateManager.rotate(angle, 0.0F, 0.0F, 1.0F); GlStateManager.translate(-0.5F, 0.5F, 0.0F); @@ -757,8 +743,8 @@ public class DungeonMap { GlStateManager.translate(centerX, centerY, 100); - if(NotEnoughUpdates.INSTANCE.manager.config.dmChromaBorder.value) { - int colour = SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.manager.config.dmBorderColour.value); + if(NotEnoughUpdates.INSTANCE.config.dungeonMap.dmChromaBorder) { + int colour = SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.config.dungeonMap.dmBorderColour); Gui.drawRect(-mapCenterX-2, -mapCenterY-2, -mapCenterX, -mapCenterY, colour); //topleft @@ -789,19 +775,19 @@ public class DungeonMap { } else { Gui.drawRect(-mapCenterX-2, -mapCenterY, -mapCenterX, mapCenterY, - SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.manager.config.dmBorderColour.value)); //left + SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.config.dungeonMap.dmBorderColour)); //left Gui.drawRect(mapCenterX, -mapCenterY, mapCenterX+2, mapCenterY, - SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.manager.config.dmBorderColour.value)); //right + SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.config.dungeonMap.dmBorderColour)); //right Gui.drawRect(-mapCenterX-2, -mapCenterY-2, mapCenterX+2, -mapCenterY, - SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.manager.config.dmBorderColour.value)); //top + SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.config.dungeonMap.dmBorderColour)); //top Gui.drawRect(-mapCenterX-2, mapCenterY, mapCenterX+2, mapCenterY+2, - SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.manager.config.dmBorderColour.value)); //bottom + SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.config.dungeonMap.dmBorderColour)); //bottom } String sizeId = borderSizeOption == 0 ? "small" : borderSizeOption == 2 ? "large" : "medium"; ResourceLocation rl = new ResourceLocation("notenoughupdates:dungeon_map/borders/"+sizeId+"/"+ - NotEnoughUpdates.INSTANCE.manager.config.dmBorderStyle.value.intValue()+".png"); + NotEnoughUpdates.INSTANCE.config.dungeonMap.dmBorderStyle+".png"); if(Minecraft.getMinecraft().getTextureManager().getTexture(rl) != TextureUtil.missingTexture) { Minecraft.getMinecraft().getTextureManager().bindTexture(rl); GlStateManager.color(1, 1, 1, 1); @@ -1010,7 +996,7 @@ public class DungeonMap { private long lastClearCache = 0; public void renderMap(int centerX, int centerY, Color[][] colourMap, Map<String, Vec4b> mapDecorations, int roomSizeBlocks, Set<String> actualPlayers, boolean usePlayerPositions, float partialTicks) { - if(!NotEnoughUpdates.INSTANCE.manager.config.dmEnable.value) return; + if(!NotEnoughUpdates.INSTANCE.config.dungeonMap.dmEnable) return; if(colourMap == null) return; if(colourMap.length != 128) return; if(colourMap[0].length != 128) return; @@ -1364,8 +1350,8 @@ public class DungeonMap { @SubscribeEvent(priority=EventPriority.HIGH) public void onRenderOverlayPre(RenderGameOverlayEvent.Pre event) { if(event.type == RenderGameOverlayEvent.ElementType.ALL && - NotEnoughUpdates.INSTANCE.manager.config.dmEnable.value && - NotEnoughUpdates.INSTANCE.manager.config.dmBackgroundBlur.value > 0.1) { + NotEnoughUpdates.INSTANCE.config.dungeonMap.dmEnable && + NotEnoughUpdates.INSTANCE.config.dungeonMap.dmBackgroundBlur > 0.1) { blurBackground(); GlStateManager.enableBlend(); GlStateManager.enableTexture2D(); @@ -1378,9 +1364,9 @@ public class DungeonMap { } @SubscribeEvent - public void onRenderOverlay(RenderGameOverlayEvent event) { + public void onRenderOverlay(RenderGameOverlayEvent.Post event) { if(event.type == RenderGameOverlayEvent.ElementType.ALL) { - if(!NotEnoughUpdates.INSTANCE.manager.config.dmEnable.value) return; + if(!NotEnoughUpdates.INSTANCE.config.dungeonMap.dmEnable) return; if(Minecraft.getMinecraft().gameSettings.showDebugInfo || (Minecraft.getMinecraft().gameSettings.keyBindPlayerList.isKeyDown() && @@ -1489,8 +1475,8 @@ public class DungeonMap { } } - renderMap((int)(NotEnoughUpdates.INSTANCE.manager.config.dmCenterX.value/100*Minecraft.getMinecraft().displayWidth/2), - (int)(NotEnoughUpdates.INSTANCE.manager.config.dmCenterY.value/100*Minecraft.getMinecraft().displayHeight/2), + renderMap((int)(NotEnoughUpdates.INSTANCE.config.dungeonMap.dmCenterX/100*Minecraft.getMinecraft().displayWidth/2), + (int)(NotEnoughUpdates.INSTANCE.config.dungeonMap.dmCenterY/100*Minecraft.getMinecraft().displayHeight/2), colourMap, decorations, roomSizeBlocks, actualPlayers, true, event.partialTicks); } } @@ -1591,7 +1577,7 @@ public class DungeonMap { } catch(Exception e) { } } if(blurShaderHorz != null && blurShaderVert != null) { - float blur = NotEnoughUpdates.INSTANCE.manager.config.dmBackgroundBlur.value.floatValue(); + float blur = NotEnoughUpdates.INSTANCE.config.dungeonMap.dmBackgroundBlur; blur = Math.max(0, Math.min(50, blur)); if(blur != lastBgBlurFactor) { blurShaderHorz.getShaderManager().getShaderUniform("Radius").set(blur); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonWin.java b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonWin.java index fec10027..284ec1a3 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonWin.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/DungeonWin.java @@ -77,13 +77,13 @@ public class DungeonWin { } public static void displayWin() { - if(NotEnoughUpdates.INSTANCE.manager.config.dungeonWinMillis.value < 100) return; + if(NotEnoughUpdates.INSTANCE.config.dungeonWin.dungeonWinMillis < 100 || !NotEnoughUpdates.INSTANCE.config.dungeonWin.enableDungeonWin) return; startTime = System.currentTimeMillis(); confetti.clear(); } public static void tick() { - if(NotEnoughUpdates.INSTANCE.manager.config.dungeonWinMillis.value < 100) return; + if(NotEnoughUpdates.INSTANCE.config.dungeonWin.dungeonWinMillis < 100 || !NotEnoughUpdates.INSTANCE.config.dungeonWin.enableDungeonWin) return; if(System.currentTimeMillis() - startTime > 5000) return; int deltaTime = (int)(System.currentTimeMillis() - startTime); @@ -140,7 +140,7 @@ public class DungeonWin { } public static void onChatMessage(ClientChatReceivedEvent e) { - if(NotEnoughUpdates.INSTANCE.manager.config.dungeonWinMillis.value < 100) return; + if(NotEnoughUpdates.INSTANCE.config.dungeonWin.dungeonWinMillis < 100 || !NotEnoughUpdates.INSTANCE.config.dungeonWin.enableDungeonWin) return; long currentTime = System.currentTimeMillis(); String unformatted = Utils.cleanColour(e.message.getUnformattedText()); if(e.message.getFormattedText().startsWith(EnumChatFormatting.RESET+" ")) { @@ -195,8 +195,8 @@ public class DungeonWin { } public static void render(float partialTicks) { - if(NotEnoughUpdates.INSTANCE.manager.config.dungeonWinMillis.value < 100) return; - int maxTime = Math.min(30000, NotEnoughUpdates.INSTANCE.manager.config.dungeonWinMillis.value.intValue()); + if(NotEnoughUpdates.INSTANCE.config.dungeonWin.dungeonWinMillis < 100 || !NotEnoughUpdates.INSTANCE.config.dungeonWin.enableDungeonWin) return; + int maxTime = Math.min(30000, NotEnoughUpdates.INSTANCE.config.dungeonWin.dungeonWinMillis); if(System.currentTimeMillis() - startTime > maxTime) return; int deltaTime = (int)(System.currentTimeMillis() - startTime); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/GuiDungeonMapEditor.java b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/GuiDungeonMapEditor.java index 0bd7ed6f..e962f793 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/dungeons/GuiDungeonMapEditor.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/dungeons/GuiDungeonMapEditor.java @@ -1,18 +1,18 @@ package io.github.moulberry.notenoughupdates.dungeons; +import io.github.moulberry.notenoughupdates.options.NEUConfig; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.core.GuiElementColour; +import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigEditorSlider; +import io.github.moulberry.notenoughupdates.core.config.annotations.ConfigOption; import io.github.moulberry.notenoughupdates.itemeditor.GuiElementTextField; -import io.github.moulberry.notenoughupdates.options.Options; 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; -import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.OpenGlHelper; -import net.minecraft.client.renderer.texture.DynamicTexture; import net.minecraft.client.shader.Framebuffer; import net.minecraft.client.shader.Shader; import net.minecraft.util.EnumChatFormatting; @@ -24,14 +24,11 @@ import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; import java.awt.*; -import java.awt.image.BufferedImage; import java.io.IOException; +import java.lang.reflect.Field; import java.util.*; import java.util.List; -import static io.github.moulberry.notenoughupdates.GuiTextures.*; - -import static io.github.moulberry.notenoughupdates.GuiTextures.*; -import static io.github.moulberry.notenoughupdates.GuiTextures.colour_selector_dot; +import static io.github.moulberry.notenoughupdates.util.GuiTextures.*; public class GuiDungeonMapEditor extends GuiScreen { @@ -57,23 +54,9 @@ public class GuiDungeonMapEditor extends GuiScreen { private GuiElementTextField xField = new GuiElementTextField("", GuiElementTextField.NUM_ONLY | GuiElementTextField.NO_SPACE); private GuiElementTextField yField = new GuiElementTextField("", GuiElementTextField.NUM_ONLY | GuiElementTextField.NO_SPACE); private GuiElementTextField blurField = new GuiElementTextField("", GuiElementTextField.NUM_ONLY | GuiElementTextField.NO_SPACE); - private ColourEditor activeColourEditor = null; - - private Options.Option<Double> clickedSlider = null; - - private class ColourEditor { - public int x; - public int y; - public Options.Option<String> option; - public String special; + private GuiElementColour activeColourEditor = null; - public ColourEditor(int x, int y, Options.Option<String> option, String special) { - this.x = x; - this.y = y; - this.option = option; - this.special = special; - } - } + private Field clickedSlider; class Button { private int id; @@ -81,18 +64,26 @@ public class GuiDungeonMapEditor extends GuiScreen { private int y; private String text; private Color colour = new Color(-1, true); - private Options.Option<?> option; + private Field option; + private String displayName; + private String desc; public Button(int id, int x, int y, String text) { this(id, x, y, text, null); } - public Button(int id, int x, int y, String text, Options.Option<?> option) { + public Button(int id, int x, int y, String text, Field option) { this.id = id; this.x = x; this.y = y; this.text = text; this.option = option; + + if(option != null) { + ConfigOption optionAnnotation = option.getAnnotation(ConfigOption.class); + displayName = optionAnnotation.name(); + desc = optionAnnotation.desc(); + } } public List<String> getTooltip() { @@ -101,8 +92,8 @@ public class GuiDungeonMapEditor extends GuiScreen { } List<String> tooltip = new ArrayList<>(); - tooltip.add(EnumChatFormatting.YELLOW+option.displayName); - for(String line : option.desc.split("\n")) { + tooltip.add(EnumChatFormatting.YELLOW+displayName); + for(String line : desc.split("\n")) { tooltip.add(EnumChatFormatting.AQUA+line); } return tooltip; @@ -129,7 +120,7 @@ public class GuiDungeonMapEditor extends GuiScreen { } public GuiDungeonMapEditor() { - Options options = NotEnoughUpdates.INSTANCE.manager.config; + NEUConfig.DungeonMap options = NotEnoughUpdates.INSTANCE.config.dungeonMap; //Map Border Size //buttons.add(new Button(0, 6, 37, "Small", options.dmBorderSize)); //buttons.add(new Button(1, 52, 37, "Medium", options.dmBorderSize)); @@ -154,42 +145,41 @@ public class GuiDungeonMapEditor extends GuiScreen { buttons.add(new Button(16, 52, 154+30, "Ornate")); buttons.add(new Button(17, 98, 154+30, "Dragon")); - //Dungeon Map - buttons.add(new Button(18, 20+139, 36, "Yes/No", options.dmEnable)); - //Center - buttons.add(new Button(19, 84+139, 36, "Player/Map", options.dmCenterPlayer)); - //Rotate - buttons.add(new Button(20, 20+139, 65, "Player/No Rotate", options.dmRotatePlayer)); - //Icon Style - buttons.add(new Button(21, 84+139, 65, "Default/Heads", options.dmPlayerHeads)); - //Check Orient - buttons.add(new Button(22, 20+139, 94, "Normal/Reorient", options.dmOrientCheck)); - //Check Center - buttons.add(new Button(23, 84+139, 94, "Yes/No", options.dmCenterCheck)); - //Interpolation - buttons.add(new Button(24, 20+139, 123, "Yes/No", options.dmPlayerInterp)); - //Compatibility - buttons.add(new Button(25, 84+139, 123, "Normal/No SHD/No FB/SHD", options.dmCompat)); - - //Background - buttons.add(new Button(26, 20+139, 152, "", options.dmBackgroundColour)); - //Border - buttons.add(new Button(27, 84+139, 152, "", options.dmBorderColour)); - - //Chroma Mode - buttons.add(new Button(28, 84+139, 181, "Normal/Scroll", options.dmChromaBorder)); + try { + //Dungeon Map + buttons.add(new Button(18, 20+139, 36, "Yes/No", NEUConfig.DungeonMap.class.getDeclaredField("dmEnable"))); + //Center + buttons.add(new Button(19, 84+139, 36, "Player/Map", NEUConfig.DungeonMap.class.getDeclaredField("dmCenterPlayer"))); + //Rotate + buttons.add(new Button(20, 20+139, 65, "Player/No Rotate", NEUConfig.DungeonMap.class.getDeclaredField("dmRotatePlayer"))); + //Icon Style + buttons.add(new Button(21, 84+139, 65, "Default/Heads", NEUConfig.DungeonMap.class.getDeclaredField("dmPlayerHeads"))); + //Check Orient + buttons.add(new Button(22, 20+139, 94, "Normal/Reorient", NEUConfig.DungeonMap.class.getDeclaredField("dmOrientCheck"))); + //Check Center + buttons.add(new Button(23, 84+139, 94, "Yes/No", NEUConfig.DungeonMap.class.getDeclaredField("dmCenterCheck"))); + //Interpolation + buttons.add(new Button(24, 20+139, 123, "Yes/No", NEUConfig.DungeonMap.class.getDeclaredField("dmPlayerInterp"))); + //Compatibility + buttons.add(new Button(25, 84+139, 123, "Normal/No SHD/No FB/SHD", NEUConfig.DungeonMap.class.getDeclaredField("dmCompat"))); + + //Background + buttons.add(new Button(26, 20+139, 152, "", NEUConfig.DungeonMap.class.getDeclaredField("dmBackgroundColour"))); + //Border + buttons.add(new Button(27, 84+139, 152, "", NEUConfig.DungeonMap.class.getDeclaredField("dmBorderColour"))); + + //Chroma Mode + buttons.add(new Button(28, 84+139, 181, "Normal/Scroll", NEUConfig.DungeonMap.class.getDeclaredField("dmChromaBorder"))); + } catch(Exception e) { + e.printStackTrace(); + } //buttons.add(new Button(29, 52, 86+19, "XLarge", options.dmRoomSize)); //buttons.add(new Button(30, 52, 56, "XLarge", options.dmBorderSize)); - xField.setText(String.valueOf(NotEnoughUpdates.INSTANCE.manager.config.dmCenterX.value)); - yField.setText(String.valueOf(NotEnoughUpdates.INSTANCE.manager.config.dmCenterY.value)); - blurField.setText(String.valueOf(NotEnoughUpdates.INSTANCE.manager.config.dmBackgroundBlur.value)); - } - - private void showColourEditor(int mouseX, int mouseY, Options.Option<String> option, String special) { - activeColourEditor = new ColourEditor(mouseX, mouseY, option, special); - hexField.otherComponentClick(); + xField.setText(String.valueOf(NotEnoughUpdates.INSTANCE.config.dungeonMap.dmCenterX)); + yField.setText(String.valueOf(NotEnoughUpdates.INSTANCE.config.dungeonMap.dmCenterY)); + blurField.setText(String.valueOf(NotEnoughUpdates.INSTANCE.config.dungeonMap.dmBackgroundBlur)); } @Override @@ -311,24 +301,28 @@ public class GuiDungeonMapEditor extends GuiScreen { Utils.drawStringCenteredScaledMaxWidth("Y (%)", Minecraft.getMinecraft().fontRendererObj, guiLeft+108, guiTop+209, false, 60, 0xFFB4B4B4); - drawSlider(NotEnoughUpdates.INSTANCE.manager.config.dmBorderSize, guiLeft+76, guiTop+45); - drawSlider(NotEnoughUpdates.INSTANCE.manager.config.dmRoomSize, guiLeft+76, guiTop+75); - drawSlider(NotEnoughUpdates.INSTANCE.manager.config.dmIconScale, guiLeft+76, guiTop+105); + try { + drawSlider(NEUConfig.DungeonMap.class.getDeclaredField("dmBorderSize"), guiLeft+76, guiTop+45); + drawSlider(NEUConfig.DungeonMap.class.getDeclaredField("dmRoomSize"), guiLeft+76, guiTop+75); + drawSlider(NEUConfig.DungeonMap.class.getDeclaredField("dmIconScale"), guiLeft+76, guiTop+105); + } catch(Exception e) { + e.printStackTrace(); + } - Options options = NotEnoughUpdates.INSTANCE.manager.config; - buttons.get(18-6).text = options.dmEnable.value ? "Enabled" : "Disabled"; - buttons.get(19-6).text = options.dmCenterPlayer.value ? "Player" : "Map"; - buttons.get(20-6).text = options.dmRotatePlayer.value ? "Player" : "Vertical"; - buttons.get(21-6).text = options.dmPlayerHeads.value <= 0 ? "Default" : options.dmPlayerHeads.value == 1 ? "Heads" : "Heads w/ Border"; - buttons.get(22-6).text = options.dmOrientCheck.value ? "Orient" : "Off"; - buttons.get(23-6).text = options.dmCenterCheck.value ? "Center" : "Off"; - buttons.get(24-6).text = options.dmPlayerInterp.value ? "Interp" : "No Interp"; - buttons.get(25-6).text = options.dmCompat.value <= 0 ? "Normal" : options.dmCompat.value >= 2 ? "No FB/SHD" : "No SHD"; + NEUConfig.DungeonMap options = NotEnoughUpdates.INSTANCE.config.dungeonMap; + buttons.get(18-6).text = options.dmEnable ? "Enabled" : "Disabled"; + buttons.get(19-6).text = options.dmCenterPlayer ? "Player" : "Map"; + buttons.get(20-6).text = options.dmRotatePlayer ? "Player" : "Vertical"; + buttons.get(21-6).text = options.dmPlayerHeads <= 0 ? "Default" : options.dmPlayerHeads == 1 ? "Heads" : "Heads w/ Border"; + buttons.get(22-6).text = options.dmOrientCheck ? "Orient" : "Off"; + buttons.get(23-6).text = options.dmCenterCheck ? "Center" : "Off"; + buttons.get(24-6).text = options.dmPlayerInterp ? "Interp" : "No Interp"; + buttons.get(25-6).text = options.dmCompat <= 0 ? "Normal" : options.dmCompat >= 2 ? "No FB/SHD" : "No SHD"; - buttons.get(26-6).colour = new Color(SpecialColour.specialToChromaRGB(options.dmBackgroundColour.value)); - buttons.get(27-6).colour = new Color(SpecialColour.specialToChromaRGB(options.dmBorderColour.value)); + buttons.get(26-6).colour = new Color(SpecialColour.specialToChromaRGB(options.dmBackgroundColour)); + buttons.get(27-6).colour = new Color(SpecialColour.specialToChromaRGB(options.dmBorderColour)); - buttons.get(28-6).text = options.dmChromaBorder.value ? "Scroll" : "Normal"; + buttons.get(28-6).text = options.dmChromaBorder ? "Scroll" : "Normal"; blurField.setSize(48, 16); xField.setSize(48, 16); @@ -358,140 +352,28 @@ public class GuiDungeonMapEditor extends GuiScreen { } if(activeColourEditor != null) { - Gui.drawRect(activeColourEditor.x, activeColourEditor.y, activeColourEditor.x+119, activeColourEditor.y+89, colourEditorBG); - - int currentColour = SpecialColour.specialToSimpleRGB(activeColourEditor.special); - Color c = new Color(currentColour, true); - float[] hsv = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); - - BufferedImage bufferedImage = new BufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB); - for(int x=0; x<256; x++) { - for(int y=0; y<256; y++) { - float radius = (float) Math.sqrt(((x-128)*(x-128)+(y-128)*(y-128))/16384f); - float angle = (float) Math.toDegrees(Math.atan((128-x)/(y-128+1E-5))+Math.PI/2); - if(y < 128) angle += 180; - if(radius <= 1) { - int rgb = Color.getHSBColor(angle/360f, (float)Math.pow(radius, 1.5f), hsv[2]).getRGB(); - bufferedImage.setRGB(x, y, rgb); - } - } - } - - BufferedImage bufferedImageValue = new BufferedImage(10, 64, BufferedImage.TYPE_INT_ARGB); - for(int x=0; x<10; x++) { - for(int y=0; y<64; y++) { - if((x == 0 || x == 9) && (y == 0 || y == 63)) continue; - - int rgb = Color.getHSBColor(hsv[0], hsv[1], (64-y)/64f).getRGB(); - bufferedImageValue.setRGB(x, y, rgb); - } - } - - BufferedImage bufferedImageOpacity = new BufferedImage(10, 64, BufferedImage.TYPE_INT_ARGB); - for(int x=0; x<10; x++) { - for(int y=0; y<64; y++) { - if((x == 0 || x == 9) && (y == 0 || y == 63)) continue; - - int rgb = (currentColour & 0x00FFFFFF) | (Math.min(255, (64-y)*4) << 24); - bufferedImageOpacity.setRGB(x, y, rgb); - } - } - - float selradius = (float) Math.pow(hsv[1], 1/1.5f)*32; - int selx = (int)(Math.cos(Math.toRadians(hsv[0]*360))*selradius); - int sely = (int)(Math.sin(Math.toRadians(hsv[0]*360))*selradius); - - Minecraft.getMinecraft().getTextureManager().bindTexture(colour_selector_bar_alpha); - GlStateManager.color(1, 1, 1, 1); - Utils.drawTexturedRect(activeColourEditor.x+5+64+5+10+5, activeColourEditor.y+5, 10, 64, GL11.GL_NEAREST); - - Minecraft.getMinecraft().getTextureManager().loadTexture(colourPickerBarValueLocation, new DynamicTexture(bufferedImageValue)); - Minecraft.getMinecraft().getTextureManager().bindTexture(colourPickerBarValueLocation); - GlStateManager.color(1, 1, 1, 1); - Utils.drawTexturedRect(activeColourEditor.x+5+64+5, activeColourEditor.y+5, 10, 64, GL11.GL_NEAREST); - - Minecraft.getMinecraft().getTextureManager().loadTexture(colourPickerBarOpacityLocation, new DynamicTexture(bufferedImageOpacity)); - Minecraft.getMinecraft().getTextureManager().bindTexture(colourPickerBarOpacityLocation); - GlStateManager.color(1, 1, 1, 1); - Utils.drawTexturedRect(activeColourEditor.x+5+64+5+10+5, activeColourEditor.y+5, 10, 64, GL11.GL_NEAREST); - - int chromaSpeed = SpecialColour.getSpeed(activeColourEditor.special); - int currentColourChroma = SpecialColour.specialToChromaRGB(activeColourEditor.special); - Color cChroma = new Color(currentColourChroma, true); - float hsvChroma[] = Color.RGBtoHSB(cChroma.getRed(), cChroma.getGreen(), cChroma.getBlue(), null); - - if(chromaSpeed > 0) { - Gui.drawRect(activeColourEditor.x+5+64+5+10+5+10+5+1, activeColourEditor.y+5+1, - activeColourEditor.x+5+64+5+10+5+10+5+10-1, activeColourEditor.y+5+64-1, - Color.HSBtoRGB(hsvChroma[0], 0.8f, 0.8f)); - } else { - Gui.drawRect(activeColourEditor.x+5+64+5+10+5+10+5+1, activeColourEditor.y+5+27+1, - activeColourEditor.x+5+64+5+10+5+10+5+10-1, activeColourEditor.y+5+37-1, - Color.HSBtoRGB((hsvChroma[0]+(System.currentTimeMillis()-SpecialColour.startTime)/1000f)%1, 0.8f, 0.8f)); - } - - Minecraft.getMinecraft().getTextureManager().bindTexture(colour_selector_bar); - GlStateManager.color(1, 1, 1, 1); - Utils.drawTexturedRect(activeColourEditor.x+5+64+5, activeColourEditor.y+5, 10, 64, GL11.GL_NEAREST); - Utils.drawTexturedRect(activeColourEditor.x+5+64+5+10+5, activeColourEditor.y+5, 10, 64, GL11.GL_NEAREST); - - if(chromaSpeed > 0) { - Utils.drawTexturedRect(activeColourEditor.x+5+64+5+10+5+10+5, activeColourEditor.y+5, 10, 64, GL11.GL_NEAREST); - } else { - Minecraft.getMinecraft().getTextureManager().bindTexture(colour_selector_chroma); - Utils.drawTexturedRect(activeColourEditor.x+5+64+5+10+5+10+5, activeColourEditor.y+5+27, 10, 10, GL11.GL_NEAREST); - } - - Gui.drawRect(activeColourEditor.x+5+64+5, activeColourEditor.y+5+64-(int)(64*hsv[2]), - activeColourEditor.x+5+64+5+10, activeColourEditor.y+5+64-(int)(64*hsv[2])+1, 0xFF000000); - Gui.drawRect(activeColourEditor.x+5+64+5+10+5, activeColourEditor.y+5+64-c.getAlpha()/4, - activeColourEditor.x+5+64+5+10+5+10, activeColourEditor.y+5+64-c.getAlpha()/4-1, 0xFF000000); - if(chromaSpeed > 0) { - Gui.drawRect(activeColourEditor.x+5+64+5+10+5+10+5, - activeColourEditor.y+5+64-(int)(chromaSpeed/255f*64), - activeColourEditor.x+5+64+5+10+5+10+5+10, - activeColourEditor.y+5+64-(int)(chromaSpeed/255f*64)+1, 0xFF000000); - } - - Minecraft.getMinecraft().getTextureManager().loadTexture(colourPickerLocation, new DynamicTexture(bufferedImage)); - Minecraft.getMinecraft().getTextureManager().bindTexture(colourPickerLocation); - GlStateManager.color(1, 1, 1, 1); - Utils.drawTexturedRect(activeColourEditor.x+5, activeColourEditor.y+5, 64, 64, GL11.GL_NEAREST); - - Minecraft.getMinecraft().getTextureManager().bindTexture(colour_selector_dot); - GlStateManager.color(1, 1, 1, 1); - Utils.drawTexturedRect(activeColourEditor.x+5+32+selx-4, activeColourEditor.y+5+32+sely-4, 8, 8, GL11.GL_NEAREST); - - Utils.drawStringCenteredScaledMaxWidth(EnumChatFormatting.GRAY.toString()+Math.round(hsv[2]*100)+"", - Minecraft.getMinecraft().fontRendererObj, - activeColourEditor.x+5+64+5+5-(Math.round(hsv[2]*100)==100?1:0), activeColourEditor.y+5+64+5+5, true, 13, -1); - Utils.drawStringCenteredScaledMaxWidth(EnumChatFormatting.GRAY.toString()+Math.round(c.getAlpha()/255f*100)+"", - Minecraft.getMinecraft().fontRendererObj, - activeColourEditor.x+5+64+5+15+5, activeColourEditor.y+5+64+5+5, true, 13, -1); - if(chromaSpeed > 0) { - Utils.drawStringCenteredScaledMaxWidth(EnumChatFormatting.GRAY.toString()+(int)SpecialColour.getSecondsForSpeed(chromaSpeed)+"s", - Minecraft.getMinecraft().fontRendererObj, - activeColourEditor.x+5+64+5+30+6, activeColourEditor.y+5+64+5+5, true, 13, -1); - } - - hexField.setSize(48, 10); - if(!hexField.getFocus()) hexField.setText(Integer.toHexString(c.getRGB() & 0xFFFFFF).toUpperCase()); - - StringBuilder sb = new StringBuilder(EnumChatFormatting.GRAY+"#"); - for(int i=0; i<6-hexField.getText().length(); i++) { - sb.append("0"); - } - sb.append(EnumChatFormatting.WHITE); - - hexField.setPrependText(sb.toString()); - hexField.render(activeColourEditor.x+5+8, activeColourEditor.y+5+64+5); + activeColourEditor.render(); } Utils.pushGuiScale(-1); } - public void drawSlider(Options.Option<Double> option, int centerX, int centerY) { - float sliderAmount = (float)Math.max(0, Math.min(1, (option.value-option.minValue)/(option.maxValue-option.minValue))); + public void drawSlider(Field option, int centerX, int centerY) { + float value; + float minValue; + float maxValue; + try { + value = ((Number)option.get(NotEnoughUpdates.INSTANCE.config.dungeonMap)).floatValue(); + + ConfigEditorSlider sliderAnnotation = option.getAnnotation(ConfigEditorSlider.class); + minValue = sliderAnnotation.minValue(); + maxValue = sliderAnnotation.maxValue(); + } catch(Exception e) { + e.printStackTrace(); + return; + } + + float sliderAmount = Math.max(0, Math.min(1, (value-minValue)/(maxValue-minValue))); int sliderAmountI = (int)(96*sliderAmount); GlStateManager.color(1f, 1f, 1f, 1f); @@ -513,12 +395,32 @@ public class GuiDungeonMapEditor extends GuiScreen { super.mouseClickMove(mouseX, mouseY, clickedMouseButton, timeSinceLastClick); if(clickedSlider != null) { + float minValue; + float maxValue; + try { + ConfigEditorSlider sliderAnnotation = clickedSlider.getAnnotation(ConfigEditorSlider.class); + minValue = sliderAnnotation.minValue(); + maxValue = sliderAnnotation.maxValue(); + } catch(Exception e) { + e.printStackTrace(); + return; + } + float sliderAmount = (mouseX - (guiLeft+76-48))/96f; - double val = clickedSlider.minValue+(clickedSlider.maxValue-clickedSlider.minValue)*sliderAmount; + double val = minValue+(maxValue-minValue)*sliderAmount; if(Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) { val = Math.round(val); } - clickedSlider.value = Math.max(clickedSlider.minValue, Math.min(clickedSlider.maxValue, val)); + float value = (float)Math.max(minValue, Math.min(maxValue, val)); + try { + if(clickedSlider.getType() == int.class) { + clickedSlider.set(NotEnoughUpdates.INSTANCE.config.dungeonMap, Math.round(value)); + } else { + clickedSlider.set(NotEnoughUpdates.INSTANCE.config.dungeonMap, value); + } + } catch(Exception e) { + e.printStackTrace(); + } } } @@ -539,15 +441,19 @@ public class GuiDungeonMapEditor extends GuiScreen { clickedSlider = null; if(mouseX >= guiLeft+76-48 && mouseX <= guiLeft+76+48) { - if(mouseY > guiTop+45-8 && mouseY < guiTop+45+8) { - clickedSlider = NotEnoughUpdates.INSTANCE.manager.config.dmBorderSize; - return; - } else if(mouseY > guiTop+75-8 && mouseY < guiTop+75+8) { - clickedSlider = NotEnoughUpdates.INSTANCE.manager.config.dmRoomSize; - return; - } else if(mouseY > guiTop+105-8 && mouseY < guiTop+105+8) { - clickedSlider = NotEnoughUpdates.INSTANCE.manager.config.dmIconScale; - return; + try { + if(mouseY > guiTop+45-8 && mouseY < guiTop+45+8) { + clickedSlider = NEUConfig.DungeonMap.class.getDeclaredField("dmBorderSize"); + return; + } else if(mouseY > guiTop+75-8 && mouseY < guiTop+75+8) { + clickedSlider = NEUConfig.DungeonMap.class.getDeclaredField("dmRoomSize"); + return; + } else if(mouseY > guiTop+105-8 && mouseY < guiTop+105+8) { + clickedSlider = NEUConfig.DungeonMap.class.getDeclaredField("dmIconScale"); + return; + } + } catch(Exception e) { + e.printStackTrace(); } } @@ -583,83 +489,8 @@ public class GuiDungeonMapEditor extends GuiScreen { int mouseX = Mouse.getEventX() * this.width / this.mc.displayWidth; int mouseY = this.height - Mouse.getEventY() * this.height / this.mc.displayHeight - 1; - if(activeColourEditor != null && (Mouse.isButtonDown(0) || Mouse.isButtonDown(1))) { - if(mouseX >= activeColourEditor.x && mouseX <= activeColourEditor.x+119) { - if(mouseY >= activeColourEditor.y && mouseY <= activeColourEditor.y+89) { - if(Mouse.getEventButtonState()) { - if(mouseX > activeColourEditor.x+5+8 && mouseX < activeColourEditor.x+5+8+48) { - if(mouseY > activeColourEditor.y+5+64+5 && mouseY < activeColourEditor.y+5+64+5+10) { - hexField.mouseClicked(mouseX, mouseY, Mouse.getEventButton()); - Utils.pushGuiScale(-1); - return; - } - } - } - hexField.otherComponentClick(); - - int currentColour = SpecialColour.specialToSimpleRGB(activeColourEditor.special); - Color c = new Color(currentColour, true); - float[] hsv = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); - - int xWheel = mouseX - activeColourEditor.x - 5; - int yWheel = mouseY - activeColourEditor.y - 5; - - if(xWheel > 0 && xWheel < 64) { - if(yWheel > 0 && yWheel < 64) { - float radius = (float) Math.sqrt(((xWheel-32)*(xWheel-32)+(yWheel-32)*(yWheel-32))/1024f); - float angle = (float) Math.toDegrees(Math.atan((32-xWheel)/(yWheel-32+1E-5))+Math.PI/2); - if(yWheel < 32) angle += 180; - - int rgb = Color.getHSBColor(angle/360f, (float)Math.pow(Math.min(1, radius), 1.5f), hsv[2]).getRGB(); - activeColourEditor.special = SpecialColour.special(SpecialColour.getSpeed(activeColourEditor.special), c.getAlpha(), rgb); - activeColourEditor.option.value = (String) activeColourEditor.special; - } - } - - int xValue = mouseX - (activeColourEditor.x+5+64+5); - int y = mouseY - activeColourEditor.y - 5; - - if(y > -5 && y <= 69) { - y = Math.max(0, Math.min(64, y)); - if(xValue > 0 && xValue < 10) { - int rgb = Color.getHSBColor(hsv[0], hsv[1], 1-y/64f).getRGB(); - activeColourEditor.special = SpecialColour.special(SpecialColour.getSpeed(activeColourEditor.special), c.getAlpha(), rgb); - activeColourEditor.option.value = activeColourEditor.special; - } - - int xOpacity = mouseX - (activeColourEditor.x+5+64+5+10+5); - - if(xOpacity > 0 && xOpacity < 10) { - activeColourEditor.special = SpecialColour.special(SpecialColour.getSpeed(activeColourEditor.special), - 255-(int)(y/64f*255), currentColour); - activeColourEditor.option.value = activeColourEditor.special; - } - } - - int chromaSpeed = SpecialColour.getSpeed(activeColourEditor.special); - - int xChroma = mouseX - (activeColourEditor.x+5+64+5+10+5+10+5); - if(xChroma > 0 && xChroma < 10) { - if(chromaSpeed > 0) { - if(y > -5 && y <= 69) { - y = Math.max(0, Math.min(64, y)); - activeColourEditor.special = SpecialColour.special(255-Math.round(y/64f*255), c.getAlpha(), currentColour); - activeColourEditor.option.value = activeColourEditor.special; - } - } else if(mouseY > activeColourEditor.y+5+27 && mouseY < activeColourEditor.y+5+37) { - activeColourEditor.special = SpecialColour.special(200, c.getAlpha(), currentColour); - activeColourEditor.option.value = activeColourEditor.special; - } - } - - try { NotEnoughUpdates.INSTANCE.manager.saveConfig(); } catch(IOException ignored) {} - return; - } - } - if(Mouse.getEventButtonState()) { - activeColourEditor = null; - hexField.otherComponentClick(); - } + if(activeColourEditor != null) { + activeColourEditor.mouseInput(mouseX, mouseY); } } @@ -667,23 +498,8 @@ public class GuiDungeonMapEditor extends GuiScreen { public void handleKeyboardInput() throws IOException { super.handleKeyboardInput(); - if(activeColourEditor != null && hexField.getFocus()) { - String old = hexField.getText(); - - hexField.keyTyped(Keyboard.getEventCharacter(), Keyboard.getEventKey()); - - if(hexField.getText().length() > 6) { - hexField.setText(old); - } else { - try { - String text = hexField.getText().toLowerCase(); - - int rgb = Integer.parseInt(text, 16); - int alpha = (SpecialColour.specialToSimpleRGB(activeColourEditor.special) >> 24) & 0xFF; - activeColourEditor.special = SpecialColour.special(SpecialColour.getSpeed(activeColourEditor.special), alpha, rgb); - activeColourEditor.option.value = activeColourEditor.special; - } catch(Exception e) {}; - } + if(activeColourEditor != null) { + activeColourEditor.keyboardInput(); } } @@ -696,8 +512,7 @@ public class GuiDungeonMapEditor extends GuiScreen { try { xField.setCustomBorderColour(-1); - NotEnoughUpdates.INSTANCE.manager.config.dmCenterX.setValue(xField.getText()); - try { NotEnoughUpdates.INSTANCE.manager.saveConfig(); } catch(IOException ignored) {} + NotEnoughUpdates.INSTANCE.config.dungeonMap.dmCenterX = Float.parseFloat(xField.getText()); } catch(Exception e) { xField.setCustomBorderColour(Color.RED.getRGB()); } @@ -706,8 +521,7 @@ public class GuiDungeonMapEditor extends GuiScreen { try { yField.setCustomBorderColour(-1); - NotEnoughUpdates.INSTANCE.manager.config.dmCenterY.setValue(yField.getText()); - try { NotEnoughUpdates.INSTANCE.manager.saveConfig(); } catch(IOException ignored) {} + NotEnoughUpdates.INSTANCE.config.dungeonMap.dmCenterY = Float.parseFloat(yField.getText()); } catch(Exception e) { yField.setCustomBorderColour(Color.RED.getRGB()); } @@ -716,8 +530,7 @@ public class GuiDungeonMapEditor extends GuiScreen { try { blurField.setCustomBorderColour(-1); - NotEnoughUpdates.INSTANCE.manager.config.dmBackgroundBlur.setValue(blurField.getText()); - try { NotEnoughUpdates.INSTANCE.manager.saveConfig(); } catch(IOException ignored) {} + NotEnoughUpdates.INSTANCE.config.dungeonMap.dmBackgroundBlur = (int)Float.parseFloat(blurField.getText()); } catch(Exception e) { blurField.setCustomBorderColour(Color.RED.getRGB()); } @@ -725,71 +538,73 @@ public class GuiDungeonMapEditor extends GuiScreen { } private void buttonClicked(int mouseX, int mouseY, int id) { - Options options = NotEnoughUpdates.INSTANCE.manager.config; + NEUConfig.DungeonMap options = NotEnoughUpdates.INSTANCE.config.dungeonMap; switch (id) { case 0: - options.dmBorderSize.value = 0.0; break; + options.dmBorderSize = 0; break; case 1: - options.dmBorderSize.value = 1.0; break; + options.dmBorderSize = 1; break; case 2: - options.dmBorderSize.value = 2.0; break; + options.dmBorderSize = 2; break; case 30: - options.dmBorderSize.value = 3.0; break; + options.dmBorderSize = 3; break; case 3: - options.dmRoomSize.value = 0.0; break; + options.dmRoomSize = 0; break; case 4: - options.dmRoomSize.value = 1.0; break; + options.dmRoomSize = 1; break; case 5: - options.dmRoomSize.value = 2.0; break; + options.dmRoomSize = 2; break; case 29: - options.dmRoomSize.value = 3.0; break; + options.dmRoomSize = 3; break; case 18: - options.dmEnable.value = !options.dmEnable.value; break; + options.dmEnable = !options.dmEnable; break; case 19: - options.dmCenterPlayer.value = !options.dmCenterPlayer.value; break; + options.dmCenterPlayer = !options.dmCenterPlayer; break; case 20: - options.dmRotatePlayer.value = !options.dmRotatePlayer.value; break; + options.dmRotatePlayer = !options.dmRotatePlayer; break; case 21: - options.dmPlayerHeads.value++; - if(options.dmPlayerHeads.value > 2) options.dmPlayerHeads.value = 0.0; break; + options.dmPlayerHeads++; + if(options.dmPlayerHeads > 2) options.dmPlayerHeads = 0; break; case 22: - options.dmOrientCheck.value = !options.dmOrientCheck.value; break; + options.dmOrientCheck = !options.dmOrientCheck; break; case 23: - options.dmCenterCheck.value = !options.dmCenterCheck.value; break; + options.dmCenterCheck = !options.dmCenterCheck; break; case 24: - options.dmPlayerInterp.value = !options.dmPlayerInterp.value; break; + options.dmPlayerInterp = !options.dmPlayerInterp; break; case 25: - options.dmCompat.value++; - if(options.dmCompat.value > 2) options.dmCompat.value = 0.0; + options.dmCompat++; + if(options.dmCompat > 2) options.dmCompat = 0; break; case 26: - showColourEditor(mouseX, mouseY, options.dmBackgroundColour, options.dmBackgroundColour.value); break; + activeColourEditor = new GuiElementColour(mouseX, mouseY, options.dmBackgroundColour, + (col) -> options.dmBackgroundColour = col, () -> activeColourEditor = null); + break; case 27: - showColourEditor(mouseX, mouseY, options.dmBorderColour, options.dmBorderColour.value); break; + activeColourEditor = new GuiElementColour(mouseX, mouseY, options.dmBorderColour, + (col) -> options.dmBorderColour = col, () -> activeColourEditor = null); + break; case 28: - options.dmChromaBorder.value = !options.dmChromaBorder.value; break; + options.dmChromaBorder = !options.dmChromaBorder; break; default: if(id >= 6 && id <= 17) { - options.dmBorderStyle.value = (double)id-6; break; + options.dmBorderStyle = id-6; break; } - } - try { NotEnoughUpdates.INSTANCE.manager.saveConfig(); } catch(IOException ignored) {}; - + }; } private boolean isButtonPressed(int id) { - Options options = NotEnoughUpdates.INSTANCE.manager.config; + NEUConfig.DungeonMap options = NotEnoughUpdates.INSTANCE.config.dungeonMap; if(id >= 0 && id <= 2) { - return options.dmBorderSize.value == id; + return options.dmBorderSize == id; } else if(id >= 3 && id <= 5) { - return options.dmRoomSize.value == id-3; + return options.dmRoomSize == id-3; } else if(id >= 6 && id <= 17) { - return options.dmBorderStyle.value == id-6; + return options.dmBorderStyle == id-6; } else if(id == 29) { - return options.dmRoomSize.value == 3; + return options.dmRoomSize == 3; } else if(id == 30) { - return options.dmBorderSize.value == 3; + return options.dmBorderSize == 3; } return false; } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/gamemodes/GuiGamemodes.java b/src/main/java/io/github/moulberry/notenoughupdates/gamemodes/GuiGamemodes.java index 0f479f53..ff010fc7 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/gamemodes/GuiGamemodes.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/gamemodes/GuiGamemodes.java @@ -10,7 +10,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import static io.github.moulberry.notenoughupdates.GuiTextures.*; +import static io.github.moulberry.notenoughupdates.util.GuiTextures.*; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumChatFormatting; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/gamemodes/SBGamemodes.java b/src/main/java/io/github/moulberry/notenoughupdates/gamemodes/SBGamemodes.java index 692c1d4f..0c645255 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/gamemodes/SBGamemodes.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/gamemodes/SBGamemodes.java @@ -3,7 +3,7 @@ package io.github.moulberry.notenoughupdates.gamemodes; import com.google.gson.Gson; import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; -import io.github.moulberry.notenoughupdates.questing.SBInfo; +import io.github.moulberry.notenoughupdates.util.SBInfo; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.inventory.GuiChest; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/CollectionLogInfoPane.java b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/CollectionLogInfoPane.java index d0600796..fadb148d 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/CollectionLogInfoPane.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/CollectionLogInfoPane.java @@ -4,7 +4,7 @@ import com.google.gson.JsonArray; import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.NEUManager; import io.github.moulberry.notenoughupdates.NEUOverlay; -import io.github.moulberry.notenoughupdates.NEUResourceManager; +import io.github.moulberry.notenoughupdates.util.NEUResourceManager; import io.github.moulberry.notenoughupdates.util.SpecialColour; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; @@ -14,7 +14,6 @@ import net.minecraft.client.shader.Framebuffer; import net.minecraft.client.shader.Shader; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.Matrix4f; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; @@ -25,7 +24,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; -import static io.github.moulberry.notenoughupdates.GuiTextures.item_mask; +import static io.github.moulberry.notenoughupdates.util.GuiTextures.item_mask; public class CollectionLogInfoPane extends ScrollableInfoPane { @@ -114,7 +113,7 @@ public class CollectionLogInfoPane extends ScrollableInfoPane { } private Map<String, ArrayList<String>> getAcquiredItems() { - return manager.config.collectionLog.value; + return null;//manager.config.collectionLog.value; } private Comparator<String> getItemComparator() { @@ -267,13 +266,13 @@ public class CollectionLogInfoPane extends ScrollableInfoPane { itemFramebufferGrayscale = checkFramebufferSizes(itemFramebufferGrayscale, width, height, scaledresolution.getScaleFactor()); - if(!manager.config.cacheRenderedItempane.value || previousAcquiredCount != getCurrentAcquiredCount() || + /*if(!manager.config.cacheRenderedItempane.value || previousAcquiredCount != getCurrentAcquiredCount() || previousScroll != scrollHeight.getValue() || previousX != left || previousFilter != filterMode || System.currentTimeMillis() - lastUpdate > 5000) { lastUpdate = System.currentTimeMillis(); renderItemsToImage(itemFramebuffer, fg, left+5, right, top+1, bottom); renderItemBGToImage(itemBGFramebuffer, fg, left+5, right, top+1, bottom); - } + }*/ previousAcquiredCount = getCurrentAcquiredCount(); previousScroll = scrollHeight.getValue(); previousX = left; @@ -396,8 +395,8 @@ public class CollectionLogInfoPane extends ScrollableInfoPane { } private void renderItemBackgrounds(Color fg, int left, int right, int top, int bottom) { - Color fgCustomOpacity = new Color(SpecialColour.specialToChromaRGB(manager.config.itemBackgroundColour.value), true); - Color fgGold = new Color(SpecialColour.specialToChromaRGB(manager.config.itemFavouriteColour.value), true); + Color fgCustomOpacity = null;//new Color(SpecialColour.specialToChromaRGB(manager.config.itemBackgroundColour.value), true); + Color fgGold = null;//new Color(SpecialColour.specialToChromaRGB(manager.config.itemFavouriteColour.value), true); String[] items = getItemList(); iterateItemSlots(new ItemSlotConsumer() { @@ -413,13 +412,13 @@ public class CollectionLogInfoPane extends ScrollableInfoPane { } Minecraft.getMinecraft().getTextureManager().bindTexture(item_mask); - if(manager.config.itemStyle.value) { + /*if(manager.config.itemStyle.value) { GlStateManager.color(color.getRed() / 255f, color.getGreen() / 255f, color.getBlue() / 255f, color.getAlpha() / 255f); Utils.drawTexturedRect(x - 1, y - 1, overlay.ITEM_SIZE + 2, overlay.ITEM_SIZE + 2, GL11.GL_NEAREST); } else { drawRect(x-1, y-1, x+overlay.ITEM_SIZE+1, y+overlay.ITEM_SIZE+1, color.getRGB()); - } + }*/ GlStateManager.bindTexture(0); } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/FlipperInfoPane.java b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/FlipperInfoPane.java index b5d20a97..b6db53f3 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/FlipperInfoPane.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/FlipperInfoPane.java @@ -9,7 +9,7 @@ import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.renderer.GlStateManager; -import static io.github.moulberry.notenoughupdates.GuiTextures.*; +import static io.github.moulberry.notenoughupdates.util.GuiTextures.*; import static io.github.moulberry.notenoughupdates.itemeditor.GuiElementTextField.*; import java.awt.*; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/HTMLInfoPane.java b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/HTMLInfoPane.java index c03b98fb..9981e6f9 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/HTMLInfoPane.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/HTMLInfoPane.java @@ -8,7 +8,7 @@ import info.bliki.wiki.model.WikiModel; import info.bliki.wiki.tags.HTMLBlockTag; import info.bliki.wiki.tags.HTMLTag; import info.bliki.wiki.tags.IgnoreTag; -import io.github.moulberry.notenoughupdates.AllowEmptyHTMLTag; +import io.github.moulberry.notenoughupdates.util.AllowEmptyHTMLTag; import io.github.moulberry.notenoughupdates.NEUManager; import io.github.moulberry.notenoughupdates.NEUOverlay; import io.github.moulberry.notenoughupdates.util.Utils; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/ScrollableInfoPane.java b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/ScrollableInfoPane.java index 056aeaf1..12d42551 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/ScrollableInfoPane.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/ScrollableInfoPane.java @@ -1,8 +1,8 @@ package io.github.moulberry.notenoughupdates.infopanes; -import io.github.moulberry.notenoughupdates.util.LerpingInteger; import io.github.moulberry.notenoughupdates.NEUManager; import io.github.moulberry.notenoughupdates.NEUOverlay; +import io.github.moulberry.notenoughupdates.core.util.lerp.LerpingInteger; import org.lwjgl.input.Mouse; public abstract class ScrollableInfoPane extends InfoPane { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/SettingsInfoPane.java b/src/main/java/io/github/moulberry/notenoughupdates/infopanes/SettingsInfoPane.java deleted file mode 100644 index 4938770d..00000000 --- a/src/main/java/io/github/moulberry/notenoughupdates/infopanes/SettingsInfoPane.java +++ /dev/null @@ -1,851 +0,0 @@ -package io.github.moulberry.notenoughupdates.infopanes; - -import io.github.moulberry.notenoughupdates.BetterContainers; -import io.github.moulberry.notenoughupdates.NEUManager; -import io.github.moulberry.notenoughupdates.NEUOverlay; -import io.github.moulberry.notenoughupdates.NotEnoughUpdates; -import io.github.moulberry.notenoughupdates.util.SpecialColour; -import io.github.moulberry.notenoughupdates.util.Utils; -import io.github.moulberry.notenoughupdates.itemeditor.GuiElementTextField; -import io.github.moulberry.notenoughupdates.options.Options; -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.texture.DynamicTexture; -import net.minecraft.entity.item.EntityXPOrb; -import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.ResourceLocation; -import org.lwjgl.input.Keyboard; -import org.lwjgl.input.Mouse; -import org.lwjgl.opengl.GL11; -import scala.tools.cmd.Spec; - -import java.awt.*; -import java.awt.image.BufferedImage; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicReference; -import static io.github.moulberry.notenoughupdates.GuiTextures.*; - -public class SettingsInfoPane extends InfoPane { - - private int currentCategory = Options.CAT_ALL; - private final String[] CATEGORY_NAMES = {"All", "Misc", "Features", "Sliders", "Colours"}; - - private GuiElementTextField searchBar = new GuiElementTextField("", 0); - - private final Map<Options.Option<?>, GuiElementTextField> textConfigMap = new HashMap<>(); - private int page = 0; - private int maxPages = 1; - - private Options.Option clickedSlider = null; - private int clickedSliderX = 0; - private float clickedSliderMult = 0; - - private static final int colourEditorBG = new Color(80, 80, 80, 220).getRGB(); - private static ResourceLocation colourPickerLocation = new ResourceLocation("notenoughupdates:dynamic/colourpicker"); - private static ResourceLocation colourPickerBarValueLocation = new ResourceLocation("notenoughupdates:dynamic/colourpickervalue"); - private static ResourceLocation colourPickerBarOpacityLocation = new ResourceLocation("notenoughupdates:dynamic/colourpickeropacity"); - - private GuiElementTextField hexField = new GuiElementTextField("", - GuiElementTextField.SCALE_TEXT | GuiElementTextField.FORCE_CAPS | GuiElementTextField.NO_SPACE); - private ColourEditor activeColourEditor = null; - - private class ColourEditor { - public int x; - public int y; - public Options.Option<String> option; - public String special; - - public ColourEditor(int x, int y, Options.Option<String> option, String special) { - this.x = x; - this.y = y; - this.option = option; - this.special = special; - } - } - - public SettingsInfoPane(NEUOverlay overlay, NEUManager manager) { - super(overlay, manager); - } - - public void reset() { - textConfigMap.clear(); - activeColourEditor = null; - hexField.otherComponentClick(); - } - - private void showColourEditor(int mouseX, int mouseY, Options.Option<String> option, String special) { - activeColourEditor = new ColourEditor(mouseX, mouseY, option, special); - hexField.otherComponentClick(); - } - - public void render(int width, int height, Color bg, Color fg, ScaledResolution scaledResolution, int mouseX, - int mouseY) { - Utils.pushGuiScale(2); - - int widthN = Utils.peekGuiScale().getScaledWidth(); - int heightN = Utils.peekGuiScale().getScaledHeight(); - int mouseXN = Mouse.getX() * widthN / Minecraft.getMinecraft().displayWidth; - int mouseYN = heightN - Mouse.getY() * heightN / Minecraft.getMinecraft().displayHeight - 1; - - FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; - - int paneWidth = (int)(widthN/3*overlay.getWidthMult()); - int rightSide = (int)(widthN*overlay.getInfoPaneOffsetFactor()); - int leftSide = rightSide - paneWidth; - - this.renderDefaultBackground(widthN, heightN, bg); - - if(page > maxPages-1) page = maxPages-1; - if(page < 0) page = 0; - - overlay.renderNavElement(leftSide+overlay.getBoxPadding(), rightSide-overlay.getBoxPadding(), - maxPages,page+1,"Settings: "); - - int area = rightSide-leftSide-overlay.getBoxPadding()*2; - int categoryArea = (area-3*4)/5; - int ySize = overlay.getSearchBarYSize(); - int yStartCat = overlay.getBoxPadding()+overlay.getSearchBarYSize()+3; - for(int i=0; i<5; i++) { - boolean pressed = currentCategory == i; - drawRect(leftSide+overlay.getBoxPadding()+i*(categoryArea+3), yStartCat, - leftSide+overlay.getBoxPadding()+i*(categoryArea+3)+categoryArea, yStartCat+ySize, fg.getRGB()); - GlStateManager.color(1, 1, 1, 1); - Minecraft.getMinecraft().getTextureManager().bindTexture(rightarrow_overlay); - Utils.drawTexturedRect(leftSide+overlay.getBoxPadding()+i*(categoryArea+3), - yStartCat, categoryArea, ySize, pressed?0:1, pressed?1:0, pressed?0:1, pressed?1:0, GL11.GL_NEAREST); - - Utils.drawStringCenteredScaledMaxWidth(EnumChatFormatting.BOLD+CATEGORY_NAMES[i], - Minecraft.getMinecraft().fontRendererObj, - leftSide+overlay.getBoxPadding()+i*(categoryArea+3)+categoryArea/2f, - yStartCat+ySize/2f, false, categoryArea-6, 0); - } - - searchBar.setSize(area-5, ySize); - searchBar.setMaxStringLength(45); - searchBar.render(leftSide+overlay.getBoxPadding()+1, overlay.getBoxPadding()+overlay.getSearchBarYSize()*2+7); - - AtomicReference<List<String>> textToDisplay = new AtomicReference<>(null); - AtomicReference<GuiElementTextField> tfTop = new AtomicReference<>(); - AtomicInteger tfTopX = new AtomicInteger(); - AtomicInteger tfTopY = new AtomicInteger(); - iterateSettingTile(new SettingsTileConsumer() { - public void consume(int x, int y, int tileWidth, int tileHeight, Options.Option<?> option, Options.Button button) { - float mult = tileWidth/90f; - - drawRect(x+2, y+2, x+tileWidth-2, y+tileHeight-2, fg.getRGB()); - - Minecraft.getMinecraft().getTextureManager().bindTexture(setting_border); - GlStateManager.color(1, 1, 1, 1); - - Utils.drawTexturedRect(x, y, tileWidth, 5, 0, 1, 0, 5/75f, GL11.GL_NEAREST); - Utils.drawTexturedRect(x, y+tileHeight-5, tileWidth, 5, 0, 1, 70/75f, 1, GL11.GL_NEAREST); - Utils.drawTexturedRect(x, y+5, tileWidth, tileHeight-10, 0, 1, 5/75f, 70/75f, GL11.GL_NEAREST); - Utils.drawTexturedRect(x+5, y, tileWidth-10, tileHeight, 5/100f, 95/100f, 0, 1, GL11.GL_NEAREST); - - if(manager.config.hideApiKey.value && option==manager.config.apiKey) return; - - if(option == null) { - Utils.renderStringTrimWidth(button.displayName, fr, true, x+(int)(8*mult), y+(int)(8*mult), - tileWidth-(int)(16*mult), new Color(100,255,150).getRGB(), 3, - 2f/Utils.peekGuiScale().getScaleFactor()); - - GlStateManager.color(1f, 1f, 1f, 1f); - Minecraft.getMinecraft().getTextureManager().bindTexture(button_tex); - Utils.drawTexturedRect(x + tileWidth/2f - (int) (32 * mult), y + tileHeight - (int) (20 * mult), (int) (48 * mult), (int) (16 * mult)); - - Minecraft.getMinecraft().getTextureManager().bindTexture(help); - Utils.drawTexturedRect(x + tileWidth/2f + (int) (19 * mult), y + tileHeight - (int) (19 * mult), (int) (14 * mult), (int) (14 * mult)); - GlStateManager.bindTexture(0); - - if (mouseXN > x + tileWidth / 2 + (int) (19 * mult) && mouseXN < x + tileWidth / 2 + (int) (19 * mult) + (int) (14 * mult)) { - if (mouseYN > y + tileHeight - (int) (19 * mult) && mouseYN < y + tileHeight - (int) (19 * mult) + (int) (14 * mult)) { - List<String> textLines = new ArrayList<>(); - textLines.add(button.displayName); - textLines.add(EnumChatFormatting.GRAY + button.desc); - textToDisplay.set(textLines); - } - } - return; - } - - Utils.renderStringTrimWidth(option.displayName, fr, true, x+(int)(8*mult), y+(int)(8*mult), - tileWidth-(int)(16*mult), new Color(100,255,150).getRGB(), 3, - 2f/Utils.peekGuiScale().getScaleFactor()); - - if(option.value instanceof Boolean) { - GlStateManager.color(1f, 1f, 1f, 1f); - Minecraft.getMinecraft().getTextureManager().bindTexture(((Boolean) option.value) ? on : off); - Utils.drawTexturedRect(x + tileWidth/2f - (int) (32 * mult), y + tileHeight - (int) (20 * mult), (int) (48 * mult), (int) (16 * mult)); - - Minecraft.getMinecraft().getTextureManager().bindTexture(help); - Utils.drawTexturedRect(x + tileWidth/2f + (int) (19 * mult), y + tileHeight - (int) (19 * mult), (int) (14 * mult), (int) (14 * mult)); - GlStateManager.bindTexture(0); - - if (mouseXN > x + tileWidth / 2 + (int) (19 * mult) && mouseXN < x + tileWidth / 2 + (int) (19 * mult) + (int) (14 * mult)) { - if (mouseYN > y + tileHeight - (int) (19 * mult) && mouseYN < y + tileHeight - (int) (19 * mult) + (int) (14 * mult)) { - List<String> textLines = new ArrayList<>(); - textLines.add(option.displayName); - textLines.add(EnumChatFormatting.GRAY + option.desc); - textToDisplay.set(textLines); - } - } - } else if(option.value instanceof Double) { - if(!textConfigMap.containsKey(option)) { - textConfigMap.put(option, new GuiElementTextField(String.valueOf(option.value), - GuiElementTextField.NUM_ONLY | GuiElementTextField.NO_SPACE | GuiElementTextField.SCALE_TEXT)); - } - - GuiElementTextField tf = textConfigMap.get(option); - if(tf.getText().trim().endsWith(".0")) { - tf.setText(tf.getText().trim().substring(0, tf.getText().trim().length()-2)); - } - if(tf.getFocus()) { - tf.setSize(Math.max((int)(20*mult), fr.getStringWidth(tf.getText())+10), (int)(16*mult)); - tfTop.set(tf); - tfTopX.set(x+(int)(65*mult)); - tfTopY.set(y+tileHeight-(int)(20*mult)); - } else { - tf.setSize((int)(20*mult), (int)(16*mult)); - tf.render(x+(int)(65*mult), y+tileHeight-(int)(20*mult)); - } - - double sliderAmount = (((Options.Option<Double>)option).value-option.minValue)/(option.maxValue-option.minValue); - sliderAmount = Math.max(0, Math.min(1, sliderAmount)); - - GlStateManager.color(1f, 1f, 1f, 1f); - Minecraft.getMinecraft().getTextureManager().bindTexture(slider_on); - Utils.drawTexturedRect(x+5*mult, y + tileHeight-20*mult, (float)(54*mult*sliderAmount), 16*mult, - 0, (float)sliderAmount, 0, 1); - - Minecraft.getMinecraft().getTextureManager().bindTexture(slider_off); - Utils.drawTexturedRect((float)(x+5*mult+54*mult*sliderAmount), y + tileHeight - 20*mult, - (float)(54*mult*(1-sliderAmount)), 16*mult, - (float)(sliderAmount), 1, 0, 1); - - Minecraft.getMinecraft().getTextureManager().bindTexture(slider_button); - Utils.drawTexturedRect(x+1*mult+(float)(54*sliderAmount*mult), y + tileHeight - 20*mult, - 8*mult, 16*mult); - } else { - if((option.flags & Options.FLAG_COLOUR) != 0) { - Utils.renderStringTrimWidth(option.displayName, fr, true, x+(int)(8*mult), y+(int)(8*mult), - tileWidth-(int)(16*mult), new Color(100,255,150).getRGB(), 3, - 2f/Utils.peekGuiScale().getScaleFactor()); - - Color c = new Color(SpecialColour.specialToChromaRGB((String)option.value)); - GlStateManager.color( - Math.min(1f, c.getRed()/255f), - Math.min(1f, c.getGreen()/255f), - Math.min(1f, c.getBlue()/255f), 1f); - Minecraft.getMinecraft().getTextureManager().bindTexture(button_white); - Utils.drawTexturedRect(x + tileWidth/2f - (int) (32 * mult), y + tileHeight - (int) (20 * mult), (int) (48 * mult), (int) (16 * mult)); - - GlStateManager.color(1, 1, 1, 1); - Minecraft.getMinecraft().getTextureManager().bindTexture(help); - Utils.drawTexturedRect(x + tileWidth/2f + (int) (19 * mult), y + tileHeight - (int) (19 * mult), (int) (14 * mult), (int) (14 * mult)); - GlStateManager.bindTexture(0); - - if (mouseXN > x + tileWidth / 2 + (int) (19 * mult) && mouseXN < x + tileWidth / 2 + (int) (19 * mult) + (int) (14 * mult)) { - if (mouseYN > y + tileHeight - (int) (19 * mult) && mouseYN < y + tileHeight - (int) (19 * mult) + (int) (14 * mult)) { - List<String> textLines = new ArrayList<>(); - textLines.add(option.displayName); - textLines.add(EnumChatFormatting.GRAY + option.desc); - textToDisplay.set(textLines); - } - } - } else { - if(!textConfigMap.containsKey(option)) { - textConfigMap.put(option, new GuiElementTextField(String.valueOf(option.value), 0)); - } - GuiElementTextField tf = textConfigMap.get(option); - if(tf.getFocus()) { - tf.setSize(Math.max(tileWidth-(int)(20*mult), fr.getStringWidth(tf.getText())+10), (int)(16*mult)); - tfTop.set(tf); - tfTopX.set(x+(int)(10*mult)); - tfTopY.set(y+tileHeight-(int)(20*mult)); - } else { - tf.setSize(tileWidth-(int)(20*mult), (int)(16*mult)); - tf.render(x+(int)(10*mult), y+tileHeight-(int)(20*mult)); - } - } - } - } - }); - if(tfTop.get() != null) { - tfTop.get().render(tfTopX.get(), tfTopY.get()); - } - - if(activeColourEditor != null) { - Gui.drawRect(activeColourEditor.x, activeColourEditor.y, activeColourEditor.x+119, activeColourEditor.y+89, colourEditorBG); - - int currentColour = SpecialColour.specialToSimpleRGB(activeColourEditor.special); - Color c = new Color(currentColour, true); - float[] hsv = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); - - BufferedImage bufferedImage = new BufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB); - for(int x=0; x<256; x++) { - for(int y=0; y<256; y++) { - float radius = (float) Math.sqrt(((x-128)*(x-128)+(y-128)*(y-128))/16384f); - float angle = (float) Math.toDegrees(Math.atan((128-x)/(y-128+1E-5))+Math.PI/2); - if(y < 128) angle += 180; - if(radius <= 1) { - int rgb = Color.getHSBColor(angle/360f, (float)Math.pow(radius, 1.5f), hsv[2]).getRGB(); - bufferedImage.setRGB(x, y, rgb); - } - } - } - - BufferedImage bufferedImageValue = new BufferedImage(10, 64, BufferedImage.TYPE_INT_ARGB); - for(int x=0; x<10; x++) { - for(int y=0; y<64; y++) { - if((x == 0 || x == 9) && (y == 0 || y == 63)) continue; - - int rgb = Color.getHSBColor(hsv[0], hsv[1], (64-y)/64f).getRGB(); - bufferedImageValue.setRGB(x, y, rgb); - } - } - - BufferedImage bufferedImageOpacity = new BufferedImage(10, 64, BufferedImage.TYPE_INT_ARGB); - for(int x=0; x<10; x++) { - for(int y=0; y<64; y++) { - if((x == 0 || x == 9) && (y == 0 || y == 63)) continue; - - int rgb = (currentColour & 0x00FFFFFF) | (Math.min(255, (64-y)*4) << 24); - bufferedImageOpacity.setRGB(x, y, rgb); - } - } - - float selradius = (float) Math.pow(hsv[1], 1/1.5f)*32; - int selx = (int)(Math.cos(Math.toRadians(hsv[0]*360))*selradius); - int sely = (int)(Math.sin(Math.toRadians(hsv[0]*360))*selradius); - - Minecraft.getMinecraft().getTextureManager().bindTexture(colour_selector_bar_alpha); - GlStateManager.color(1, 1, 1, 1); - Utils.drawTexturedRect(activeColourEditor.x+5+64+5+10+5, activeColourEditor.y+5, 10, 64, GL11.GL_NEAREST); - - Minecraft.getMinecraft().getTextureManager().loadTexture(colourPickerBarValueLocation, new DynamicTexture(bufferedImageValue)); - Minecraft.getMinecraft().getTextureManager().bindTexture(colourPickerBarValueLocation); - GlStateManager.color(1, 1, 1, 1); - Utils.drawTexturedRect(activeColourEditor.x+5+64+5, activeColourEditor.y+5, 10, 64, GL11.GL_NEAREST); - - Minecraft.getMinecraft().getTextureManager().loadTexture(colourPickerBarOpacityLocation, new DynamicTexture(bufferedImageOpacity)); - Minecraft.getMinecraft().getTextureManager().bindTexture(colourPickerBarOpacityLocation); - GlStateManager.color(1, 1, 1, 1); - Utils.drawTexturedRect(activeColourEditor.x+5+64+5+10+5, activeColourEditor.y+5, 10, 64, GL11.GL_NEAREST); - - int chromaSpeed = SpecialColour.getSpeed(activeColourEditor.special); - int currentColourChroma = SpecialColour.specialToChromaRGB(activeColourEditor.special); - Color cChroma = new Color(currentColourChroma, true); - float hsvChroma[] = Color.RGBtoHSB(cChroma.getRed(), cChroma.getGreen(), cChroma.getBlue(), null); - - if(chromaSpeed > 0) { - Gui.drawRect(activeColourEditor.x+5+64+5+10+5+10+5+1, activeColourEditor.y+5+1, - activeColourEditor.x+5+64+5+10+5+10+5+10-1, activeColourEditor.y+5+64-1, - Color.HSBtoRGB(hsvChroma[0], 0.8f, 0.8f)); - } else { - Gui.drawRect(activeColourEditor.x+5+64+5+10+5+10+5+1, activeColourEditor.y+5+27+1, - activeColourEditor.x+5+64+5+10+5+10+5+10-1, activeColourEditor.y+5+37-1, - Color.HSBtoRGB((hsvChroma[0]+(System.currentTimeMillis()-SpecialColour.startTime)/1000f)%1, 0.8f, 0.8f)); - } - - Minecraft.getMinecraft().getTextureManager().bindTexture(colour_selector_bar); - GlStateManager.color(1, 1, 1, 1); - Utils.drawTexturedRect(activeColourEditor.x+5+64+5, activeColourEditor.y+5, 10, 64, GL11.GL_NEAREST); - Utils.drawTexturedRect(activeColourEditor.x+5+64+5+10+5, activeColourEditor.y+5, 10, 64, GL11.GL_NEAREST); - - if(chromaSpeed > 0) { - Utils.drawTexturedRect(activeColourEditor.x+5+64+5+10+5+10+5, activeColourEditor.y+5, 10, 64, GL11.GL_NEAREST); - } else { - Minecraft.getMinecraft().getTextureManager().bindTexture(colour_selector_chroma); - Utils.drawTexturedRect(activeColourEditor.x+5+64+5+10+5+10+5, activeColourEditor.y+5+27, 10, 10, GL11.GL_NEAREST); - } - - Gui.drawRect(activeColourEditor.x+5+64+5, activeColourEditor.y+5+64-(int)(64*hsv[2]), - activeColourEditor.x+5+64+5+10, activeColourEditor.y+5+64-(int)(64*hsv[2])+1, 0xFF000000); - Gui.drawRect(activeColourEditor.x+5+64+5+10+5, activeColourEditor.y+5+64-c.getAlpha()/4, - activeColourEditor.x+5+64+5+10+5+10, activeColourEditor.y+5+64-c.getAlpha()/4-1, 0xFF000000); - if(chromaSpeed > 0) { - Gui.drawRect(activeColourEditor.x+5+64+5+10+5+10+5, - activeColourEditor.y+5+64-(int)(chromaSpeed/255f*64), - activeColourEditor.x+5+64+5+10+5+10+5+10, - activeColourEditor.y+5+64-(int)(chromaSpeed/255f*64)+1, 0xFF000000); - } - - Minecraft.getMinecraft().getTextureManager().loadTexture(colourPickerLocation, new DynamicTexture(bufferedImage)); - Minecraft.getMinecraft().getTextureManager().bindTexture(colourPickerLocation); - GlStateManager.color(1, 1, 1, 1); - Utils.drawTexturedRect(activeColourEditor.x+5, activeColourEditor.y+5, 64, 64, GL11.GL_NEAREST); - - Minecraft.getMinecraft().getTextureManager().bindTexture(colour_selector_dot); - GlStateManager.color(1, 1, 1, 1); - Utils.drawTexturedRect(activeColourEditor.x+5+32+selx-4, activeColourEditor.y+5+32+sely-4, 8, 8, GL11.GL_NEAREST); - - Utils.drawStringCenteredScaledMaxWidth(EnumChatFormatting.GRAY.toString()+Math.round(hsv[2]*100)+"", - Minecraft.getMinecraft().fontRendererObj, - activeColourEditor.x+5+64+5+5-(Math.round(hsv[2]*100)==100?1:0), activeColourEditor.y+5+64+5+5, true, 13, -1); - Utils.drawStringCenteredScaledMaxWidth(EnumChatFormatting.GRAY.toString()+Math.round(c.getAlpha()/255f*100)+"", - Minecraft.getMinecraft().fontRendererObj, - activeColourEditor.x+5+64+5+15+5, activeColourEditor.y+5+64+5+5, true, 13, -1); - if(chromaSpeed > 0) { - Utils.drawStringCenteredScaledMaxWidth(EnumChatFormatting.GRAY.toString()+(int)SpecialColour.getSecondsForSpeed(chromaSpeed)+"s", - Minecraft.getMinecraft().fontRendererObj, - activeColourEditor.x+5+64+5+30+6, activeColourEditor.y+5+64+5+5, true, 13, -1); - } - - hexField.setSize(48, 10); - if(!hexField.getFocus()) hexField.setText(Integer.toHexString(c.getRGB() & 0xFFFFFF).toUpperCase()); - - StringBuilder sb = new StringBuilder(EnumChatFormatting.GRAY+"#"); - for(int i=0; i<6-hexField.getText().length(); i++) { - sb.append("0"); - } - sb.append(EnumChatFormatting.WHITE); - - hexField.setPrependText(sb.toString()); - hexField.render(activeColourEditor.x+5+8, activeColourEditor.y+5+64+5); - } - - if(textToDisplay.get() != null) { - Utils.drawHoveringText(textToDisplay.get(), mouseXN, mouseYN, widthN, heightN, 200, fr); - } - - Utils.pushGuiScale(-1); - } - - private void onTextfieldChange(GuiElementTextField tf, Options.Option<?> option) { - try { - tf.setCustomBorderColour(-1); - option.setValue(tf.getText()); - overlay.redrawItems(); - BetterContainers.reset(); - } catch(Exception e) { - tf.setCustomBorderColour(Color.RED.getRGB()); - } - } - - @Override - public void mouseInputOutside() { - for(GuiElementTextField tf : textConfigMap.values()) { - tf.otherComponentClick(); - } - activeColourEditor = null; - hexField.otherComponentClick(); - searchBar.otherComponentClick(); - } - - public void mouseInput(int width, int height, int mouseX, int mouseY, boolean mouseDown) { - Utils.pushGuiScale(2); - - int widthN = Utils.peekGuiScale().getScaledWidth(); - int heightN = Utils.peekGuiScale().getScaledHeight(); - int mouseXN = Mouse.getX() * widthN / Minecraft.getMinecraft().displayWidth; - int mouseYN = heightN - Mouse.getY() * heightN / Minecraft.getMinecraft().displayHeight - 1; - - int paneWidth = (int)(widthN/3*overlay.getWidthMult()); - int rightSide = (int)(widthN*overlay.getInfoPaneOffsetFactor()); - int leftSide = rightSide - paneWidth; - - int area = rightSide-leftSide-overlay.getBoxPadding()*2; - int categoryArea = (area-3*4)/5; - int ySize = overlay.getSearchBarYSize(); - int yStartCat = overlay.getBoxPadding()+overlay.getSearchBarYSize()+3; - for(int i=0; i<5; i++) { - if(mouseDown && mouseXN > leftSide + overlay.getBoxPadding() + i * (categoryArea + 3) && - mouseXN < leftSide + overlay.getBoxPadding() + i * (categoryArea + 3) + categoryArea && - mouseYN > yStartCat && mouseYN < yStartCat + ySize) { - currentCategory = i; - searchBar.otherComponentClick(); - Utils.pushGuiScale(-1); - return; - } - } - - if(mouseDown) { - if(mouseXN > leftSide+overlay.getBoxPadding() && mouseXN < leftSide+overlay.getBoxPadding()+area-3) { - if(mouseYN > overlay.getBoxPadding()+overlay.getSearchBarYSize()*2+7 && - mouseYN < overlay.getBoxPadding()+overlay.getSearchBarYSize()*2+7+ySize) { - searchBar.mouseClicked(mouseXN, mouseYN, Mouse.getEventButton()); - Utils.pushGuiScale(-1); - return; - } - } - searchBar.otherComponentClick(); - } - - if(activeColourEditor != null && (Mouse.isButtonDown(0) || Mouse.isButtonDown(1))) { - if(mouseXN >= activeColourEditor.x && mouseXN <= activeColourEditor.x+119) { - if(mouseYN >= activeColourEditor.y && mouseYN <= activeColourEditor.y+89) { - if(Mouse.getEventButtonState()) { - if(mouseXN > activeColourEditor.x+5+8 && mouseXN < activeColourEditor.x+5+8+48) { - if(mouseYN > activeColourEditor.y+5+64+5 && mouseYN < activeColourEditor.y+5+64+5+10) { - hexField.mouseClicked(mouseXN, mouseYN, Mouse.getEventButton()); - Utils.pushGuiScale(-1); - return; - } - } - } - hexField.otherComponentClick(); - - int currentColour = SpecialColour.specialToSimpleRGB(activeColourEditor.special); - Color c = new Color(currentColour, true); - float[] hsv = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null); - - int xWheel = mouseXN - activeColourEditor.x - 5; - int yWheel = mouseYN - activeColourEditor.y - 5; - - if(xWheel > 0 && xWheel < 64) { - if(yWheel > 0 && yWheel < 64) { - float radius = (float) Math.sqrt(((xWheel-32)*(xWheel-32)+(yWheel-32)*(yWheel-32))/1024f); - float angle = (float) Math.toDegrees(Math.atan((32-xWheel)/(yWheel-32+1E-5))+Math.PI/2); - if(yWheel < 32) angle += 180; - - int rgb = Color.getHSBColor(angle/360f, (float)Math.pow(Math.min(1, radius), 1.5f), hsv[2]).getRGB(); - activeColourEditor.special = SpecialColour.special(SpecialColour.getSpeed(activeColourEditor.special), c.getAlpha(), rgb); - activeColourEditor.option.value = (String) activeColourEditor.special; - } - } - - int xValue = mouseXN - (activeColourEditor.x+5+64+5); - int y = mouseYN - activeColourEditor.y - 5; - - if(y > -5 && y <= 69) { - y = Math.max(0, Math.min(64, y)); - if(xValue > 0 && xValue < 10) { - int rgb = Color.getHSBColor(hsv[0], hsv[1], 1-y/64f).getRGB(); - activeColourEditor.special = SpecialColour.special(SpecialColour.getSpeed(activeColourEditor.special), c.getAlpha(), rgb); - activeColourEditor.option.value = activeColourEditor.special; - } - - int xOpacity = mouseXN - (activeColourEditor.x+5+64+5+10+5); - - if(xOpacity > 0 && xOpacity < 10) { - activeColourEditor.special = SpecialColour.special(SpecialColour.getSpeed(activeColourEditor.special), - 255-(int)(y/64f*255), currentColour); - activeColourEditor.option.value = activeColourEditor.special; - } - } - - int chromaSpeed = SpecialColour.getSpeed(activeColourEditor.special); - - int xChroma = mouseXN - (activeColourEditor.x+5+64+5+10+5+10+5); - if(xChroma > 0 && xChroma < 10) { - if(chromaSpeed > 0) { - if(y > -5 && y <= 69) { - y = Math.max(0, Math.min(64, y)); - activeColourEditor.special = SpecialColour.special(255-Math.round(y/64f*255), c.getAlpha(), currentColour); - activeColourEditor.option.value = activeColourEditor.special; - } - } else if(mouseYN > activeColourEditor.y+5+27 && mouseYN < activeColourEditor.y+5+37) { - activeColourEditor.special = SpecialColour.special(200, c.getAlpha(), currentColour); - activeColourEditor.option.value = activeColourEditor.special; - } - } - - Utils.pushGuiScale(-1); - return; - } - } - if(Mouse.getEventButtonState()) activeColourEditor = null; - } - iterateSettingTile(new SettingsTileConsumer() { - @Override - public void consume(int x, int y, int tileWidth, int tileHeight, Options.Option<?> option, Options.Button button) { - float mult = tileWidth/90f; - if(option == null) { - if(Mouse.getEventButtonState()) { - if(mouseXN > x+tileWidth/2-(int)(32*mult) && mouseXN < x+tileWidth/2-(int)(32*mult)+(int)(48*mult)) { - if(mouseYN > y+tileHeight-(int)(20*mult) && mouseYN < y+tileHeight-(int)(20*mult)+(int)(16*mult)) { - button.click.run(); - Utils.pushGuiScale(-1); - return; - } - } - } - } else if(option.value instanceof Boolean) { - if(Mouse.getEventButtonState()) { - if(mouseXN > x+tileWidth/2-(int)(32*mult) && mouseXN < x+tileWidth/2-(int)(32*mult)+(int)(48*mult)) { - if(mouseYN > y+tileHeight-(int)(20*mult) && mouseYN < y+tileHeight-(int)(20*mult)+(int)(16*mult)) { - ((Options.Option<Boolean>)option).value = !((Boolean)option.value); - overlay.redrawItems(); - Utils.pushGuiScale(-1); - return; - } - } - } - } else if(option.value instanceof Double) { - if(!textConfigMap.containsKey(option)) { - textConfigMap.put(option, new GuiElementTextField(String.valueOf(option.value), - GuiElementTextField.NUM_ONLY | GuiElementTextField.NO_SPACE | GuiElementTextField.SCALE_TEXT)); - } - - GuiElementTextField tf = textConfigMap.get(option); - int tfX = x+(int)(65*mult); - int tfY = y+tileHeight-(int)(20*mult); - int tfWidth = tf.getWidth(); - int tfHeight = tf.getHeight(); - if(mouseYN > tfY && mouseYN < tfY+tfHeight) { - if(mouseXN > tfX && mouseXN < tfX+tfWidth) { - if(Mouse.getEventButtonState()) { - tf.mouseClicked(mouseXN, mouseYN, Mouse.getEventButton()); - onTextfieldChange(tf, option); - Utils.pushGuiScale(-1); - return; - } else if(Mouse.getEventButton() == -1 && mouseDown) { - tf.mouseClickMove(mouseXN, mouseYN, 0, 0); //last 2 values are unused - Utils.pushGuiScale(-1); - return; - } - } else if(clickedSlider != option && Mouse.getEventButtonState() && mouseXN > x+1*mult && mouseXN < x+63*mult) { - clickedSlider = option; - clickedSliderX = x; - clickedSliderMult = mult; - } - } - - if(clickedSlider == option) { - float xMin = clickedSliderX+5*clickedSliderMult; - float xMax = clickedSliderX+59*clickedSliderMult; - - float sliderAmount = (mouseXN - xMin)/(xMax - xMin); - sliderAmount = Math.max(0, Math.min(1, sliderAmount)); - - double range = option.maxValue - option.minValue; - double value = option.minValue + sliderAmount*range; - - if(range >= 10 || (option.flags & Options.FLAG_INT) != 0) { - value = Math.round(value); - } else if(range >= 1) { - value = Math.round(value*10)/10.0; - } else { - value = Math.round(value*100)/100.0; - } - - value = Math.max(option.minValue, Math.min(option.maxValue, value)); - - tf.setText(String.valueOf(value)); - onTextfieldChange(tf, option); - - if(Mouse.getEventButton() == 0 && !Mouse.getEventButtonState()) { - clickedSlider = null; - } - } - - if(Mouse.getEventButtonState()) tf.otherComponentClick(); - } else { - if((option.flags & Options.FLAG_COLOUR) != 0) { - if(Mouse.getEventButtonState()) { - if(mouseXN > x+tileWidth/2-(int)(32*mult) && mouseXN < x+tileWidth/2-(int)(32*mult)+(int)(48*mult)) { - if(mouseYN > y+tileHeight-(int)(20*mult) && mouseYN < y+tileHeight-(int)(20*mult)+(int)(16*mult)) { - int editorX = (int)Math.min(mouseXN, widthN*overlay.getInfoPaneOffsetFactor()-129); - int editorY = Math.min(mouseYN, heightN-99); - showColourEditor(editorX, editorY, (Options.Option<String>) option, (String)option.value); - Utils.pushGuiScale(-1); - return; - } - } - } - } else { - if(!textConfigMap.containsKey(option)) { - textConfigMap.put(option, new GuiElementTextField(String.valueOf(option.value), 0)); - } - GuiElementTextField tf = textConfigMap.get(option); - int tfX = x+(int)(10*mult); - int tfY = y+tileHeight-(int)(20*mult); - int tfWidth = tf.getWidth(); - int tfHeight = tf.getHeight(); - if(mouseXN > tfX && mouseXN < tfX+tfWidth) { - if(mouseYN > tfY && mouseYN < tfY+tfHeight) { - if(Mouse.getEventButtonState()) { - tf.mouseClicked(mouseXN, mouseYN, Mouse.getEventButton()); - onTextfieldChange(tf, option); - Utils.pushGuiScale(-1); - return; - } else if(Mouse.getEventButton() == -1 && mouseDown) { - tf.mouseClickMove(mouseXN, mouseYN, 0, 0); //last 2 values are unused - Utils.pushGuiScale(-1); - return; - } - } - } - if(Mouse.getEventButtonState()) tf.otherComponentClick(); - } - } - } - }); - - if(Mouse.getEventButtonState()) { - rightSide -= overlay.getBoxPadding(); - leftSide += overlay.getBoxPadding(); - - FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; - float maxStrLen = fr.getStringWidth(EnumChatFormatting.BOLD+"Settings: " + maxPages + "/" + maxPages); - float maxButtonXSize = (rightSide-leftSide+2 - maxStrLen*0.5f - 10)/2f; - int buttonXSize = (int)Math.min(maxButtonXSize, overlay.getSearchBarYSize()*480/160f); - int ySize2 = (int)(buttonXSize/480f*160); - int yOffset = (int)((overlay.getSearchBarYSize()-ySize2)/2f); - int top = overlay.getBoxPadding()+yOffset; - - if(mouseYN >= top && mouseYN <= top+ySize2) { - int leftPrev = leftSide-1; - if(mouseXN > leftPrev && mouseXN < leftPrev+buttonXSize) { //"Previous" button - page--; - } - int leftNext = rightSide+1-buttonXSize; - if(mouseXN > leftNext && mouseXN < leftNext+buttonXSize) { //"Next" button - page++; - } - } - } - - Utils.pushGuiScale(-1); - } - - public boolean keyboardInput() { - if(searchBar.getFocus()) { - searchBar.keyTyped(Keyboard.getEventCharacter(), Keyboard.getEventKey()); - return true; - } - - AtomicBoolean ret = new AtomicBoolean(false); - iterateSettingTile(new SettingsTileConsumer() { - @Override - public void consume(int x, int y, int tileWidth, int tileHeight, Options.Option<?> option, Options.Button button) { - if(option == null) return; - - if(!textConfigMap.containsKey(option)) { - return; - } - GuiElementTextField tf = textConfigMap.get(option); - - if(!(option.value instanceof Boolean)) { - if(tf.getFocus()) { - tf.keyTyped(Keyboard.getEventCharacter(), Keyboard.getEventKey()); - onTextfieldChange(tf, option); - ret.set(true); - } - } - } - }); - if(activeColourEditor != null && hexField.getFocus()) { - String old = hexField.getText(); - - hexField.keyTyped(Keyboard.getEventCharacter(), Keyboard.getEventKey()); - - if(hexField.getText().length() > 6) { - hexField.setText(old); - } else { - try { - String text = hexField.getText().toLowerCase(); - - int rgb = Integer.parseInt(text, 16); - int alpha = (SpecialColour.specialToSimpleRGB(activeColourEditor.special) >> 24) & 0xFF; - activeColourEditor.special = SpecialColour.special(SpecialColour.getSpeed(activeColourEditor.special), alpha, rgb); - activeColourEditor.option.value = activeColourEditor.special; - } catch(Exception e) {}; - } - } - return ret.get(); - } - - private abstract static class SettingsTileConsumer { - public abstract void consume(int x, int y, int tileWidth, int tileHeight, Options.Option<?> option, Options.Button button); - } - - public void iterateSettingTile(SettingsTileConsumer settingsTileConsumer) { - ScaledResolution scaledresolution = Utils.pushGuiScale(2); - int width = scaledresolution.getScaledWidth(); - int height = scaledresolution.getScaledHeight(); - - int numHorz = scaledresolution.getScaleFactor() >= 3 ? 2 : 3; - - int paneWidth = (int)(width/3*overlay.getWidthMult()); - int rightSide = (int)(width*overlay.getInfoPaneOffsetFactor()); - int leftSide = rightSide - paneWidth; - - int padding = overlay.getBoxPadding(); - - int boxLeft = leftSide+padding-5; - int boxRight = rightSide-padding+5; - - int boxBottom = height - padding + 5; - - int boxWidth = boxRight-boxLeft; - int tilePadding = 7; - int tileWidth = (boxWidth-tilePadding*4)/numHorz; - int tileHeight = tileWidth*3/4; - - int top = tilePadding+padding+overlay.getSearchBarYSize()*3+3*2; - int bottom = height - padding; - int leftover = (bottom-top)%(tileHeight+tilePadding); - - top += leftover/2; - - maxPages=1; - int currPage=0; - int x=0; - int y=top; - int tileCount = 0; - out: - for(int i=0; i<manager.config.getOptions().size()+manager.config.getButtons().size(); i++) { - if(i < manager.config.getButtons().size()) { - if(currentCategory != Options.CAT_ALL || searchBar.getText().trim().length() != 0) { - continue; - } - } else { - Options.Option<?> option = manager.config.getOptions().get(i-manager.config.getButtons().size()); - if(searchBar.getText().trim().length() != 0) { - for(String s : searchBar.getText().split(" ")) { - s = s.replaceAll("[^A-Za-z]", "").toLowerCase(); - boolean contains = false; - for(String tag : option.tags) { - if(tag.contains(s)) { - contains = true; - break; - } - } - if(!contains) { - continue out; - } - } - } - if(currentCategory != Options.CAT_ALL && currentCategory != option.category) { - continue; - } - } - - if(tileCount != 0 && tileCount % numHorz == 0) { - x = 0; - y += tileHeight+tilePadding; - } - if(y + tileHeight > boxBottom) { - x=0; - y=top; - currPage++; - maxPages = currPage+1; - } - x+=tilePadding; - - if(currPage == page) { - if(i < manager.config.getButtons().size()) { - settingsTileConsumer.consume(boxLeft+x, y, tileWidth, tileHeight, - null, manager.config.getButtons().get(i)); - } else { - settingsTileConsumer.consume(boxLeft+x, y, tileWidth, tileHeight, - manager.config.getOptions().get(i-manager.config.getButtons().size()), null); - } - } - - tileCount++; - x+=tileWidth; - } - - Utils.pushGuiScale(-1); - } -} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/NEUItemEditor.java b/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/NEUItemEditor.java index 1d67b8c4..37ffc938 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/NEUItemEditor.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/itemeditor/NEUItemEditor.java @@ -2,8 +2,8 @@ package io.github.moulberry.notenoughupdates.itemeditor; import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import io.github.moulberry.notenoughupdates.util.LerpingInteger; import io.github.moulberry.notenoughupdates.NEUManager; +import io.github.moulberry.notenoughupdates.core.util.lerp.LerpingInteger; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.*; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBGuiGroupFloating.java b/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBGuiGroupFloating.java index 293fc241..8a972f78 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBGuiGroupFloating.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mbgui/MBGuiGroupFloating.java @@ -1,6 +1,6 @@ package io.github.moulberry.notenoughupdates.mbgui; -import io.github.moulberry.notenoughupdates.GuiItemRecipe; +import io.github.moulberry.notenoughupdates.miscgui.GuiItemRecipe; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.auction.CustomAHGui; import io.github.moulberry.notenoughupdates.util.Utils; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/BetterContainers.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/BetterContainers.java index 02ff2164..2b682e4f 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/BetterContainers.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/BetterContainers.java @@ -1,6 +1,7 @@ -package io.github.moulberry.notenoughupdates; +package io.github.moulberry.notenoughupdates.miscfeatures; import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.util.TexLoc; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; @@ -10,6 +11,7 @@ import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.texture.DynamicTexture; import net.minecraft.client.renderer.texture.TextureManager; import net.minecraft.init.Blocks; +import net.minecraft.init.Items; import net.minecraft.inventory.Container; import net.minecraft.inventory.ContainerChest; import net.minecraft.inventory.IInventory; @@ -122,6 +124,7 @@ public class BetterContainers { public static boolean isBlankStack(ItemStack stack) { return stack != null && stack.getItem() == Item.getItemFromBlock(Blocks.stained_glass_pane) && + stack.getItemDamage() == 15 && stack.getDisplayName() != null && stack.getDisplayName().trim().isEmpty(); } @@ -167,7 +170,7 @@ public class BetterContainers { Container container = ((GuiChest)Minecraft.getMinecraft().currentScreen).inventorySlots; if(hasNullPane() && container instanceof ContainerChest) { - int backgroundStyle = NotEnoughUpdates.INSTANCE.manager.config.dynamicMenuBackgroundStyle.value.intValue(); + int backgroundStyle = NotEnoughUpdates.INSTANCE.config.improvedSBMenu.backgroundStyle+1; backgroundStyle = Math.max(1, Math.min(10, backgroundStyle)); try(BufferedReader reader = new BufferedReader(new InputStreamReader(Minecraft.getMinecraft().getResourceManager().getResource( new ResourceLocation("notenoughupdates:dynamic_54/style"+ backgroundStyle+"/dynamic_config.json")).getInputStream(), StandardCharsets.UTF_8))) { @@ -189,14 +192,14 @@ public class BetterContainers { } catch(Exception e) {} BufferedImage bufferedImageSlot = ImageIO.read(Minecraft.getMinecraft().getResourceManager().getResource(DYNAMIC_54_SLOT).getInputStream()); try { - int buttonStyle = NotEnoughUpdates.INSTANCE.manager.config.dynamicMenuButtonStyle.value.intValue(); + int buttonStyle = NotEnoughUpdates.INSTANCE.config.improvedSBMenu.buttonStyle+1; buttonStyle = Math.max(1, Math.min(10, buttonStyle)); bufferedImageSlot = ImageIO.read(Minecraft.getMinecraft().getResourceManager().getResource( new ResourceLocation("notenoughupdates:dynamic_54/style"+buttonStyle+"/dynamic_54_slot_ctm.png")).getInputStream()); } catch(Exception e) {} BufferedImage bufferedImageButton = ImageIO.read(Minecraft.getMinecraft().getResourceManager().getResource(DYNAMIC_54_BUTTON).getInputStream()); try { - int buttonStyle = NotEnoughUpdates.INSTANCE.manager.config.dynamicMenuButtonStyle.value.intValue(); + int buttonStyle = NotEnoughUpdates.INSTANCE.config.improvedSBMenu.buttonStyle+1; buttonStyle = Math.max(1, Math.min(10, buttonStyle)); bufferedImageButton = ImageIO.read(Minecraft.getMinecraft().getResourceManager().getResource( new ResourceLocation("notenoughupdates:dynamic_54/style"+buttonStyle+"/dynamic_54_button_ctm.png")).getInputStream()); @@ -213,13 +216,26 @@ public class BetterContainers { int size = lower.getSizeInventory(); boolean[][] slots = new boolean[9][size/9]; boolean[][] buttons = new boolean[9][size/9]; + + boolean ultrasequencer = lower.getDisplayName().getUnformattedText().startsWith("Ultrasequencer") && + !lower.getDisplayName().getUnformattedText().contains("Stakes"); + boolean superpairs = lower.getDisplayName().getUnformattedText().startsWith("Superpairs") && + !lower.getDisplayName().getUnformattedText().contains("Stakes"); for (int index = 0; index < size; index++) { ItemStack stack = getStackCached(lower, index); buttons[index%9][index/9] = isButtonStack(stack); - if(buttons[index%9][index/9] && lastClickedSlot == index) { + if(ultrasequencer && stack.getItem() == Items.dye) { + buttons[index%9][index/9] = false; + } + + if(superpairs && index > 9 && index < size-9) { buttons[index%9][index/9] = false; - slots[index%9][index/9] = true; + } + + if(buttons[index%9][index/9] && lastClickedSlot == index) { + //buttons[index%9][index/9] = false; + //slots[index%9][index/9] = true; } else { slots[index%9][index/9] = !isBlankStack(stack) && !buttons[index%9][index/9]; } @@ -301,8 +317,7 @@ public class BetterContainers { private static boolean isChestOpen() { return Minecraft.getMinecraft().currentScreen instanceof GuiChest && NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard() && - (NotEnoughUpdates.INSTANCE.manager.config.dynamicMenuBackgroundStyle.value >= 1 && - NotEnoughUpdates.INSTANCE.manager.config.dynamicMenuButtonStyle.value >= 1); + NotEnoughUpdates.INSTANCE.config.improvedSBMenu.enableSbMenus; } private static boolean hasItem() { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/CustomItemEffects.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CustomItemEffects.java index 796d630c..763da0b5 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/CustomItemEffects.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CustomItemEffects.java @@ -1,35 +1,29 @@ -package io.github.moulberry.notenoughupdates; +package io.github.moulberry.notenoughupdates.miscfeatures; +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.util.SpecialColour; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.block.Block; import net.minecraft.block.material.Material; -import net.minecraft.block.state.BlockState; import net.minecraft.block.state.IBlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.renderer.texture.TextureUtil; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.resources.model.IBakedModel; -import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompressedStreamTools; -import net.minecraft.nbt.NBTTagByteArray; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.*; import net.minecraftforge.client.event.DrawBlockHighlightEvent; -import net.minecraftforge.client.event.EntityViewRenderEvent; -import net.minecraftforge.client.event.RenderBlockOverlayEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.fml.common.Loader; @@ -37,11 +31,9 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; import org.lwjgl.opengl.GL11; import org.lwjgl.util.vector.Vector3f; -import scala.tools.cmd.Spec; import java.awt.*; import java.io.ByteArrayInputStream; -import java.io.IOException; import java.util.*; import java.util.List; @@ -52,6 +44,9 @@ public class CustomItemEffects { private static final int MAX_BUILDERS_BLOCKS = 164; public long aoteUseMillis = 0; + + public long lastUsedHyperion = 0; + public int aoteTeleportationMillis = 0; public Vector3f aoteTeleportationCurr = null; @@ -72,8 +67,8 @@ public class CustomItemEffects { if(delta <= 0) return; - if(aoteTeleportationMillis > NotEnoughUpdates.INSTANCE.manager.config.smoothAoteMillis.value.intValue()*2) { - aoteTeleportationMillis = NotEnoughUpdates.INSTANCE.manager.config.smoothAoteMillis.value.intValue()*2; + if(aoteTeleportationMillis > NotEnoughUpdates.INSTANCE.config.smoothAOTE.smoothTpMillis*2) { + aoteTeleportationMillis = NotEnoughUpdates.INSTANCE.config.smoothAOTE.smoothTpMillis*2; } if(aoteTeleportationMillis < 0) aoteTeleportationMillis = 0; @@ -114,14 +109,20 @@ public class CustomItemEffects { @SubscribeEvent public void onPlayerInteract(PlayerInteractEvent event) { - if(NotEnoughUpdates.INSTANCE.manager.config.smoothAoteMillis.value <= 0 - || Minecraft.getMinecraft().gameSettings.thirdPersonView != 0) return; - if(event.action == PlayerInteractEvent.Action.RIGHT_CLICK_AIR || event.action == PlayerInteractEvent.Action.RIGHT_CLICK_BLOCK) { ItemStack held = Minecraft.getMinecraft().thePlayer.getHeldItem(); - if(held != null) { - String internal = NotEnoughUpdates.INSTANCE.manager.getInternalNameForItem(held); - if(internal != null && (internal.equals("ASPECT_OF_THE_END") || internal.equals("HYPERION"))) { + String internal = NotEnoughUpdates.INSTANCE.manager.getInternalNameForItem(held); + if(internal != null) { + if(internal.equals("HYPERION")) { + lastUsedHyperion = System.currentTimeMillis(); + } + + if(NotEnoughUpdates.INSTANCE.config.smoothAOTE.smoothTpMillis <= 0 + || Minecraft.getMinecraft().gameSettings.thirdPersonView != 0) return; + + boolean aote = NotEnoughUpdates.INSTANCE.config.smoothAOTE.enableSmoothAOTE && internal.equals("ASPECT_OF_THE_END"); + boolean hyp = NotEnoughUpdates.INSTANCE.config.smoothAOTE.enableSmoothHyperion && internal.equals("HYPERION"); + if(aote || hyp) { aoteUseMillis = System.currentTimeMillis(); if(aoteTeleportationCurr == null) { aoteTeleportationCurr = new Vector3f(); @@ -136,7 +137,7 @@ public class CustomItemEffects { @SubscribeEvent public void onOverlayDrawn(RenderGameOverlayEvent event) { - if(!NotEnoughUpdates.INSTANCE.manager.config.disableWandOverlay.value && + if(NotEnoughUpdates.INSTANCE.config.builderWand.enableWandOverlay && Minecraft.getMinecraft().objectMouseOver != null && Minecraft.getMinecraft().objectMouseOver.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK && ((event.type == null && Loader.isModLoaded("labymod")) || @@ -191,7 +192,7 @@ public class CustomItemEffects { String itemCountS = EnumChatFormatting.DARK_GRAY+"x"+EnumChatFormatting.RESET+itemCount; int itemCountLen = Minecraft.getMinecraft().fontRendererObj.getStringWidth(itemCountS); - if(NotEnoughUpdates.INSTANCE.manager.config.wandBlockCount.value) { + if(NotEnoughUpdates.INSTANCE.config.builderWand.wandBlockCount) { if(usingDirtWand) { Utils.drawItemStack(new ItemStack(Items.gold_nugget), scaledResolution.getScaledWidth()/2 - (itemCountLen+16)/2, scaledResolution.getScaledHeight()/2+10+4); @@ -303,7 +304,7 @@ public class CustomItemEffects { double d1 = player.lastTickPosY + (player.posY - player.lastTickPosY) * (double)event.partialTicks; double d2 = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double)event.partialTicks; - if(!NotEnoughUpdates.INSTANCE.manager.config.disableTreecapOverlay.value && + if(NotEnoughUpdates.INSTANCE.config.treecapOverlay.enableTreecapOverlay && (heldInternal.equals("JUNGLE_AXE") || heldInternal.equals("TREECAPITATOR_AXE"))) { int maxWood = 10; if(heldInternal.equals("TREECAPITATOR_AXE")) maxWood = 35; @@ -363,7 +364,7 @@ public class CustomItemEffects { drawFilledBoundingBox(block.getSelectedBoundingBox(Minecraft.getMinecraft().theWorld, candidate) .expand(0.001D, 0.001D, 0.001D).offset(-d0, -d1, -d2), - random ? 0.5f : 1f, NotEnoughUpdates.INSTANCE.manager.config.treecapOverlayColour.value); + random ? 0.5f : 1f, NotEnoughUpdates.INSTANCE.config.treecapOverlay.treecapOverlayColour); } } } @@ -372,7 +373,7 @@ public class CustomItemEffects { GlStateManager.enableTexture2D(); GlStateManager.disableBlend(); } - } else if(!NotEnoughUpdates.INSTANCE.manager.config.disableWandOverlay.value) { + } else if(NotEnoughUpdates.INSTANCE.config.builderWand.enableWandOverlay) { if(heldInternal.equals("BUILDERS_WAND")) { int maxBlocks = 164; if (event.target.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK) { @@ -391,7 +392,8 @@ public class CustomItemEffects { getBuildersWandCandidates(player, event.target, event.partialTicks, candidatesOld, candidatesOldSorted, 10); - ItemStack matchStack = new ItemStack(matchItem, 1, match.getBlock().getMetaFromState(match)); + ItemStack matchStack = new ItemStack(matchItem, 1, + match.getBlock().getDamageValue(Minecraft.getMinecraft().theWorld, event.target.getBlockPos())); int itemCount; if(match.getBlock() == Blocks.dirt && matchStack.getItemDamage() == 0 && hasDirtWand()) { itemCount = candidatesOld.size(); @@ -399,7 +401,7 @@ public class CustomItemEffects { itemCount = countItemsInInventoryAndStorage(matchStack); } - String special = (candidatesOld.size() <= itemCount) ? NotEnoughUpdates.INSTANCE.manager.config.wandOverlayColour.value : + String special = (candidatesOld.size() <= itemCount) ? NotEnoughUpdates.INSTANCE.config.builderWand.wandOverlayColour : "0:255:255:0:0"; if(candidatesOld.size() <= maxBlocks) { @@ -440,7 +442,7 @@ public class CustomItemEffects { GlStateManager.disableTexture2D(); GlStateManager.depthMask(false); - String special = NotEnoughUpdates.INSTANCE.manager.config.wandOverlayColour.value; + String special = NotEnoughUpdates.INSTANCE.config.builderWand.wandOverlayColour; AxisAlignedBB bb = Blocks.dirt.getSelectedBoundingBox(Minecraft.getMinecraft().theWorld, hover); drawBlock((int)bb.minX, (int)bb.minY, (int)bb.minZ+1, Blocks.dirt.getDefaultState(), diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/EnchantingSolvers.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/EnchantingSolvers.java new file mode 100644 index 00000000..79dc2bba --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/EnchantingSolvers.java @@ -0,0 +1,542 @@ +package io.github.moulberry.notenoughupdates.miscfeatures; + +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.util.Utils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.inventory.GuiChest; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ContainerChest; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraftforge.client.event.GuiOpenEvent; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.common.gameevent.TickEvent; + +import java.util.*; + +public class EnchantingSolvers { + + private static SolverType currentSolver = SolverType.NONE; + + private enum SolverType { + NONE, + CHRONOMATRON, + ULTRASEQUENCER, + SUPERPAIRS + } + + private static final NBTTagCompound enchTag = new NBTTagCompound(); + static { + enchTag.setTag("ench", new NBTTagList()); + } + + //Chronomatron + private static boolean addToChronomatron = false; + private static boolean chronomatronStartSeq = false; + private static List<String> chronomatronOrder = new ArrayList<>(); + private static int chronomatronReplayIndex = 0; + private static int lastChronomatronSize = 0; + private static long millisLastClick = 0; + + //Ultrasequencer + private static class UltrasequencerItem { + ItemStack stack; + int containerIndex; + + public UltrasequencerItem(ItemStack stack, int containerIndex) { + this.stack = stack; + this.containerIndex = containerIndex; + } + } + + private static Map<Integer, UltrasequencerItem> ultraSequencerOrder = new HashMap<>(); + private static int ultrasequencerReplayIndex = 0; + + //Superpairs + private static Map<Integer, ItemStack> superpairStacks = new HashMap<>(); + private static int lastSlotClicked = -1; + private static HashSet<Integer> successfulMatches = new HashSet<>(); + private static HashSet<Integer> possibleMatches = new HashSet<>(); + private static HashSet<Integer> powerupMatches = new HashSet<>(); + + @SubscribeEvent + public void onGuiOpen(GuiOpenEvent event) { + chronomatronOrder.clear(); + currentSolver = SolverType.NONE; + + if(!NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard()) { + return; + } + + if(event.gui instanceof GuiChest) { + GuiChest chest = (GuiChest) event.gui; + ContainerChest container = (ContainerChest) chest.inventorySlots; + String containerName = container.getLowerChestInventory().getDisplayName().getUnformattedText(); + String lower = containerName.toLowerCase(); + + if(!lower.contains("stakes")) { + if(lower.startsWith("chronomatron")) { + currentSolver = SolverType.CHRONOMATRON; + } else if(lower.startsWith("ultrasequencer")) { + currentSolver = SolverType.ULTRASEQUENCER; + } else if(lower.startsWith("superpairs")) { + currentSolver = SolverType.SUPERPAIRS; + } + } + } + } + + public static ItemStack overrideStack(IInventory inventory, int slotIndex, ItemStack stack) { + if(!NotEnoughUpdates.INSTANCE.config.enchantingSolvers.enableEnchantingSolvers) { + return null; + } + + if(!NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard()) { + return null; + } + + if(stack != null && stack.getDisplayName() != null) { + if(Minecraft.getMinecraft().currentScreen instanceof GuiChest) { + GuiChest chest = (GuiChest) Minecraft.getMinecraft().currentScreen; + ContainerChest container = (ContainerChest) chest.inventorySlots; + IInventory lower = container.getLowerChestInventory(); + + if(lower != inventory) { + return null; + } + + String displayName = stack.getDisplayName(); + + if(currentSolver == SolverType.CHRONOMATRON) { + ItemStack timerStack = lower.getStackInSlot(lower.getSizeInventory()-5); + if(timerStack == null) { + return null; + } + + boolean yepClock = timerStack.getItem() == Items.clock; + if(yepClock && (addToChronomatron && chronomatronOrder.size() >= lastChronomatronSize+1)) { + if(chronomatronReplayIndex < chronomatronOrder.size()) { + String chronomatronCurrent = chronomatronOrder.get(chronomatronReplayIndex); + if(stack.getItem() == Item.getItemFromBlock(Blocks.stained_glass) || + stack.getItem() == Item.getItemFromBlock(Blocks.stained_hardened_clay)) { + long currentTime = System.currentTimeMillis(); + + boolean lastSame = chronomatronReplayIndex > 0 && + chronomatronCurrent.equals(chronomatronOrder.get(chronomatronReplayIndex-1)); + + if(chronomatronCurrent.equals(displayName)) { + if(!lastSame || currentTime - millisLastClick > 300) { + ItemStack retStack = new ItemStack(Item.getItemFromBlock(Blocks.stained_hardened_clay), 1, stack.getItemDamage()); + retStack.setTagCompound(enchTag); + retStack.setStackDisplayName(stack.getDisplayName()); + return retStack; + } else { + ItemStack retStack = new ItemStack(Item.getItemFromBlock(Blocks.stained_glass), 1, stack.getItemDamage()); + retStack.setStackDisplayName(stack.getDisplayName()); + return retStack; + } + } else { + if(chronomatronReplayIndex+1 < chronomatronOrder.size()) { + String chronomatronNext = chronomatronOrder.get(chronomatronReplayIndex+1); + if(chronomatronNext.equals(displayName)) { + ItemStack retStack = new ItemStack(Item.getItemFromBlock(Blocks.stained_glass), 1, stack.getItemDamage()); + retStack.setStackDisplayName(stack.getDisplayName()); + return retStack; + } + } + ItemStack retStack = new ItemStack(Item.getItemFromBlock(Blocks.stained_glass), 1, 8); + retStack.setStackDisplayName(stack.getDisplayName()); + return retStack; + } + } + + } + } + } else if(currentSolver == SolverType.ULTRASEQUENCER) { + ItemStack timerStack = lower.getStackInSlot(lower.getSizeInventory()-5); + if(timerStack == null) { + return null; + } + + boolean yepClock = timerStack.getItem() == Items.clock; + if(stack.getItem() == Item.getItemFromBlock(Blocks.stained_glass_pane) && stack.getItemDamage() != 15) { + if(yepClock) { + for(int solveIndex : ultraSequencerOrder.keySet()) { + UltrasequencerItem item = ultraSequencerOrder.get(solveIndex); + if(item.containerIndex == slotIndex) { + ItemStack newStack = item.stack; + if(solveIndex == ultrasequencerReplayIndex) { + newStack.setTagCompound(enchTag); + } else { + newStack.setTagCompound(null); + } + return newStack; + } + } + ItemStack retStack = new ItemStack(Item.getItemFromBlock(Blocks.stained_glass_pane), 1, 15); + retStack.setStackDisplayName(stack.getDisplayName()); + return retStack; + } + } + } else if(currentSolver == SolverType.SUPERPAIRS) { + if(stack.getItem() == Item.getItemFromBlock(Blocks.stained_glass) && + superpairStacks.containsKey(slotIndex)) { + return superpairStacks.get(slotIndex); + } + } + } + } + return null; + } + + public static boolean onStackRender(ItemStack stack, IInventory inventory, int slotIndex, int x, int y) { + if(!NotEnoughUpdates.INSTANCE.config.enchantingSolvers.enableEnchantingSolvers) { + return false; + } + + if(!NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard()) { + return false; + } + + if(stack != null && stack.getDisplayName() != null) { + if(Minecraft.getMinecraft().currentScreen instanceof GuiChest) { + GuiChest chest = (GuiChest) Minecraft.getMinecraft().currentScreen; + ContainerChest container = (ContainerChest) chest.inventorySlots; + IInventory lower = container.getLowerChestInventory(); + + if(lower != inventory) { + return false; + } + + if(currentSolver == SolverType.ULTRASEQUENCER) { + ItemStack timerStack = lower.getStackInSlot(lower.getSizeInventory()-5); + if(timerStack == null) { + return false; + } + + boolean yepClock = timerStack.getItem() == Items.clock; + if(stack.getItem() == Item.getItemFromBlock(Blocks.stained_glass_pane) && stack.getItemDamage() != 15) { + if(yepClock) { + for(int solveIndex : ultraSequencerOrder.keySet()) { + UltrasequencerItem item = ultraSequencerOrder.get(solveIndex); + if(item.containerIndex == slotIndex) { + int meta = 0; + if(solveIndex == ultrasequencerReplayIndex) { + meta = NotEnoughUpdates.INSTANCE.config.enchantingSolvers.seqNext; + } else if(solveIndex == ultrasequencerReplayIndex+1) { + meta = NotEnoughUpdates.INSTANCE.config.enchantingSolvers.seqUpcoming; + } + if(meta > 0) { + Utils.drawItemStack(new ItemStack(Item.getItemFromBlock(Blocks.stained_glass_pane), 1, meta-1), x, y); + } + if(NotEnoughUpdates.INSTANCE.config.enchantingSolvers.seqNumbers && + solveIndex >= ultrasequencerReplayIndex) { + int w = Minecraft.getMinecraft().fontRendererObj.getStringWidth((solveIndex+1)+""); + GlStateManager.disableDepth(); + GlStateManager.enableBlend(); + GlStateManager.disableLighting(); + Utils.drawStringScaled((solveIndex+1)+"", Minecraft.getMinecraft().fontRendererObj, + x+8.5f-w/2f, y+8.5f-4, true, 0xffc0c0c0, 1f); + return true; + } + } + } + } + } + } else if(currentSolver == SolverType.SUPERPAIRS) { + int meta = 0; + if(stack.getItem() == Item.getItemFromBlock(Blocks.stained_glass) && + superpairStacks.containsKey(slotIndex)) { + if(possibleMatches.contains(slotIndex)) { + meta = NotEnoughUpdates.INSTANCE.config.enchantingSolvers.supPossible; + } else { + meta = NotEnoughUpdates.INSTANCE.config.enchantingSolvers.supUnmatched; + } + } else { + if(powerupMatches.contains(slotIndex)) { + meta = NotEnoughUpdates.INSTANCE.config.enchantingSolvers.supPower; + } else if(successfulMatches.contains(slotIndex)) { + meta = NotEnoughUpdates.INSTANCE.config.enchantingSolvers.supMatched; + } + } + if(meta > 0) { + Utils.drawItemStack(new ItemStack(Item.getItemFromBlock(Blocks.stained_glass_pane), 1, meta-1), x, y); + } + } + } + } + return false; + } + + public static boolean onStackClick(ItemStack stack, int windowId, int slotId, int mouseButtonClicked, int mode) { + if(!NotEnoughUpdates.INSTANCE.config.enchantingSolvers.enableEnchantingSolvers) { + return false; + } + + if(!NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard()) { + return false; + } + + if(stack != null && stack.getDisplayName() != null) { + String displayName = stack.getDisplayName(); + if(Minecraft.getMinecraft().currentScreen instanceof GuiChest) { + GuiChest chest = (GuiChest) Minecraft.getMinecraft().currentScreen; + ContainerChest container = (ContainerChest) chest.inventorySlots; + IInventory lower = container.getLowerChestInventory(); + + if(currentSolver == SolverType.CHRONOMATRON) { + ItemStack timerStack = lower.getStackInSlot(lower.getSizeInventory()-5); + if(timerStack == null) { + return false; + } + + boolean yepClock = timerStack.getItem() == Items.clock; + if(timerStack.getItem() == Item.getItemFromBlock(Blocks.glowstone) || + (yepClock && (!addToChronomatron || chronomatronOrder.size() < lastChronomatronSize+1))) { + return true; + } else if(yepClock) { + long currentTime = System.currentTimeMillis(); + if(currentTime - millisLastClick < 150) { + return true; + } + + if(chronomatronReplayIndex < chronomatronOrder.size()) { + String chronomatronCurrent = chronomatronOrder.get(chronomatronReplayIndex); + if(!NotEnoughUpdates.INSTANCE.config.enchantingSolvers.preventMisclicks || + chronomatronCurrent.equals(displayName)) { + chronomatronReplayIndex++; + Minecraft.getMinecraft().playerController.windowClick(windowId, slotId, + 2, mode, Minecraft.getMinecraft().thePlayer); + millisLastClick = currentTime; + } + } + return true; + } + } else if(currentSolver == SolverType.ULTRASEQUENCER) { + ItemStack timerStack = lower.getStackInSlot(lower.getSizeInventory()-5); + if(timerStack == null) { + return false; + } + + boolean yepClock = timerStack.getItem() == Items.clock; + if(yepClock) { + UltrasequencerItem current = ultraSequencerOrder.get(ultrasequencerReplayIndex); + if(current == null) { + return true; + } + long currentTime = System.currentTimeMillis(); + if(currentTime - millisLastClick > 150 && + (!NotEnoughUpdates.INSTANCE.config.enchantingSolvers.preventMisclicks || + current.containerIndex == slotId)) { + ultrasequencerReplayIndex++; + Minecraft.getMinecraft().playerController.windowClick(windowId, slotId, + 2, mode, Minecraft.getMinecraft().thePlayer); + millisLastClick = currentTime; + } + return true; + } else { + return true; + } + } else if(currentSolver == SolverType.SUPERPAIRS) { + lastSlotClicked = slotId; + } + } + } + return false; + } + + public static void processInventoryContents() { + if(!NotEnoughUpdates.INSTANCE.config.enchantingSolvers.enableEnchantingSolvers) { + return; + } + + if(!NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard()) { + return; + } + + if(Minecraft.getMinecraft().currentScreen instanceof GuiChest) { + GuiChest chest = (GuiChest) Minecraft.getMinecraft().currentScreen; + ContainerChest container = (ContainerChest) chest.inventorySlots; + IInventory lower = container.getLowerChestInventory(); + + if(currentSolver == SolverType.CHRONOMATRON) { + ItemStack timerStack = lower.getStackInSlot(lower.getSizeInventory() - 5); + if (timerStack == null) { + return; + } + + String stainedHardenedClayName = null; + for (int index = 0; index < lower.getSizeInventory(); index++) { + ItemStack stack = lower.getStackInSlot(index); + if (stack != null && stack.getItem() == Item.getItemFromBlock(Blocks.stained_hardened_clay)) { + if (stack.getTagCompound() != null && stack.getTagCompound().hasKey("ench")) { + if (stainedHardenedClayName != null && !stack.getDisplayName().equals(stainedHardenedClayName)) { + return; + } + stainedHardenedClayName = stack.getDisplayName(); + } + } + } + + boolean yepClock = timerStack.getItem() == Items.clock; + if (timerStack.getItem() == Item.getItemFromBlock(Blocks.glowstone) || + (yepClock && (!addToChronomatron || chronomatronOrder.size() < lastChronomatronSize + 1))) { + if (chronomatronStartSeq) { + chronomatronStartSeq = false; + addToChronomatron = false; + lastChronomatronSize = chronomatronOrder.size(); + chronomatronOrder.clear(); + } + + if (stainedHardenedClayName != null) { + if (addToChronomatron) { + chronomatronOrder.add(stainedHardenedClayName); + } + addToChronomatron = false; + } else { + addToChronomatron = true; + chronomatronReplayIndex = 0; + } + } else if (yepClock) { + chronomatronStartSeq = true; + } + } else { + chronomatronStartSeq = true; + addToChronomatron = true; + } + if(currentSolver == SolverType.ULTRASEQUENCER) { + ItemStack timerStack = lower.getStackInSlot(lower.getSizeInventory() - 5); + if (timerStack == null) { + return; + } + if(timerStack.getItem() == Item.getItemFromBlock(Blocks.glowstone)) { + ultrasequencerReplayIndex = 0; + } + + for (int index = 0; index < lower.getSizeInventory(); index++) { + ItemStack stack = lower.getStackInSlot(index); + if (stack != null && stack.getItem() == Items.dye) { + if(ultraSequencerOrder.containsKey(stack.stackSize-1)) { + UltrasequencerItem ultrasequencerItem = ultraSequencerOrder.get(stack.stackSize-1); + ultrasequencerItem.containerIndex = index; + ultrasequencerItem.stack = stack; + } else { + ultraSequencerOrder.put(stack.stackSize-1, new UltrasequencerItem(stack, index)); + } + } + } + } else { + ultraSequencerOrder.clear(); + } + if(currentSolver == SolverType.SUPERPAIRS) { + successfulMatches.clear(); + possibleMatches.clear(); + powerupMatches.clear(); + out: + for (int index = 0; index < lower.getSizeInventory(); index++) { + ItemStack stack = lower.getStackInSlot(index); + if(stack == null) continue; + if (stack.getItem() != Item.getItemFromBlock(Blocks.stained_glass) && + stack.getItem() != Item.getItemFromBlock(Blocks.stained_glass_pane)) { + superpairStacks.put(index, stack); + + NBTTagCompound tag = stack.getTagCompound(); + if(tag != null) { + NBTTagCompound display = tag.getCompoundTag("display"); + if (display.hasKey("Lore", 9)) { + NBTTagList list = display.getTagList("Lore", 8); + for (int i = 0; i < list.tagCount(); i++) { + if(list.getStringTagAt(i).toLowerCase().contains("powerup")) { + powerupMatches.add(index); + continue out; + } + } + } + } + + int numMatches = 0; + for (int index2 = 0; index2 < lower.getSizeInventory(); index2++) { + ItemStack stack2 = lower.getStackInSlot(index2); + if(stack2 != null && stack2.getDisplayName().equals(stack.getDisplayName()) && + stack.getItem() == stack2.getItem()) { + numMatches++; + } + } + boolean oddMatches = (numMatches % 2) == 1; + + if((!oddMatches || index != lastSlotClicked) && !successfulMatches.contains(index)) { + for (int index2 = 0; index2 < lower.getSizeInventory(); index2++) { + if(index == index2) continue; + if(oddMatches && index2 == lastSlotClicked) continue; + + ItemStack stack2 = lower.getStackInSlot(index2); + if(stack2 != null && stack2.getDisplayName().equals(stack.getDisplayName()) && + stack.getItem() == stack2.getItem()) { + successfulMatches.add(index); + successfulMatches.add(index2); + } + } + } + } else { + if(superpairStacks.containsKey(index) && superpairStacks.get(index) != null && + !possibleMatches.contains(index)) { + ItemStack stack1 = superpairStacks.get(index); + for (int index2 = 0; index2 < lower.getSizeInventory(); index2++) { + if(index == index2) continue; + + if(superpairStacks.containsKey(index2) && superpairStacks.get(index2) != null) { + ItemStack stack2 = superpairStacks.get(index2); + if(stack1.getDisplayName().equals(stack2.getDisplayName()) && + stack1.getItem() == stack2.getItem()) { + possibleMatches.add(index); + possibleMatches.add(index2); + } + } + } + } + } + } + } else { + superpairStacks.clear(); + successfulMatches.clear(); + powerupMatches.clear(); + lastSlotClicked = -1; + } + } + } + + + @SubscribeEvent + public void onItemTooltip(ItemTooltipEvent event) { + if(NotEnoughUpdates.INSTANCE.config.enchantingSolvers.hideTooltips && + (currentSolver == SolverType.CHRONOMATRON || currentSolver == SolverType.ULTRASEQUENCER)) { + String internal = NotEnoughUpdates.INSTANCE.manager.getInternalNameForItem(event.itemStack); + if(internal == null && event.toolTip.size() > 0 && !event.toolTip.get(0).trim().replaceAll("\\(#.+\\)$", "").trim().contains(" ")) { + event.toolTip.clear(); + } + } + } + + @SubscribeEvent + public void onTick(TickEvent.ClientTickEvent event) { + if(!(Minecraft.getMinecraft().currentScreen instanceof GuiChest)) { + currentSolver = SolverType.NONE; + } + + if(event.phase != TickEvent.Phase.END) { + return; + } + + processInventoryContents(); + } + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/ItemRarityHalo.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/ItemRarityHalo.java index 2c70ec1e..244d6906 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/ItemRarityHalo.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/ItemRarityHalo.java @@ -1,5 +1,7 @@ -package io.github.moulberry.notenoughupdates; +package io.github.moulberry.notenoughupdates.miscfeatures; +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.util.NEUResourceManager; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.ScaledResolution; @@ -12,7 +14,6 @@ import net.minecraft.client.shader.Shader; import net.minecraft.item.ItemStack; import net.minecraft.util.Matrix4f; import org.lwjgl.BufferUtils; -import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL14; import org.lwjgl.opengl.GL30; @@ -42,7 +43,7 @@ public class ItemRarityHalo { if(!OpenGlHelper.isFramebufferEnabled() || !OpenGlHelper.areShadersSupported()) return; NotEnoughUpdates neu = NotEnoughUpdates.INSTANCE; if(!neu.isOnSkyblock()) return; - if(neu.manager.config.itemHighlightOpacity.value <= 1) return; + //if(neu.manager.config.itemHighlightOpacity.value <= 1) return; if(neu.manager.getInternalNameForItem(stack) == null) return; ScaledResolution scaledresolution = new ScaledResolution(Minecraft.getMinecraft()); @@ -155,8 +156,8 @@ public class ItemRarityHalo { GlStateManager.bindTexture(itemHaloTexMap.get(stack)); Color color = Utils.getPrimaryColour(stack.getDisplayName()); - GlStateManager.color(color.getRed()/255f, color.getGreen()/255f, color.getBlue()/255f, - NotEnoughUpdates.INSTANCE.manager.config.itemHighlightOpacity.value.floatValue()/255f); + //GlStateManager.color(color.getRed()/255f, color.getGreen()/255f, color.getBlue()/255f, + // NotEnoughUpdates.INSTANCE.manager.config.itemHighlightOpacity.value.floatValue()/255f); Utils.drawTexturedRect(x, y, 16, 16, 0, 1, 1, 0, GL11.GL_NEAREST); GlStateManager.bindTexture(0); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/StreamerMode.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/StreamerMode.java index 051313d1..40b75e50 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/StreamerMode.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/StreamerMode.java @@ -1,4 +1,4 @@ -package io.github.moulberry.notenoughupdates; +package io.github.moulberry.notenoughupdates.miscfeatures; import io.github.moulberry.notenoughupdates.util.Utils; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/SunTzu.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/SunTzu.java index 6de8245e..8b690765 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/SunTzu.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/SunTzu.java @@ -1,10 +1,9 @@ -package io.github.moulberry.notenoughupdates; +package io.github.moulberry.notenoughupdates.miscfeatures; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.MovingObjectPosition; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.fml.common.Loader; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/AccessoryBagOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/AccessoryBagOverlay.java index 5ca25082..612dd8d7 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/AccessoryBagOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/AccessoryBagOverlay.java @@ -1,8 +1,9 @@ -package io.github.moulberry.notenoughupdates; +package io.github.moulberry.notenoughupdates.miscgui; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.profileviewer.PlayerStats; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.Utils; @@ -35,7 +36,7 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import static io.github.moulberry.notenoughupdates.GuiTextures.*; +import static io.github.moulberry.notenoughupdates.util.GuiTextures.*; public class AccessoryBagOverlay { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/CalendarOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/CalendarOverlay.java index ccfe4a65..c54a0218 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/CalendarOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/CalendarOverlay.java @@ -1,9 +1,10 @@ -package io.github.moulberry.notenoughupdates; +package io.github.moulberry.notenoughupdates.miscgui; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.PositionedSoundRecord; @@ -27,16 +28,14 @@ import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.ClientCommandHandler; import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent; -import net.minecraftforge.client.event.sound.SoundEvent; import net.minecraftforge.fml.common.eventhandler.EventPriority; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import net.minecraftforge.fml.common.gameevent.TickEvent; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL14; -import static io.github.moulberry.notenoughupdates.GuiTextures.*; +import static io.github.moulberry.notenoughupdates.util.GuiTextures.*; import java.io.File; import java.util.*; @@ -159,7 +158,7 @@ public class CalendarOverlay { if(event.phase != TickEvent.Phase.START) return; if(jingleIndex == 0) { - if (NotEnoughUpdates.INSTANCE.manager.config.eventNotificationSounds.value) { + if (NotEnoughUpdates.INSTANCE.config.calendar.eventNotificationSounds) { Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create( new ResourceLocation("notenoughupdates:calendar_notif_jingle") )); @@ -169,7 +168,7 @@ public class CalendarOverlay { } jingleIndex = -15*20; } else if(jingleIndex >= 1) { - if (NotEnoughUpdates.INSTANCE.manager.config.eventNotificationSounds.value) { + if (NotEnoughUpdates.INSTANCE.config.calendar.eventNotificationSounds) { Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create( new ResourceLocation("notenoughupdates:calendar_notif_in") )); @@ -179,7 +178,7 @@ public class CalendarOverlay { jingleIndex++; } if(jingleIndex == -20*6-10) { - if(NotEnoughUpdates.INSTANCE.manager.config.eventNotificationSounds.value) { + if(NotEnoughUpdates.INSTANCE.config.calendar.eventNotificationSounds) { Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create( new ResourceLocation("notenoughupdates:calendar_notif_out") )); @@ -434,7 +433,7 @@ public class CalendarOverlay { int mouseY = height - Mouse.getY() * height / Minecraft.getMinecraft().displayHeight - 1; if(!enabled) { - if(Mouse.getEventButtonState() && NotEnoughUpdates.INSTANCE.manager.config.showEventTimerInInventory.value && + if(Mouse.getEventButtonState() && NotEnoughUpdates.INSTANCE.config.calendar.showEventTimerInInventory && Minecraft.getMinecraft().currentScreen instanceof GuiContainer) { xSize = 168; ySize = 20; @@ -491,7 +490,7 @@ public class CalendarOverlay { mouseY > jfFavouriteSelectY && mouseY < jfFavouriteSelectY + 18 + jfFavouriteSelect.size() * 10) { jfFavouriteSelectIndex = Math.max(0, (mouseY - jfFavouriteSelectY - 5)/10); - List<String> eventFavourites = NotEnoughUpdates.INSTANCE.manager.config.eventFavourites.value; + List<String> eventFavourites = NotEnoughUpdates.INSTANCE.config.hidden.eventFavourites; String id = null; if(jfFavouriteSelectIndex == 0) { id = "jacob_farming"; @@ -504,10 +503,6 @@ public class CalendarOverlay { } else { eventFavourites.add(id); } - try { - NotEnoughUpdates.INSTANCE.manager.saveConfig(); - } catch (Exception ignored) { - } } } else { jfFavouriteSelect = null; @@ -573,7 +568,7 @@ public class CalendarOverlay { jfFavouriteSelectIndex--; if(jfFavouriteSelectIndex < 0) jfFavouriteSelectIndex = jfFavouriteSelect.size(); } else if(keyPressed == Keyboard.KEY_RIGHT || keyPressed == Keyboard.KEY_RETURN) { - List<String> eventFavourites = NotEnoughUpdates.INSTANCE.manager.config.eventFavourites.value; + List<String> eventFavourites = NotEnoughUpdates.INSTANCE.config.hidden.eventFavourites; String id = null; if(jfFavouriteSelectIndex == 0) { id = "jacob_farming"; @@ -586,10 +581,6 @@ public class CalendarOverlay { } else { eventFavourites.add(id); } - try { - NotEnoughUpdates.INSTANCE.manager.saveConfig(); - } catch (Exception ignored) { - } } } else if(keyPressed == Keyboard.KEY_LEFT || keyPressed == NotEnoughUpdates.INSTANCE.manager.keybindFavourite.getKeyCode()) { @@ -643,16 +634,12 @@ public class CalendarOverlay { jfFavouriteSelectX = mouseX; jfFavouriteSelectY = mouseY; } else { - List<String> eventFavourites = NotEnoughUpdates.INSTANCE.manager.config.eventFavourites.value; + List<String> eventFavourites = NotEnoughUpdates.INSTANCE.config.hidden.eventFavourites; if (eventFavourites.contains(id)) { eventFavourites.remove(id); } else { eventFavourites.add(id); } - try { - NotEnoughUpdates.INSTANCE.manager.saveConfig(); - } catch (Exception ignored) { - } } } } @@ -662,7 +649,7 @@ public class CalendarOverlay { @SubscribeEvent(priority = EventPriority.LOW) public void onGuiDraw(RenderGameOverlayEvent.Post event) { - if(NotEnoughUpdates.INSTANCE.manager.config.eventNotifications.value && + if(NotEnoughUpdates.INSTANCE.config.calendar.eventNotifications && event.type == RenderGameOverlayEvent.ElementType.ALL) { GlStateManager.pushMatrix(); GlStateManager.translate(0, 0, 10); @@ -674,7 +661,7 @@ public class CalendarOverlay { long timeUntilFirst = 0; SBEvent firstEvent = null; - List<String> eventFavourites = NotEnoughUpdates.INSTANCE.manager.config.eventFavourites.value; + List<String> eventFavourites = NotEnoughUpdates.INSTANCE.config.hidden.eventFavourites; //Daily Events out: @@ -722,15 +709,16 @@ public class CalendarOverlay { } public boolean renderToast(SBEvent event, long timeUntil) { - if(!NotEnoughUpdates.INSTANCE.manager.config.eventNotifications.value) { + if(!NotEnoughUpdates.INSTANCE.config.calendar.eventNotifications) { return false; } long currentTime = System.currentTimeMillis(); - if(currentTime - spookyStart < HOUR && NotEnoughUpdates.INSTANCE.manager.config.spookyMorningNotification.value) { - long delta = (currentTime - SKYBLOCK_START) % (20*MINUTE) - 7*50*SECOND - 10*SECOND; + if(currentTime - spookyStart > 0 && currentTime - spookyStart < HOUR && + NotEnoughUpdates.INSTANCE.config.calendar.spookyNightNotification) { + long delta = (currentTime - SKYBLOCK_START) % (20*MINUTE) - 19*50*SECOND - 10*SECOND; if(delta < 500 && delta > -8500) { - event = new SBEvent("spooky_festival_7am", "Spooky Festival 7am", new ItemStack(Items.bone), null); + event = new SBEvent("spooky_festival_7pm", "Spooky Festival 7pm", new ItemStack(Items.bone), null); timeUntil = delta; } } @@ -746,7 +734,7 @@ public class CalendarOverlay { int guiTop = 5; boolean preNotification = false; - long preNotificationTime = SECOND*NotEnoughUpdates.INSTANCE.manager.config.eventNotificationBeforeSeconds.value.intValue(); + long preNotificationTime = SECOND*NotEnoughUpdates.INSTANCE.config.calendar.startingSoonTime; if(preNotificationTime > 500 && timeUntil > 500) { timeUntil = timeUntil - preNotificationTime; @@ -838,7 +826,7 @@ public class CalendarOverlay { long timeUntilMajor = 0; SBEvent nextMajorEvent = null; - List<String> eventFavourites = NotEnoughUpdates.INSTANCE.manager.config.eventFavourites.value; + List<String> eventFavourites = NotEnoughUpdates.INSTANCE.config.hidden.eventFavourites; guiLeft = (width - xSize)/2; guiTop = 5; @@ -854,7 +842,7 @@ public class CalendarOverlay { } if(sbEvent.id.equals("spooky_festival")) { - if(currentTime - spookyStart > HOUR || (sbEvents.getKey() > currentTime && sbEvents.getKey() < spookyStart)) { + if(sbEvents.getKey() > currentTime-HOUR && (sbEvents.getKey() < spookyStart || spookyStart == 0)) { spookyStart = sbEvents.getKey(); } } @@ -904,7 +892,7 @@ public class CalendarOverlay { GlStateManager.translate(0, 0, 50); boolean toastRendered = renderToast(nextEvent, timeUntilNext); GlStateManager.translate(0, 0, -50); - if(!toastRendered && !enabled && NotEnoughUpdates.INSTANCE.manager.config.showEventTimerInInventory.value) { + if(!toastRendered && !enabled && NotEnoughUpdates.INSTANCE.config.calendar.showEventTimerInInventory) { List<String> tooltipToDisplay = null; FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; @@ -1083,7 +1071,7 @@ public class CalendarOverlay { SBEvent nextEvent = null; long timeUntilFirst = 0; SBEvent firstEvent = null; - List<String> eventFavourites = NotEnoughUpdates.INSTANCE.manager.config.eventFavourites.value; + List<String> eventFavourites = NotEnoughUpdates.INSTANCE.config.hidden.eventFavourites; //Daily Events int index = 0; @@ -1096,7 +1084,7 @@ public class CalendarOverlay { int y = guiTop+44+17*(index/3); if(sbEvent.id.equals("spooky_festival")) { - if(currentTime - spookyStart > HOUR || (sbEvents.getKey() > currentTime && sbEvents.getKey() < spookyStart)) { + if(sbEvents.getKey() > currentTime-HOUR && (sbEvents.getKey() < spookyStart || spookyStart == 0)) { spookyStart = sbEvents.getKey(); } } @@ -1300,7 +1288,7 @@ public class CalendarOverlay { jfFavouriteSelectY+18+jfFavouriteSelect.size()*10, 0xff909090); GlStateManager.depthFunc(GL11.GL_LEQUAL); - String all = (NotEnoughUpdates.INSTANCE.manager.config.eventFavourites.value.contains("jacob_farming")? + String all = (NotEnoughUpdates.INSTANCE.config.hidden.eventFavourites.contains("jacob_farming")? EnumChatFormatting.DARK_GREEN:EnumChatFormatting.DARK_GRAY)+"All"; if(jfFavouriteSelectIndex == 0) { fr.drawString(EnumChatFormatting.BLACK+"> "+all, jfFavouriteSelectX+5, jfFavouriteSelectY+5, 0xff000000); @@ -1313,7 +1301,7 @@ public class CalendarOverlay { selectStringIndex=0; for(String s : jfFavouriteSelect) { - EnumChatFormatting colour = NotEnoughUpdates.INSTANCE.manager.config.eventFavourites.value.contains("jacob_farming:"+s) + EnumChatFormatting colour = NotEnoughUpdates.INSTANCE.config.hidden.eventFavourites.contains("jacob_farming:"+s) ? EnumChatFormatting.DARK_GREEN : EnumChatFormatting.DARK_GRAY; s = (selectStringIndex+1 == jfFavouriteSelectIndex ? EnumChatFormatting.BLACK+"> " : "") + colour + s; fr.drawString(s, jfFavouriteSelectX+5, jfFavouriteSelectY+10*selectStringIndex+15, 0xff000000); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/GuiEnchantColour.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiEnchantColour.java index c450c6f4..e6beb660 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/GuiEnchantColour.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiEnchantColour.java @@ -1,13 +1,13 @@ -package io.github.moulberry.notenoughupdates; +package io.github.moulberry.notenoughupdates.miscgui; import com.google.common.base.Splitter; +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.core.util.lerp.LerpingInteger; import io.github.moulberry.notenoughupdates.itemeditor.GuiElementTextField; -import io.github.moulberry.notenoughupdates.util.LerpingInteger; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; @@ -28,7 +28,7 @@ public class GuiEnchantColour extends GuiScreen { private int ySize = 0; private List<String> getEnchantColours() { - return NotEnoughUpdates.INSTANCE.manager.config.enchantColours.value; + return NotEnoughUpdates.INSTANCE.config.hidden.enchantColours; } public static final Splitter splitter = Splitter.on(":").limit(4); @@ -61,9 +61,6 @@ public class GuiEnchantColour extends GuiScreen { scroll.resetTimer(); } - - NotEnoughUpdates.INSTANCE.manager.loadConfig(); - Minecraft.getMinecraft().getTextureManager().bindTexture(custom_ench_colour); Utils.drawTexturedRect(guiLeft, guiTop, xSize, 21, 0, 1, 0, 21/78f, GL11.GL_NEAREST); Utils.drawTexturedRect(guiLeft, guiTop+ySize-32, xSize, 32, 0, 1, 46/78f, 1, GL11.GL_NEAREST); @@ -136,16 +133,15 @@ public class GuiEnchantColour extends GuiScreen { addOffset += 1; } - NotEnoughUpdates.INSTANCE.manager.config.enchantColours.value.remove(yIndex); + NotEnoughUpdates.INSTANCE.config.hidden.enchantColours.remove(yIndex); if(yIndex+addOffset < 0) { addOffset = -yIndex; - } else if(yIndex+addOffset > NotEnoughUpdates.INSTANCE.manager.config.enchantColours.value.size()) { - addOffset = NotEnoughUpdates.INSTANCE.manager.config.enchantColours.value.size()-yIndex; + } else if(yIndex+addOffset > NotEnoughUpdates.INSTANCE.config.hidden.enchantColours.size()) { + addOffset = NotEnoughUpdates.INSTANCE.config.hidden.enchantColours.size()-yIndex; } System.out.println(addOffset); - NotEnoughUpdates.INSTANCE.manager.config.enchantColours.value.add(yIndex+addOffset, + NotEnoughUpdates.INSTANCE.config.hidden.enchantColours.add(yIndex+addOffset, getEnchantOpString(guiElementTextFields.get(yIndex), comparators.get(yIndex))); - NotEnoughUpdates.INSTANCE.manager.saveConfig(); if(addOffset != 0) { GuiElementTextField[] guiElementTextFieldArray = guiElementTextFields.remove(yIndex); guiElementTextFields.add(yIndex+addOffset, guiElementTextFieldArray); @@ -196,10 +192,9 @@ public class GuiEnchantColour extends GuiScreen { if(mouseY > guiTop+23+25*yIndex && mouseY < guiTop+23+25*yIndex+20) { guiElementTextFields.get(yIndex)[i].mouseClicked(mouseX, mouseY, mouseButton); if(mouseButton == 1) { - NotEnoughUpdates.INSTANCE.manager.config.enchantColours.value.remove(yIndex); - NotEnoughUpdates.INSTANCE.manager.config.enchantColours.value.add(yIndex, + NotEnoughUpdates.INSTANCE.config.hidden.enchantColours.remove(yIndex); + NotEnoughUpdates.INSTANCE.config.hidden.enchantColours.add(yIndex, getEnchantOpString(guiElementTextFields.get(yIndex), comparators.get(yIndex))); - NotEnoughUpdates.INSTANCE.manager.saveConfig(); } continue; } @@ -217,22 +212,19 @@ public class GuiEnchantColour extends GuiScreen { default: comparators.put(yIndex, ">"); break; } - NotEnoughUpdates.INSTANCE.manager.config.enchantColours.value.remove(yIndex); - NotEnoughUpdates.INSTANCE.manager.config.enchantColours.value.add(yIndex, + NotEnoughUpdates.INSTANCE.config.hidden.enchantColours.remove(yIndex); + NotEnoughUpdates.INSTANCE.config.hidden.enchantColours.add(yIndex, getEnchantOpString(guiElementTextFields.get(yIndex), comparators.get(yIndex))); - NotEnoughUpdates.INSTANCE.manager.saveConfig(); } else if(mouseX > guiLeft+146 && mouseX < guiLeft+146+20) { - NotEnoughUpdates.INSTANCE.manager.config.enchantColours.value.remove(yIndex); + NotEnoughUpdates.INSTANCE.config.hidden.enchantColours.remove(yIndex); guiElementTextFields.remove(yIndex); comparators.remove(yIndex); - NotEnoughUpdates.INSTANCE.manager.saveConfig(); } } } if(mouseX >= guiLeft+42 && mouseX <= guiLeft+42+88) { if(mouseY >= guiTop+ySize-30 && mouseY <= guiTop+ySize-10) { - NotEnoughUpdates.INSTANCE.manager.config.enchantColours.value.add("[a-zA-Z\\- ]+:>:5:9"); - NotEnoughUpdates.INSTANCE.manager.saveConfig(); + NotEnoughUpdates.INSTANCE.config.hidden.enchantColours.add("[a-zA-Z\\- ]+:>:5:9"); } } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/GuiItemRecipe.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiItemRecipe.java index c4040f60..8992db2a 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/GuiItemRecipe.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiItemRecipe.java @@ -1,6 +1,7 @@ -package io.github.moulberry.notenoughupdates; +package io.github.moulberry.notenoughupdates.miscgui; import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.NEUManager; import io.github.moulberry.notenoughupdates.util.TexLoc; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/HelpGUI.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/HelpGUI.java index 1049dc55..cc41a76f 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/HelpGUI.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/HelpGUI.java @@ -1,4 +1,4 @@ -package io.github.moulberry.notenoughupdates; +package io.github.moulberry.notenoughupdates.miscgui; import io.github.moulberry.notenoughupdates.util.TexLoc; import io.github.moulberry.notenoughupdates.util.Utils; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlayPlacements.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/NEUOverlayPlacements.java index 633c1c4b..995ed5e3 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUOverlayPlacements.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/NEUOverlayPlacements.java @@ -1,5 +1,6 @@ -package io.github.moulberry.notenoughupdates; +package io.github.moulberry.notenoughupdates.miscgui; +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.mbgui.*; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; @@ -145,11 +146,10 @@ public class NEUOverlayPlacements extends GuiScreen { mainGroup.recalculate(); if(index == 0) { - NotEnoughUpdates.INSTANCE.manager.config.overlaySearchBar.value = anchorPoint.toString(); + NotEnoughUpdates.INSTANCE.config.hidden.overlaySearchBar = anchorPoint.toString(); } else if(index == 1) { - NotEnoughUpdates.INSTANCE.manager.config.overlayQuickCommand.value = anchorPoint.toString(); + NotEnoughUpdates.INSTANCE.config.hidden.overlayQuickCommand = anchorPoint.toString(); } - try { NotEnoughUpdates.INSTANCE.manager.saveConfig(); } catch(IOException ignored) {} } } return; @@ -159,9 +159,8 @@ public class NEUOverlayPlacements extends GuiScreen { } if(guiButton.mousePressed(Minecraft.getMinecraft(), mouseX, mouseY)) { - NotEnoughUpdates.INSTANCE.manager.config.overlayQuickCommand.value = ""; - NotEnoughUpdates.INSTANCE.manager.config.overlaySearchBar.value = ""; - try { NotEnoughUpdates.INSTANCE.manager.saveConfig(); } catch(IOException ignored) {} + NotEnoughUpdates.INSTANCE.config.hidden.overlayQuickCommand = ""; + NotEnoughUpdates.INSTANCE.config.hidden.overlaySearchBar = ""; NotEnoughUpdates.INSTANCE.overlay.resetAnchors(false); mainGroup.recalculate(); @@ -200,11 +199,10 @@ public class NEUOverlayPlacements extends GuiScreen { for(MBGuiElement element : mainGroup.getChildren()) { if(element == clickedElement) { if(index == 0) { - NotEnoughUpdates.INSTANCE.manager.config.overlaySearchBar.value = anchorPoint.toString(); + NotEnoughUpdates.INSTANCE.config.hidden.overlaySearchBar = anchorPoint.toString(); } else if(index == 1) { - NotEnoughUpdates.INSTANCE.manager.config.overlayQuickCommand.value = anchorPoint.toString(); + NotEnoughUpdates.INSTANCE.config.hidden.overlayQuickCommand = anchorPoint.toString(); } - try { NotEnoughUpdates.INSTANCE.manager.saveConfig(); } catch(IOException ignored) {} break; } index++; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/TradeWindow.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/TradeWindow.java index 6bdf2c5d..371da939 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/TradeWindow.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/TradeWindow.java @@ -1,15 +1,15 @@ -package io.github.moulberry.notenoughupdates; +package io.github.moulberry.notenoughupdates.miscgui; import com.google.gson.JsonObject; +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.util.SBAIntegration; import io.github.moulberry.notenoughupdates.util.TexLoc; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.gui.inventory.GuiChest; import net.minecraft.client.gui.inventory.GuiContainer; -import net.minecraft.client.gui.inventory.GuiEditSign; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.inventory.ContainerChest; import net.minecraft.inventory.Slot; @@ -18,8 +18,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import net.minecraft.tileentity.TileEntitySign; -import net.minecraft.util.ChatComponentText; import net.minecraft.util.ChatComponentTranslation; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; @@ -59,7 +57,7 @@ public class TradeWindow { public static boolean tradeWindowActive() { if(!NotEnoughUpdates.INSTANCE.isOnSkyblock()) return false; - if(!NotEnoughUpdates.INSTANCE.manager.config.useCustomTrade.value) return false; + if(!NotEnoughUpdates.INSTANCE.config.tradeMenu.enableCustomTrade) return false; GuiScreen guiScreen = Minecraft.getMinecraft().currentScreen; if(guiScreen instanceof GuiChest) { @@ -731,7 +729,7 @@ public class TradeWindow { } } - if(NotEnoughUpdates.INSTANCE.manager.config.customTradePrices.value) { + if(NotEnoughUpdates.INSTANCE.config.tradeMenu.customTradePrices) { TreeMap<Integer, Set<String>> ourTopItems = new TreeMap<>(); TreeMap<String, ItemStack> ourTopItemsStack = new TreeMap<>(); TreeMap<String, Integer> ourTopItemsCount = new TreeMap<>(); @@ -780,7 +778,7 @@ public class TradeWindow { ItemStack stack = ourTopItemsStack.get(ourTopItemInternal); if(stack == null) continue; - if(NotEnoughUpdates.INSTANCE.manager.config.customTradePriceStyle.value) { + if(NotEnoughUpdates.INSTANCE.config.tradeMenu.customTradePriceStyle) { String countS = ""; if(ourTopItemsCount.containsKey(ourTopItemInternal)) { int count = ourTopItemsCount.get(ourTopItemInternal); @@ -828,7 +826,7 @@ public class TradeWindow { ItemStack stack = theirTopItemsStack.get(theirTopItemInternal); if(stack == null) continue; - if(NotEnoughUpdates.INSTANCE.manager.config.customTradePriceStyle.value) { + if(NotEnoughUpdates.INSTANCE.config.tradeMenu.customTradePriceStyle) { String countS = ""; if(theirTopItemsCount.containsKey(theirTopItemInternal)) { int count = theirTopItemsCount.get(theirTopItemInternal); @@ -862,9 +860,9 @@ public class TradeWindow { } - boolean button1 = NotEnoughUpdates.INSTANCE.manager.config.customTradePriceStyle.value; - boolean button2 = NotEnoughUpdates.INSTANCE.manager.config.customTradePrices.value; - boolean button3 = NotEnoughUpdates.INSTANCE.manager.config.useCustomTrade.value; + boolean button1 = NotEnoughUpdates.INSTANCE.config.tradeMenu.customTradePriceStyle; + boolean button2 = NotEnoughUpdates.INSTANCE.config.tradeMenu.customTradePrices; + boolean button3 = NotEnoughUpdates.INSTANCE.config.tradeMenu.enableCustomTrade; GlStateManager.color(1, 1, 1, 1); Minecraft.getMinecraft().getTextureManager().bindTexture(location); @@ -878,18 +876,18 @@ public class TradeWindow { if(mouseX >= guiLeft+xSize+3 && mouseX <= guiLeft+xSize+3+17) { if(mouseY >= guiTop+ySize-19 && mouseY <= guiTop+ySize-19+17) { tooltipToDisplay = new ArrayList<>(); - tooltipToDisplay.add(EnumChatFormatting.GOLD+NotEnoughUpdates.INSTANCE.manager.config.useCustomTrade.displayName); - tooltipToDisplay.add(EnumChatFormatting.GRAY+NotEnoughUpdates.INSTANCE.manager.config.useCustomTrade.desc); + tooltipToDisplay.add(EnumChatFormatting.GOLD+"Enable Custom Trade Menu"); + tooltipToDisplay.add(EnumChatFormatting.GRAY+"Use this menu instead of the default trade window"); tooltipLen = 200; } else if(mouseY >= guiTop+ySize-38 && mouseY <= guiTop+ySize-38+17) { tooltipToDisplay = new ArrayList<>(); - tooltipToDisplay.add(EnumChatFormatting.GOLD+NotEnoughUpdates.INSTANCE.manager.config.customTradePrices.displayName); - tooltipToDisplay.add(EnumChatFormatting.GRAY+NotEnoughUpdates.INSTANCE.manager.config.customTradePrices.desc); + tooltipToDisplay.add(EnumChatFormatting.GOLD+"Price Information"); + tooltipToDisplay.add(EnumChatFormatting.GRAY+"Show the price of items on both sides"); tooltipLen = 200; } else if(mouseY >= guiTop+ySize-57 && mouseY <= guiTop+ySize-57+17) { tooltipToDisplay = new ArrayList<>(); - tooltipToDisplay.add(EnumChatFormatting.GOLD+NotEnoughUpdates.INSTANCE.manager.config.customTradePriceStyle.displayName); - tooltipToDisplay.add(EnumChatFormatting.GRAY+NotEnoughUpdates.INSTANCE.manager.config.customTradePriceStyle.desc); + tooltipToDisplay.add(EnumChatFormatting.GOLD+"Trade Prices Style"); + tooltipToDisplay.add(EnumChatFormatting.GRAY+"Changes the style of the top item prices"); tooltipLen = 200; } } @@ -1019,16 +1017,16 @@ public class TradeWindow { if(mouseX >= guiLeft+xSize+3 && mouseX <= guiLeft+xSize+3+17) { if(mouseY >= guiTop+ySize-19 && mouseY <= guiTop+ySize-19+17) { - NotEnoughUpdates.INSTANCE.manager.config.useCustomTrade.value = - !NotEnoughUpdates.INSTANCE.manager.config.useCustomTrade.value; + NotEnoughUpdates.INSTANCE.config.tradeMenu.enableCustomTrade = + !NotEnoughUpdates.INSTANCE.config.tradeMenu.enableCustomTrade; return; } else if(mouseY >= guiTop+ySize-38 && mouseY <= guiTop+ySize-38+17) { - NotEnoughUpdates.INSTANCE.manager.config.customTradePrices.value = - !NotEnoughUpdates.INSTANCE.manager.config.customTradePrices.value; + NotEnoughUpdates.INSTANCE.config.tradeMenu.customTradePrices = + !NotEnoughUpdates.INSTANCE.config.tradeMenu.customTradePrices; return; } else if(mouseY >= guiTop+ySize-57 && mouseY <= guiTop+ySize-57+17) { - NotEnoughUpdates.INSTANCE.manager.config.customTradePriceStyle.value = - !NotEnoughUpdates.INSTANCE.manager.config.customTradePriceStyle.value; + NotEnoughUpdates.INSTANCE.config.tradeMenu.customTradePriceStyle = + !NotEnoughUpdates.INSTANCE.config.tradeMenu.customTradePriceStyle; return; } } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinContainer.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinContainer.java new file mode 100644 index 00000000..d3c96896 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinContainer.java @@ -0,0 +1,19 @@ +package io.github.moulberry.notenoughupdates.mixins; + +import io.github.moulberry.notenoughupdates.miscfeatures.EnchantingSolvers; +import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Container.class) +public class MixinContainer { + + @Inject(method = "putStacksInSlots", at=@At("RETURN")) + public void putStacksInSlots(ItemStack[] stacks, CallbackInfo ci) { + EnchantingSolvers.processInventoryContents(); + } + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityRenderer.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityRenderer.java index b9820033..6ca5a308 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityRenderer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinEntityRenderer.java @@ -1,20 +1,11 @@ package io.github.moulberry.notenoughupdates.mixins; -import io.github.moulberry.notenoughupdates.BetterContainers; -import io.github.moulberry.notenoughupdates.CustomItemEffects; -import io.github.moulberry.notenoughupdates.NotEnoughUpdates; -import net.minecraft.client.gui.FontRenderer; +import io.github.moulberry.notenoughupdates.miscfeatures.CustomItemEffects; import net.minecraft.client.renderer.EntityRenderer; -import net.minecraft.client.renderer.RenderGlobal; -import net.minecraft.entity.Entity; -import net.minecraft.util.EnumWorldBlockLayer; import org.lwjgl.util.vector.Vector3f; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyVariable; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(EntityRenderer.class) public class MixinEntityRenderer { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiChest.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiChest.java index bd74b44c..da704ce3 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiChest.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiChest.java @@ -1,24 +1,13 @@ package io.github.moulberry.notenoughupdates.mixins; -import io.github.moulberry.notenoughupdates.BetterContainers; -import io.github.moulberry.notenoughupdates.NotEnoughUpdates; -import io.github.moulberry.notenoughupdates.StreamerMode; +import io.github.moulberry.notenoughupdates.miscfeatures.BetterContainers; import net.minecraft.client.gui.FontRenderer; -import net.minecraft.client.gui.GuiIngame; import net.minecraft.client.gui.inventory.GuiChest; -import net.minecraft.client.renderer.texture.DynamicTexture; import net.minecraft.client.renderer.texture.TextureManager; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; -import net.minecraft.scoreboard.ScorePlayerTeam; -import net.minecraft.scoreboard.Team; import net.minecraft.util.ResourceLocation; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin({GuiChest.class}) public class MixinGuiChest { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiContainer.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiContainer.java index e6d0a986..12d1f929 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiContainer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiContainer.java @@ -1,20 +1,18 @@ package io.github.moulberry.notenoughupdates.mixins; -import io.github.moulberry.notenoughupdates.BetterContainers; +import io.github.moulberry.notenoughupdates.miscfeatures.BetterContainers; +import io.github.moulberry.notenoughupdates.miscfeatures.EnchantingSolvers; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.util.Utils; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.inventory.GuiChest; import net.minecraft.client.gui.inventory.GuiContainer; -import net.minecraft.client.renderer.texture.TextureManager; -import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.client.renderer.RenderHelper; import net.minecraft.inventory.Container; import net.minecraft.inventory.ContainerChest; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -23,7 +21,7 @@ import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(GuiContainer.class) -public abstract class MixinGuiContainer { +public abstract class MixinGuiContainer extends GuiScreen { @Inject(method="drawSlot", at=@At("HEAD"), cancellable = true) public void drawSlot(Slot slot, CallbackInfo ci) { @@ -32,6 +30,15 @@ public abstract class MixinGuiContainer { GuiContainer $this = (GuiContainer)(Object)this; ItemStack stack = slot.getStack(); + if(stack != null) { + if(EnchantingSolvers.onStackRender(stack, slot.inventory, slot.getSlotIndex(), slot.xDisplayPosition, slot.yDisplayPosition)) { + ci.cancel(); + return; + } + } + + RenderHelper.enableGUIStandardItemLighting(); + if(stack == null && System.currentTimeMillis() - BetterContainers.lastRenderMillis < 300 && $this instanceof GuiChest) { Container container = ((GuiChest)$this).inventorySlots; if(container instanceof ContainerChest) { @@ -58,12 +65,33 @@ public abstract class MixinGuiContainer { } } + @Shadow + private Slot theSlot; + private static final String TARGET_GETSTACK = "Lnet/minecraft/inventory/Slot;getStack()Lnet/minecraft/item/ItemStack;"; + @Redirect(method="drawScreen", at=@At(value="INVOKE", target=TARGET_GETSTACK)) + public ItemStack drawScreen_getStack(Slot slot) { + if(theSlot != null && theSlot == slot && theSlot.getStack() != null) { + ItemStack newStack = EnchantingSolvers.overrideStack(theSlot.inventory, theSlot.getSlotIndex(), theSlot.getStack()); + if(newStack != null) { + return newStack; + } + } + return slot.getStack(); + } + @Redirect(method="drawSlot", at=@At(value="INVOKE", target=TARGET_GETSTACK)) public ItemStack drawSlot_getStack(Slot slot) { GuiContainer $this = (GuiContainer)(Object)this; ItemStack stack = slot.getStack(); + if(stack != null) { + ItemStack newStack = EnchantingSolvers.overrideStack(slot.inventory, slot.getSlotIndex(), stack); + if(newStack != null) { + stack = newStack; + } + } + if($this instanceof GuiChest) { Container container = ((GuiChest)$this).inventorySlots; if(container instanceof ContainerChest) { @@ -91,7 +119,7 @@ public abstract class MixinGuiContainer { private static final String TARGET_CANBEHOVERED = "Lnet/minecraft/inventory/Slot;canBeHovered()Z"; @Redirect(method="drawScreen", at=@At(value="INVOKE", target=TARGET_CANBEHOVERED)) public boolean drawScreen_canBeHovered(Slot slot) { - if(NotEnoughUpdates.INSTANCE.manager.config.hideEmptyPanes.value && + if(NotEnoughUpdates.INSTANCE.config.improvedSBMenu.hideEmptyPanes && BetterContainers.isOverriding() && BetterContainers.isBlankStack(slot.getStack())) { return false; } @@ -100,12 +128,18 @@ public abstract class MixinGuiContainer { @Inject(method="handleMouseClick", at=@At(value="HEAD"), cancellable = true) public void handleMouseClick(Slot slotIn, int slotId, int clickedButton, int clickType, CallbackInfo ci) { + GuiContainer $this = (GuiContainer)(Object)this; + if(slotIn != null && slotIn.getStack() != null) { + if(EnchantingSolvers.onStackClick(slotIn.getStack(), $this.inventorySlots.windowId, + slotId, clickedButton, clickType)) { + ci.cancel(); + } + } if(slotIn != null && BetterContainers.isOverriding() && (BetterContainers.isBlankStack(slotIn.getStack()) || BetterContainers.isButtonStack(slotIn.getStack()))) { BetterContainers.clickSlot(slotIn.getSlotIndex()); if(BetterContainers.isBlankStack(slotIn.getStack())) { - GuiContainer $this = (GuiContainer)(Object)this; $this.mc.playerController.windowClick($this.inventorySlots.windowId, slotId, 2, clickType, $this.mc.thePlayer); ci.cancel(); } else { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiIngame.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiIngame.java index 60361306..4ec15bea 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiIngame.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinGuiIngame.java @@ -1,7 +1,7 @@ package io.github.moulberry.notenoughupdates.mixins; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; -import io.github.moulberry.notenoughupdates.StreamerMode; +import io.github.moulberry.notenoughupdates.miscfeatures.StreamerMode; import net.minecraft.client.gui.GuiIngame; import net.minecraft.scoreboard.ScorePlayerTeam; import net.minecraft.scoreboard.Team; @@ -16,7 +16,7 @@ public class MixinGuiIngame { "formatPlayerName(Lnet/minecraft/scoreboard/Team;Ljava/lang/String;)Ljava/lang/String;"; @Redirect(method="renderScoreboard", at=@At(value="INVOKE", target=TARGET)) public String renderScoreboard_formatPlayerName(Team team, String name) { - if(NotEnoughUpdates.INSTANCE.isOnSkyblock() && NotEnoughUpdates.INSTANCE.manager.config.streamerMode.value) { + if(NotEnoughUpdates.INSTANCE.isOnSkyblock() && NotEnoughUpdates.INSTANCE.config.misc.streamerMode) { return StreamerMode.filterScoreboard(ScorePlayerTeam.formatPlayerName(team, name)); } return ScorePlayerTeam.formatPlayerName(team, name); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinInventoryEffectRenderer.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinInventoryEffectRenderer.java index 00fdc873..390896f2 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinInventoryEffectRenderer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinInventoryEffectRenderer.java @@ -13,7 +13,7 @@ public class MixinInventoryEffectRenderer { @ModifyVariable(method="updateActivePotionEffects", at=@At(value="STORE")) public boolean hasVisibleEffect_updateActivePotionEffects(boolean hasVisibleEffect) { - if(NotEnoughUpdates.INSTANCE.manager.config.hidePotionEffect.value && + if(NotEnoughUpdates.INSTANCE.config.misc.hidePotionEffect && NotEnoughUpdates.INSTANCE.isOnSkyblock()) { return false; } else { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinNetHandlerPlayClient.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinNetHandlerPlayClient.java index 0bb84f44..19bcdacf 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinNetHandlerPlayClient.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinNetHandlerPlayClient.java @@ -1,16 +1,16 @@ package io.github.moulberry.notenoughupdates.mixins; -import io.github.moulberry.notenoughupdates.CustomItemEffects; +import io.github.moulberry.notenoughupdates.miscfeatures.CustomItemEffects; +import io.github.moulberry.notenoughupdates.miscfeatures.EnchantingSolvers; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; -import io.github.moulberry.notenoughupdates.StreamerMode; import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.scoreboard.ScorePlayerTeam; -import net.minecraft.scoreboard.Team; -import org.lwjgl.util.vector.Vector3f; +import net.minecraft.network.play.server.S2FPacketSetSlot; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(NetHandlerPlayClient.class) public class MixinNetHandlerPlayClient { @@ -21,9 +21,16 @@ public class MixinNetHandlerPlayClient { public void handlePlayerPosLook_setPositionAndRotation(EntityPlayer player, double x, double y, double z, float yaw, float pitch) { if(CustomItemEffects.INSTANCE.aoteTeleportationCurr != null) { CustomItemEffects.INSTANCE.aoteTeleportationMillis += - Math.max(0, Math.min(300, NotEnoughUpdates.INSTANCE.manager.config.smoothAoteMillis.value)); + Math.max(0, Math.min(300, NotEnoughUpdates.INSTANCE.config.smoothAOTE.smoothTpMillis)); } player.setPositionAndRotation(x, y, z, yaw, pitch); } + @Inject(method="handleSetSlot", at=@At("HEAD")) + public void handleSetSlot(S2FPacketSetSlot packetIn, CallbackInfo ci) { + EnchantingSolvers.processInventoryContents(); + } + + + } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRender.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRender.java index 2c92a0b1..106f9f94 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRender.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRender.java @@ -20,7 +20,7 @@ public class MixinRender { public void bindEntityTexture(Entity entity, CallbackInfoReturnable<Boolean> cir) { if(entity instanceof EntityBat && DungeonBlocks.isOverriding()) { if(DungeonBlocks.bindModifiedTexture(new ResourceLocation("textures/entity/bat.png"), - SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.manager.config.dungChestColour.value))) { + SpecialColour.specialToChromaRGB(NotEnoughUpdates.INSTANCE.config.dungeonBlock.dungBatColour))) { cir.setReturnValue(true); GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST_MIPMAP_LINEAR); GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderFish.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderFish.java index fc536267..12888dcb 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderFish.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderFish.java @@ -34,7 +34,7 @@ public abstract class MixinRenderFish extends Render<EntityFishHook> { @Inject(method = "doRender(Lnet/minecraft/entity/projectile/EntityFishHook;DDDFF)V", at=@At(value = "HEAD"), cancellable = true) public void render(EntityFishHook entity, double x, double y, double z, float entityYaw, float partialTicks, CallbackInfo ci) { - if(!NotEnoughUpdates.INSTANCE.manager.config.rodColours.value || entity == null) return; + if(!NotEnoughUpdates.INSTANCE.config.rodColours.enableRodColours || entity == null) return; String internalname = NotEnoughUpdates.INSTANCE.manager.getInternalNameForItem(entity.angler.getHeldItem()); if (NotEnoughUpdates.INSTANCE.isOnSkyblock() && internalname != null && entity.angler != null && @@ -103,9 +103,9 @@ public abstract class MixinRenderFish extends Render<EntityFishHook> { String specialColour; if (entity.angler.getUniqueID().equals(Minecraft.getMinecraft().thePlayer.getUniqueID())) { - specialColour = NotEnoughUpdates.INSTANCE.manager.config.selfRodLineColour.value; + specialColour = NotEnoughUpdates.INSTANCE.config.rodColours.ownRodColour; } else { - specialColour = NotEnoughUpdates.INSTANCE.manager.config.otherRodLineColour.value; + specialColour = NotEnoughUpdates.INSTANCE.config.rodColours.otherRodColour; } int colourI = SpecialColour.specialToChromaRGB(specialColour); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderGlobal.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderGlobal.java index 2bb5503b..1b2b99ec 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderGlobal.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderGlobal.java @@ -1,11 +1,16 @@ package io.github.moulberry.notenoughupdates.mixins; -import io.github.moulberry.notenoughupdates.CustomItemEffects; +import io.github.moulberry.notenoughupdates.miscfeatures.CustomItemEffects; +import io.github.moulberry.notenoughupdates.cosmetics.CapeManager; import net.minecraft.client.renderer.RenderGlobal; +import net.minecraft.entity.Entity; +import net.minecraft.util.EnumWorldBlockLayer; import org.lwjgl.util.vector.Vector3f; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyVariable; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(RenderGlobal.class) public class MixinRenderGlobal { @@ -66,4 +71,12 @@ public class MixinRenderGlobal { return d5; } + @Inject(method="renderBlockLayer", at=@At("RETURN")) + public void renderBlockLayer(EnumWorldBlockLayer blockLayerIn, double partialTicks, int pass, + Entity entityIn, CallbackInfoReturnable<Integer> cir) { + if(blockLayerIn == EnumWorldBlockLayer.CUTOUT) { + CapeManager.getInstance().postRenderBlocks(); + } + } + } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderItem.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderItem.java index 67f0f7dc..6e552e3c 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderItem.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinRenderItem.java @@ -1,42 +1,13 @@ package io.github.moulberry.notenoughupdates.mixins; -import io.github.moulberry.notenoughupdates.ItemRarityHalo; -import io.github.moulberry.notenoughupdates.NEUResourceManager; -import io.github.moulberry.notenoughupdates.NotEnoughUpdates; -import io.github.moulberry.notenoughupdates.util.Utils; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.ScaledResolution; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.OpenGlHelper; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.WorldRenderer; +import io.github.moulberry.notenoughupdates.miscfeatures.ItemRarityHalo; import net.minecraft.client.renderer.entity.RenderItem; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.client.resources.model.IBakedModel; -import net.minecraft.client.shader.Framebuffer; -import net.minecraft.client.shader.Shader; import net.minecraft.item.ItemStack; -import net.minecraft.util.Matrix4f; -import org.lwjgl.BufferUtils; import org.lwjgl.input.Keyboard; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL14; -import org.lwjgl.opengl.GL30; -import org.lwjgl.util.vector.Vector4f; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import javax.vecmath.Vector3f; -import java.awt.*; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.nio.FloatBuffer; -import java.nio.IntBuffer; -import java.util.HashMap; @Mixin({RenderItem.class}) public abstract class MixinRenderItem { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinTileEntitySpecialRenderer.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinTileEntitySpecialRenderer.java index d53f62c9..f7c2435a 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinTileEntitySpecialRenderer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinTileEntitySpecialRenderer.java @@ -21,8 +21,8 @@ public abstract class MixinTileEntitySpecialRenderer { location.getResourcePath().equals("textures/entity/chest/normal_double.png") || location.getResourcePath().equals("textures/entity/chest/trapped.png") || location.getResourcePath().equals("textures/entity/chest/trapped_double.png")) { - String colour = location.getResourcePath().contains("trapped") ? NotEnoughUpdates.INSTANCE.manager.config.dungTrappedChestColour.value : - NotEnoughUpdates.INSTANCE.manager.config.dungChestColour.value; + String colour = location.getResourcePath().contains("trapped") ? NotEnoughUpdates.INSTANCE.config.dungeonBlock.dungTrappedChestColour : + NotEnoughUpdates.INSTANCE.config.dungeonBlock.dungChestColour; if(DungeonBlocks.bindModifiedTexture(location, SpecialColour.specialToChromaRGB(colour))) { info.cancel(); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinWorld.java b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinWorld.java new file mode 100644 index 00000000..bedfafc9 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/mixins/MixinWorld.java @@ -0,0 +1,25 @@ +package io.github.moulberry.notenoughupdates.mixins; + +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; +import io.github.moulberry.notenoughupdates.miscfeatures.CustomItemEffects; +import net.minecraft.world.World; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(World.class) +public class MixinWorld { + + @Inject(method="spawnParticle(IZDDDDDD[I)V", at=@At("HEAD"), cancellable = true) + public void spawnParticle(int particleID, boolean p_175720_2_, double xCood, double yCoord, double zCoord, + double xOffset, double yOffset, double zOffset, int[] p_175720_15_, CallbackInfo ci) { + if(NotEnoughUpdates.INSTANCE.config.smoothAOTE.disableHyperionParticles && + System.currentTimeMillis() - CustomItemEffects.INSTANCE.lastUsedHyperion < 500) { + if(particleID == 1) { + ci.cancel(); + } + } + } + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java b/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java new file mode 100644 index 00000000..3aa7d122 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfig.java @@ -0,0 +1,1234 @@ +package io.github.moulberry.notenoughupdates.options; + +import com.google.common.collect.Lists; +import com.google.gson.annotations.Expose; +import io.github.moulberry.notenoughupdates.core.config.Config; +import io.github.moulberry.notenoughupdates.core.config.annotations.*; + +import java.util.ArrayList; + +public class NEUConfig extends Config { + + @Expose + @Category( + name = "Misc", + desc = "Miscellaneous options which don't fit into any other category" + ) + public Misc misc = new Misc(); + + @Expose + @Category( + name = "Notifications", + desc = "Notifications" + ) + public Notifications notifications = new Notifications(); + + @Expose + @Category( + name = "Item List", + desc = "Modify the item list which shows when opening an inventory" + ) + public Itemlist itemlist = new Itemlist(); + + @Expose + @Category( + name = "Toolbar", + desc = "Toolbar" + ) + public Toolbar toolbar = new Toolbar(); + + @Expose + @Category( + name = "Tooltip Tweaks", + desc = "Tooltip Tweaks" + ) + public TooltipTweaks tooltipTweaks = new TooltipTweaks(); + + @Expose + @Category( + name = "Price Info (Auction)", + desc = "Price Info (Auction)" + ) + public PriceInfoAuc priceInfoAuc = new PriceInfoAuc(); + + @Expose + @Category( + name = "Price Info (Bazaar)", + desc = "Price Info (Bazaar)" + ) + public PriceInfoBaz priceInfoBaz = new PriceInfoBaz(); + + @Expose + @Category( + name = "Dungeon Profit", + desc = "Dungeon Profit" + ) + public DungeonProfit dungeonProfit = new DungeonProfit(); + + + @Expose + @Category( + name = "Dungeon Solvers", + desc = "Dungeon Solvers" + ) + public DungeonSolvers dungeonSolvers = new DungeonSolvers(); + + + @Expose + @Category( + name = "Enchanting Solvers", + desc = "Enchanting Solvers" + ) + public EnchSolvers enchantingSolvers = new EnchSolvers(); + + @Expose + @Category( + name = "NEU Auction House", + desc = "NEU Auction House" + ) + public NeuAuctionHouse neuAuctionHouse = new NeuAuctionHouse(); + + @Expose + @Category( + name = "Improved SB Menus", + desc = "Improved SB Menus" + ) + public ImprovedSBMenu improvedSBMenu = new ImprovedSBMenu(); + + @Expose + @Category( + name = "Calendar", + desc = "Calendar" + ) + public Calendar calendar = new Calendar(); + + @Expose + @Category( + name = "Trade Menu", + desc = "Trade Menu" + ) + public TradeMenu tradeMenu = new TradeMenu(); + + @Expose + @Category( + name = "Treecap Overlay", + desc = "Treecap Overlay" + ) + public TreecapOverlay treecapOverlay = new TreecapOverlay(); + + @Expose + @Category( + name = "Builders Wand Overlay", + desc = "Builders Wand Overlay" + ) + public BuilderWand builderWand = new BuilderWand(); + + @Expose + @Category( + name = "Dungeon Block Overlay", + desc = "Dungeon Block Overlay" + ) + public DungeonBlock dungeonBlock = new DungeonBlock(); + + @Expose + @Category( + name = "Accessory Bag Overlay", + desc = "Accessory Bag Overlay" + ) + public AccessoryBag accessoryBag = new AccessoryBag(); + + @Expose + @Category( + name = "Smooth AOTE", + desc = "Smooth AOTE" + ) + public SmoothAOTE smoothAOTE = new SmoothAOTE(); + + @Expose + @Category( + name = "Custom Rod Colours", + desc = "Custom Rod Colours" + ) + public RodColours rodColours = new RodColours(); + + @Expose + @Category( + name = "Dungeon Win Overlay", + desc = "Dungeon Win Overlay" + ) + public DungeonWin dungeonWin = new DungeonWin(); + + @Expose + @Category( + name = "Api Key", + desc = "Api Key" + ) + public ApiKey apiKey = new ApiKey(); + + @Expose + public Hidden hidden = new Hidden(); + + @Expose + public DungeonMap dungeonMap = new DungeonMap(); + + public static class Misc { + @Expose + @ConfigOption( + name = "Only Show on Skyblock", + desc = "The item list and some other GUI elements will only show on skyblock" + ) + @ConfigEditorBoolean + public boolean onlyShowOnSkyblock = true; + + @Expose + @ConfigOption( + name = "Hide Potion Effects", + desc = "Hides the potion effects inside your inventory while on skyblock" + ) + @ConfigEditorBoolean + public boolean hidePotionEffect = true; + + @Expose + @ConfigOption( + name = "Streamer Mode", + desc = "Randomizes lobby names in the scoreboard and chat messages to help prevent stream sniping" + ) + @ConfigEditorBoolean + public boolean streamerMode = false; + + @Expose + @ConfigOption( + name = "Gui Click Sounds", + desc = "Plays click sounds in various NEU-related GUIs when pressing buttons" + ) + @ConfigEditorBoolean + public boolean guiButtonClicks = true; + } + + public static class Notifications { + @Expose + @ConfigOption( + name = "Update Messages", + desc = "Give a notification in chat whenever a new version of NEU is released" + ) + @ConfigEditorBoolean + public boolean showUpdateMsg = true; + } + + public static class Itemlist { + @Expose + @ConfigOption( + name = "Show Vanilla Items", + desc = "Vanilla items are included in the item list" + ) + @ConfigEditorBoolean + public boolean showVanillaItems = true; + + @Expose + @ConfigOption( + name = "Open Itemlist Arrow", + desc = "Creates an arrow on the right-side to open the item list when hovered" + ) + @ConfigEditorBoolean + public boolean tabOpen = true; + + @Expose + @ConfigOption( + name = "Keep Open", + desc = "Keeps the Itemlist open after the inventory is closed" + ) + @ConfigEditorBoolean + public boolean keepopen = false; + + @Expose + @ConfigOption( + name = "Item Style", + desc = "Sets the style of the background behind items" + ) + @ConfigEditorDropdown( + values = {"Round", "Square"} + ) + public int itemStyle = 0; + + @Expose + @ConfigOption( + name = "Pane Gui Scale", + desc = "Change the gui scale of the Itemlist" + ) + @ConfigEditorDropdown( + values = {"Default", "Small", "Medium", "Large", "Auto"} + ) + public int paneGuiScale = 0; + + @Expose + @ConfigOption( + name = "Background Blur", + desc = "Change the blur amount behind the Itemlist. 0 = off" + ) + @ConfigEditorSlider( + minValue = 0, + maxValue = 20, + minStep = 1 + ) + public int bgBlurFactor = 5; + + @Expose + @ConfigOption( + name = "Pane Width Multiplier", + desc = "Change the width of the Itemlist" + ) + @ConfigEditorSlider( + minValue = 0.5f, + maxValue = 1.5f, + minStep = 0.1f + ) + public float paneWidthMult = 1.0f; + + @Expose + @ConfigOption( + name = "Pane Padding", + desc = "Change the padding around the Itemlist" + ) + @ConfigEditorSlider( + minValue = 0f, + maxValue = 20f, + minStep = 1f + ) + public int panePadding = 10; + + @Expose + @ConfigOption( + name = "Foreground Colour", + desc = "Change the colour of foreground elements in the Itemlist" + ) + @ConfigEditorColour + public String foregroundColour = "00:255:100:100:100"; + + @Expose + @ConfigOption( + name = "Favourite Colour", + desc = "Change the colour of favourited elements in the Itemlist" + ) + @ConfigEditorColour + public String favouriteColour = "00:255:200:150:50"; + + @Expose + @ConfigOption( + name = "Pane Background Colour", + desc = "Change the colour of the Itemlist background" + ) + @ConfigEditorColour + public String backgroundColour = "15:6:0:0:255"; + } + + public static class Toolbar { + @Expose + @ConfigOption( + name = "Show Quick Commands", + desc = "Show QuickCommands\u2122 in the NEU toolbar" + ) + @ConfigEditorBoolean + public boolean quickCommands = true; + + @Expose + @ConfigOption( + name = "Show Search Bar", + desc = "Show Itemlist search bar in the NEU toolbar" + ) + @ConfigEditorBoolean + public boolean searchBar = true; + + @Expose + @ConfigOption( + name = "Search Bar Width", + desc = "Change the width of the search bar" + ) + @ConfigEditorSlider( + minValue = 50f, + maxValue = 300f, + minStep = 10f + ) + public int searchBarWidth = 200; + + @Expose + @ConfigOption( + name = "Search Bar Height", + desc = "Change the height of the search bar" + ) + @ConfigEditorSlider( + minValue = 15f, + maxValue = 50f, + minStep = 1f + ) + public int searchBarHeight = 40; + + @Expose + @ConfigOption( + name = "Quick Commands Click Type", + desc = "Change the click type needed to trigger quick commands" + ) + @ConfigEditorDropdown( + values = {"Mouse Up", "Mouse Down"} + ) + public int quickCommandsClickType = 0; + } + + public static class TooltipTweaks { + @Expose + @ConfigOption( + name = "Price Info (Inv)", + desc = "Show price information for items in your inventory" + ) + @ConfigEditorBoolean + public boolean showPriceInfoInvItem = true; + + @Expose + @ConfigOption( + name = "Price Info (AH)", + desc = "Show price information for auctioned items" + ) + @ConfigEditorBoolean + public boolean showPriceInfoAucItem = true; + + @Expose + @ConfigOption( + name = "Missing Enchant List", + desc = "Show which enchants are missing on an item when pressing LSHIFT" + ) + @ConfigEditorBoolean + public boolean missingEnchantList = true; + + @Expose + @ConfigOption( + name = "Tooltip Border Colours", + desc = "Make the borders of tooltips match the rarity of the item (NEU Tooltips Only)" + ) + @ConfigEditorBoolean + public boolean tooltipBorderColours = true; + + @Expose + @ConfigOption( + name = "Tooltip Border Opacity", + desc = "Change the opacity of the rarity highlight (NEU Tooltips Only)" + ) + @ConfigEditorSlider( + minValue = 0f, + maxValue = 255f, + minStep = 1f + ) + public int tooltipBorderOpacity = 200; + } + + public static class PriceInfoAuc { + @Expose + @ConfigOption( + name = "Line 1", + desc = "Set the price information displayed on Line #1" + ) + @ConfigEditorDropdown( + values = {"", "Lowest BIN", "AH Price", "AH Sales", "Raw Craft Cost", "AVG Lowest BIN"} + ) + public int line1 = 1; + + @Expose + @ConfigOption( + name = "Line 2", + desc = "Set the price information displayed on Line #2" + ) + @ConfigEditorDropdown( + values = {"", "Lowest BIN", "AH Price", "AH Sales", "Raw Craft Cost", "AVG Lowest BIN"} + ) + public int line2 = 2; + + @Expose + @ConfigOption( + name = "Line 3", + desc = "Set the price information displayed on Line #3" + ) + @ConfigEditorDropdown( + values = {"", "Lowest BIN", "AH Price", "AH Sales", "Raw Craft Cost", "AVG Lowest BIN"} + ) + public int line3 = 3; + + @Expose + @ConfigOption( + name = "Line 4", + desc = "Set the price information displayed on Line #4" + ) + @ConfigEditorDropdown( + values = {"", "Lowest BIN", "AH Price", "AH Sales", "Raw Craft Cost", "AVG Lowest BIN"} + ) + public int line4 = 4; + + @Expose + @ConfigOption( + name = "Line 5", + desc = "Set the price information displayed on Line #5" + ) + @ConfigEditorDropdown( + values = {"", "Lowest BIN", "AH Price", "AH Sales", "Raw Craft Cost", "AVG Lowest BIN"} + ) + public int line5 = 0; + + @Expose + @ConfigOption( + name = "Line 6", + desc = "Set the price information displayed on Line #6" + ) + @ConfigEditorDropdown( + values = {"", "Lowest BIN", "AH Price", "AH Sales", "Raw Craft Cost", "AVG Lowest BIN"} + ) + public int line6 = 0; + } + + public static class PriceInfoBaz { + @Expose + @ConfigOption( + name = "Line 1", + desc = "Set the price information displayed on Line #1" + ) + @ConfigEditorDropdown( + values = {"", "Buy", "Sell", "Buy (Insta)", "Sell (Insta)", "Raw Craft Cost"} + ) + public int line1 = 1; + + @Expose + @ConfigOption( + name = "Line 2", + desc = "Set the price information displayed on Line #2" + ) + @ConfigEditorDropdown( + values = {"", "Buy", "Sell", "Buy (Insta)", "Sell (Insta)", "Raw Craft Cost"} + ) + public int line2 = 2; + + @Expose + @ConfigOption( + name = "Line 3", + desc = "Set the price information displayed on Line #3" + ) + @ConfigEditorDropdown( + values = {"", "Buy", "Sell", "Buy (Insta)", "Sell (Insta)", "Raw Craft Cost"} + ) + public int line3 = 3; + + @Expose + @ConfigOption( + name = "Line 4", + desc = "Set the price information displayed on Line #4" + ) + @ConfigEditorDropdown( + values = {"", "Buy", "Sell", "Buy (Insta)", "Sell (Insta)", "Raw Craft Cost"} + ) + public int line4 = 4; + + @Expose + @ConfigOption( + name = "Line 5", + desc = "Set the price information displayed on Line #5" + ) + @ConfigEditorDropdown( + values = {"", "Buy", "Sell", "Buy (Insta)", "Sell (Insta)", "Raw Craft Cost"} + ) + public int line5 = 5; + + @Expose + @ConfigOption( + name = "Line 6", + desc = "Set the price information displayed on Line #6" + ) + @ConfigEditorDropdown( + values = {"", "Buy", "Sell", "Buy (Insta)", "Sell (Insta)", "Raw Craft Cost"} + ) + public int line6 = 0; + } + + public static class DungeonProfit { + @Expose + @ConfigOption( + name = "Profit Type", + desc = "Set the price dataset used for calculating profit" + ) + @ConfigEditorDropdown( + values = {"Lowest BIN", "24 AVG Lowest Bin", "Auction AVG"} + ) + public int profitType = 0; + + @Expose + @ConfigOption( + name = "Profit Display Location", + desc = "Set where the profit information is displayed\n" + + "Overlay = Overlay on right side of inventory\n" + + "GUI Title = Text displayed next to the inventory title\n" + + "Lore = Inside the \"Open Reward Chest\" item" + ) + @ConfigEditorDropdown( + values = {"Overlay", "GUI Title", "Lore"} + ) + public int profitDisplayLoc = 0; + } + public static class DungeonSolvers { + + } + + public static class EnchSolvers { + @Expose + @ConfigOption( + name = "Enable Solvers", + desc = "Turn on solvers for the experimentation table" + ) + @ConfigEditorBoolean + public boolean enableEnchantingSolvers = true; + + @Expose + @ConfigOption( + name = "Prevent Misclicks", + desc = "Prevent accidentally failing the Chronomatron and Ultrasequencer experiments" + ) + @ConfigEditorBoolean + public boolean preventMisclicks = true; + + @Expose + @ConfigOption( + name = "Hide Tooltips", + desc = "Hide the tooltip of items in the Chronomatron and Ultrasequencer experiments" + ) + @ConfigEditorBoolean + public boolean hideTooltips = true; + + @Expose + @ConfigOption( + name = "Ultrasequencer Numbers", + desc = "Replace the items in the supersequencer with only numbers" + ) + @ConfigEditorBoolean + public boolean seqNumbers = false; + + @Expose + @ConfigOption( + name = "Ultrasequencer Next", + desc = "Set the colour of the glass pane shown behind the element in the ultrasequencer which is next" + ) + @ConfigEditorDropdown( + values = {"None", "White", "Orange", "Light Purple", "Light Blue", "Yellow", "Light Green", "Pink", + "Gray", "Light Gray", "Cyan", "Dark Purple", "Dark Blue", "Brown", "Dark Green", "Red", "Black"} + ) + public int seqNext = 6; + + @Expose + @ConfigOption( + name = "Ultrasequencer Upcoming", + desc = "Set the colour of the glass pane shown behind the element in the ultrasequencer which is coming after \"next\"" + ) + @ConfigEditorDropdown( + values = {"None", "White", "Orange", "Light Purple", "Light Blue", "Yellow", "Light Green", "Pink", + "Gray", "Light Gray", "Cyan", "Dark Purple", "Dark Blue", "Brown", "Dark Green", "Red", "Black"} + ) + public int seqUpcoming = 5; + + @Expose + @ConfigOption( + name = "Superpairs Matched", + desc = "Set the colour of the glass pane shown behind successfully matched pairs" + ) + @ConfigEditorDropdown( + values = {"None", "White", "Orange", "Light Purple", "Light Blue", "Yellow", "Light Green", "Pink", + "Gray", "Light Gray", "Cyan", "Dark Purple", "Dark Blue", "Brown", "Dark Green", "Red", "Black"} + ) + public int supMatched = 6; + + @Expose + @ConfigOption( + name = "Superpairs Possible", + desc = "Set the colour of the glass pane shown behind pairs which can be matched, but have not yet" + ) + @ConfigEditorDropdown( + values = {"None", "White", "Orange", "Light Purple", "Light Blue", "Yellow", "Light Green", "Pink", + "Gray", "Light Gray", "Cyan", "Dark Purple", "Dark Blue", "Brown", "Dark Green", "Red", "Black"} + ) + public int supPossible = 2; + + @Expose + @ConfigOption( + name = "Superpairs Unmatched", + desc = "Set the colour of the glass pane shown behind pairs which have been previously uncovered" + ) + @ConfigEditorDropdown( + values = {"None", "White", "Orange", "Light Purple", "Light Blue", "Yellow", "Light Green", "Pink", + "Gray", "Light Gray", "Cyan", "Dark Purple", "Dark Blue", "Brown", "Dark Green", "Red", "Black"} + ) + public int supUnmatched = 5; + + @Expose + @ConfigOption( + name = "Superpairs Powerups", + desc = "Set the colour of the glass pane shown behind powerups" + ) + @ConfigEditorDropdown( + values = {"None", "White", "Orange", "Light Purple", "Light Blue", "Yellow", "Light Green", "Pink", + "Gray", "Light Gray", "Cyan", "Dark Purple", "Dark Blue", "Brown", "Dark Green", "Red", "Black"} + ) + public int supPower = 11; + } + + public static class NeuAuctionHouse { + @Expose + @ConfigOption( + name = "Enable NeuAH", + desc = "Turn on the NEU Auction House. \u00A7cWARNING: May negatively impact performance on low-end machines" + ) + @ConfigEditorBoolean + public boolean enableNeuAuctionHouse = false; + + @Expose + @ConfigOption( + name = "Disable AH Scroll", + desc = "Disable scrolling using the scroll wheel inside NeuAH.\n" + + "This should be used if you want to be able to scroll through tooltips" + ) + @ConfigEditorBoolean + public boolean disableAhScroll = false; + + @Expose + @ConfigOption( + name = "AH Notification (Mins)", + desc = "Change the amount of time (in minutes) before the \"Ending Soon\" notification for an auction you have bid on" + ) + @ConfigEditorSlider( + minValue = 1f, + maxValue = 10f, + minStep = 1f + ) + public int ahNotification = 5; + } + + public static class ImprovedSBMenu { + @Expose + @ConfigOption( + name = "Enable Improved SB Menus", + desc = "Change the way that skyblock menus (eg. /sbmenu) look" + ) + @ConfigEditorBoolean + public boolean enableSbMenus = true; + + @Expose + @ConfigOption( + name = "Menu Background Style", + desc = "Change the style of the background of skyblock menus" + ) + @ConfigEditorDropdown( + values = {"Dark 1", "Dark 2", "Transparent", "Light 1", "Light 2", "Light 3", + "Unused 1", "Unused 2", "Unused 3", "Unused 4"} + ) + public int backgroundStyle = 0; + + @Expose + @ConfigOption( + name = "Button Background Style", + desc = "Change the style of the foreground elements in skyblock menus" + ) + @ConfigEditorDropdown( + values = {"Dark 1", "Dark 2", "Transparent", "Light 1", "Light 2", "Light 3", + "Unused 1", "Unused 2", "Unused 3", "Unused 4"} + ) + public int buttonStyle = 0; + + @Expose + @ConfigOption( + name = "Hide Empty Tooltips", + desc = "Hide the tooltips of glass panes with no text" + ) + @ConfigEditorBoolean + public boolean hideEmptyPanes = true; + } + + public static class Calendar { + @Expose + @ConfigOption( + name = "Event Notifications", + desc = "Display notifications for skyblock calendar events" + ) + @ConfigEditorBoolean + public boolean eventNotifications = true; + + @Expose + @ConfigOption( + name = "Starting Soon Time", + desc = "Display a notification before events start, time in seconds.\n" + + "0 = No prior notification" + ) + @ConfigEditorSlider( + minValue = 0f, + maxValue = 600f, + minStep = 30f + ) + public int startingSoonTime = 300; + + @Expose + @ConfigOption( + name = "Timer In Inventory", + desc = "Displays the time until the next event at the top of your screen when in inventories" + ) + @ConfigEditorBoolean + public boolean showEventTimerInInventory = true; + + @Expose + @ConfigOption( + name = "Notification Sounds", + desc = "Play a sound whenever events start" + ) + @ConfigEditorBoolean + public boolean eventNotificationSounds = true; + + @Expose + @ConfigOption( + name = "Spooky Night Notification", + desc = "Send a notification during spooky event when the time reaches 7pm" + ) + @ConfigEditorBoolean + public boolean spookyNightNotification = true; + } + + public static class TradeMenu { + @Expose + @ConfigOption( + name = "Enable Custom Trade Menu", + desc = "When trading with other players in skyblock, display a special GUI designed to prevent scamming" + ) + @ConfigEditorBoolean + public boolean enableCustomTrade = true; + + + @Expose + @ConfigOption( + name = "Price Information", + desc = "Show the price of items in the trade window on both sides" + ) + @ConfigEditorBoolean + public boolean customTradePrices = true; + + @Expose + public boolean customTradePriceStyle = true; + } + + public static class TreecapOverlay { + @Expose + @ConfigOption( + name = "Enable Treecap Overlay", + desc = "Show which blocks will be broken when using a Jungle Axe or Treecapitator" + ) + @ConfigEditorBoolean + public boolean enableTreecapOverlay = true; + + @Expose + @ConfigOption( + name = "Overlay Colour", + desc = "Change the colour of the overlay" + ) + @ConfigEditorColour + public String treecapOverlayColour = "00:50:64:224:208"; + } + + public static class BuilderWand { + @Expose + @ConfigOption( + name = "Enable Wand Overlay", + desc = "Show which blocks will be placed when using the Builder's Wand" + ) + @ConfigEditorBoolean + public boolean enableWandOverlay = true; + + @Expose + @ConfigOption( + name = "Wand Block Count", + desc = "Shows the total count of a block in your inventory" + ) + @ConfigEditorBoolean + public boolean wandBlockCount = true; + + @Expose + @ConfigOption( + name = "Overlay Colour", + desc = "Change the colour of the ghost block outline" + ) + @ConfigEditorColour + public String wandOverlayColour = "00:50:64:224:208"; + } + + public static class DungeonBlock { + @Expose + @ConfigOption( + name = "Enable Block Overlay", + desc = "Change the colour of certain blocks / entities while inside dungeons, but keeps the normal texture outside of dungeons" + ) + @ConfigEditorBoolean + public boolean enableDungBlockOverlay = true; + + @Expose + @ConfigOption( + name = "Show Overlay Everywhere", + desc = "Show the dungeon block overlay even when not inside dungeons. Should only be used for testing." + ) + @ConfigEditorBoolean + public boolean dungeonBlocksEverywhere = false; + + @Expose + @ConfigOption( + name = "Slow Update", + desc = "Updates the colour every second instead of every tick.\n" + + "\u00A7cWARNING: This will cause all texture animations (eg. flowing water) to update slowly.\n" + + "This should only be used on low-end machines" + ) + @ConfigEditorBoolean + public boolean slowDungeonBlocks = false; + + @Expose + @ConfigOption( + name = "Cracked Bricks", + desc = "Change the colour of: Cracked Bricks" + ) + @ConfigEditorColour + public String dungCrackedColour = "0:255:7:255:217"; + + @Expose + @ConfigOption( + name = "Dispensers", + desc = "Change the colour of: Dispensers" + ) + @ConfigEditorColour + public String dungDispenserColour = "0:255:255:76:0"; + + @Expose + @ConfigOption( + name = "Levers", + desc = "Change the colour of: Levers" + ) + @ConfigEditorColour + public String dungLeverColour = "0:252:24:249:255"; + + @Expose + @ConfigOption( + name = "Tripwire String", + desc = "Change the colour of: Tripwire String" + ) + @ConfigEditorColour + public String dungTripWireColour = "0:255:255:0:0"; + + @Expose + @ConfigOption( + name = "Normal Chests", + desc = "Change the colour of: Normal Chests" + ) + @ConfigEditorColour + public String dungChestColour = "0:255:0:163:36"; + + @Expose + @ConfigOption( + name = "Trapped Chests", + desc = "Change the colour of: Trapped Chests" + ) + @ConfigEditorColour + public String dungTrappedChestColour = "0:255:0:163:36"; + + @Expose + @ConfigOption( + name = "Bats", + desc = "Change the colour of: Bats" + ) + @ConfigEditorColour + public String dungBatColour = "0:255:12:255:0"; + } + + public static class AccessoryBag { + @Expose + @ConfigOption( + name = "Enable Accessory Bag Overlay", + desc = "Show an overlay on the accessory bag screen which gives useful information about your accessories" + ) + @ConfigEditorBoolean + public boolean enableOverlay = true; + } + + public static class SmoothAOTE { + @Expose + @ConfigOption( + name = "Enable Smooth AOTE", + desc = "Teleport smoothly to your destination when using AOTE" + ) + @ConfigEditorBoolean + public boolean enableSmoothAOTE = true; + + @Expose + @ConfigOption( + name = "Enable Smooth Hyperion", + desc = "Teleport smoothly to your destination when using Hyperion" + ) + @ConfigEditorBoolean + public boolean enableSmoothHyperion = true; + + @Expose + @ConfigOption( + name = "Smooth TP Time", + desc = "Change the amount of time (milliseconds) taken to teleport" + ) + @ConfigEditorSlider( + minValue = 0, + maxValue = 500, + minStep = 25 + ) + public int smoothTpMillis = 175; + + + @Expose + @ConfigOption( + name = "Disable Hyperion Particles", + desc = "Remove the explosion effect when using a hyperion" + ) + @ConfigEditorBoolean + public boolean disableHyperionParticles = true; + } + + public static class RodColours { + @Expose + @ConfigOption( + name = "Enable Rod Colours", + desc = "Change the colour of your and other players' rod lines\n" + + "Also fixes the position of the rod line" + ) + @ConfigEditorBoolean + public boolean enableRodColours = true; + + @Expose + @ConfigOption( + name = "Own Rod Colour", + desc = "Change the colour of your own rod lines" + ) + @ConfigEditorColour + public String ownRodColour = "0:255:0:0:0"; + + + @Expose + @ConfigOption( + name = "Other Rod Colour", + desc = "Change the colour of other players' rod lines" + ) + @ConfigEditorColour + public String otherRodColour = "0:255:0:0:0"; + } + + public static class DungeonWin { + @Expose + @ConfigOption( + name = "Enable Dungeon Win", + desc = "Show a fancy win screen and stats when completing a dungeon" + ) + @ConfigEditorBoolean + public boolean enableDungeonWin = true; + + @Expose + @ConfigOption( + name = "Dungeon Win Time", + desc = "Change the amount of time (milliseconds) that the win screen shows for" + ) + @ConfigEditorSlider( + minValue = 0, + maxValue = 20000, + minStep = 500 + ) + public int dungeonWinMillis = 8000; + } + + public static class ApiKey { + @Expose + @ConfigOption( + name = "Api Key", + desc = "Hypixel api key" + ) + @ConfigEditorText + public String apiKey = ""; + } + + private static ArrayList<String> createDefaultQuickCommands() { + ArrayList<String> arr = new ArrayList<>(); + arr.add("/warp home:Warp Home:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzljODg4MWU0MjkxNWE5ZDI5YmI2MWExNmZiMjZkMDU5OTEzMjA0ZDI2NWRmNWI0MzliM2Q3OTJhY2Q1NiJ9fX0="); + arr.add("/warp hub:Warp Hub:eyJ0aW1lc3RhbXAiOjE1NTkyMTU0MTY5MDksInByb2ZpbGVJZCI6IjQxZDNhYmMyZDc0OTQwMGM5MDkwZDU0MzRkMDM4MzFiIiwicHJvZmlsZU5hbWUiOiJNZWdha2xvb24iLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2Q3Y2M2Njg3NDIzZDA1NzBkNTU2YWM1M2UwNjc2Y2I1NjNiYmRkOTcxN2NkODI2OWJkZWJlZDZmNmQ0ZTdiZjgifX19"); + arr.add("/warp dungeon_hub:Dungeon Hub:eyJ0aW1lc3RhbXAiOjE1Nzg0MDk0MTMxNjksInByb2ZpbGVJZCI6IjQxZDNhYmMyZDc0OTQwMGM5MDkwZDU0MzRkMDM4MzFiIiwicHJvZmlsZU5hbWUiOiJNZWdha2xvb24iLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzliNTY4OTViOTY1OTg5NmFkNjQ3ZjU4NTk5MjM4YWY1MzJkNDZkYjljMWIwMzg5YjhiYmViNzA5OTlkYWIzM2QiLCJtZXRhZGF0YSI6eyJtb2RlbCI6InNsaW0ifX19fQ=="); + arr.add("/craft:Crafting Table:CRAFTING_TABLE"); + arr.add("/enderchest:Ender Chest:ENDER_CHEST"); + arr.add("/wardrobe:Wardrobe:LEATHER_CHESTPLATE"); + arr.add("/pets:Pets:BONE"); + arr.add("/ah:Auction House:GOLD_BLOCK"); + arr.add("/bz:Bazaar:GOLD_BARDING"); + return arr; + } + + public static class Hidden { + @Expose public boolean enableItemEditing = false; + @Expose public boolean cacheRenderedItempane = true; + @Expose public boolean autoupdate = true; + @Expose public String overlaySearchBar = ""; + @Expose public String overlayQuickCommand = ""; + @Expose public boolean dev = false; + @Expose public boolean loadedModBefore = false; + @Expose public boolean doRamNotif = true; + @Expose public String selectedCape = null; + @Expose public int compareMode = 0; + @Expose public int sortMode = 0; + @Expose public ArrayList<Boolean> compareAscending = Lists.newArrayList(true, true, true); + @Expose public ArrayList<String> favourites = new ArrayList<>(); + @Expose public ArrayList<String> eventFavourites = new ArrayList<>(); + @Expose public ArrayList<String> quickCommands = createDefaultQuickCommands(); + @Expose public ArrayList<String> enchantColours = Lists.newArrayList( + "[a-zA-Z\\- ]+:\u003e:9:6", + "[a-zA-Z\\- ]+:\u003e:6:c", + "[a-zA-Z\\- ]+:\u003e:5:5", + "Experience:\u003e:3:5", + "Life Steal:\u003e:3:5", + "Scavenger:\u003e:3:5", + "Looting:\u003e:3:5"); + } + + public static class DungeonMap { + @Expose + @ConfigOption( + name = "Border Size", + desc = "Changes the size of the map border, without changing the size of the contents" + ) + @ConfigEditorSlider( + minValue = 0, + maxValue = 5, + minStep = 1 + ) + public int dmBorderSize = 1; + + @Expose + @ConfigOption( + name = "Room Size", + desc = "Changes the size of rooms. Useful for higher dungeons with larger maps" + ) + @ConfigEditorSlider( + minValue = 0, + maxValue = 5, + minStep = 1 + ) + public int dmRoomSize = 1; + + @Expose + @ConfigOption( + name = "Icon Size", + desc = "Changes the scale of room indicators and player icons" + ) + @ConfigEditorSlider( + minValue = 0.5f, + maxValue = 3f, + minStep = 0.25f + ) + public float dmIconScale = 1.0f; + + @Expose + @ConfigOption( + name = "Border Style", + desc = "Various custom borders from various talented artists.\nUse 'custom' if your texture pack has a custom border" + ) + public int dmBorderStyle = 0; + + @Expose + @ConfigOption( + name = "Show Dungeon Map", + desc = "Show/hide the NEU dungeon map" + ) + public boolean dmEnable = true; + + @Expose + @ConfigOption( + name = "Map Center", + desc = "Center on rooms, or center on your player" + ) + public boolean dmCenterPlayer = true; + + @Expose + @ConfigOption( + name = "Rotate with Player", + desc = "Rotate the map to face the same direction as your player" + ) + public boolean dmRotatePlayer = true; + + @Expose + @ConfigOption( + name = "Orient Checkmarks", + desc = "Checkmarks will always show vertically, regardless of rotation" + ) + public boolean dmOrientCheck = true; + + @Expose + @ConfigOption( + name = "Center Checkmarks", + desc = "Checkmarks will show closer to the center of rooms" + ) + public boolean dmCenterCheck = false; + + @Expose + @ConfigOption( + name = "Player Icon Style", + desc = "Various player icon styles" + ) + public int dmPlayerHeads = 0; + + @Expose + @ConfigOption( + name = "Interpolate Far Players", + desc = "Will make players far away move smoothly" + ) + public boolean dmPlayerInterp = true; + + @Expose + @ConfigOption( + name = "OpenGL Compatibility", + desc = "Compatiblity options for people with bad computers. ONLY use this if you know what you are doing, otherwise the map will look worse" + ) + public int dmCompat = 0; + + @Expose + @ConfigOption( + name = "Background Colour", + desc = "Colour of the map background. Supports opacity & chroma" + ) + public String dmBackgroundColour = "00:170:75:75:75"; + + @Expose + @ConfigOption( + name = "Border Colour", + desc = "Colour of the map border. Supports opacity & chroma. Turn off custom borders to see" + ) + public String dmBorderColour = "00:0:0:0:0"; + + @Expose + @ConfigOption( + name = "Chroma Border Mode", + desc = "Applies a hue offset around the map border" + ) + public boolean dmChromaBorder = false; + + @Expose + @ConfigOption( + name = "Background Blur Factor", + desc = "Changes the blur factor behind the map. Set to 0 to disable blur" + ) + public int dmBackgroundBlur = 3; + + @Expose + @ConfigOption( + name = "Center X (%)", + desc = "The horizontal position of the map" + ) + public double dmCenterX = 8.5; + + @Expose + @ConfigOption( + name = "Center Y (%)", + desc = "The vertical position of the map" + ) + public double dmCenterY = 15.0; + } + +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfigEditor.java b/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfigEditor.java new file mode 100644 index 00000000..3d006383 --- /dev/null +++ b/src/main/java/io/github/moulberry/notenoughupdates/options/NEUConfigEditor.java @@ -0,0 +1,390 @@ +package io.github.moulberry.notenoughupdates.options; + +import com.google.common.collect.Lists; +import io.github.moulberry.notenoughupdates.core.GlScissorStack; +import io.github.moulberry.notenoughupdates.core.GuiElement; +import io.github.moulberry.notenoughupdates.core.config.Config; +import io.github.moulberry.notenoughupdates.core.config.gui.GuiOptionEditor; +import io.github.moulberry.notenoughupdates.core.config.struct.ConfigProcessor; +import io.github.moulberry.notenoughupdates.core.util.lerp.LerpUtils; +import io.github.moulberry.notenoughupdates.core.util.lerp.LerpingInteger; +import io.github.moulberry.notenoughupdates.core.util.render.RenderUtils; +import io.github.moulberry.notenoughupdates.core.util.render.TextRenderUtils; +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.util.EnumChatFormatting; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; +import static io.github.moulberry.notenoughupdates.util.GuiTextures.*; + +import java.awt.*; +import java.net.URI; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class NEUConfigEditor extends GuiElement { + + private static final ResourceLocation[] socialsIco = new ResourceLocation[] { + DISCORD, + GITHUB, + TWITTER, + YOUTUBE, + PATREON + }; + private static final String[] socialsLink = new String[] { + "https://discord.gg/moulberry", + "https://github.com/Moulberry/Hychat", + "https://twitter.com/moulberry/", + "https://www.youtube.com/channel/UCPh-OKmRSS3IQi9p6YppLcw", + "https://patreon.com/moulberry" + }; + + private final long openedMillis; + + private String selectedCategory = null; + + private LerpingInteger optionsScroll = new LerpingInteger(0, 150); + + private LinkedHashMap<String, ConfigProcessor.ProcessedCategory> processedConfig; + + public NEUConfigEditor(Config config) { + this.openedMillis = System.currentTimeMillis(); + this.processedConfig = ConfigProcessor.create(config); + } + + private LinkedHashMap<String, ConfigProcessor.ProcessedCategory> getCurrentConfigEditing() { + return processedConfig; + } + + private String getSelectedCategory() { + return selectedCategory; + } + + private void setSelectedCategory(String category) { + selectedCategory = category; + optionsScroll.setValue(0); + } + + public void render() { + optionsScroll.tick(); + + List<String> tooltipToDisplay = null; + + long currentTime = System.currentTimeMillis(); + long delta = currentTime - openedMillis; + + ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); + int width = scaledResolution.getScaledWidth(); + int height = scaledResolution.getScaledHeight(); + int mouseX = Mouse.getX() * width / Minecraft.getMinecraft().displayWidth; + int mouseY = height - Mouse.getY() * height / Minecraft.getMinecraft().displayHeight - 1; + + float opacityFactor = LerpUtils.sigmoidZeroOne(delta/500f); + RenderUtils.drawGradientRect(0, 0, 0, width, height, + (int)(0x80*opacityFactor) << 24 | 0x101010, + (int)(0x90*opacityFactor) << 24 | 0x101010); + + int xSize = Math.min(scaledResolution.getScaledWidth()-100/scaledResolution.getScaleFactor(), 500); + int ySize = Math.min(scaledResolution.getScaledHeight()-100/scaledResolution.getScaleFactor(), 400); + + int x = (scaledResolution.getScaledWidth() - xSize)/2; + int y = (scaledResolution.getScaledHeight() - ySize)/2; + + int adjScaleFactor = Math.max(2, scaledResolution.getScaleFactor()); + + int openingXSize = xSize; + int openingYSize = ySize; + if(delta < 150) { + openingXSize = (int)(delta*xSize/150); + openingYSize = 5; + } else if(delta < 300) { + openingYSize = 5 + (int)(delta-150)*(ySize-5)/150; + } + RenderUtils.drawFloatingRectDark( + (scaledResolution.getScaledWidth() - openingXSize)/2, + (scaledResolution.getScaledHeight() - openingYSize)/2, + openingXSize, openingYSize); + GlScissorStack.clear(); + GlScissorStack.push((scaledResolution.getScaledWidth() - openingXSize)/2, + (scaledResolution.getScaledHeight() - openingYSize)/2, + (scaledResolution.getScaledWidth() + openingXSize)/2, + (scaledResolution.getScaledHeight() + openingYSize)/2, scaledResolution); + + RenderUtils.drawFloatingRectDark(x+5, y+5, xSize-10, 20, false); + + FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; + TextRenderUtils.drawStringCenteredScaledMaxWidth("NotEnoughUpdates by "+EnumChatFormatting.DARK_PURPLE+"Moulberry", + fr, x+xSize/2, y+15, false, 200, 0xa0a0a0); + + RenderUtils.drawFloatingRectDark(x+4, y+49-20, + 140, ySize-54+20, false); + + int innerPadding = 20/adjScaleFactor; + int innerLeft = x+4+innerPadding; + int innerRight = x+144-innerPadding; + int innerTop = y+49+innerPadding; + int innerBottom = y+ySize-5-innerPadding; + Gui.drawRect(innerLeft, innerTop, innerLeft+1, innerBottom, 0xff08080E); //Left + Gui.drawRect(innerLeft+1, innerTop, innerRight, innerTop+1, 0xff08080E); //Top + Gui.drawRect(innerRight-1, innerTop+1, innerRight, innerBottom, 0xff28282E); //Right + Gui.drawRect(innerLeft+1, innerBottom-1, innerRight-1, innerBottom, 0xff28282E); //Bottom + Gui.drawRect(innerLeft+1, innerTop+1, innerRight-1, innerBottom-1, 0x6008080E); //Middle + + GlScissorStack.push(0, innerTop+1, scaledResolution.getScaledWidth(), + innerBottom-1, scaledResolution); + + int categoryIndex = 0; + for(Map.Entry<String, ConfigProcessor.ProcessedCategory> entry : getCurrentConfigEditing().entrySet()) { + if(getSelectedCategory() == null) { + setSelectedCategory(entry.getKey()); + } + String catName = entry.getValue().name; + if(entry.getKey().equals(getSelectedCategory())) { + catName = EnumChatFormatting.DARK_AQUA.toString() + EnumChatFormatting.UNDERLINE + catName; + } else { + catName = EnumChatFormatting.GRAY + catName; + } + TextRenderUtils.drawStringCenteredScaledMaxWidth(catName, + fr, x+75, y+70+categoryIndex*15, false, 140, -1); + categoryIndex++; + } + + GlScissorStack.pop(scaledResolution); + + TextRenderUtils.drawStringCenteredScaledMaxWidth("Categories", + fr, x+75, y+44, false, 120, 0xa368ef); + + RenderUtils.drawFloatingRectDark(x+149, y+29, + xSize-154, ySize-34, false); + + if(getSelectedCategory() != null && getCurrentConfigEditing().containsKey(getSelectedCategory())) { + ConfigProcessor.ProcessedCategory cat = getCurrentConfigEditing().get(getSelectedCategory()); + + TextRenderUtils.drawStringCenteredScaledMaxWidth(cat.desc, + fr, x+xSize/2+72, y+44, true, xSize-154-innerPadding*2, 0xb0b0b0); + } + + innerLeft = x+149+innerPadding; + innerRight =x+xSize-5-innerPadding; + //innerTop = y+29+innerPadding; + innerBottom = y+ySize-5-innerPadding; + Gui.drawRect(innerLeft, innerTop, innerLeft+1, innerBottom, 0xff08080E); //Left + Gui.drawRect(innerLeft+1, innerTop, innerRight, innerTop+1, 0xff08080E); //Top + Gui.drawRect(innerRight-1, innerTop+1, innerRight, innerBottom, 0xff303036); //Right + Gui.drawRect(innerLeft+1, innerBottom-1, innerRight-1, innerBottom, 0xff303036); //Bottom + Gui.drawRect(innerLeft+1, innerTop+1, innerRight-1, innerBottom-1, 0x6008080E); //Middle + + GlScissorStack.push(innerLeft+1, innerTop+1, innerRight-1, innerBottom-1, scaledResolution); + + float barSize = 1; + int optionY = -optionsScroll.getValue(); + if(getSelectedCategory() != null && getCurrentConfigEditing().containsKey(getSelectedCategory())) { + ConfigProcessor.ProcessedCategory cat = getCurrentConfigEditing().get(getSelectedCategory()); + int optionWidth = innerRight-innerLeft-20; + GlStateManager.enableDepth(); + for(ConfigProcessor.ProcessedOption option : cat.options.values()) { + GuiOptionEditor editor = option.editor; + if(editor == null) { + continue; + } + int optionHeight = editor.getHeight(); + if(innerTop+5+optionY+optionHeight > innerTop+1 && innerTop+5+optionY < innerBottom-1) { + editor.render(innerLeft+5, innerTop+5+optionY, optionWidth); + } + optionY += optionHeight + 5; + } + GlStateManager.disableDepth(); + if(optionY > 0) { + barSize = LerpUtils.clampZeroOne((float)(innerBottom-innerTop-2)/(optionY+5+optionsScroll.getValue())); + } + } + + GlScissorStack.pop(scaledResolution); + + float barStart = optionsScroll.getValue() / (float)(optionY + optionsScroll.getValue()); + float barEnd = barStart+barSize; + if(barEnd > 1) { + barEnd = 1; + if(optionsScroll.getTarget()/(float)(optionY + optionsScroll.getValue())+barSize < 1) { + int target = optionsScroll.getTarget(); + optionsScroll.setValue((int)Math.ceil((optionY+5+optionsScroll.getValue())-barSize*(optionY+5+optionsScroll.getValue()))); + optionsScroll.setTarget(target); + } else { + optionsScroll.setValue((int)Math.ceil((optionY+5+optionsScroll.getValue())-barSize*(optionY+5+optionsScroll.getValue()))); + } + } + int dist = innerBottom-innerTop-12; + Gui.drawRect(innerRight-10, innerTop+5, innerRight-5, innerBottom-5, 0xff101010); + Gui.drawRect(innerRight-9, innerTop+6+(int)(dist*barStart), innerRight-6, innerTop+6+(int)(dist*barEnd), 0xff303030); + + for(int socialIndex=0; socialIndex<socialsIco.length; socialIndex++) { + Minecraft.getMinecraft().getTextureManager().bindTexture(socialsIco[socialIndex]); + GlStateManager.color(1, 1, 1, 1); + int socialLeft = x+xSize-23-18*socialIndex; + RenderUtils.drawTexturedRect(socialLeft, y+7, 16, 16, GL11.GL_LINEAR); + + if(mouseX >= socialLeft && mouseX <= socialLeft+16 && + mouseY >= y+6 && mouseY <= y+23) { + tooltipToDisplay = Lists.newArrayList(EnumChatFormatting.YELLOW+"Go to: "+EnumChatFormatting.RESET+socialsLink[socialIndex]); + } + } + + GlScissorStack.clear(); + + if(tooltipToDisplay != null) { + TextRenderUtils.drawHoveringText(tooltipToDisplay, mouseX, mouseY, width, height, -1, fr); + } + + GlStateManager.translate(0, 0, -2); + } + + public boolean mouseInput(int mouseX, int mouseY) { + ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft()); + int width = scaledResolution.getScaledWidth(); + int height = scaledResolution.getScaledHeight(); + + int xSize = Math.min(width-100/scaledResolution.getScaleFactor(), 500); + int ySize = Math.min(height-100/scaledResolution.getScaleFactor(), 400); + + int x = (scaledResolution.getScaledWidth() - xSize)/2; + int y = (scaledResolution.getScaledHeight() - ySize)/2; + + int adjScaleFactor = Math.max(2, scaledResolution.getScaleFactor()); + + int innerPadding = 20/adjScaleFactor; + int innerTop = y+49+innerPadding; + int innerBottom = y+ySize-5-innerPadding; + int innerLeft = x+149+innerPadding; + int innerRight = x+xSize-5-innerPadding; + + int dWheel = Mouse.getDWheel(); + if(mouseY > innerTop && mouseY < innerBottom && dWheel != 0) { + if(dWheel < 0) { + dWheel = -1; + } + if(dWheel > 0) { + dWheel = 1; + } + boolean resetTimer = true; + int newTarget = optionsScroll.getTarget() - dWheel*30; + if(newTarget < 0) { + newTarget = 0; + resetTimer = false; + } + + float barSize = 1; + int optionY = -newTarget; + if(getSelectedCategory() != null && getCurrentConfigEditing() != null && getCurrentConfigEditing().containsKey(getSelectedCategory())) { + ConfigProcessor.ProcessedCategory cat = getCurrentConfigEditing().get(getSelectedCategory()); + for(ConfigProcessor.ProcessedOption option : cat.options.values()) { + GuiOptionEditor editor = option.editor; + if(editor == null) { + continue; + } + optionY += editor.getHeight() + 5; + + if(optionY > 0) { + barSize = LerpUtils.clampZeroOne((float)(innerBottom-innerTop-2)/(optionY+5 + newTarget)); + } + } + } + + int barMax = (int)Math.floor((optionY+5+newTarget)-barSize*(optionY+5+newTarget)); + if(newTarget > barMax) { + newTarget = barMax; + resetTimer = false; + } + if(resetTimer && optionsScroll.getTarget() != newTarget) { + optionsScroll.resetTimer(); + } + optionsScroll.setTarget(newTarget); + } else if(Mouse.getEventButtonState() && Mouse.getEventButton() == 0) { + if(getCurrentConfigEditing() != null) { + int categoryIndex = 0; + for(Map.Entry<String, ConfigProcessor.ProcessedCategory> entry : getCurrentConfigEditing().entrySet()) { + if(getSelectedCategory() == null) { + setSelectedCategory(entry.getKey()); + } + if(mouseX >= x+5 && mouseX <= x+145 && + mouseY >= y+70+categoryIndex*15-7 && mouseY <= y+70+categoryIndex*15+7) { + setSelectedCategory(entry.getKey()); + return true; + } + categoryIndex++; + } + } + + for(int socialIndex=0; socialIndex<socialsLink.length; socialIndex++) { + int socialLeft = x+xSize-23-18*socialIndex; + + if(mouseX >= socialLeft && mouseX <= socialLeft+16 && + mouseY >= y+6 && mouseY <= y+23) { + try { + Desktop.getDesktop().browse(new URI(socialsLink[socialIndex])); + } catch(Exception ignored) {} + return true; + } + } + } + + int optionY = -optionsScroll.getValue(); + if(getSelectedCategory() != null && getCurrentConfigEditing() != null && getCurrentConfigEditing().containsKey(getSelectedCategory())) { + int optionWidth = innerRight-innerLeft-20; + ConfigProcessor.ProcessedCategory cat = getCurrentConfigEditing().get(getSelectedCategory()); + for(ConfigProcessor.ProcessedOption option : cat.options.values()) { + GuiOptionEditor editor = option.editor; + if(editor == null) { + continue; + } + if(editor.mouseInputGlobal(innerLeft+5, innerTop+5+optionY, optionWidth, mouseX, mouseY)) { + return true; + } + optionY += editor.getHeight() + 5; + } + } + + if(mouseX > innerLeft && mouseX < innerRight && + mouseY > innerTop && mouseY < innerBottom) { + optionY = -optionsScroll.getValue(); + if(getSelectedCategory() != null && getCurrentConfigEditing() != null && getCurrentConfigEditing().containsKey(getSelectedCategory())) { + int optionWidth = innerRight-innerLeft-20; + ConfigProcessor.ProcessedCategory cat = getCurrentConfigEditing().get(getSelectedCategory()); + for(ConfigProcessor.ProcessedOption option : cat.options.values()) { + GuiOptionEditor editor = option.editor; + if(editor == null) { + continue; + } + if(editor.mouseInput(innerLeft+5, innerTop+5+optionY, optionWidth, mouseX, mouseY)) { + return true; + } + optionY += editor.getHeight() + 5; + } + } + } + + return true; + } + + public boolean keyboardInput() { + if(getSelectedCategory() != null && getCurrentConfigEditing() != null && getCurrentConfigEditing().containsKey(getSelectedCategory())) { + ConfigProcessor.ProcessedCategory cat = getCurrentConfigEditing().get(getSelectedCategory()); + for(ConfigProcessor.ProcessedOption option : cat.options.values()) { + GuiOptionEditor editor = option.editor; + if(editor == null) { + continue; + } + if(editor.keyboardInput()) { + return true; + } + } + } + + return true; + } +} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/options/Options.java b/src/main/java/io/github/moulberry/notenoughupdates/options/Options.java deleted file mode 100644 index a5566ce6..00000000 --- a/src/main/java/io/github/moulberry/notenoughupdates/options/Options.java +++ /dev/null @@ -1,819 +0,0 @@ -package io.github.moulberry.notenoughupdates.options; - -import com.google.gson.*; -import io.github.moulberry.notenoughupdates.dungeons.GuiDungeonMapEditor; -import io.github.moulberry.notenoughupdates.GuiEnchantColour; -import io.github.moulberry.notenoughupdates.NEUOverlayPlacements; -import io.github.moulberry.notenoughupdates.NotEnoughUpdates; -import io.github.moulberry.notenoughupdates.util.Utils; -import net.minecraft.client.Minecraft; - -import java.awt.*; -import java.io.*; -import java.lang.reflect.Field; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class Options { - - /** - * Ok, I'll be honest. I wrote this class without looking too much in to how to make proper serializable - * variables with defaults values/etc. It works. I'm happy. - */ - - public static final transient int FLAG_COLOUR = 0b1; - public static final transient int FLAG_INT = 0b10; - - public static final int CAT_ALL = 0; - public static final int CAT_MISC = 1; - public static final int CAT_FEATURES = 2; - public static final int CAT_SLIDERS = 3; - public static final int CAT_COLOURS = 4; - - public Option<Boolean> enableItemEditing = new Option( - false, - "Enable Item Editing", - true, - "Dev Feature.", CAT_ALL); - public Option<Boolean> onlyShowOnSkyblock = new Option( - true, - "Only Show On Skyblock", - false, - "NEU Overlay only appears when you are playing Skyblock.", CAT_MISC); - public Option<Boolean> showVanillaItems = new Option( - true, - "Show Vanilla Items", - false, - "Shows vanilla items in the itemlist.", CAT_MISC); - public Option<Boolean> hidePotionEffect = new Option( - true, - "Hide Potion Effects", - false, - "Potion effects are hidden in the inventory GUI. Contrib: All the gamers that play on GUI AUTO", CAT_MISC); - public Option<Boolean> showQuickCommands = new Option( - true, - "Quick Commands", - false, - "Shows QuickCommands\u2122 above search bar.", CAT_FEATURES); - public Option<Boolean> showUpdateMsg = new Option( - true, - "Show Update Notifs", - false, - "Shows update messages if NEU is out-of-date.", CAT_MISC); - public Option<Boolean> tooltipBorderColours = new Option( - true, - "Coloured Tooltip Borders", - false, - "Makes the border of tooltips coloured. (Only NEU Tooltips)", CAT_MISC); - public Option<Boolean> disableAhScroll = new Option( - false, - "No NeuAH Scroll", - false, - "Disables Scrolling in NeuAH", CAT_MISC); - public Option<Boolean> advancedPriceInfo = new Option( - false, - "Adv. Item Price Info", - false, - "Shows some extra information about item prices.", CAT_MISC); - public Option<Boolean> cacheRenderedItempane = new Option( - true, - "Cache Itempane", - false, - "Caches the drawn itempane, drastically improving performance. Animated textures will not work.", CAT_MISC); - public Option<Boolean> streamerMode = new Option( - false, - "Streamer Mode", - false, - "Hides or randomises some stuff on your screen to prevent sniping", CAT_MISC); - public Option<Boolean> disableTreecapOverlay = new Option( - false, - "Disable Treecap Overlay", - false, - "Disables the treecapitator overlay effect", CAT_FEATURES); - public Option<Boolean> disableWandOverlay = new Option( - false, - "Disable Builder's Wand Overlay", - false, - "Disables the builder's wand overlay effect", CAT_FEATURES); - public Option<Boolean> wandBlockCount = new Option( - true, - "Builder's Wand Block Count", - false, - "If true, will show how many blocks you have remaining when holding a builder's wand.", CAT_MISC); - public Option<Boolean> hideApiKey = new Option( - false, - "Hide Apikey Setting", - false, - "Hides the Apikey setting (please try not to leak Apikey if you're recording)", CAT_MISC); - public Option<Double> bgBlurFactor = new Option( - 5.0, - "Background Blur", - false, - "Changes the strength of pane background blur. 0-50.", 0, 50, CAT_SLIDERS); - public Option<String> apiKey = new Option( - "", - "Api Key", - false, - "Type /api new to receive key and put it here.", CAT_MISC); - public Option<Boolean> autoupdate = new Option( - true, - "Automatically Update Items", - false, - "If true, updated items will automatically download from the remote repository when you start the game. \nHIGHLY RECOMMENDED.", CAT_MISC); - public Option<Boolean> quickcommandMousePress = new Option( - false, - "QuickCommand on Mouse Press", - false, - "If true, quickcommands will trigger on mouse down instead of mouse up.", CAT_MISC); - public Option<Boolean> disableItemTabOpen = new Option( - false, - "No Tab Open", - false, - "If True, moving your mouse to the item tab on the right side won't open the itempane.", CAT_MISC); - public Option<Boolean> keepopen = new Option( - false, - "Keep Itempane Open", - false, - "If true, the itempane will stay open after the gui is closed.", CAT_MISC); - public Option<Boolean> itemStyle = new Option( - true, - "Circular Item Style", - false, - "Uses the circular item background style instead of the square style. Contrib: Calyps0", CAT_MISC); - public Option<Boolean> hideEmptyPanes = new Option( - true, - "Hide GUI Filler Tooltips", - false, - "Hides the tooltip of glass panes in skyblock GUIs. Contrib: ThatGravyBoat", CAT_MISC); - public Option<Boolean> guiButtonClicks = new Option( - true, - "Button Click Sounds", - false, - "Plays a click sound whenever various NEU GUIs are interacted with", CAT_MISC); - public Option<Boolean> dungeonProfitLore = new Option( - false, - "Dungeon Profit in Lore", - false, - "If true, will show the dungeon profit on the tooltip of the 'reward chest' instead of as a GUI.", CAT_MISC); - public Option<Boolean> auctionPriceInfo = new Option( - true, - "Price Info in Auction Lore", - false, - "If true, will show price information about an item inside the auction house item tooltip.", CAT_MISC); - public Option<Boolean> useCustomTrade = new Option( - true, - "Custom Trade", - false, - "If true, uses the custom trade window for skyblock trades.", CAT_FEATURES); - public Option<Boolean> invBazaarPrice = new Option( - false, - "Show Bazaar Price In Inventory", - false, - "If true, shows the bazaar price for the item you hover in your inventory.", CAT_MISC); - public Option<Boolean> invAuctionPrice = new Option( - false, - "Show Auction Price In Inventory", - false, - "If true, shows the auction price for the item you hover in your inventory.", CAT_MISC); - public Option<Boolean> dungeonBlocksEverywhere = new Option( - false, - "Show Dungeon Block Overlay Everywhere", - false, - "If true, will show the overlay for cracked bricks, etc. even when not in dungeons.", CAT_MISC); - public Option<Boolean> disableDungeonBlocks = new Option( - true, - "Disable the dungeon blocks feature", - false, - "If true, the dungeon block overlay will be disabled. WARNING: May cause memory/fps issues on some machines", CAT_FEATURES); - public Option<Boolean> slowDungeonBlocks = new Option( - false, - "Slowly Update Dungeon Block Textures", - false, - "If true, dungeon blocks will only update once every second.\n" + - "Use this option if you are having performance\n" + - "issues relating to the dungeon blocks.", CAT_MISC); - public Option<Boolean> missingEnchantList = new Option( - true, - "Missing Enchant List", - false, - "If true, will show enchants that are missing on an enchanted item when LSHIFT is pressed.", CAT_FEATURES); - public Option<Boolean> neuAuctionHouse = new Option( - false, - "NEU Auction House", - false, - "Enables the auction house which can be found using /neuah.\n" + - "Don't enable this option unless you use /neuah\n" + - "You *may* need to restart after enabling this for the auctions to download properly", CAT_FEATURES); - public Option<Boolean> eventNotifications = new Option( - true, - "Skyblock Event Notifications", - false, - "Notifies you 5m (default) before and when favourited events (/neucalendar) start.", CAT_FEATURES); - public Option<Boolean> showEventTimerInInventory = new Option( - true, - "Event Timer In Inventory", - false, - "Will show how long until the next event starts at the top of your inventory", CAT_FEATURES); - public Option<Boolean> eventNotificationSounds = new Option( - true, - "Skyblock Event Notification Sounds", - false, - "Will play a sounds whenever a favourited event starts.", CAT_MISC); - public Option<Boolean> spookyMorningNotification = new Option( - true, - "Spooky Festival Morning Notification", - false, - "During a spooky festival, will notify the player whenever it hits 7am", CAT_MISC); - - public Option<Boolean> accessoryBagOverlay = new Option( - true, - "Accessory Bag Overlay", - false, - "If true, will an overlay with useful information in your accessory bag.", CAT_FEATURES); - public Option<Boolean> rodColours = new Option( - true, - "Custom Rod Line Colours", - false, - "If true, will use custom colours for fishing line rods in skyblock.", CAT_FEATURES); - public Option<Double> paneGuiScale = new Option( - 0.0, - "Pane GUI Scale", - false, - "Changes the GUI scale of the item pane. 0 = use game default. 1-4 = scale", FLAG_INT, 0, 4, CAT_SLIDERS); - public Option<Double> paneWidthMult = new Option( - 1.0, - "Pane Width", - false, - "Changes how wide the item and info panes are. Value between 0.5-1.5.", 0.5, 1.5, CAT_SLIDERS); - public Option<Double> smoothAoteMillis = new Option( - 175.0, - "Smooth AOTE Milliseconds", - false, - "How long teleporting with the AOTE takes. 0 = disable.", 0, 300, CAT_SLIDERS); - public Option<Double> itemHighlightOpacity = new Option( - 178.0, - "Item Highlight Opacity", - false, - "Changes the opacity of item highlights. Value between 0-255.", 0, 255, CAT_SLIDERS); - public Option<Double> panePadding = new Option( - 10.0, - "Pane Padding", - false, - "Changes the padding of the panes. Value between 0-20.", 0, 20, CAT_SLIDERS); - public Option<Double> ahNotification = new Option( - 2.0, - "AH Notification (Mins, 0 = off)", - false, - "Minutes before AH ends to notify. 0-10.", 0, 10, CAT_SLIDERS); - public Option<Double> tooltipBorderOpacity = new Option( - 200.0, - "Coloured Tooltip Border Opacity", - false, - "Coloured tooltips only apply to tooltips in my GUIs. Value between 0-255.", 0, 255, CAT_SLIDERS); - public Option<Double> dynamicMenuBackgroundStyle = new Option( - 1.0, - "SBMenu Background Style", - false, - "Style of the background used for the skyblock menu.", 0, 10, CAT_FEATURES); - public Option<Double> dynamicMenuButtonStyle = new Option( - 1.0, - "SBMenu Button Style", - false, - "Style of the buttons used for the skyblock menu.", 0, 10, CAT_FEATURES); - public Option<Double> dungeonWinMillis = new Option( - 5000.0, - "Dungeon Victory Screen Millis", - false, - "Changes how long the victory screen at the end of dungeons appears for. 0 = off", FLAG_INT, 0, 15000, CAT_SLIDERS); - public Option<Double> eventNotificationBeforeSeconds = new Option( - 300.0, - "Event Notification Before Seconds", - false, - "Changes how long before skyblock events will the 'starting in' notification show. 0 = off", FLAG_INT, 0, 1800, CAT_SLIDERS); - - public Option<String> itemBackgroundColour = new Option( - "00:255:100:100:100", - "Item BG Colour", - false, - "Item BG Colour", - FLAG_COLOUR, CAT_COLOURS); - public Option<String> itemFavouriteColour = new Option( - "00:255:200:150:50", - "Item BG Favourite Colour", - false, - "Item BG Favourite Colour", - FLAG_COLOUR, CAT_COLOURS); - public Option<String> paneBackgroundColour = new Option( - "15:6:0:0:255", - "Pane Background Colour", - false, - "Pane Background Colour", - FLAG_COLOUR, CAT_COLOURS); - public Option<String> treecapOverlayColour = new Option( - "00:50:64:224:208", - "Treecapitator Overlay Colour", - false, - "Treecapitator Overlay Colour", - FLAG_COLOUR, CAT_COLOURS); - public Option<String> wandOverlayColour = new Option( - "00:50:64:224:208", - "Builder's Wand Overlay Colour", - false, - "Builder's Wand Overlay Colour", - FLAG_COLOUR, CAT_COLOURS); - - public Option<String> dungCrackedColour = new Option( - "0:252:7:255:217", - "Dungeon Cracked Brick Colour", - false, - "Dungeon Cracked Brick Colour", - FLAG_COLOUR, CAT_COLOURS); - public Option<String> dungDispenserColour = new Option( - "0:255:255:76:0", - "Dungeon Dispenser Colour", - false, - "Dungeon Dispenser Colour", - FLAG_COLOUR, CAT_COLOURS); - public Option<String> dungLeverColour = new Option( - "0:252:24:249:255", - "Dungeon Lever Colour", - false, - "Dungeon Lever Colour", - FLAG_COLOUR, CAT_COLOURS); - public Option<String> dungTripWireColour = new Option( - "0:255:255:0:0", - "Dungeon Trip Wire Colour", - false, - "Dungeon Trip Wire Colour", - FLAG_COLOUR, CAT_COLOURS); - public Option<String> dungChestColour = new Option( - "0:255:0:163:36", - "Dungeon Chest Colour", - false, - "Dungeon Chest Colour", - FLAG_COLOUR, CAT_COLOURS); - public Option<String> dungTrappedChestColour = new Option( - "0:255:0:163:36", - "Dungeon Trapped Chest Colour", - false, - "Dungeon Trapped Chest Colour", - FLAG_COLOUR, CAT_COLOURS); - public Option<String> dungBatColour = new Option( - "0:255:12:255:0", - "Dungeon Bat Colour", - false, - "Dungeon Bat Colour", - FLAG_COLOUR, CAT_COLOURS); - public Option<String> selfRodLineColour = new Option( - "0:255:0:0:0", - "Your Rod Line Colour", - false, - "Changes the colour of your rod's fishing line.\nContrib: ThatGravyBoat", - FLAG_COLOUR, CAT_COLOURS); - public Option<String> otherRodLineColour = new Option( - "0:255:0:0:0", - "Other Rod Line Colour", - false, - "Changes the colour of other players' rod's fishing line.\nContrib: ThatGravyBoat", - FLAG_COLOUR, CAT_COLOURS); - - /** - * OPTIONS THAT DON'T SHOW IN GUI - */ - public Option<Boolean> dev = new Option( - false, - "Show Dev Options", - true, - "Dev Feature. Please don't use.", CAT_ALL); - public Option<Boolean> loadedModBefore = new Option( - false, - "loadedModBefore", - true, - "loadedModBefore", CAT_ALL); - public Option<Boolean> doRamNotif = new Option( - true, - "doRamNotif", - false, - "doRamNotif", CAT_ALL); - public Option<Boolean> customTradePrices = new Option( - true, - "Trade Item Values", - true, - "If true, shows a window with the total item value of either side", CAT_ALL); - public Option<Boolean> customTradePriceStyle = new Option( - true, - "Trade Prices Style", - true, - "Changes the style of the top item prices", CAT_ALL); - public Option<String> selectedCape = new Option( - "", - "Selected Cape", - true, - "Selected Cape", CAT_ALL); - public Option<Double> compareMode = new Option( - 0.0, - "Compare Mode", - false, - "Compare Mode", CAT_ALL); - public Option<Double> sortMode = new Option( - 0.0, - "Sort Mode", - false, - "Sort Mode", CAT_ALL); - public Option<ArrayList<Boolean>> compareAscending = new Option( - Utils.createList(true, true, true), - "Compare Ascending", - false, - "Compare Ascending", CAT_ALL); - public Option<ArrayList<String>> favourites = new Option( - new ArrayList<String>(), - "Favourites", - false, - "Favourites", CAT_ALL); - public Option<ArrayList<String>> eventFavourites = new Option( - new ArrayList<String>(), - "Event Favourites", - false, - "Event Favourites", CAT_ALL); - public Option<Map<String, ArrayList<String>>> collectionLog = new Option( - new HashMap<String, ArrayList<String>>(), - "CollectionLog", - false, - "CollectionLog", CAT_ALL); - public Option<ArrayList<String>> quickCommands = new Option( - createDefaultQuickCommands(), - "Quick Commands", - false, - "Quick Commands", CAT_ALL); - public Option<String> overlaySearchBar = new Option( - "", - "OverlaySearchBar", - false, - "OverlaySearchBar", CAT_ALL); - public Option<String> overlayQuickCommand = new Option( - "", - "OverlaySearchBar", - false, - "OverlaySearchBar", CAT_ALL); - public Option<List<String>> enchantColours = new Option( - Utils.createList("[a-zA-Z\\- ]+:\u003e:9:6", - "[a-zA-Z\\- ]+:\u003e:6:c", - "[a-zA-Z\\- ]+:\u003e:5:5", - "Experience:\u003e:3:5", - "Life Steal:\u003e:3:5", - "Scavenger:\u003e:3:5", - "Looting:\u003e:3:5"), - "enchantColours", - false, - "enchantColours", CAT_ALL); - - //Dungeon Map Options - public Option<Double> dmBorderSize = new Option( - 1.0, - "Border Size", - false, - "Changes the size of the map border, without changing the size of the contents", 0, 5, CAT_ALL); - public Option<Double> dmRoomSize = new Option( - 1.0, - "Room Size", - false, - "Changes the size of rooms. Useful for higher dungeons with larger maps", 0, 5, CAT_ALL); - public Option<Double> dmIconScale = new Option( - 1.0, - "Icon Size", - false, - "Changes the scale of room indicators and player icons", 0.5, 3, CAT_ALL); - public Option<Double> dmBorderStyle = new Option( - 0.0, - "Border Style", - false, - "Various custom borders from various talented artists.\nUse 'custom' if your texture pack has a custom border", CAT_ALL); - public Option<Boolean> dmEnable = new Option( - true, - "Show Dungeon Map", - false, - "Show/hide the NEU dungeon map", CAT_ALL); - public Option<Boolean> dmCenterPlayer = new Option( - false, - "Map Center", - false, - "Center on rooms, or center on your player", CAT_ALL); - public Option<Boolean> dmRotatePlayer = new Option( - true, - "Rotate with Player", - false, - "Rotate the map to face the same direction as your player", CAT_ALL); - public Option<Boolean> dmOrientCheck = new Option( - true, - "Orient Checkmarks", - false, - "Checkmarks will always show vertically, regardless of rotation", CAT_ALL); - public Option<Boolean> dmCenterCheck = new Option( - false, - "Center Checkmarks", - false, - "Checkmarks will show closer to the center of rooms", CAT_ALL); - public Option<Double> dmPlayerHeads = new Option( - 0.0, - "Player Icon Style", - false, - "Various player icon styles", CAT_ALL); - public Option<Boolean> dmPlayerInterp = new Option( - true, - "Interpolate Far Players", - false, - "Will make players far away move smoothly", CAT_ALL); - public Option<Double> dmCompat = new Option( - 0.0, - "OpenGL Compatibility", - false, - "Compatiblity options for people with bad computers. ONLY use this if you know what you are doing, otherwise the map will look worse", CAT_ALL); - public Option<String> dmBackgroundColour = new Option( - "00:170:75:75:75", - "Background Colour", - false, - "Colour of the map background. Supports opacity & chroma", FLAG_COLOUR, CAT_ALL); - public Option<String> dmBorderColour = new Option( - "00:0:0:0:0", - "Border Colour", - false, - "Colour of the map border. Supports opacity & chroma. Turn off custom borders to see", FLAG_COLOUR, CAT_ALL); - public Option<Boolean> dmChromaBorder = new Option( - false, - "Chroma Border Mode", - false, - "Applies a hue offset around the map border", CAT_ALL); - public Option<Double> dmBackgroundBlur = new Option( - 3.0, - "Background Blur Factor", - false, - "Changes the blur factor behind the map. Set to 0 to disable blur", CAT_ALL); - public Option<Double> dmCenterX = new Option( - 8.5, - "Center X (%)", - false, - "The horizontal position of the map", CAT_ALL); - public Option<Double> dmCenterY = new Option( - 15.0, - "Center Y (%)", - false, - "The vertical position of the map", CAT_ALL); - - private ArrayList<String> createDefaultQuickCommands() { - ArrayList<String> arr = new ArrayList<>(); - arr.add("/warp home:Warp Home:eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzljODg4MWU0MjkxNWE5ZDI5YmI2MWExNmZiMjZkMDU5OTEzMjA0ZDI2NWRmNWI0MzliM2Q3OTJhY2Q1NiJ9fX0="); - arr.add("/warp hub:Warp Hub:eyJ0aW1lc3RhbXAiOjE1NTkyMTU0MTY5MDksInByb2ZpbGVJZCI6IjQxZDNhYmMyZDc0OTQwMGM5MDkwZDU0MzRkMDM4MzFiIiwicHJvZmlsZU5hbWUiOiJNZWdha2xvb24iLCJzaWduYXR1cmVSZXF1aXJlZCI6dHJ1ZSwidGV4dHVyZXMiOnsiU0tJTiI6eyJ1cmwiOiJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2Q3Y2M2Njg3NDIzZDA1NzBkNTU2YWM1M2UwNjc2Y2I1NjNiYmRkOTcxN2NkODI2OWJkZWJlZDZmNmQ0ZTdiZjgifX19"); - arr.add("/craft:Crafting Table:CRAFTING_TABLE"); - arr.add("/enderchest:Ender Chest:ENDER_CHEST"); - arr.add("/wardrobe:Wardrobe:LEATHER_CHESTPLATE"); - arr.add("/pets:Pets:BONE"); - arr.add("neucl:Collection Log:MAP"); - arr.add("neuah:NEU Auction House:GOLD_BLOCK"); - return arr; - } - - public class Button { - public String displayName; - public String desc; - public Runnable click; - - public Button(String displayName, String desc, Runnable click) { - this.displayName = displayName; - this.desc = desc; - this.click = click; - } - } - - private transient List<Button> buttons = new ArrayList<>(); - - { - buttons.add(new Button("Open Config Folder", "Opens the config folder. Be careful.", () -> { - if (Desktop.isDesktopSupported()) { - Desktop desktop = Desktop.getDesktop(); - if (NotEnoughUpdates.INSTANCE.manager.configFile.getParentFile().exists()) { - try { - desktop.open(NotEnoughUpdates.INSTANCE.manager.configFile.getParentFile()); - } catch (IOException ignored) { - } - } - } - })); - - buttons.add(new Button("Edit Gui Positions", "Allows you to change the position of the search bar, etc.", () -> { - Minecraft.getMinecraft().displayGuiScreen(new NEUOverlayPlacements()); - })); - - buttons.add(new Button("Edit Enchant Colours", "Allows you to change the colour of any enchant at any level.", () -> { - Minecraft.getMinecraft().displayGuiScreen(new GuiEnchantColour()); - })); - - - buttons.add(new Button("Edit Dungeon Map", "Allows you to configure the NEU dungeon map.", () -> { - Minecraft.getMinecraft().displayGuiScreen(new GuiDungeonMapEditor()); - })); - } - - public List<Button> getButtons() { - return buttons; - } - - public List<Option> getOptions() { - List<Option> options = new ArrayList<>(); - - //Pane width near top so less scuffed - tryAddOption(paneWidthMult, options); - //Buttons - tryAddOption(enableItemEditing, options); - tryAddOption(onlyShowOnSkyblock, options); - tryAddOption(showVanillaItems, options); - tryAddOption(showQuickCommands, options); - tryAddOption(hidePotionEffect, options); - tryAddOption(hideEmptyPanes, options); - tryAddOption(guiButtonClicks, options); - tryAddOption(advancedPriceInfo, options); - tryAddOption(showUpdateMsg, options); - tryAddOption(tooltipBorderColours, options); - tryAddOption(disableAhScroll, options); - tryAddOption(hideApiKey, options); - tryAddOption(streamerMode, options); - tryAddOption(disableTreecapOverlay, options); - tryAddOption(disableWandOverlay, options); - tryAddOption(wandBlockCount, options); - tryAddOption(autoupdate, options); - tryAddOption(cacheRenderedItempane, options); - tryAddOption(itemStyle, options); - tryAddOption(keepopen, options); - tryAddOption(disableItemTabOpen, options); - tryAddOption(dungeonProfitLore, options); - tryAddOption(auctionPriceInfo, options); - tryAddOption(useCustomTrade, options); - tryAddOption(customTradePrices, options); - tryAddOption(customTradePriceStyle, options); - tryAddOption(invBazaarPrice, options); - tryAddOption(invAuctionPrice, options); - tryAddOption(dungeonBlocksEverywhere, options); - tryAddOption(disableDungeonBlocks, options); - tryAddOption(slowDungeonBlocks, options); - tryAddOption(missingEnchantList, options); - tryAddOption(accessoryBagOverlay, options); - tryAddOption(rodColours, options); - tryAddOption(neuAuctionHouse, options); - tryAddOption(eventNotifications, options); - tryAddOption(showEventTimerInInventory, options); - tryAddOption(spookyMorningNotification, options); - //Sliders - tryAddOption(paneGuiScale, options); - tryAddOption(smoothAoteMillis, options); - tryAddOption(bgBlurFactor, options); - tryAddOption(ahNotification, options); - tryAddOption(panePadding, options); - tryAddOption(tooltipBorderOpacity, options); - tryAddOption(dynamicMenuBackgroundStyle, options); - tryAddOption(dynamicMenuButtonStyle, options); - tryAddOption(dungeonWinMillis, options); - tryAddOption(eventNotificationBeforeSeconds, options); - //Text - tryAddOption(apiKey, options); - //Colour - tryAddOption(paneBackgroundColour, options); - tryAddOption(itemBackgroundColour, options); - tryAddOption(itemFavouriteColour, options); - tryAddOption(treecapOverlayColour, options); - tryAddOption(wandOverlayColour, options); - tryAddOption(selfRodLineColour, options); - tryAddOption(otherRodLineColour, options); - - tryAddOption(dungCrackedColour, options); - tryAddOption(dungDispenserColour, options); - tryAddOption(dungLeverColour, options); - tryAddOption(dungTripWireColour, options); - tryAddOption(dungChestColour, options); - tryAddOption(dungTrappedChestColour, options); - tryAddOption(dungBatColour, options); - - return options; - } - - private void tryAddOption(Option<?> option, List<Option> list) { - if (!option.secret) {// || dev.value) { - list.add(option); - } - } - - public static class Option<T> implements Serializable { - public T value; - public final transient T defaultValue; - public final transient String displayName; - public final transient boolean secret; - public final transient String desc; - public final transient int flags; - public final transient double minValue; - public final transient double maxValue; - public final transient int category; - public final transient ArrayList<String> tags; - - public Option(T defaultValue, String displayName, boolean secret, String desc, int category) { - this(defaultValue, displayName, secret, desc, 0, 0, 100, category); - } - - public Option(T defaultValue, String displayName, boolean secret, String desc, int flags, int category) { - this(defaultValue, displayName, secret, desc, flags, 0, 100, category); - } - - public Option(T defaultValue, String displayName, boolean secret, String desc, double minValue, double maxValue, int category) { - this(defaultValue, displayName, secret, desc, 0, minValue, maxValue, category); - } - - public Option(T defaultValue, String displayName, boolean secret, String desc, int flags, double minValue, double maxValue, int category) { - this.value = defaultValue; - this.defaultValue = defaultValue; - this.displayName = displayName; - this.secret = secret; - this.desc = desc; - this.flags = flags; - this.minValue = minValue; - this.maxValue = maxValue; - this.category = category; - - this.tags = new ArrayList<>(); - for(String s : displayName.split(" ")) { - s = s.replaceAll("[^A-Za-z]", "").toLowerCase(); - if(s.length() > 0) { - tags.add(s); - } - } - for(String s : desc.split(" ")) { - s = s.replaceAll("[^A-Za-z]", "").toLowerCase(); - if(s.length() >= 4) { - tags.add(s); - } - } - } - - public void setValue(String value) { - if (this.value instanceof Boolean) { - ((Option<Boolean>) this).value = Boolean.valueOf(value); - } else if (this.value instanceof Double) { - ((Option<Double>) this).value = Double.valueOf(value); - } else if (this.value instanceof String) { - ((Option<String>) this).value = value; - } - } - } - - public static JsonSerializer<Option<?>> createSerializer() { - return (src, typeOfSrc, context) -> { - if (src.secret && src.defaultValue.equals(src.value)) { - return null; - } - return context.serialize(src.value); - }; - } - - public static JsonDeserializer<Option<?>> createDeserializer() { - return (json, typeOfT, context) -> { - try { - return new Option(context.deserialize(json, Object.class), "unknown", false, "unknown", CAT_ALL); - } catch (Exception e) { - return null; - } - }; - } - - public static Options loadFromFile(Gson gson, File file) throws IOException { - try(BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8))) { - Options oLoad = gson.fromJson(reader, Options.class); - Options oDefault = new Options(); - if (oLoad == null) return oDefault; - - for (Field f : Options.class.getDeclaredFields()) { - try { - if (((Option<?>) f.get(oDefault)).value instanceof List) { - //If the default size of the list is greater than the loaded size, use the default value. - //if(((List<?>)((Option)f.get(oDefault)).value).size() > ((List<?>)((Option)f.get(oLoad)).value).size()) { - // continue; - //} - } - if(((Option<?>) f.get(oDefault)).value.getClass().isAssignableFrom(((Option<?>) f.get(oLoad)).value.getClass())) { - ((Option) f.get(oDefault)).value = ((Option) f.get(oLoad)).value; - } - } catch (Exception e) { - } - } - return oDefault; - } - } - - - public void saveToFile(Gson gson, File file) throws IOException { - file.createNewFile(); - - try(BufferedWriter writer = new BufferedWriter( - new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8))) { - writer.write(gson.toJson(this)); - } - } -}
\ No newline at end of file diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java index 9480db06..bc2361f2 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/GuiProfileViewer.java @@ -8,10 +8,10 @@ import com.google.gson.JsonPrimitive; import com.mojang.authlib.GameProfile; import com.mojang.authlib.minecraft.MinecraftProfileTexture; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; -import io.github.moulberry.notenoughupdates.SBAIntegration; +import io.github.moulberry.notenoughupdates.util.SBAIntegration; import io.github.moulberry.notenoughupdates.cosmetics.ShaderManager; import io.github.moulberry.notenoughupdates.itemeditor.GuiElementTextField; -import io.github.moulberry.notenoughupdates.questing.SBInfo; +import io.github.moulberry.notenoughupdates.util.SBInfo; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; @@ -230,10 +230,6 @@ public class GuiProfileViewer extends GuiScreen { } } - private boolean isLoadedProfile() { - return profile.getProfileInformation(profileId) != null; - } - private void renderTabs(boolean renderPressed) { int ignoredTabs = 0; for(int i=0; i<ProfileViewerPage.values().length; i++) { @@ -530,10 +526,8 @@ public class GuiProfileViewer extends GuiScreen { JsonObject inventoryInfo = profile.getInventoryInfo(profileId); if(inventoryInfo == null) return; - JsonObject collectionInfo = profile.getCollectionInfo(profileId); - if(collectionInfo == null) return; - ItemStack[][][] inventories = getItemsForInventory(inventoryInfo, collectionInfo, selectedInventory); + ItemStack[][][] inventories = getItemsForInventory(inventoryInfo, selectedInventory); if(currentInventoryIndex >= inventories.length) currentInventoryIndex = inventories.length-1; if(currentInventoryIndex < 0) currentInventoryIndex = 0; @@ -575,13 +569,13 @@ public class GuiProfileViewer extends GuiScreen { } } - private class Level { + public static class Level { float level; float currentLevelRequirement; float maxXP; } - public Level getLevel(JsonArray levels, int offset, float exp) { + public static Level getLevel(JsonArray levels, int offset, float exp) { float xpTotal = 0; float level = 1; float currentLevelRequirement = 0; @@ -618,7 +612,7 @@ public class GuiProfileViewer extends GuiScreen { return levelObj; } - private static final HashMap<String, HashMap<String, Float>> PET_STAT_BOOSTS = new HashMap<>(); + public static final HashMap<String, HashMap<String, Float>> PET_STAT_BOOSTS = new HashMap<>(); static { HashMap<String, Float> bigTeeth = new HashMap<>(); bigTeeth.put("CRIT_CHANCE", 5f); @@ -636,7 +630,7 @@ public class GuiProfileViewer extends GuiScreen { sharpenedClaws.put("CRIT_DAMAGE", 15f); PET_STAT_BOOSTS.put("PET_ITEM_SHARPENED_CLAWS_UNCOMMON", sharpenedClaws); } - private static final HashMap<String, HashMap<String, Float>> PET_STAT_BOOSTS_MULT = new HashMap<>(); + public static final HashMap<String, HashMap<String, Float>> PET_STAT_BOOSTS_MULT = new HashMap<>(); static { HashMap<String, Float> ironClaws = new HashMap<>(); ironClaws.put("CRIT_DAMAGE", 1.4f); @@ -652,13 +646,13 @@ public class GuiProfileViewer extends GuiScreen { private int petsPage = 0; private List<JsonObject> sortedPets = null; private List<ItemStack> sortedPetsStack = null; - private static HashMap<String, String> minionRarityToNumMap = new HashMap<>(); + public static HashMap<String, String> MINION_RARITY_TO_NUM = new HashMap<>(); static { - minionRarityToNumMap.put("COMMON", "0"); - minionRarityToNumMap.put("UNCOMMON", "1"); - minionRarityToNumMap.put("RARE", "2"); - minionRarityToNumMap.put("EPIC", "3"); - minionRarityToNumMap.put("LEGENDARY", "4"); + MINION_RARITY_TO_NUM.put("COMMON", "0"); + MINION_RARITY_TO_NUM.put("UNCOMMON", "1"); + MINION_RARITY_TO_NUM.put("RARE", "2"); + MINION_RARITY_TO_NUM.put("EPIC", "3"); + MINION_RARITY_TO_NUM.put("LEGENDARY", "4"); } private void drawPetsPage(int mouseX, int mouseY, float partialTicks) { JsonObject petsInfo = profile.getPetsInfo(profileId); @@ -692,12 +686,12 @@ public class GuiProfileViewer extends GuiScreen { } sortedPets.sort((pet1, pet2) -> { String tier1 = pet1.get("tier").getAsString(); - String tierNum1 = minionRarityToNumMap.get(tier1); + String tierNum1 = MINION_RARITY_TO_NUM.get(tier1); int tierNum1I = Integer.parseInt(tierNum1); float exp1 = pet1.get("exp").getAsFloat(); String tier2 = pet2.get("tier").getAsString(); - String tierNum2 = minionRarityToNumMap.get(tier2); + String tierNum2 = MINION_RARITY_TO_NUM.get(tier2); int tierNum2I = Integer.parseInt(tierNum2); float exp2 = pet2.get("exp").getAsFloat(); @@ -712,7 +706,7 @@ public class GuiProfileViewer extends GuiScreen { String tier = pet.get("tier").getAsString(); String heldItem = Utils.getElementAsString(pet.get("heldItem"), null); JsonObject heldItemJson = heldItem==null?null:NotEnoughUpdates.INSTANCE.manager.getItemInformation().get(heldItem); - String tierNum = minionRarityToNumMap.get(tier); + String tierNum = MINION_RARITY_TO_NUM.get(tier); float exp = pet.get("exp").getAsFloat(); if(tierNum == null) continue; @@ -934,22 +928,22 @@ public class GuiProfileViewer extends GuiScreen { String[] split = display.split("] "); String colouredName = split[split.length-1]; - renderAlignedString(colouredName, EnumChatFormatting.WHITE+"Level "+(int)Math.floor(level), guiLeft+319, guiTop+28, 98); + Utils.renderAlignedString(colouredName, EnumChatFormatting.WHITE+"Level "+(int)Math.floor(level), guiLeft+319, guiTop+28, 98); //Utils.drawStringCenteredScaledMaxWidth(, Minecraft.getMinecraft().fontRendererObj, guiLeft+368, guiTop+28+4, true, 98, 0); //renderAlignedString(display, EnumChatFormatting.YELLOW+"[LVL "+Math.floor(level)+"]", guiLeft+319, guiTop+28, 98); renderBar(guiLeft+319, guiTop+38, 98, (float)Math.floor(level)/100f); - renderAlignedString(EnumChatFormatting.YELLOW+"To Next LVL", EnumChatFormatting.WHITE.toString()+(int)(level%1*100)+"%", guiLeft+319, guiTop+46, 98); + Utils.renderAlignedString(EnumChatFormatting.YELLOW+"To Next LVL", EnumChatFormatting.WHITE.toString()+(int)(level%1*100)+"%", guiLeft+319, guiTop+46, 98); renderBar(guiLeft+319, guiTop+56, 98, level%1); - renderAlignedString(EnumChatFormatting.YELLOW+"To Max LVL", EnumChatFormatting.WHITE.toString()+Math.min(100, (int)(exp/maxXP*100))+"%", guiLeft+319, guiTop+64, 98); + Utils.renderAlignedString(EnumChatFormatting.YELLOW+"To Max LVL", EnumChatFormatting.WHITE.toString()+Math.min(100, (int)(exp/maxXP*100))+"%", guiLeft+319, guiTop+64, 98); renderBar(guiLeft+319, guiTop+74, 98, exp/maxXP); - renderAlignedString(EnumChatFormatting.YELLOW+"Total XP", EnumChatFormatting.WHITE.toString()+shortNumberFormat(exp, 0), guiLeft+319, guiTop+125, 98); - renderAlignedString(EnumChatFormatting.YELLOW+"Current LVL XP", + Utils.renderAlignedString(EnumChatFormatting.YELLOW+"Total XP", EnumChatFormatting.WHITE.toString()+shortNumberFormat(exp, 0), guiLeft+319, guiTop+125, 98); + Utils.renderAlignedString(EnumChatFormatting.YELLOW+"Current LVL XP", EnumChatFormatting.WHITE.toString()+shortNumberFormat((level%1)*currentLevelRequirement, 0), guiLeft+319, guiTop+143, 98); - renderAlignedString(EnumChatFormatting.YELLOW+"Required LVL XP", EnumChatFormatting.WHITE.toString()+shortNumberFormat(currentLevelRequirement, 0), guiLeft+319, guiTop+161, 98); + Utils.renderAlignedString(EnumChatFormatting.YELLOW+"Required LVL XP", EnumChatFormatting.WHITE.toString()+shortNumberFormat(currentLevelRequirement, 0), guiLeft+319, guiTop+161, 98); } } @@ -1216,6 +1210,16 @@ public class GuiProfileViewer extends GuiScreen { return 6; } + private boolean useActualMax(String invName) { + switch(invName) { + case "talisman_bag": + case "fishing_bag": + case "potion_bag": + return true; + } + return false; + } + private int getIgnoredRowsForInventory(String invName) { switch(invName) { case "talisman_bag": @@ -1257,30 +1261,44 @@ public class GuiProfileViewer extends GuiScreen { } private ItemStack fillerStack = new ItemStack(Item.getItemFromBlock(Blocks.stained_glass_pane), 1, 15); - public ItemStack[][][] getItemsForInventory(JsonObject inventoryInfo, JsonObject collectionInfo, String invName) { + public ItemStack[][][] getItemsForInventory(JsonObject inventoryInfo, String invName) { if(inventoryItems.containsKey(invName)) return inventoryItems.get(invName); JsonArray jsonInv = Utils.getElement(inventoryInfo, invName).getAsJsonArray(); + if(jsonInv.size() == 0) return new ItemStack[1][][]; + + int jsonInvSize; + if(useActualMax(invName)) { + jsonInvSize = (int)Math.ceil(jsonInv.size()/9f)*9; + } else { + jsonInvSize = 9*4; + for(int i=9*4; i<jsonInv.size(); i++) { + JsonElement item = jsonInv.get(i); + if(item != null && item.isJsonObject()) { + jsonInvSize = (i/9)*9; + } + } + } + int rowSize = 9; - int rows = jsonInv.size()/rowSize; + int rows = jsonInvSize/rowSize; int maxRowsPerPage = getRowsForInventory(invName); - int ignoredRows = getIgnoredRowsForInventory(invName); int maxInvSize = rowSize*maxRowsPerPage; - int numInventories = (jsonInv.size()-1)/maxInvSize+1; + int numInventories = (jsonInvSize-1)/maxInvSize+1; ItemStack[][][] inventories = new ItemStack[numInventories][][]; - int availableSlots = getAvailableSlotsForInventory(inventoryInfo, collectionInfo, invName); + //int availableSlots = getAvailableSlotsForInventory(inventoryInfo, collectionInfo, invName); for(int i=0; i<numInventories; i++) { - int thisRows = Math.min(maxRowsPerPage, rows-maxRowsPerPage*i)-ignoredRows; + int thisRows = Math.min(maxRowsPerPage, rows-maxRowsPerPage*i); if(thisRows <= 0) break; ItemStack[][] items = new ItemStack[thisRows][rowSize]; - int invSize = Math.min(jsonInv.size(), maxInvSize+maxInvSize*i); + int invSize = Math.min(jsonInvSize, maxInvSize+maxInvSize*i); for(int j=maxInvSize*i; j<invSize; j++) { int xIndex = (j%maxInvSize)%rowSize; int yIndex = (j%maxInvSize)/rowSize; @@ -1292,12 +1310,11 @@ public class GuiProfileViewer extends GuiScreen { break; } + if(j >= jsonInv.size()) { + items[yIndex][xIndex] = fillerStack; + continue; + } if(jsonInv.get(j) == null || !jsonInv.get(j).isJsonObject()) { - if(availableSlots >= 0) { - if(j >= availableSlots) { - items[yIndex][xIndex] = fillerStack; - } - } continue; } @@ -1353,7 +1370,6 @@ public class GuiProfileViewer extends GuiScreen { JsonObject inventoryInfo = profile.getInventoryInfo(profileId); if(inventoryInfo == null) return; - JsonObject collectionInfo = profile.getCollectionInfo(profileId); int invNameIndex=0; for(Map.Entry<String, ItemStack> entry : invNameToDisplayMap.entrySet()) { @@ -1411,7 +1427,7 @@ public class GuiProfileViewer extends GuiScreen { } } - ItemStack[][][] inventories = getItemsForInventory(inventoryInfo, collectionInfo, selectedInventory); + ItemStack[][][] inventories = getItemsForInventory(inventoryInfo, selectedInventory); if(currentInventoryIndex >= inventories.length) currentInventoryIndex = inventories.length-1; if(currentInventoryIndex < 0) currentInventoryIndex = 0; @@ -1659,14 +1675,14 @@ public class GuiProfileViewer extends GuiScreen { float bankBalance = Utils.getElementAsFloat(Utils.getElement(profileInfo, "banking.balance"), 0); float purseBalance = Utils.getElementAsFloat(Utils.getElement(profileInfo, "coin_purse"), 0); - renderAlignedString(EnumChatFormatting.GOLD+"Bank Balance", EnumChatFormatting.WHITE.toString()+shortNumberFormat(bankBalance, 0), + Utils.renderAlignedString(EnumChatFormatting.GOLD+"Bank Balance", EnumChatFormatting.WHITE.toString()+shortNumberFormat(bankBalance, 0), guiLeft+xStart, guiTop+yStartTop, 76); - renderAlignedString(EnumChatFormatting.GOLD+"Purse", EnumChatFormatting.WHITE.toString()+shortNumberFormat(purseBalance, 0), + Utils.renderAlignedString(EnumChatFormatting.GOLD+"Purse", EnumChatFormatting.WHITE.toString()+shortNumberFormat(purseBalance, 0), guiLeft+xStart, guiTop+yStartTop+yOffset, 76); float fairySouls = Utils.getElementAsFloat(Utils.getElement(profileInfo, "fairy_souls_collected"), 0); - renderAlignedString(EnumChatFormatting.LIGHT_PURPLE+"Fairy Souls", EnumChatFormatting.WHITE.toString()+(int)fairySouls+"/209", + Utils.renderAlignedString(EnumChatFormatting.LIGHT_PURPLE+"Fairy Souls", EnumChatFormatting.WHITE.toString()+(int)fairySouls+"/209", guiLeft+xStart, guiTop+yStartBottom, 76); if(skillInfo != null) { float totalSkillLVL = 0; @@ -1694,11 +1710,11 @@ public class GuiProfileViewer extends GuiScreen { float avgTrueSkillLVL = totalTrueSkillLVL/totalSkillCount; float avgSlayerLVL = totalSlayerLVL/totalSlayerCount; - renderAlignedString(EnumChatFormatting.RED+"AVG Skill Level", EnumChatFormatting.WHITE.toString()+Math.floor(avgSkillLVL*10)/10, + Utils.renderAlignedString(EnumChatFormatting.RED+"AVG Skill Level", EnumChatFormatting.WHITE.toString()+Math.floor(avgSkillLVL*10)/10, guiLeft+xStart, guiTop+yStartBottom+yOffset, 76); - renderAlignedString(EnumChatFormatting.RED+"AVG Slayer Level", EnumChatFormatting.WHITE.toString()+Math.floor(avgSlayerLVL*10)/10, + Utils.renderAlignedString(EnumChatFormatting.RED+"AVG Slayer Level", EnumChatFormatting.WHITE.toString()+Math.floor(avgSlayerLVL*10)/10, guiLeft+xStart, guiTop+yStartBottom+yOffset*2, 76); - renderAlignedString(EnumChatFormatting.RED+"True AVG Skill Level", EnumChatFormatting.WHITE.toString()+Math.floor(avgTrueSkillLVL*10)/10, + Utils.renderAlignedString(EnumChatFormatting.RED+"True AVG Skill Level", EnumChatFormatting.WHITE.toString()+Math.floor(avgTrueSkillLVL*10)/10, guiLeft+xStart, guiTop+yStartBottom+yOffset*3, 76); } @@ -1710,17 +1726,17 @@ public class GuiProfileViewer extends GuiScreen { float auctions_gold_spent = Utils.getElementAsFloat(Utils.getElement(profileInfo, "stats.auctions_gold_spent"), 0); float auctions_gold_earned = Utils.getElementAsFloat(Utils.getElement(profileInfo, "stats.auctions_gold_earned"), 0); - renderAlignedString(EnumChatFormatting.DARK_PURPLE+"Auction Bids", EnumChatFormatting.WHITE.toString()+(int)auctions_bids, + Utils.renderAlignedString(EnumChatFormatting.DARK_PURPLE+"Auction Bids", EnumChatFormatting.WHITE.toString()+(int)auctions_bids, guiLeft+xStart+xOffset, guiTop+yStartTop, 76); - renderAlignedString(EnumChatFormatting.DARK_PURPLE+"Highest Bid", EnumChatFormatting.WHITE.toString()+shortNumberFormat(auctions_highest_bid, 0), + Utils.renderAlignedString(EnumChatFormatting.DARK_PURPLE+"Highest Bid", EnumChatFormatting.WHITE.toString()+shortNumberFormat(auctions_highest_bid, 0), guiLeft+xStart+xOffset, guiTop+yStartTop+yOffset, 76); - renderAlignedString(EnumChatFormatting.DARK_PURPLE+"Auctions Won", EnumChatFormatting.WHITE.toString()+(int)auctions_won, + Utils.renderAlignedString(EnumChatFormatting.DARK_PURPLE+"Auctions Won", EnumChatFormatting.WHITE.toString()+(int)auctions_won, guiLeft+xStart+xOffset, guiTop+yStartTop+yOffset*2, 76); - renderAlignedString(EnumChatFormatting.DARK_PURPLE+"Auctions Created", EnumChatFormatting.WHITE.toString()+(int)auctions_created, + Utils.renderAlignedString(EnumChatFormatting.DARK_PURPLE+"Auctions Created", EnumChatFormatting.WHITE.toString()+(int)auctions_created, guiLeft+xStart+xOffset, guiTop+yStartTop+yOffset*3, 76); - renderAlignedString(EnumChatFormatting.DARK_PURPLE+"Gold Spent", EnumChatFormatting.WHITE.toString()+shortNumberFormat(auctions_gold_spent, 0), + Utils.renderAlignedString(EnumChatFormatting.DARK_PURPLE+"Gold Spent", EnumChatFormatting.WHITE.toString()+shortNumberFormat(auctions_gold_spent, 0), guiLeft+xStart+xOffset, guiTop+yStartTop+yOffset*4, 76); - renderAlignedString(EnumChatFormatting.DARK_PURPLE+"Gold Earned", EnumChatFormatting.WHITE.toString()+shortNumberFormat(auctions_gold_earned, 0), + Utils.renderAlignedString(EnumChatFormatting.DARK_PURPLE+"Gold Earned", EnumChatFormatting.WHITE.toString()+shortNumberFormat(auctions_gold_earned, 0), guiLeft+xStart+xOffset, guiTop+yStartTop+yOffset*5, 76); @@ -1731,17 +1747,17 @@ public class GuiProfileViewer extends GuiScreen { float wolf_boss_kills_tier_2 = Utils.getElementAsFloat(Utils.getElement(profileInfo, "slayer_bosses.wolf.boss_kills_tier_2"), 0); float wolf_boss_kills_tier_3 = Utils.getElementAsFloat(Utils.getElement(profileInfo, "slayer_bosses.wolf.boss_kills_tier_3"), 0); - renderAlignedString(EnumChatFormatting.DARK_AQUA+"Revenant T3", EnumChatFormatting.WHITE.toString()+(int)zombie_boss_kills_tier_2, + Utils.renderAlignedString(EnumChatFormatting.DARK_AQUA+"Revenant T3", EnumChatFormatting.WHITE.toString()+(int)zombie_boss_kills_tier_2, guiLeft+xStart+xOffset, guiTop+yStartBottom, 76); - renderAlignedString(EnumChatFormatting.DARK_AQUA+"Revenant T4", EnumChatFormatting.WHITE.toString()+(int)zombie_boss_kills_tier_3, + Utils.renderAlignedString(EnumChatFormatting.DARK_AQUA+"Revenant T4", EnumChatFormatting.WHITE.toString()+(int)zombie_boss_kills_tier_3, guiLeft+xStart+xOffset, guiTop+yStartBottom+yOffset, 76); - renderAlignedString(EnumChatFormatting.DARK_AQUA+"Sven T3", EnumChatFormatting.WHITE.toString()+(int)wolf_boss_kills_tier_2, + Utils.renderAlignedString(EnumChatFormatting.DARK_AQUA+"Sven T3", EnumChatFormatting.WHITE.toString()+(int)wolf_boss_kills_tier_2, guiLeft+xStart+xOffset, guiTop+yStartBottom+yOffset*2, 76); - renderAlignedString(EnumChatFormatting.DARK_AQUA+"Sven T4", EnumChatFormatting.WHITE.toString()+(int)wolf_boss_kills_tier_3, + Utils.renderAlignedString(EnumChatFormatting.DARK_AQUA+"Sven T4", EnumChatFormatting.WHITE.toString()+(int)wolf_boss_kills_tier_3, guiLeft+xStart+xOffset, guiTop+yStartBottom+yOffset*3, 76); - renderAlignedString(EnumChatFormatting.DARK_AQUA+"Tarantula T3", EnumChatFormatting.WHITE.toString()+(int)spider_boss_kills_tier_2, + Utils.renderAlignedString(EnumChatFormatting.DARK_AQUA+"Tarantula T3", EnumChatFormatting.WHITE.toString()+(int)spider_boss_kills_tier_2, guiLeft+xStart+xOffset, guiTop+yStartBottom+yOffset*4, 76); - renderAlignedString(EnumChatFormatting.DARK_AQUA+"Tarantula T4", EnumChatFormatting.WHITE.toString()+(int)spider_boss_kills_tier_3, + Utils.renderAlignedString(EnumChatFormatting.DARK_AQUA+"Tarantula T4", EnumChatFormatting.WHITE.toString()+(int)spider_boss_kills_tier_3, guiLeft+xStart+xOffset, guiTop+yStartBottom+yOffset*5, 76); float pet_milestone_ores_mined = Utils.getElementAsFloat(Utils.getElement(profileInfo, "stats.pet_milestone_ores_mined"), 0); @@ -1751,16 +1767,16 @@ public class GuiProfileViewer extends GuiScreen { float items_fished_treasure = Utils.getElementAsFloat(Utils.getElement(profileInfo, "stats.items_fished_treasure"), 0); float items_fished_large_treasure = Utils.getElementAsFloat(Utils.getElement(profileInfo, "stats.items_fished_large_treasure"), 0); - renderAlignedString(EnumChatFormatting.GREEN+"Ores Mined", EnumChatFormatting.WHITE.toString()+(int)pet_milestone_ores_mined, + Utils.renderAlignedString(EnumChatFormatting.GREEN+"Ores Mined", EnumChatFormatting.WHITE.toString()+(int)pet_milestone_ores_mined, guiLeft+xStart+xOffset*2, guiTop+yStartTop, 76); - renderAlignedString(EnumChatFormatting.GREEN+"Sea Creatures Killed", EnumChatFormatting.WHITE.toString()+(int)pet_milestone_sea_creatures_killed, + Utils.renderAlignedString(EnumChatFormatting.GREEN+"Sea Creatures Killed", EnumChatFormatting.WHITE.toString()+(int)pet_milestone_sea_creatures_killed, guiLeft+xStart+xOffset*2, guiTop+yStartTop+yOffset, 76); - renderAlignedString(EnumChatFormatting.GREEN+"Items Fished", EnumChatFormatting.WHITE.toString()+(int)items_fished, + Utils.renderAlignedString(EnumChatFormatting.GREEN+"Items Fished", EnumChatFormatting.WHITE.toString()+(int)items_fished, guiLeft+xStart+xOffset*2, guiTop+yStartTop+yOffset*3, 76); - renderAlignedString(EnumChatFormatting.GREEN+"Treasures Fished", EnumChatFormatting.WHITE.toString()+(int)items_fished_treasure, + Utils.renderAlignedString(EnumChatFormatting.GREEN+"Treasures Fished", EnumChatFormatting.WHITE.toString()+(int)items_fished_treasure, guiLeft+xStart+xOffset*2, guiTop+yStartTop+yOffset*4, 76); - renderAlignedString(EnumChatFormatting.GREEN+"Large Treasures", EnumChatFormatting.WHITE.toString()+(int)items_fished_large_treasure, + Utils.renderAlignedString(EnumChatFormatting.GREEN+"Large Treasures", EnumChatFormatting.WHITE.toString()+(int)items_fished_large_treasure, guiLeft+xStart+xOffset*2, guiTop+yStartTop+yOffset*5, 76); if(topKills == null) { @@ -1802,7 +1818,7 @@ public class GuiProfileViewer extends GuiScreen { Set<String> kills = topKills.get(killCount); for(String killType : kills) { if(index >= 6) break; - renderAlignedString(EnumChatFormatting.YELLOW+killType+" Kills", EnumChatFormatting.WHITE.toString()+killCount, + Utils.renderAlignedString(EnumChatFormatting.YELLOW+killType+" Kills", EnumChatFormatting.WHITE.toString()+killCount, guiLeft+xStart+xOffset*3, guiTop+yStartTop+yOffset*index, 76); index++; } @@ -1813,7 +1829,7 @@ public class GuiProfileViewer extends GuiScreen { Set<String> deaths = topDeaths.get(deathCount); for(String deathType : deaths) { if(index >= 6) break; - renderAlignedString(EnumChatFormatting.YELLOW+"Deaths: "+ deathType, EnumChatFormatting.WHITE.toString()+deathCount, + Utils.renderAlignedString(EnumChatFormatting.YELLOW+"Deaths: "+ deathType, EnumChatFormatting.WHITE.toString()+deathCount, guiLeft+xStart+xOffset*3, guiTop+yStartBottom+yOffset*index, 76); index++; } @@ -1834,50 +1850,6 @@ public class GuiProfileViewer extends GuiScreen { : shortNumberFormat(d, iteration+1)); } - private void renderAlignedString(String first, String second, float x, float y, int length) { - if(fontRendererObj.getStringWidth(first + " " + second) >= length) { - for(int xOff=-2; xOff<=2; xOff++) { - for(int yOff=-2; yOff<=2; yOff++) { - if(Math.abs(xOff) != Math.abs(yOff)) { - Utils.drawStringCenteredScaledMaxWidth(Utils.cleanColourNotModifiers(first + " " + second), Minecraft.getMinecraft().fontRendererObj, - x+length/2f+xOff/2f, y+4+yOff/2f, false, length, - new Color(0, 0, 0, 200/Math.max(Math.abs(xOff), Math.abs(yOff))).getRGB()); - } - } - } - - GlStateManager.color(1, 1, 1, 1); - Utils.drawStringCenteredScaledMaxWidth(first + " " + second, Minecraft.getMinecraft().fontRendererObj, - x+length/2f, y+4, false, length, 4210752); - } else { - for(int xOff=-2; xOff<=2; xOff++) { - for(int yOff=-2; yOff<=2; yOff++) { - if(Math.abs(xOff) != Math.abs(yOff)) { - fontRendererObj.drawString(Utils.cleanColourNotModifiers(first), - x+xOff/2f, y+yOff/2f, - new Color(0, 0, 0, 200/Math.max(Math.abs(xOff), Math.abs(yOff))).getRGB(), false); - } - } - } - - int secondLen = fontRendererObj.getStringWidth(second); - GlStateManager.color(1, 1, 1, 1); - fontRendererObj.drawString(first, x, y, 4210752, false); - for(int xOff=-2; xOff<=2; xOff++) { - for(int yOff=-2; yOff<=2; yOff++) { - if(Math.abs(xOff) != Math.abs(yOff)) { - fontRendererObj.drawString(Utils.cleanColourNotModifiers(second), - x+length-secondLen+xOff/2f, y+yOff/2f, - new Color(0, 0, 0, 200/Math.max(Math.abs(xOff), Math.abs(yOff))).getRGB(), false); - } - } - } - - GlStateManager.color(1, 1, 1, 1); - fontRendererObj.drawString(second, x+length-secondLen, y, 4210752, false); - } - } - private void drawBasicPage(int mouseX, int mouseY, float partialTicks) { FontRenderer fr = Minecraft.getMinecraft().fontRendererObj; @@ -1934,8 +1906,9 @@ public class GuiProfileViewer extends GuiScreen { if(!rank.equals("YOUTUBER") && !monthlyPackageRank.equals("NONE")) { rank = monthlyPackageRank; } - EnumChatFormatting rankPlusColorECF = EnumChatFormatting.getValueByName(Utils.getElementAsString(profile.getHypixelProfile().get("rankPlusColor"), "YELLOW")); - String rankPlusColor = EnumChatFormatting.YELLOW.toString(); + EnumChatFormatting rankPlusColorECF = EnumChatFormatting.getValueByName(Utils.getElementAsString(profile.getHypixelProfile().get("rankPlusColor"), + "GOLD")); + String rankPlusColor = EnumChatFormatting.GOLD.toString(); if(rankPlusColorECF != null) { rankPlusColor = rankPlusColorECF.toString(); } @@ -2160,10 +2133,10 @@ public class GuiProfileViewer extends GuiScreen { GlStateManager.color(1, 1, 1, 1); GlStateManager.enableBlend(); GL14.glBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ONE_MINUS_SRC_ALPHA); - renderAlignedString(statNamePretty, EnumChatFormatting.WHITE.toString()+val, guiLeft+132, guiTop+32+12.5f*i, 80); + Utils.renderAlignedString(statNamePretty, EnumChatFormatting.WHITE.toString()+val, guiLeft+132, guiTop+27+11f*i, 80); if(mouseX > guiLeft+132 && mouseX < guiLeft+212) { - if(mouseY > guiTop+32+12.5f*i && mouseY < guiTop+40+12.5f*i) { + if(mouseY > guiTop+27+11f*i && mouseY < guiTop+37+11f*i) { List<String> split = splitter.splitToList(statNamePretty); PlayerStats.Stats baseStats = PlayerStats.getBaseStats(); tooltipToDisplay = new ArrayList<>(); @@ -2207,7 +2180,7 @@ public class GuiProfileViewer extends GuiScreen { int x = guiLeft+237+86*xPosition; int y = guiTop+31+21*yPosition; - renderAlignedString(skillName, EnumChatFormatting.WHITE.toString()+levelFloored, x+14, y-4, 60); + Utils.renderAlignedString(skillName, EnumChatFormatting.WHITE.toString()+levelFloored, x+14, y-4, 60); if(skillInfo.get("maxed_"+entry.getKey()).getAsBoolean()) { renderGoldBar(x, y+6, 80); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PlayerStats.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PlayerStats.java index 5223e127..0ae6fed2 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PlayerStats.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/PlayerStats.java @@ -1,15 +1,16 @@ package io.github.moulberry.notenoughupdates.profileviewer; import com.google.gson.*; +import io.github.moulberry.notenoughupdates.NotEnoughUpdates; import io.github.moulberry.notenoughupdates.util.Constants; import io.github.moulberry.notenoughupdates.util.Utils; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.*; import net.minecraft.util.EnumChatFormatting; import org.apache.commons.lang3.StringUtils; import java.io.ByteArrayInputStream; import java.io.IOException; -import java.util.Base64; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -30,11 +31,12 @@ public class PlayerStats { public static final String PET_LUCK = "pet_luck"; public static final String[] defaultStatNames = new String[]{"health","defence","strength","speed","crit_chance", - "crit_damage","bonus_attack_speed","intelligence","sea_creature_chance","magic_find","pet_luck"}; + "crit_damage","bonus_attack_speed","intelligence","sea_creature_chance","magic_find","pet_luck","ferocity","ability_damage"}; public static final String[] defaultStatNamesPretty = new String[]{EnumChatFormatting.RED+"\u2764 Health",EnumChatFormatting.GREEN+"\u2748 Defence", EnumChatFormatting.RED+"\u2741 Strength",EnumChatFormatting.WHITE+"\u2726 Speed",EnumChatFormatting.BLUE+"\u2623 Crit Chance", EnumChatFormatting.BLUE+"\u2620 Crit Damage",EnumChatFormatting.YELLOW+"\u2694 Attack Speed",EnumChatFormatting.AQUA+"\u270e Intelligence", - EnumChatFormatting.DARK_AQUA+"\u03b1 SC Chance",EnumChatFormatting.AQUA+"\u272f Magic Find",EnumChatFormatting.LIGHT_PURPLE+"\u2663 Pet Luck"}; + EnumChatFormatting.DARK_AQUA+"\u03b1 SC Chance",EnumChatFormatting.AQUA+"\u272f Magic Find",EnumChatFormatting.LIGHT_PURPLE+"\u2663 Pet Luck", + EnumChatFormatting.RED+"\u2AFD Ferocity",EnumChatFormatting.RED+"\u2739 Ability Damage"}; public static class Stats { JsonObject statsJson = new JsonObject(); @@ -88,6 +90,12 @@ public class PlayerStats { return this; } + public void scale(String statName, float scale) { + if(statsJson.has(statName)) { + statsJson.add(statName, new JsonPrimitive(statsJson.get(statName).getAsFloat()*scale)); + } + } + public void scaleAll(float scale) { for(Map.Entry<String, JsonElement> statEntry : statsJson.entrySet()) { statsJson.add(statEntry.getKey(), new JsonPrimitive(statEntry.getValue().getAsFloat()*scale)); @@ -159,7 +167,7 @@ public class PlayerStats { return skillBonus; } - private static Stats getPetBonus(JsonObject profile) { + private static Stats getTamingBonus(JsonObject profile) { JsonObject bonuses = Constants.BONUSES; if(bonuses == null) return null; @@ -211,10 +219,9 @@ public class PlayerStats { Stats fairyBonus = getFairyBonus((int)Utils.getElementAsFloat(Utils.getElement(profile, "fairy_exchanges"), 0)); Stats skillBonus = getSkillBonus(skillInfo); - Stats petBonus = getPetBonus(profile); + Stats petBonus = getTamingBonus(profile); - if(fairyBonus == null || skillBonus == null || petBonus == null) { - System.out.println(petBonus); + if(skillBonus == null || petBonus == null) { return null; } @@ -332,6 +339,8 @@ public class PlayerStats { private static final Pattern ATKSPEED_PATTERN = Pattern.compile("^Bonus Attack Speed: ((?:\\+|-)[0-9]+)"); private static final Pattern INTELLIGENCE_PATTERN = Pattern.compile("^Intelligence: ((?:\\+|-)[0-9]+)"); private static final Pattern SCC_PATTERN = Pattern.compile("^Sea Creature Chance: ((?:\\+|-)[0-9]+)"); + private static final Pattern FEROCITY_PATTERN = Pattern.compile("^Ferocity: ((?:\\+|-)[0-9]+)"); + private static final Pattern AD_PATTERN = Pattern.compile("^Ability Damage: ((?:\\+|-)[0-9]+)"); private static final HashMap<String, Pattern> STAT_PATTERN_MAP = new HashMap<>(); static { STAT_PATTERN_MAP.put("health", HEALTH_PATTERN); @@ -343,6 +352,8 @@ public class PlayerStats { STAT_PATTERN_MAP.put("bonus_attack_speed", ATKSPEED_PATTERN); STAT_PATTERN_MAP.put("intelligence", INTELLIGENCE_PATTERN); STAT_PATTERN_MAP.put("sea_creature_chance", SCC_PATTERN); + STAT_PATTERN_MAP.put("ferocity", FEROCITY_PATTERN); + STAT_PATTERN_MAP.put("ability_damage", AD_PATTERN); } private static Stats getStatForItem(String internalname, JsonObject item, JsonArray lore) { Stats stats = new Stats(); @@ -429,9 +440,104 @@ public class PlayerStats { for(Stats stats : itemBonuses.values()) { itemBonusesStats.add(stats); } + return itemBonusesStats; } + public static Stats getPetStatBonuses(JsonObject petsInfo) { + JsonObject petsJson = Constants.PETS; + JsonObject petnums = Constants.PETNUMS; + if(petsJson == null || petnums == null) return new Stats(); + + if(petsInfo != null && petsInfo.has("active_pet") && petsInfo.get("active_pet") != null && + petsInfo.get("active_pet").isJsonObject()) { + JsonObject pet = petsInfo.get("active_pet").getAsJsonObject(); + if(pet.has("type") && pet.get("type") != null && + pet.has("tier") && pet.get("tier") != null && + pet.has("exp") && pet.get("exp") != null) { + + String petname = pet.get("type").getAsString(); + String tier = pet.get("tier").getAsString(); + String heldItem = Utils.getElementAsString(pet.get("heldItem"), null); + + if(!petnums.has(petname)) { + return new Stats(); + } + + String tierNum = GuiProfileViewer.MINION_RARITY_TO_NUM.get(tier); + float exp = pet.get("exp").getAsFloat(); + if(tierNum == null) return new Stats(); + + if(pet.has("heldItem") && !pet.get("heldItem").isJsonNull() && pet.get("heldItem").getAsString().equals("PET_ITEM_TIER_BOOST")) { + tierNum = ""+(Integer.parseInt(tierNum)+1); + } + + int petRarityOffset = petsJson.get("pet_rarity_offset").getAsJsonObject().get(tier).getAsInt(); + JsonArray levelsArr = petsJson.get("pet_levels").getAsJsonArray(); + + GuiProfileViewer.Level levelObj = GuiProfileViewer.getLevel(levelsArr, petRarityOffset, exp); + float level = levelObj.level; + float currentLevelRequirement = levelObj.currentLevelRequirement; + float maxXP = levelObj.maxXP; + pet.addProperty("level", level); + pet.addProperty("currentLevelRequirement", currentLevelRequirement); + pet.addProperty("maxXP", maxXP); + + JsonObject petItem = NotEnoughUpdates.INSTANCE.manager.getItemInformation().get(petname+";"+tierNum); + if(petItem == null) return new Stats(); + + Stats stats = new Stats(); + + JsonObject petInfo = petnums.get(petname).getAsJsonObject(); + if(petInfo.has(tier)) { + JsonObject petInfoTier = petInfo.get(tier).getAsJsonObject(); + if(petInfoTier == null || !petInfoTier.has("1") || !petInfoTier.has("100")) { + return new Stats(); + } + + JsonObject min = petInfoTier.get("1").getAsJsonObject(); + JsonObject max = petInfoTier.get("100").getAsJsonObject(); + + float minMix = (100-level)/99f; + float maxMix = (level-1)/99f; + + for(Map.Entry<String, JsonElement> entry : max.get("statNums").getAsJsonObject().entrySet()) { + float statMax = entry.getValue().getAsFloat(); + float statMin = min.get("statNums").getAsJsonObject().get(entry.getKey()).getAsFloat(); + float val = statMin*minMix + statMax*maxMix; + + stats.addStat(entry.getKey().toLowerCase(), (int)Math.floor(val)); + } + } + + if(heldItem != null) { + HashMap<String, Float> petStatBoots = GuiProfileViewer.PET_STAT_BOOSTS.get(heldItem); + HashMap<String, Float> petStatBootsMult = GuiProfileViewer.PET_STAT_BOOSTS_MULT.get(heldItem); + if(petStatBoots != null) { + for(Map.Entry<String, Float> entryBoost : petStatBoots.entrySet()) { + String key = entryBoost.getKey().toLowerCase(); + try { + stats.addStat(key, entryBoost.getValue()); + } catch(Exception ignored) {} + } + + } + if(petStatBootsMult != null) { + for(Map.Entry<String, Float> entryBoost : petStatBootsMult.entrySet()) { + String key = entryBoost.getKey().toLowerCase(); + try { + stats.scale(key, entryBoost.getValue()); + } catch(Exception ignored) {} + } + } + } + + return stats; + } + } + return new Stats(); + } + private static float getStatMult(JsonObject inventoryInfo) { float mult = 1f; @@ -485,7 +591,8 @@ public class PlayerStats { } } - public static Stats getStats(JsonObject skillInfo, JsonObject inventoryInfo, JsonObject collectionInfo, JsonObject profile) { + public static Stats getStats(JsonObject skillInfo, JsonObject inventoryInfo, JsonObject collectionInfo, + JsonObject petsInfo, JsonObject profile) { if(skillInfo == null || inventoryInfo == null || collectionInfo == null || profile == null) return null; JsonArray armor = Utils.getElement(inventoryInfo, "inv_armor").getAsJsonArray(); @@ -500,7 +607,14 @@ public class PlayerStats { return null; } - Stats stats = getBaseStats().add(passiveBonuses).add(armorBonuses).add(talismanBonuses); + Stats stats = getBaseStats(); + if(stats == null) { + return null; + } + + Stats petBonus = getPetStatBonuses(petsInfo); + + stats = stats.add(passiveBonuses).add(armorBonuses).add(talismanBonuses).add(petBonus); stats.add(getSetBonuses(stats, inventoryInfo, collectionInfo, skillInfo, profile)); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewer.java b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewer.java index e4ab29d2..63c61ee4 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewer.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/profileviewer/ProfileViewer.java @@ -293,7 +293,7 @@ public class ProfileViewer { HashMap<String, String> args = new HashMap<>(); args.put("uuid", ""+uuid); - manager.hypixelApi.getHypixelApiAsync(manager.config.apiKey.value, "status", + manager.hypixelApi.getHypixelApiAsync(NotEnoughUpdates.INSTANCE.config.apiKey.apiKey, "status", args, jsonObject -> { if(jsonObject == null) return; @@ -415,7 +415,7 @@ public class ProfileViewer { HashMap<String, String> args = new HashMap<>(); args.put("uuid", "" + uuid); - manager.hypixelApi.getHypixelApiAsync(manager.config.apiKey.value, "skyblock/profiles", + manager.hypixelApi.getHypixelApiAsync(NotEnoughUpdates.INSTANCE.config.apiKey.apiKey, "skyblock/profiles", args, jsonObject -> { if (jsonObject == null) return; @@ -553,7 +553,7 @@ public class ProfileViewer { private boolean maxed = false; } - public Level getLevel(JsonArray levelingArray, float xp, boolean cumulative) { + public Level getLevel(JsonArray levelingArray, float xp, int levelCap, boolean cumulative) { Level levelObj = new Level(); for(int level=0; level<levelingArray.size(); level++) { float levelXp = levelingArray.get(level).getAsFloat(); @@ -567,16 +567,35 @@ public class ProfileViewer { levelObj.maxXpForLevel = levelXp; levelObj.level = level + xp/levelXp; } + if(levelObj.level > levelCap) { + levelObj.level = levelCap; + levelObj.maxed = true; + } return levelObj; } else { if(!cumulative) xp -= levelXp; } } levelObj.level = levelingArray.size(); + if(levelObj.level > levelCap) { + levelObj.level = levelCap; + } levelObj.maxed = true; return levelObj; } + public int getCap(JsonObject leveling, String skillName) { + JsonElement capsElement = Utils.getElement(leveling, "leveling_caps"); + if(capsElement == null || !capsElement.isJsonObject()) { + return 50; + } + JsonObject caps = capsElement.getAsJsonObject(); + if(caps.has(skillName)) { + return caps.get(skillName).getAsInt(); + } + return 50; + } + public JsonObject getSkillInfo(String profileId) { JsonObject profileInfo = getProfileInformation(profileId); if(profileInfo == null) return null; @@ -597,7 +616,6 @@ public class ProfileViewer { float experience_skill_runecrafting = Utils.getElementAsFloat(Utils.getElement(profileInfo, "experience_skill_runecrafting"), 0); float experience_skill_catacombs = Utils.getElementAsFloat(Utils.getElement(profileInfo, "dungeons.dungeon_types.catacombs.experience"), 0); - if(uuid.equals("d14403fd77664905929ee1a6e365e623")) experience_skill_catacombs = 569809640; //lvl 50 float experience_slayer_zombie = Utils.getElementAsFloat(Utils.getElement(profileInfo, "slayer_bosses.zombie.xp"), 0); float experience_slayer_spider = Utils.getElementAsFloat(Utils.getElement(profileInfo, "slayer_bosses.spider.xp"), 0); @@ -632,22 +650,30 @@ public class ProfileViewer { skillInfo.addProperty("experience_slayer_spider", experience_slayer_spider); skillInfo.addProperty("experience_slayer_wolf", experience_slayer_wolf); - Level level_skill_taming = getLevel(Utils.getElement(leveling, "leveling_xp").getAsJsonArray(), experience_skill_taming, false); - Level level_skill_mining = getLevel(Utils.getElement(leveling, "leveling_xp").getAsJsonArray(), experience_skill_mining, false); - Level level_skill_foraging = getLevel(Utils.getElement(leveling, "leveling_xp").getAsJsonArray(), experience_skill_foraging, false); - Level level_skill_enchanting = getLevel(Utils.getElement(leveling, "leveling_xp").getAsJsonArray(), experience_skill_enchanting, false); - Level level_skill_carpentry = getLevel(Utils.getElement(leveling, "leveling_xp").getAsJsonArray(), experience_skill_carpentry, false); - Level level_skill_farming = getLevel(Utils.getElement(leveling, "leveling_xp").getAsJsonArray(), experience_skill_farming, false); - Level level_skill_combat = getLevel(Utils.getElement(leveling, "leveling_xp").getAsJsonArray(), experience_skill_combat, false); - Level level_skill_fishing = getLevel(Utils.getElement(leveling, "leveling_xp").getAsJsonArray(), experience_skill_fishing, false); - Level level_skill_alchemy = getLevel(Utils.getElement(leveling, "leveling_xp").getAsJsonArray(), experience_skill_alchemy, false); - Level level_skill_runecrafting = getLevel(Utils.getElement(leveling, "runecrafting_xp").getAsJsonArray(), experience_skill_runecrafting, false); - - Level level_skill_catacombs = getLevel(Utils.getElement(leveling, "catacombs").getAsJsonArray(), experience_skill_catacombs, false); - - Level level_slayer_zombie = getLevel(Utils.getElement(leveling, "slayer_xp.zombie").getAsJsonArray(), experience_slayer_zombie, true); - Level level_slayer_spider = getLevel(Utils.getElement(leveling, "slayer_xp.spider").getAsJsonArray(), experience_slayer_spider, true); - Level level_slayer_wolf = getLevel(Utils.getElement(leveling, "slayer_xp.wolf").getAsJsonArray(), experience_slayer_wolf, true); + JsonArray levelingArray = Utils.getElement(leveling, "leveling_xp").getAsJsonArray(); + int farmingCap = getCap(leveling, "farming") + (int)Utils.getElementAsFloat( + Utils.getElement(profileInfo, "jacob2.perks.farming_level_cap"), 0); + Level level_skill_taming = getLevel(levelingArray, experience_skill_taming, getCap(leveling, "taming"), false); + Level level_skill_mining = getLevel(levelingArray, experience_skill_mining, getCap(leveling, "mining"), false); + Level level_skill_foraging = getLevel(levelingArray, experience_skill_foraging, getCap(leveling, "foraging"), false); + Level level_skill_enchanting = getLevel(levelingArray, experience_skill_enchanting, getCap(leveling, "enchanting"), false); + Level level_skill_carpentry = getLevel(levelingArray, experience_skill_carpentry,getCap(leveling, "carpetry"), false); + Level level_skill_farming = getLevel(levelingArray, experience_skill_farming, farmingCap, false); + Level level_skill_combat = getLevel(levelingArray, experience_skill_combat, getCap(leveling, "combat"), false); + Level level_skill_fishing = getLevel(levelingArray, experience_skill_fishing, getCap(leveling, "fishing"), false); + Level level_skill_alchemy = getLevel(levelingArray, experience_skill_alchemy, getCap(leveling, "alchemy"), false); + Level level_skill_runecrafting = getLevel(Utils.getElement(leveling, "runecrafting_xp").getAsJsonArray(), + experience_skill_runecrafting, getCap(leveling, "runecrafting"), false); + + Level level_skill_catacombs = getLevel(Utils.getElement(leveling, "catacombs").getAsJsonArray(), + experience_skill_catacombs, getCap(leveling, "catacombs"), false); + + Level level_slayer_zombie = getLevel(Utils.getElement(leveling, "slayer_xp.zombie").getAsJsonArray(), + experience_slayer_zombie, 9,true); + Level level_slayer_spider = getLevel(Utils.getElement(leveling, "slayer_xp.spider").getAsJsonArray(), + experience_slayer_spider, 9,true); + Level level_slayer_wolf = getLevel(Utils.getElement(leveling, "slayer_xp.wolf").getAsJsonArray(), + experience_slayer_wolf, 9,true); skillInfo.addProperty("level_skill_taming", level_skill_taming.level); skillInfo.addProperty("level_skill_mining", level_skill_mining.level); @@ -785,7 +811,7 @@ public class ProfileViewer { JsonElement crafted_generators_element = Utils.getElement(profileInfo, "crafted_generators"); JsonElement collectionInfoElement = Utils.getElement(profileInfo, "collection"); - if(unlocked_coll_tiers_element == null || crafted_generators_element == null || collectionInfoElement == null) { + if(unlocked_coll_tiers_element == null || collectionInfoElement == null) { return null; } @@ -816,7 +842,7 @@ public class ProfileViewer { } } - if(unlocked_coll_tiers_element != null && unlocked_coll_tiers_element.isJsonArray()) { + if(unlocked_coll_tiers_element.isJsonArray()) { JsonArray unlocked_coll_tiers = unlocked_coll_tiers_element.getAsJsonArray(); for(int i=0; i<unlocked_coll_tiers.size(); i++) { String unlocked = unlocked_coll_tiers.get(i).getAsString(); @@ -920,7 +946,8 @@ public class ProfileViewer { return null; } - PlayerStats.Stats stats = PlayerStats.getStats(getSkillInfo(profileId), getInventoryInfo(profileId), getCollectionInfo(profileId), profileInfo); + PlayerStats.Stats stats = PlayerStats.getStats(getSkillInfo(profileId), getInventoryInfo(profileId), getCollectionInfo(profileId), + getPetsInfo(profileId), profileInfo); this.stats.put(profileId, stats); return stats; } @@ -942,7 +969,7 @@ public class ProfileViewer { public void getHypixelProfile(String name, Consumer<JsonObject> callback) { HashMap<String, String> args = new HashMap<>(); args.put("name", ""+name); - manager.hypixelApi.getHypixelApiAsync(manager.config.apiKey.value, "player", + manager.hypixelApi.getHypixelApiAsync(NotEnoughUpdates.INSTANCE.config.apiKey.apiKey, "player", args, jsonObject -> { if(jsonObject != null && jsonObject.has("success") && jsonObject.get("success").getAsBoolean() && jsonObject.get("player").isJsonObject()) { @@ -1000,7 +1027,7 @@ public class ProfileViewer { updatingResourceCollection.set(true); HashMap<String, String> args = new HashMap<>(); - NotEnoughUpdates.INSTANCE.manager.hypixelApi.getHypixelApiAsync(NotEnoughUpdates.INSTANCE.manager.config.apiKey.value, "resources/skyblock/collections", + NotEnoughUpdates.INSTANCE.manager.hypixelApi.getHypixelApiAsync(NotEnoughUpdates.INSTANCE.config.apiKey.apiKey, "resources/skyblock/collections", args, jsonObject -> { updatingResourceCollection.set(false); if(jsonObject != null && jsonObject.has("success") && jsonObject.get("success").getAsBoolean()) { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/questing/GuiQuestLine.java b/src/main/java/io/github/moulberry/notenoughupdates/questing/GuiQuestLine.java deleted file mode 100644 index 6840a5aa..00000000 --- a/src/main/java/io/github/moulberry/notenoughupdates/questing/GuiQuestLine.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.github.moulberry.notenoughupdates.questing; - -import net.minecraft.client.gui.GuiScreen; - -import java.awt.*; - -public class GuiQuestLine extends GuiScreen { - - public static QuestLine questLine = new QuestLine(); - - @Override - public void drawScreen(int mouseX, int mouseY, float partialTicks) { - super.drawScreen(mouseX, mouseY, partialTicks); - - drawDefaultBackground(); - - drawRect(0, 0, 20, height, new Color(100, 100, 100, 100).getRGB()); - drawRect(20, 0, 21, height, new Color(50, 50, 50, 200).getRGB()); - - questLine.render(width, height, mouseX, mouseY); - } - - @Override - public boolean doesGuiPauseGame() { - return false; - } -} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/questing/QuestLine.java b/src/main/java/io/github/moulberry/notenoughupdates/questing/QuestLine.java deleted file mode 100644 index 4e541583..00000000 --- a/src/main/java/io/github/moulberry/notenoughupdates/questing/QuestLine.java +++ /dev/null @@ -1,226 +0,0 @@ -package io.github.moulberry.notenoughupdates.questing; - -import com.google.gson.JsonObject; -import io.github.moulberry.notenoughupdates.NEUResourceManager; -import io.github.moulberry.notenoughupdates.NotEnoughUpdates; -import io.github.moulberry.notenoughupdates.cosmetics.CapeNode; -import io.github.moulberry.notenoughupdates.questing.requirements.*; -import io.github.moulberry.notenoughupdates.util.Utils; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.ScaledResolution; -import net.minecraft.client.renderer.GlStateManager; -import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.WorldRenderer; -import net.minecraft.client.renderer.vertex.DefaultVertexFormats; -import net.minecraft.client.shader.Framebuffer; -import net.minecraft.client.shader.Shader; -import net.minecraft.init.Items; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Matrix4f; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL14; -import org.lwjgl.util.vector.Vector3f; - -import java.awt.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import static io.github.moulberry.notenoughupdates.GuiTextures.item_mask; - -public class QuestLine { - - private List<Quest> quests = new ArrayList<>(); - private Framebuffer framebuffer = null; - private Framebuffer framebufferGrayscale = null; - private Shader grayscaleShader = null; - - public class Quest { - //requirements - //rewards - //display icon - //x,y offset - //prerequisite quests id:0,6 - - private Requirement requirement; - - private int x; - private int y; - private ItemStack display; - private String[] tooltip = new String[0]; - private int[] prerequisites; - private boolean completed = false; - - public Quest(ItemStack display, Requirement requirement, int x, int y, int... prerequisites) { - this.requirement = requirement; - this.display = display; - this.x = x; - this.y = y; - this.prerequisites = prerequisites; - } - - public String[] render(int mouseX, int mouseY, boolean hasCompleted) { - if(hasCompleted != completed) return null; - - Minecraft.getMinecraft().getTextureManager().bindTexture(item_mask); - if(completed) { - GlStateManager.color(200/255f, 150/255f, 50/255f, 255/255f); - } else { - GlStateManager.color(100/255f, 100/255f, 100/255f, 255/255f); - } - Utils.drawTexturedRect(x-9, y-9, 18, 18, GL11.GL_NEAREST); - - Utils.drawItemStack(display, x-8, y-8); - - GlStateManager.color(100/255f, 100/255f, 100/255f, 255/255f); - GlStateManager.disableTexture2D(); - for(int prereq : prerequisites) { - Quest other = quests.get(prereq); - - Tessellator tessellator = Tessellator.getInstance(); - WorldRenderer worldrenderer = tessellator.getWorldRenderer(); - worldrenderer.begin(GL11.GL_LINES, DefaultVertexFormats.POSITION); - worldrenderer.pos(x, y, 0).endVertex(); - worldrenderer.pos(other.x, other.y, 0).endVertex(); - tessellator.draw(); - } - - if(mouseX > x-9 && mouseX < x+9) { - if(mouseY > y-9 && mouseY < y+9) { - return tooltip; - } - } - return null; - } - - public void tick() { - if(completed) return; - for(int prereq : prerequisites) { - Quest other = quests.get(prereq); - if(!other.completed) return; - } - requirement.updateRequirement(); - if(requirement.getCompleted()) { - completed = true; - } - } - } - - private Framebuffer checkFramebufferSizes(Framebuffer framebuffer, int width, int height, int scaleFactor) { - int sw = width*scaleFactor; - int sh = height*scaleFactor; - - if(framebuffer == null || framebuffer.framebufferWidth != sw || framebuffer.framebufferHeight != sh) { - if(framebuffer == null) { - framebuffer = new Framebuffer(sw, sh, true); - } else { - framebuffer.createBindFramebuffer(sw, sh); - } - framebuffer.setFramebufferFilter(GL11.GL_NEAREST); - } - return framebuffer; - } - - private Matrix4f createProjectionMatrix(int width, int height) { - Matrix4f projMatrix = new Matrix4f(); - projMatrix.setIdentity(); - projMatrix.m00 = 2.0F / (float)width; - projMatrix.m11 = 2.0F / (float)(-height); - projMatrix.m22 = -0.0020001999F; - projMatrix.m33 = 1.0F; - projMatrix.m03 = -1.0F; - projMatrix.m13 = 1.0F; - projMatrix.m23 = -1.0001999F; - return projMatrix; - } - - public void render(int width, int height, int mouseX, int mouseY) { - ScaledResolution scaledresolution = new ScaledResolution(Minecraft.getMinecraft()); - - GL11.glTranslatef(width/2f, height/2f, 0); - String[] tooltipDisplay = null; - for(Quest quest : quests) { - String[] tooltip = quest.render(mouseX-width/2, mouseY-height/2, true); - if(tooltip != null && tooltip.length > 0) tooltipDisplay = tooltip; - } - GL11.glTranslatef(-width/2f, -height/2f, 0); - - //FBO/Shader setup - if(framebuffer != null && grayscaleShader != null && (framebuffer.framebufferWidth != width || framebuffer.framebufferHeight != height)) { - grayscaleShader.setProjectionMatrix(createProjectionMatrix( - width*scaledresolution.getScaleFactor(), height*scaledresolution.getScaleFactor())); - } - framebuffer = checkFramebufferSizes(framebuffer, width, height, - scaledresolution.getScaleFactor()); - framebufferGrayscale = checkFramebufferSizes(framebufferGrayscale, width, height, - scaledresolution.getScaleFactor()); - if(grayscaleShader == null) { - try { - grayscaleShader = new Shader(new NEUResourceManager(Minecraft.getMinecraft().getResourceManager()), - "grayscale", - framebuffer, framebufferGrayscale); - grayscaleShader.setProjectionMatrix(createProjectionMatrix( - width*scaledresolution.getScaleFactor(), height*scaledresolution.getScaleFactor())); - } catch(Exception e) { - return; - } - } - - //Render contents of framebuffer to screen - framebufferGrayscale.bindFramebufferTexture(); - GlStateManager.color(1f, 1f, 1f, 1f); - Utils.drawTexturedRect(0, 0, width, height, 0, 1, 1, 0); - framebufferGrayscale.unbindFramebufferTexture(); - - //Render uncompleted quests to framebuffer - GL11.glPushMatrix(); - framebuffer.framebufferClear(); - framebuffer.bindFramebuffer(false); - GlStateManager.color(1f, 1f, 1f, 1f); - GL11.glTranslatef(width/2f, height/2f, 0); - for(Quest quest : quests) { - String[] tooltip = quest.render(mouseX-width/2, mouseY-height/2, false); - if(tooltip != null && tooltip.length > 0) tooltipDisplay = tooltip; - } - GL11.glTranslatef(-width/2f, -height/2f, 0); - framebuffer.unbindFramebuffer(); - GL11.glPopMatrix(); - - //Execute shader - GL11.glPushMatrix(); - grayscaleShader.loadShader(0); - Minecraft.getMinecraft().getFramebuffer().bindFramebuffer(true); - GL11.glPopMatrix(); - - if(tooltipDisplay != null) { - List<String> tooltip = new ArrayList<>(); - tooltip.addAll(Arrays.asList(tooltipDisplay)); - - Utils.drawHoveringText(tooltip, mouseX, mouseY, width, height, -1, Minecraft.getMinecraft().fontRendererObj, false); - } - } - - public void tick() { - for(Quest quest : quests) { - quest.tick(); - } - } - - { - //Requirement hubRequirement = new RequirementIslandType("Village"); - //Requirement locationRequirement = new RequirementLocation(-29, 79, -108, 2); - //Requirement locationRequirement2 = new RequirementLocation(-29, 79, -108, 2, hubRequirement); - Requirement req1 = new RequirementApi("coin_purse>20000"); - Requirement req2 = new RequirementIslandType("The End"); - Requirement req3 = new RequirementGuiOpen("Auctions Browser"); - - Quest quest1 = new Quest(new ItemStack(Items.rotten_flesh), req1, 0, 0); - Quest quest2 = new Quest(new ItemStack(Items.cooked_porkchop), req2, 0, 30); - Quest quest3 = new Quest(new ItemStack(Items.diamond_axe), req3, 30, 30, 0, 1); - quest1.tooltip = new String[]{"Line1", "Line2", "Line3"}; - quests.add(quest1); - quests.add(quest2); - quests.add(quest3); - } - -} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/questing/requirements/Requirement.java b/src/main/java/io/github/moulberry/notenoughupdates/questing/requirements/Requirement.java deleted file mode 100644 index a7f40e73..00000000 --- a/src/main/java/io/github/moulberry/notenoughupdates/questing/requirements/Requirement.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.github.moulberry.notenoughupdates.questing.requirements; - -public abstract class Requirement { - - private Requirement[] preconditions; - - protected boolean completed = false; - - public Requirement(Requirement... preconditions) { - this.preconditions = preconditions; - } - - public boolean getPreconditionCompleted() { - boolean completed = true; - for(Requirement precondition : preconditions) { - completed &= precondition.completed; - } - return completed; - } - - //Collection, Item obtained, GUI Open, Fake npc interact - - public boolean getCompleted() { - return completed && getPreconditionCompleted(); - } - - public abstract void updateRequirement(); - -} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/questing/requirements/RequirementApi.java b/src/main/java/io/github/moulberry/notenoughupdates/questing/requirements/RequirementApi.java deleted file mode 100644 index 16da64fe..00000000 --- a/src/main/java/io/github/moulberry/notenoughupdates/questing/requirements/RequirementApi.java +++ /dev/null @@ -1,108 +0,0 @@ -package io.github.moulberry.notenoughupdates.questing.requirements; - -import com.google.common.base.Splitter; -import com.google.gson.*; -import io.github.moulberry.notenoughupdates.NotEnoughUpdates; - -import java.util.List; - -public class RequirementApi extends Requirement { - - private boolean valid = false; - private String requirementLeft; //a.b.c - private String op; //!=,<=,>=,=,<,> - private String requirementRight; //true,float,etc. - - private String[] ops = new String[]{"!=","<=",">=","=","<",">"}; - - public RequirementApi(String apiCheck, Requirement... preconditions) { - super(preconditions); - - processApiCheck(apiCheck); - } - - public void processApiCheck(String apiCheck) { - for(String operator : ops) { - if(apiCheck.contains(operator)) { - String[] split = apiCheck.split(operator); - requirementLeft = split[0]; - requirementRight = split[1]; - op = operator; - valid = true; - return; - } - } - } - - private static Splitter PATH_SPLITTER = Splitter.on(".").omitEmptyStrings().limit(2); - private static JsonElement getElement(JsonElement element, String path) { - List<String> path_split = PATH_SPLITTER.splitToList(path); - if(element instanceof JsonObject) { - JsonElement e = element.getAsJsonObject().get(path_split.get(0)); - if(path_split.size() > 1) { - return getElement(e, path_split.get(1)); - } else { - return e; - } - } else { - return element; - } - } - - private static boolean checkElementSatisfiesComparison(JsonElement element, String op, String value) { - try { - if(element instanceof JsonNull) { - return value.equals("null"); - } else if(element instanceof JsonObject) { - if(value.contains(".")) { - StringBuilder sb = new StringBuilder(); - String[] split = value.split("\\."); - for(int i=0; i<split.length-1; i++) { - sb.append(split[i]).append("."); - } - return checkElementSatisfiesComparison(getElement(element, sb.toString()), op, split[split.length-1]); - } else { - boolean containsValue = element.getAsJsonObject().has(value); - switch(op) { - case "=": return containsValue; - case "!=": return !containsValue; - default: return false; - } - } - } else if(element instanceof JsonArray) { - for(int i=0; i<element.getAsJsonArray().size(); i++) { - JsonElement e = element.getAsJsonArray().get(i); - if(checkElementSatisfiesComparison(e, op, value)) return true; - } - } else if(element instanceof JsonPrimitive) { - JsonPrimitive prim = element.getAsJsonPrimitive(); - if(!prim.isNumber()) { - return prim.getAsString().equals(value); - } else { - switch(op) { - case "=": return prim.getAsString().equals(value); - case "!=": return !prim.getAsString().equals(value); - case ">": return prim.getAsDouble() > Double.parseDouble(value); - case "<": return prim.getAsDouble() < Double.parseDouble(value); - case "<=": return prim.getAsDouble() <= Double.parseDouble(value); - case ">=": return prim.getAsDouble() >= Double.parseDouble(value); - default: return false; - } - } - } - } catch(Exception e) {} - return false; - } - - @Override - public void updateRequirement() { - if(valid) { - /*JsonObject profile = NotEnoughUpdates.INSTANCE.manager.auctionManager.getPlayerInformation(); - if(profile != null) { - System.out.println("-----------"); - JsonElement element = getElement(profile, requirementLeft); - completed = checkElementSatisfiesComparison(element, op, requirementRight); - }*/ - } - } -} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/questing/requirements/RequirementGuiOpen.java b/src/main/java/io/github/moulberry/notenoughupdates/questing/requirements/RequirementGuiOpen.java deleted file mode 100644 index e53a1aca..00000000 --- a/src/main/java/io/github/moulberry/notenoughupdates/questing/requirements/RequirementGuiOpen.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.github.moulberry.notenoughupdates.questing.requirements; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.inventory.GuiChest; -import net.minecraft.inventory.ContainerChest; - -public class RequirementGuiOpen extends Requirement { - - private String guiName; - - public RequirementGuiOpen(String guiName, Requirement... preconditions) { - super(preconditions); - this.guiName = guiName; - } - - @Override - public void updateRequirement() { - if(Minecraft.getMinecraft().currentScreen instanceof GuiChest) { - GuiChest chest = (GuiChest) Minecraft.getMinecraft().currentScreen; - ContainerChest container = (ContainerChest) chest.inventorySlots; - String containerName = container.getLowerChestInventory().getDisplayName().getUnformattedText(); - - if(containerName.equals(guiName)) { - completed = true; - } - } - } -} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/questing/requirements/RequirementIslandType.java b/src/main/java/io/github/moulberry/notenoughupdates/questing/requirements/RequirementIslandType.java deleted file mode 100644 index c0aef344..00000000 --- a/src/main/java/io/github/moulberry/notenoughupdates/questing/requirements/RequirementIslandType.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.github.moulberry.notenoughupdates.questing.requirements; - -import io.github.moulberry.notenoughupdates.questing.SBInfo; - -public class RequirementIslandType extends Requirement { - - private String islandType; - - public RequirementIslandType(String islandType, Requirement... preconditions) { - super(preconditions); - this.islandType = islandType; - } - - - @Override - public void updateRequirement() { - completed = islandType.equalsIgnoreCase(SBInfo.getInstance().location); - } -} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/questing/requirements/RequirementItemObtained.java b/src/main/java/io/github/moulberry/notenoughupdates/questing/requirements/RequirementItemObtained.java deleted file mode 100644 index 0627a1cf..00000000 --- a/src/main/java/io/github/moulberry/notenoughupdates/questing/requirements/RequirementItemObtained.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.github.moulberry.notenoughupdates.questing.requirements; - -import io.github.moulberry.notenoughupdates.NotEnoughUpdates; - -import java.util.ArrayList; -import java.util.Map; - -public class RequirementItemObtained extends Requirement { - - private String internalname; - - public RequirementItemObtained(String internalname, Requirement... preconditions) { - super(preconditions); - this.internalname = internalname; - } - - private Map<String, ArrayList<String>> getAcquiredItems() { - return NotEnoughUpdates.INSTANCE.manager.config.collectionLog.value; - } - - @Override - public void updateRequirement() { - if(getAcquiredItems() != null && - getAcquiredItems().containsKey(NotEnoughUpdates.INSTANCE.manager.getCurrentProfile()) && - getAcquiredItems().get(NotEnoughUpdates.INSTANCE.manager.getCurrentProfile()).contains(internalname)) { - completed = true; - } - } -} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/questing/requirements/RequirementLocation.java b/src/main/java/io/github/moulberry/notenoughupdates/questing/requirements/RequirementLocation.java deleted file mode 100644 index 0e995f34..00000000 --- a/src/main/java/io/github/moulberry/notenoughupdates/questing/requirements/RequirementLocation.java +++ /dev/null @@ -1,26 +0,0 @@ -package io.github.moulberry.notenoughupdates.questing.requirements; - -import net.minecraft.client.Minecraft; -import net.minecraft.entity.player.EntityPlayer; - -public class RequirementLocation extends Requirement { - - private int x; - private int y; - private int z; - private float radius; - - public RequirementLocation(int x, int y, int z, float radius, Requirement... preconditions) { - super(preconditions); - this.x = x; - this.y = y; - this.z = z; - this.radius = radius; - } - - @Override - public void updateRequirement() { - EntityPlayer player = Minecraft.getMinecraft().thePlayer; - completed = player.getDistance(x, y, z) < radius; - } -} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/questing/requirements/RequirementLocationRect.java b/src/main/java/io/github/moulberry/notenoughupdates/questing/requirements/RequirementLocationRect.java deleted file mode 100644 index fff71af7..00000000 --- a/src/main/java/io/github/moulberry/notenoughupdates/questing/requirements/RequirementLocationRect.java +++ /dev/null @@ -1,34 +0,0 @@ -package io.github.moulberry.notenoughupdates.questing.requirements; - -import net.minecraft.client.Minecraft; -import net.minecraft.entity.player.EntityPlayer; - -public class RequirementLocationRect extends Requirement { - - private int x1; - private int y1; - private int z1; - private int x2; - private int y2; - private int z2; - - public RequirementLocationRect(int x1, int y1, int z1, int x2, int y2, int z2, Requirement... preconditions) { - super(preconditions); - this.x1 = Math.min(x1, x2); - this.y1 = Math.min(y1, y2); - this.z1 = Math.min(z1, z2); - - this.x2 = Math.max(x1, x2); - this.y2 = Math.max(y1, y2); - this.z2 = Math.max(z1, z2); - } - - @Override - public void updateRequirement() { - EntityPlayer player = Minecraft.getMinecraft().thePlayer; - completed = true; - completed &= player.posX > x1 && player.posX < x2; - completed &= player.posY > y1 && player.posY < y2; - completed &= player.posZ > z1 && player.posZ < z2; - } -} diff --git a/src/main/java/io/github/moulberry/notenoughupdates/AllowEmptyHTMLTag.java b/src/main/java/io/github/moulberry/notenoughupdates/util/AllowEmptyHTMLTag.java index 3cf5ef31..e6baff16 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/AllowEmptyHTMLTag.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/AllowEmptyHTMLTag.java @@ -1,4 +1,4 @@ -package io.github.moulberry.notenoughupdates; +package io.github.moulberry.notenoughupdates.util; import info.bliki.htmlcleaner.TagNode; import info.bliki.wiki.filter.ITextConverter; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/GuiTextures.java b/src/main/java/io/github/moulberry/notenoughupdates/util/GuiTextures.java index 141ffefb..5bb15ef3 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/GuiTextures.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/GuiTextures.java @@ -1,4 +1,4 @@ -package io.github.moulberry.notenoughupdates; +package io.github.moulberry.notenoughupdates.util; import net.minecraft.util.ResourceLocation; @@ -23,6 +23,12 @@ public class GuiTextures { public static final ResourceLocation slider_on_large = new ResourceLocation("notenoughupdates:slider_on_large.png"); public static final ResourceLocation slider_button = new ResourceLocation("notenoughupdates:slider_button.png"); + public static final ResourceLocation DISCORD = new ResourceLocation("notenoughupdates:social/discord.png"); + public static final ResourceLocation GITHUB = new ResourceLocation("notenoughupdates:social/github.png"); + public static final ResourceLocation PATREON = new ResourceLocation("notenoughupdates:social/patreon.png"); + public static final ResourceLocation TWITTER = new ResourceLocation("notenoughupdates:social/twitter.png"); + public static final ResourceLocation YOUTUBE = new ResourceLocation("notenoughupdates:social/youtube.png"); + public static final ResourceLocation item_mask = new ResourceLocation("notenoughupdates:item_mask.png"); public static final ResourceLocation item_haschild = new ResourceLocation("notenoughupdates:item_haschild.png"); public static final ResourceLocation button_tex = new ResourceLocation("notenoughupdates:button.png"); @@ -78,4 +84,20 @@ public class GuiTextures { public static final ResourceLocation ascending_overlay = new ResourceLocation("notenoughupdates:ascending_overlay.png"); public static final ResourceLocation descending_overlay = new ResourceLocation("notenoughupdates:descending_overlay.png"); + public static final ResourceLocation BAR = new ResourceLocation("notenoughupdates:core/bar.png"); + public static final ResourceLocation OFF = new ResourceLocation("notenoughupdates:core/toggle_off.png"); + public static final ResourceLocation ONE = new ResourceLocation("notenoughupdates:core/toggle_1.png"); + public static final ResourceLocation TWO = new ResourceLocation("notenoughupdates:core/toggle_2.png"); + public static final ResourceLocation THREE = new ResourceLocation("notenoughupdates:core/toggle_3.png"); + public static final ResourceLocation ON = new ResourceLocation("notenoughupdates:core/toggle_on.png"); + + public static final ResourceLocation slider_off_cap = new ResourceLocation("notenoughupdates:core/slider/slider_off_cap.png"); + public static final ResourceLocation slider_off_notch = new ResourceLocation("notenoughupdates:core/slider/slider_off_notch.png"); + public static final ResourceLocation slider_off_segment = new ResourceLocation("notenoughupdates:core/slider/slider_off_segment.png"); + public static final ResourceLocation slider_on_cap = new ResourceLocation("notenoughupdates:core/slider/slider_on_cap.png"); + public static final ResourceLocation slider_on_notch = new ResourceLocation("notenoughupdates:core/slider/slider_on_notch.png"); + public static final ResourceLocation slider_on_segment = new ResourceLocation("notenoughupdates:core/slider/slider_on_segment.png"); + + + } diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NEUResourceManager.java b/src/main/java/io/github/moulberry/notenoughupdates/util/NEUResourceManager.java index 41737eda..388fd4f6 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NEUResourceManager.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/NEUResourceManager.java @@ -1,4 +1,4 @@ -package io.github.moulberry.notenoughupdates; +package io.github.moulberry.notenoughupdates.util; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.IResource; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/RequestFocusListener.java b/src/main/java/io/github/moulberry/notenoughupdates/util/RequestFocusListener.java index ecc27c9a..2365b60b 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/RequestFocusListener.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/RequestFocusListener.java @@ -1,4 +1,4 @@ -package io.github.moulberry.notenoughupdates; +package io.github.moulberry.notenoughupdates.util; import javax.swing.*; import javax.swing.event.*; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/SBAIntegration.java b/src/main/java/io/github/moulberry/notenoughupdates/util/SBAIntegration.java index 4df9c847..04f53bf3 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/SBAIntegration.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/SBAIntegration.java @@ -1,4 +1,4 @@ -package io.github.moulberry.notenoughupdates; +package io.github.moulberry.notenoughupdates.util; import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; diff --git a/src/main/java/io/github/moulberry/notenoughupdates/questing/SBInfo.java b/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java index 67cd79a9..f5df9305 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/questing/SBInfo.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/SBInfo.java @@ -1,8 +1,7 @@ -package io.github.moulberry.notenoughupdates.questing; +package io.github.moulberry.notenoughupdates.util; import com.google.gson.JsonObject; import io.github.moulberry.notenoughupdates.NotEnoughUpdates; -import io.github.moulberry.notenoughupdates.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.scoreboard.Score; import net.minecraft.scoreboard.ScoreObjective; 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 64bf3015..37f4db0c 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/util/Utils.java @@ -366,7 +366,7 @@ public class Utils { } public static void playPressSound() { - if(NotEnoughUpdates.INSTANCE.manager.config.guiButtonClicks.value) { + if(NotEnoughUpdates.INSTANCE.config.misc.guiButtonClicks) { Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.create( new ResourceLocation("gui.button.press"), 1.0F)); } @@ -517,6 +517,51 @@ public class Utils { } } + public static void renderAlignedString(String first, String second, float x, float y, int length) { + FontRenderer fontRendererObj = Minecraft.getMinecraft().fontRendererObj; + if(fontRendererObj.getStringWidth(first + " " + second) >= length) { + for(int xOff=-2; xOff<=2; xOff++) { + for(int yOff=-2; yOff<=2; yOff++) { + if(Math.abs(xOff) != Math.abs(yOff)) { + Utils.drawStringCenteredScaledMaxWidth(Utils.cleanColourNotModifiers(first + " " + second), Minecraft.getMinecraft().fontRendererObj, + x+length/2f+xOff/2f, y+4+yOff/2f, false, length, + new Color(0, 0, 0, 200/Math.max(Math.abs(xOff), Math.abs(yOff))).getRGB()); + } + } + } + + GlStateManager.color(1, 1, 1, 1); + Utils.drawStringCenteredScaledMaxWidth(first + " " + second, Minecraft.getMinecraft().fontRendererObj, + x+length/2f, y+4, false, length, 4210752); + } else { + for(int xOff=-2; xOff<=2; xOff++) { + for(int yOff=-2; yOff<=2; yOff++) { + if(Math.abs(xOff) != Math.abs(yOff)) { + fontRendererObj.drawString(Utils.cleanColourNotModifiers(first), + x+xOff/2f, y+yOff/2f, + new Color(0, 0, 0, 200/Math.max(Math.abs(xOff), Math.abs(yOff))).getRGB(), false); + } + } + } + + int secondLen = fontRendererObj.getStringWidth(second); + GlStateManager.color(1, 1, 1, 1); + fontRendererObj.drawString(first, x, y, 4210752, false); + for(int xOff=-2; xOff<=2; xOff++) { + for(int yOff=-2; yOff<=2; yOff++) { + if(Math.abs(xOff) != Math.abs(yOff)) { + fontRendererObj.drawString(Utils.cleanColourNotModifiers(second), + x+length-secondLen+xOff/2f, y+yOff/2f, + new Color(0, 0, 0, 200/Math.max(Math.abs(xOff), Math.abs(yOff))).getRGB(), false); + } + } + } + + GlStateManager.color(1, 1, 1, 1); + fontRendererObj.drawString(second, x+length-secondLen, y, 4210752, false); + } + } + public static void drawStringScaledMaxWidth(String str, FontRenderer fr, float x, float y, boolean shadow, int len, int colour) { int strLen = fr.getStringWidth(str); float factor = len/(float)strLen; @@ -939,11 +984,11 @@ public class Utils { drawGradientRect(zLevel, tooltipX + tooltipTextWidth + 3, tooltipY - 3, tooltipX + tooltipTextWidth + 4, tooltipY + tooltipHeight + 3, backgroundColor, backgroundColor); //TODO: Coloured Borders int borderColorStart = 0x505000FF; - if(NotEnoughUpdates.INSTANCE.manager.config.tooltipBorderColours.value && coloured) { + if(NotEnoughUpdates.INSTANCE.config.tooltipTweaks.tooltipBorderColours && coloured) { if(textLines.size() > 0) { String first = textLines.get(0); borderColorStart = getPrimaryColour(first).getRGB() & 0x00FFFFFF | - ((NotEnoughUpdates.INSTANCE.manager.config.tooltipBorderOpacity.value.intValue()) << 24); + ((NotEnoughUpdates.INSTANCE.config.tooltipTweaks.tooltipBorderOpacity) << 24); } } final int borderColorEnd = (borderColorStart & 0xFEFEFE) >> 1 | borderColorStart & 0xFF000000; |