From b09f774d422263ce15b97d6d0804beddf856176d Mon Sep 17 00:00:00 2001 From: IRONM00N <64110067+IRONM00N@users.noreply.github.com> Date: Sun, 27 Feb 2022 11:53:57 -0500 Subject: feat: improve formating :) --- .../notenoughupdates/miscgui/GuiCustomEnchant.java | 3426 +++++++++++--------- 1 file changed, 1839 insertions(+), 1587 deletions(-) (limited to 'src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiCustomEnchant.java') diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiCustomEnchant.java b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiCustomEnchant.java index c68f02fc..f5838052 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiCustomEnchant.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscgui/GuiCustomEnchant.java @@ -43,566 +43,582 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; public class GuiCustomEnchant extends Gui { - private static final GuiCustomEnchant INSTANCE = new GuiCustomEnchant(); - private static final ResourceLocation TEXTURE = new ResourceLocation("notenoughupdates:custom_enchant_gui.png"); - private static final ResourceLocation ENCHANTMENT_TABLE_BOOK_TEXTURE = new ResourceLocation("textures/entity/enchanting_table_book.png"); - private static final ModelBook MODEL_BOOK = new ModelBook(); - - private static final int EXPERIENCE_ORB_COUNT = 30; - - private static final Pattern XP_COST_PATTERN = Pattern.compile("\\u00a73(\\d+) Exp Levels"); - - private enum EnchantState { - NO_ITEM, - ADDING_ENCHANT, - SWITCHING_DONT_UPDATE, - INVALID_ITEM, - HAS_ITEM - } - - private class Enchantment { - public int slotIndex; - public String enchantName; - public String enchId; - public List displayLore; - public int level; - public int xpCost = -1; - public boolean overMaxLevel = false; - public boolean conflicts = false; - - public Enchantment(int slotIndex, String enchantName, String enchId, List displayLore, int level, - boolean useMaxLevelForCost, boolean checkConflicts) { - this.slotIndex = slotIndex; - this.enchantName = enchantName; - this.enchId = enchId; - this.displayLore = displayLore; - this.level = level; - - if (Constants.ENCHANTS != null) { - if (checkConflicts && Constants.ENCHANTS.has("enchant_pools")) { - JsonArray pools = Constants.ENCHANTS.getAsJsonArray("enchant_pools"); - out: - for (int i = 0; i < pools.size(); i++) { - JsonArray pool = pools.get(i).getAsJsonArray(); - - boolean hasThis = false; - boolean hasApplied = false; - - for (int j = 0; j < pool.size(); j++) { - String enchIdPoolElement = pool.get(j).getAsString(); - if (enchId.equalsIgnoreCase(enchIdPoolElement)) { - hasThis = true; - } else if (playerEnchantIds.containsKey(enchIdPoolElement)) { - hasApplied = true; - } - if (hasThis && hasApplied) { - this.conflicts = true; - break out; - } - } - } - } - - if (level >= 1 && Constants.ENCHANTS.has("enchants_xp_cost")) { - JsonObject allCosts = Constants.ENCHANTS.getAsJsonObject("enchants_xp_cost"); - if (allCosts.has(enchId)) { - JsonArray costs = allCosts.getAsJsonArray(enchId); - - if (costs.size() >= 1) { - if (useMaxLevelForCost) { - this.xpCost = costs.get(costs.size() - 1).getAsInt(); - } else if (level - 1 < costs.size()) { - this.xpCost = costs.get(level - 1).getAsInt(); - } else { - overMaxLevel = true; - } - } - } - - } - } - } - } - - public static class ExperienceOrb { - public float x; - public float y; - public float xLast; - public float yLast; - public float xVel; - public float yVel; - - public int type; - public int rotationDeg; - } - - private final List orbs = new ArrayList<>(); - private int orbTargetX = 0; - private int orbTargetY = 0; - - private int guiLeft; - private int guiTop; - private boolean shouldOverrideFast = false; - - public float pageOpen; - public float pageOpenLast; - public float pageOpenRandom; - public float pageOpenVelocity; - public float bookOpen; - public float bookOpenLast; - - private int currentPage; - private int expectedMaxPage; - - private boolean isScrollingLeft = true; - - private ItemStack enchantingItem = null; - - private int removingEnchantPlayerLevel = -1; - - private final GuiElementTextField searchField = new GuiElementTextField("", GuiElementTextField.SCISSOR_TEXT); - - private final HashMap playerEnchantIds = new HashMap<>(); - - private boolean searchRemovedFromApplicable = false; - private boolean searchRemovedFromRemovable = false; - private final List applicable = new ArrayList<>(); - private final List removable = new ArrayList<>(); - - private final HashMap enchanterEnchLevels = new HashMap<>(); - private Enchantment enchanterCurrentEnch = null; - - public Random random = new Random(); - - private EnchantState currentState = EnchantState.NO_ITEM; - private EnchantState lastState = EnchantState.NO_ITEM; - - private final LerpingInteger leftScroll = new LerpingInteger(0, 150); - private final LerpingInteger rightScroll = new LerpingInteger(0, 150); - - private final LerpingFloat arrowAmount = new LerpingFloat(0, 100); - - private static final int X_SIZE = 364; - private static final int Y_SIZE = 215; - - private int clickedScrollOffset = -1; - private boolean isClickedScrollLeft = true; - - private boolean isChangingEnchLevel = false; - - private long cancelButtonAnimTime = 0; - private long confirmButtonAnimTime = 0; - - public static GuiCustomEnchant getInstance() { - return INSTANCE; - } - - public boolean shouldOverride(String containerName) { - shouldOverrideFast = NotEnoughUpdates.INSTANCE.config.enchantingSolvers.enableTableGUI && - Objects.equals("Enchant Item", containerName) && - NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard(); - if (!shouldOverrideFast) { - currentState = EnchantState.NO_ITEM; - applicable.clear(); - removable.clear(); - expectedMaxPage = 1; - } - return shouldOverrideFast; - } - - private int tickCounter = 0; - - public void tick() { - GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); - ContainerChest cc = (ContainerChest) chest.inventorySlots; - - ItemStack stack = cc.getLowerChestInventory().getStackInSlot(23); - ItemStack enchantGuideStack = cc.getLowerChestInventory().getStackInSlot(50); - ItemStack enchantingItemStack = cc.getLowerChestInventory().getStackInSlot(19); - - int lastPage = currentPage; - - this.lastState = currentState; - if (enchantGuideStack != null && enchantGuideStack.getItem() != Items.book && enchantingItem != null) { - currentState = EnchantState.ADDING_ENCHANT; - } else if (stack == null || enchantingItemStack == null) { - if (currentState == EnchantState.SWITCHING_DONT_UPDATE || currentState == EnchantState.NO_ITEM) { - currentState = EnchantState.NO_ITEM; - } else { - currentState = EnchantState.SWITCHING_DONT_UPDATE; - } - } else if (stack.getItem() != Items.dye) { - ItemStack sanityCheckStack = cc.getLowerChestInventory().getStackInSlot(12); - if (sanityCheckStack == null || sanityCheckStack.getItem() == Items.enchanted_book) { - currentState = EnchantState.HAS_ITEM; - enchantingItem = enchantingItemStack; - } else { - currentState = EnchantState.SWITCHING_DONT_UPDATE; - } - } else if (stack.getItemDamage() == 1) { - currentState = EnchantState.INVALID_ITEM; - } else { - currentState = EnchantState.NO_ITEM; - } - - if (currentState == EnchantState.HAS_ITEM) { - ItemStack pageUpStack = cc.getLowerChestInventory().getStackInSlot(17); - ItemStack pageDownStack = cc.getLowerChestInventory().getStackInSlot(35); - if (pageUpStack != null && pageDownStack != null) { - currentPage = 0; - boolean upIsGlass = pageUpStack.getItem() == Item.getItemFromBlock(Blocks.stained_glass_pane); - boolean downIsGlass = pageDownStack.getItem() == Item.getItemFromBlock(Blocks.stained_glass_pane); - int page = -1; - - expectedMaxPage = 1; - if (!downIsGlass) { - try { - page = Integer.parseInt(Utils.getRawTooltip(pageDownStack).get(1).substring(11)) - 1; - expectedMaxPage = page + 1; - } catch (Exception ignored) {} - } - if (page == -1 && !upIsGlass) { - try { - page = Integer.parseInt(Utils.getRawTooltip(pageUpStack).get(1).substring(11)) + 1; - expectedMaxPage = page; - } catch (Exception ignored) {} - } - if (page == -1) { - currentPage = 1; - } else { - currentPage = page; - } - } - } - - List toRemove = new ArrayList<>(); - for (ExperienceOrb orb : orbs) { - float targetDeltaX = guiLeft + orbTargetX - orb.x; - float targetDeltaY = guiTop + orbTargetY - orb.y; - - float length = (float) Math.sqrt(targetDeltaX * targetDeltaX + targetDeltaY * targetDeltaY); - - if (length < 8 && orb.xVel * orb.xVel + orb.yVel * orb.yVel < 20) { - toRemove.add(orb); - continue; - } - - orb.xVel += targetDeltaX * 2 / length; - orb.yVel += targetDeltaY * 2 / length; - - orb.xVel *= 0.90; - orb.yVel *= 0.90; - - orb.xLast = orb.x; - orb.yLast = orb.y; - orb.x += orb.xVel; - orb.y += orb.yVel; - } - orbs.removeAll(toRemove); - - if (++tickCounter >= 20) { - tickCounter = 0; - } - - boolean updateItems = tickCounter == 0; - - if (currentState == EnchantState.ADDING_ENCHANT) { - if (arrowAmount.getTarget() != 1) { - arrowAmount.setTarget(1); - arrowAmount.resetTimer(); - } - } else { - if (arrowAmount.getTarget() != 0) { - arrowAmount.setTarget(0); - arrowAmount.resetTimer(); - } - } - - // Set allowedSwitchStates = Sets.newHashSet(EnchantState.ADDING_ENCHANT, EnchantState.HAS_ITEM, EnchantState.SWITCHING_DONT_UPDATE); - if (lastState != currentState || lastPage != currentPage) { - // if (!allowedSwitchStates.contains(lastState) || !allowedSwitchStates.contains(currentState)) { - leftScroll.setValue(0); - rightScroll.setValue(0); - // } - updateItems = true; - } - - if (updateItems && currentState != EnchantState.SWITCHING_DONT_UPDATE) { - enchanterEnchLevels.clear(); - - if (enchantingItem != null) { - playerEnchantIds.clear(); - NBTTagCompound tag = enchantingItem.getTagCompound(); - if (tag != null) { - NBTTagCompound ea = tag.getCompoundTag("ExtraAttributes"); - if (ea != null) { - NBTTagCompound enchantments = ea.getCompoundTag("enchantments"); - if (enchantments != null) { - for (String enchId : enchantments.getKeySet()) { - playerEnchantIds.put(enchId, enchantments.getInteger(enchId)); - } - } - } - } - } - - if (currentState == EnchantState.ADDING_ENCHANT) { - removingEnchantPlayerLevel = -1; - boolean updateLevel = enchanterCurrentEnch == null; - for (int i = 0; i < 27; i++) { - int slotIndex = 9 + i; - ItemStack book = cc.getLowerChestInventory().getStackInSlot(slotIndex); - if (book != null && book.getItem() == Items.enchanted_book) { - NBTTagCompound tagBook = book.getTagCompound(); - if (tagBook != null) { - NBTTagCompound ea = tagBook.getCompoundTag("ExtraAttributes"); - if (ea != null) { - NBTTagCompound enchantments = ea.getCompoundTag("enchantments"); - if (enchantments != null) { - for (String enchId : enchantments.getKeySet()) { - String name = Utils.cleanColour(book.getDisplayName()); - if (name.equalsIgnoreCase("Bane of Arthropods")) { - name = "Bane of Arth."; - } else if (name.equalsIgnoreCase("Projectile Protection")) { - name = "Projectile Prot"; - } else if (name.equalsIgnoreCase("Blast Protection")) { - name = "Blast Prot"; - } - Enchantment enchantment = new Enchantment(slotIndex, name, enchId, - Utils.getRawTooltip(book), enchantments.getInteger(enchId), false, true); - enchantment.displayLore.remove(0); - - if (removingEnchantPlayerLevel == -1 && playerEnchantIds.containsKey(enchId)) { - removingEnchantPlayerLevel = playerEnchantIds.get(enchId); - } - - if (removingEnchantPlayerLevel >= 0 && enchantment.level < removingEnchantPlayerLevel) { - continue; - } - - if (enchanterCurrentEnch == null) { - enchanterCurrentEnch = enchantment; - } else if (updateLevel) { - if (removingEnchantPlayerLevel < 0 && enchantment.level > enchanterCurrentEnch.level) { - enchanterCurrentEnch = enchantment; - } else if (removingEnchantPlayerLevel >= 0 && enchantment.level < enchanterCurrentEnch.level) { - enchanterCurrentEnch = enchantment; - } - } - - enchanterEnchLevels.put(enchantment.level, enchantment); - } - } - } - } - } - } - if (enchanterCurrentEnch != null && removingEnchantPlayerLevel >= 0) { - for (String line : enchanterCurrentEnch.displayLore) { - Matcher matcher = XP_COST_PATTERN.matcher(line); - if (matcher.find()) { - enchanterCurrentEnch.xpCost = Integer.parseInt(matcher.group(1)); - } - } - } - } else { - isChangingEnchLevel = false; - enchanterCurrentEnch = null; - - searchRemovedFromRemovable = false; - searchRemovedFromApplicable = false; - applicable.clear(); - removable.clear(); - if (currentState == EnchantState.HAS_ITEM) { - for (int i = 0; i < 15; i++) { - int slotIndex = 12 + (i % 5) + (i / 5) * 9; - ItemStack book = cc.getLowerChestInventory().getStackInSlot(slotIndex); - if (book != null) { - NBTTagCompound tagBook = book.getTagCompound(); - if (tagBook != null) { - NBTTagCompound ea = tagBook.getCompoundTag("ExtraAttributes"); - if (ea != null) { - NBTTagCompound enchantments = ea.getCompoundTag("enchantments"); - if (enchantments != null) { - for (String enchId : enchantments.getKeySet()) { - String name = Utils.cleanColour(book.getDisplayName()); - - if (searchField.getText().trim().isEmpty() || - name.toLowerCase().contains(searchField.getText().trim().toLowerCase())) { - if (name.equalsIgnoreCase("Bane of Arthropods")) { - name = "Bane of Arth."; - } else if (name.equalsIgnoreCase("Projectile Protection")) { - name = "Projectile Prot"; - } else if (name.equalsIgnoreCase("Blast Protection")) { - name = "Blast Prot"; - } else if (name.equalsIgnoreCase("Luck of the Sea")) { - name = "Luck of Sea"; - } - - if (playerEnchantIds.containsKey(enchId)) { - Enchantment enchantment = new Enchantment(slotIndex, name, enchId, - Utils.getRawTooltip(book), playerEnchantIds.get(enchId), false, false); - if (!enchantment.overMaxLevel) { - removable.add(enchantment); - } - } else { - Enchantment enchantment = new Enchantment(slotIndex, name, enchId, - Utils.getRawTooltip(book), enchantments.getInteger(enchId), true, true); - applicable.add(enchantment); - } - } else { - if (playerEnchantIds.containsKey(enchId)) { - searchRemovedFromRemovable = true; - } else { - searchRemovedFromApplicable = true; - } - } - - } - } - } - } - } - } - NEUConfig cfg = NotEnoughUpdates.INSTANCE.config; - int mult = cfg.enchantingSolvers.enchantOrdering == 0 ? 1 : -1; - Comparator comparator = cfg.enchantingSolvers.enchantSorting == 0 ? - Comparator.comparingInt(e -> mult * e.xpCost) : - (c1, c2) -> mult * c1.enchId.toLowerCase().compareTo(c2.enchId.toLowerCase()); - removable.sort(comparator); - applicable.sort(comparator); - } - } - } - - //Update book model state - if (lastState != currentState) { - while (true) { - this.pageOpenRandom += (float) (this.random.nextInt(4) - this.random.nextInt(4)); - - if (this.pageOpen > this.pageOpenRandom + 1.0F || this.pageOpen < this.pageOpenRandom - 1.0F) { - break; - } - } - } - - this.pageOpenLast = this.pageOpen; - this.bookOpenLast = this.bookOpen; - - if (currentState == EnchantState.HAS_ITEM || currentState == EnchantState.ADDING_ENCHANT) { - this.bookOpen += 0.2F; - } else { - this.bookOpen -= 0.2F; - } - - this.bookOpen = MathHelper.clamp_float(this.bookOpen, 0.0F, 1.0F); - float f1 = (this.pageOpenRandom - this.pageOpen) * 0.4F; - f1 = MathHelper.clamp_float(f1, -0.2F, 0.2F); - this.pageOpenVelocity += (f1 - this.pageOpenVelocity) * 0.9F; - this.pageOpen += this.pageOpenVelocity; - } - - private List createTooltip(String title, int selectedOption, String... options) { - String selPrefix = EnumChatFormatting.DARK_AQUA + " \u25b6 "; - String unselPrefix = EnumChatFormatting.GRAY.toString(); - - for (int i = 0; i < options.length; i++) { - if (i == selectedOption) { - options[i] = selPrefix + options[i]; - } else { - options[i] = unselPrefix + options[i]; - } - } - - List list = Lists.newArrayList(options); - list.add(0, ""); - list.add(0, EnumChatFormatting.GREEN + title); - return list; - } - - public void render(float partialTicks) { - if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return; - - long currentTime = System.currentTimeMillis(); - int playerXpLevel = Minecraft.getMinecraft().thePlayer.experienceLevel; - - GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); - ContainerChest cc = (ContainerChest) chest.inventorySlots; - - leftScroll.tick(); - rightScroll.tick(); - arrowAmount.tick(); - - 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; - - guiLeft = (width - X_SIZE) / 2; - guiTop = (height - Y_SIZE) / 2; - - List tooltipToDisplay = null; - boolean disallowClick = false; - ItemStack stackOnMouse = Minecraft.getMinecraft().thePlayer.inventory.getItemStack(); - int itemHoverX = -1; - int itemHoverY = -1; - boolean hoverLocked = false; - - drawGradientRect(0, 0, width, height, 0xc0101010, 0xd0101010); - - //Base Texture - Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); - GlStateManager.color(1, 1, 1, 1); - Utils.drawTexturedRect(guiLeft, guiTop, X_SIZE, Y_SIZE, - 0, X_SIZE / 512f, 0, Y_SIZE / 512f, GL11.GL_NEAREST); - - Minecraft.getMinecraft().fontRendererObj.drawString("Applicable", guiLeft + 7, guiTop + 7, 0x404040, false); - Minecraft.getMinecraft().fontRendererObj.drawString("Removable", guiLeft + 247, guiTop + 7, 0x404040, false); - - //Page Text - if (currentState == EnchantState.HAS_ITEM || currentState == EnchantState.ADDING_ENCHANT) { - String pageStr = "Page: " + currentPage + "/" + expectedMaxPage; - int pageStrLen = Minecraft.getMinecraft().fontRendererObj.getStringWidth(pageStr); - Utils.drawStringCentered(pageStr, Minecraft.getMinecraft().fontRendererObj, - guiLeft + X_SIZE / 2, guiTop + 14, false, 0x404040); - - //Page Arrows - Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); - GlStateManager.color(1, 1, 1, 1); - Utils.drawTexturedRect(guiLeft + X_SIZE / 2 - pageStrLen / 2 - 2 - 15, guiTop + 6, 15, 15, - 0, 15 / 512f, 372 / 512f, 387 / 512f, GL11.GL_NEAREST); - Utils.drawTexturedRect(guiLeft + X_SIZE / 2 + pageStrLen / 2 + 2, guiTop + 6, 15, 15, - 15 / 512f, 30 / 512f, 372 / 512f, 387 / 512f, GL11.GL_NEAREST); - } - - //Settings Buttons - Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); - GlStateManager.color(1, 1, 1, 1); - //On Settings Button - Utils.drawTexturedRect(guiLeft + 295, guiTop + 147, 16, 16, - 0, 16 / 512f, 387 / 512f, (387 + 16) / 512f, GL11.GL_NEAREST); - //Incompatible Settings Button + private static final GuiCustomEnchant INSTANCE = new GuiCustomEnchant(); + private static final ResourceLocation TEXTURE = new ResourceLocation("notenoughupdates:custom_enchant_gui.png"); + private static final ResourceLocation ENCHANTMENT_TABLE_BOOK_TEXTURE = new ResourceLocation( + "textures/entity/enchanting_table_book.png"); + private static final ModelBook MODEL_BOOK = new ModelBook(); + + private static final int EXPERIENCE_ORB_COUNT = 30; + + private static final Pattern XP_COST_PATTERN = Pattern.compile("\\u00a73(\\d+) Exp Levels"); + + private enum EnchantState { + NO_ITEM, + ADDING_ENCHANT, + SWITCHING_DONT_UPDATE, + INVALID_ITEM, + HAS_ITEM + } + + private class Enchantment { + public int slotIndex; + public String enchantName; + public String enchId; + public List displayLore; + public int level; + public int xpCost = -1; + public boolean overMaxLevel = false; + public boolean conflicts = false; + + public Enchantment( + int slotIndex, String enchantName, String enchId, List displayLore, int level, + boolean useMaxLevelForCost, boolean checkConflicts + ) { + this.slotIndex = slotIndex; + this.enchantName = enchantName; + this.enchId = enchId; + this.displayLore = displayLore; + this.level = level; + + if (Constants.ENCHANTS != null) { + if (checkConflicts && Constants.ENCHANTS.has("enchant_pools")) { + JsonArray pools = Constants.ENCHANTS.getAsJsonArray("enchant_pools"); + out: + for (int i = 0; i < pools.size(); i++) { + JsonArray pool = pools.get(i).getAsJsonArray(); + + boolean hasThis = false; + boolean hasApplied = false; + + for (int j = 0; j < pool.size(); j++) { + String enchIdPoolElement = pool.get(j).getAsString(); + if (enchId.equalsIgnoreCase(enchIdPoolElement)) { + hasThis = true; + } else if (playerEnchantIds.containsKey(enchIdPoolElement)) { + hasApplied = true; + } + if (hasThis && hasApplied) { + this.conflicts = true; + break out; + } + } + } + } + + if (level >= 1 && Constants.ENCHANTS.has("enchants_xp_cost")) { + JsonObject allCosts = Constants.ENCHANTS.getAsJsonObject("enchants_xp_cost"); + if (allCosts.has(enchId)) { + JsonArray costs = allCosts.getAsJsonArray(enchId); + + if (costs.size() >= 1) { + if (useMaxLevelForCost) { + this.xpCost = costs.get(costs.size() - 1).getAsInt(); + } else if (level - 1 < costs.size()) { + this.xpCost = costs.get(level - 1).getAsInt(); + } else { + overMaxLevel = true; + } + } + } + + } + } + } + } + + public static class ExperienceOrb { + public float x; + public float y; + public float xLast; + public float yLast; + public float xVel; + public float yVel; + + public int type; + public int rotationDeg; + } + + private final List orbs = new ArrayList<>(); + private int orbTargetX = 0; + private int orbTargetY = 0; + + private int guiLeft; + private int guiTop; + private boolean shouldOverrideFast = false; + + public float pageOpen; + public float pageOpenLast; + public float pageOpenRandom; + public float pageOpenVelocity; + public float bookOpen; + public float bookOpenLast; + + private int currentPage; + private int expectedMaxPage; + + private boolean isScrollingLeft = true; + + private ItemStack enchantingItem = null; + + private int removingEnchantPlayerLevel = -1; + + private final GuiElementTextField searchField = new GuiElementTextField("", GuiElementTextField.SCISSOR_TEXT); + + private final HashMap playerEnchantIds = new HashMap<>(); + + private boolean searchRemovedFromApplicable = false; + private boolean searchRemovedFromRemovable = false; + private final List applicable = new ArrayList<>(); + private final List removable = new ArrayList<>(); + + private final HashMap enchanterEnchLevels = new HashMap<>(); + private Enchantment enchanterCurrentEnch = null; + + public Random random = new Random(); + + private EnchantState currentState = EnchantState.NO_ITEM; + private EnchantState lastState = EnchantState.NO_ITEM; + + private final LerpingInteger leftScroll = new LerpingInteger(0, 150); + private final LerpingInteger rightScroll = new LerpingInteger(0, 150); + + private final LerpingFloat arrowAmount = new LerpingFloat(0, 100); + + private static final int X_SIZE = 364; + private static final int Y_SIZE = 215; + + private int clickedScrollOffset = -1; + private boolean isClickedScrollLeft = true; + + private boolean isChangingEnchLevel = false; + + private long cancelButtonAnimTime = 0; + private long confirmButtonAnimTime = 0; + + public static GuiCustomEnchant getInstance() { + return INSTANCE; + } + + public boolean shouldOverride(String containerName) { + shouldOverrideFast = NotEnoughUpdates.INSTANCE.config.enchantingSolvers.enableTableGUI && + Objects.equals("Enchant Item", containerName) && + NotEnoughUpdates.INSTANCE.hasSkyblockScoreboard(); + if (!shouldOverrideFast) { + currentState = EnchantState.NO_ITEM; + applicable.clear(); + removable.clear(); + expectedMaxPage = 1; + } + return shouldOverrideFast; + } + + private int tickCounter = 0; + + public void tick() { + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + ContainerChest cc = (ContainerChest) chest.inventorySlots; + + ItemStack stack = cc.getLowerChestInventory().getStackInSlot(23); + ItemStack enchantGuideStack = cc.getLowerChestInventory().getStackInSlot(50); + ItemStack enchantingItemStack = cc.getLowerChestInventory().getStackInSlot(19); + + int lastPage = currentPage; + + this.lastState = currentState; + if (enchantGuideStack != null && enchantGuideStack.getItem() != Items.book && enchantingItem != null) { + currentState = EnchantState.ADDING_ENCHANT; + } else if (stack == null || enchantingItemStack == null) { + if (currentState == EnchantState.SWITCHING_DONT_UPDATE || currentState == EnchantState.NO_ITEM) { + currentState = EnchantState.NO_ITEM; + } else { + currentState = EnchantState.SWITCHING_DONT_UPDATE; + } + } else if (stack.getItem() != Items.dye) { + ItemStack sanityCheckStack = cc.getLowerChestInventory().getStackInSlot(12); + if (sanityCheckStack == null || sanityCheckStack.getItem() == Items.enchanted_book) { + currentState = EnchantState.HAS_ITEM; + enchantingItem = enchantingItemStack; + } else { + currentState = EnchantState.SWITCHING_DONT_UPDATE; + } + } else if (stack.getItemDamage() == 1) { + currentState = EnchantState.INVALID_ITEM; + } else { + currentState = EnchantState.NO_ITEM; + } + + if (currentState == EnchantState.HAS_ITEM) { + ItemStack pageUpStack = cc.getLowerChestInventory().getStackInSlot(17); + ItemStack pageDownStack = cc.getLowerChestInventory().getStackInSlot(35); + if (pageUpStack != null && pageDownStack != null) { + currentPage = 0; + boolean upIsGlass = pageUpStack.getItem() == Item.getItemFromBlock(Blocks.stained_glass_pane); + boolean downIsGlass = pageDownStack.getItem() == Item.getItemFromBlock(Blocks.stained_glass_pane); + int page = -1; + + expectedMaxPage = 1; + if (!downIsGlass) { + try { + page = Integer.parseInt(Utils.getRawTooltip(pageDownStack).get(1).substring(11)) - 1; + expectedMaxPage = page + 1; + } catch (Exception ignored) { + } + } + if (page == -1 && !upIsGlass) { + try { + page = Integer.parseInt(Utils.getRawTooltip(pageUpStack).get(1).substring(11)) + 1; + expectedMaxPage = page; + } catch (Exception ignored) { + } + } + if (page == -1) { + currentPage = 1; + } else { + currentPage = page; + } + } + } + + List toRemove = new ArrayList<>(); + for (ExperienceOrb orb : orbs) { + float targetDeltaX = guiLeft + orbTargetX - orb.x; + float targetDeltaY = guiTop + orbTargetY - orb.y; + + float length = (float) Math.sqrt(targetDeltaX * targetDeltaX + targetDeltaY * targetDeltaY); + + if (length < 8 && orb.xVel * orb.xVel + orb.yVel * orb.yVel < 20) { + toRemove.add(orb); + continue; + } + + orb.xVel += targetDeltaX * 2 / length; + orb.yVel += targetDeltaY * 2 / length; + + orb.xVel *= 0.90; + orb.yVel *= 0.90; + + orb.xLast = orb.x; + orb.yLast = orb.y; + orb.x += orb.xVel; + orb.y += orb.yVel; + } + orbs.removeAll(toRemove); + + if (++tickCounter >= 20) { + tickCounter = 0; + } + + boolean updateItems = tickCounter == 0; + + if (currentState == EnchantState.ADDING_ENCHANT) { + if (arrowAmount.getTarget() != 1) { + arrowAmount.setTarget(1); + arrowAmount.resetTimer(); + } + } else { + if (arrowAmount.getTarget() != 0) { + arrowAmount.setTarget(0); + arrowAmount.resetTimer(); + } + } + + // Set allowedSwitchStates = Sets.newHashSet(EnchantState.ADDING_ENCHANT, EnchantState.HAS_ITEM, EnchantState.SWITCHING_DONT_UPDATE); + if (lastState != currentState || lastPage != currentPage) { + // if (!allowedSwitchStates.contains(lastState) || !allowedSwitchStates.contains(currentState)) { + leftScroll.setValue(0); + rightScroll.setValue(0); + // } + updateItems = true; + } + + if (updateItems && currentState != EnchantState.SWITCHING_DONT_UPDATE) { + enchanterEnchLevels.clear(); + + if (enchantingItem != null) { + playerEnchantIds.clear(); + NBTTagCompound tag = enchantingItem.getTagCompound(); + if (tag != null) { + NBTTagCompound ea = tag.getCompoundTag("ExtraAttributes"); + if (ea != null) { + NBTTagCompound enchantments = ea.getCompoundTag("enchantments"); + if (enchantments != null) { + for (String enchId : enchantments.getKeySet()) { + playerEnchantIds.put(enchId, enchantments.getInteger(enchId)); + } + } + } + } + } + + if (currentState == EnchantState.ADDING_ENCHANT) { + removingEnchantPlayerLevel = -1; + boolean updateLevel = enchanterCurrentEnch == null; + for (int i = 0; i < 27; i++) { + int slotIndex = 9 + i; + ItemStack book = cc.getLowerChestInventory().getStackInSlot(slotIndex); + if (book != null && book.getItem() == Items.enchanted_book) { + NBTTagCompound tagBook = book.getTagCompound(); + if (tagBook != null) { + NBTTagCompound ea = tagBook.getCompoundTag("ExtraAttributes"); + if (ea != null) { + NBTTagCompound enchantments = ea.getCompoundTag("enchantments"); + if (enchantments != null) { + for (String enchId : enchantments.getKeySet()) { + String name = Utils.cleanColour(book.getDisplayName()); + if (name.equalsIgnoreCase("Bane of Arthropods")) { + name = "Bane of Arth."; + } else if (name.equalsIgnoreCase("Projectile Protection")) { + name = "Projectile Prot"; + } else if (name.equalsIgnoreCase("Blast Protection")) { + name = "Blast Prot"; + } + Enchantment enchantment = new Enchantment(slotIndex, name, enchId, + Utils.getRawTooltip(book), enchantments.getInteger(enchId), false, true + ); + enchantment.displayLore.remove(0); + + if (removingEnchantPlayerLevel == -1 && playerEnchantIds.containsKey(enchId)) { + removingEnchantPlayerLevel = playerEnchantIds.get(enchId); + } + + if (removingEnchantPlayerLevel >= 0 && enchantment.level < removingEnchantPlayerLevel) { + continue; + } + + if (enchanterCurrentEnch == null) { + enchanterCurrentEnch = enchantment; + } else if (updateLevel) { + if (removingEnchantPlayerLevel < 0 && enchantment.level > enchanterCurrentEnch.level) { + enchanterCurrentEnch = enchantment; + } else if (removingEnchantPlayerLevel >= 0 && enchantment.level < enchanterCurrentEnch.level) { + enchanterCurrentEnch = enchantment; + } + } + + enchanterEnchLevels.put(enchantment.level, enchantment); + } + } + } + } + } + } + if (enchanterCurrentEnch != null && removingEnchantPlayerLevel >= 0) { + for (String line : enchanterCurrentEnch.displayLore) { + Matcher matcher = XP_COST_PATTERN.matcher(line); + if (matcher.find()) { + enchanterCurrentEnch.xpCost = Integer.parseInt(matcher.group(1)); + } + } + } + } else { + isChangingEnchLevel = false; + enchanterCurrentEnch = null; + + searchRemovedFromRemovable = false; + searchRemovedFromApplicable = false; + applicable.clear(); + removable.clear(); + if (currentState == EnchantState.HAS_ITEM) { + for (int i = 0; i < 15; i++) { + int slotIndex = 12 + (i % 5) + (i / 5) * 9; + ItemStack book = cc.getLowerChestInventory().getStackInSlot(slotIndex); + if (book != null) { + NBTTagCompound tagBook = book.getTagCompound(); + if (tagBook != null) { + NBTTagCompound ea = tagBook.getCompoundTag("ExtraAttributes"); + if (ea != null) { + NBTTagCompound enchantments = ea.getCompoundTag("enchantments"); + if (enchantments != null) { + for (String enchId : enchantments.getKeySet()) { + String name = Utils.cleanColour(book.getDisplayName()); + + if (searchField.getText().trim().isEmpty() || + name.toLowerCase().contains(searchField.getText().trim().toLowerCase())) { + if (name.equalsIgnoreCase("Bane of Arthropods")) { + name = "Bane of Arth."; + } else if (name.equalsIgnoreCase("Projectile Protection")) { + name = "Projectile Prot"; + } else if (name.equalsIgnoreCase("Blast Protection")) { + name = "Blast Prot"; + } else if (name.equalsIgnoreCase("Luck of the Sea")) { + name = "Luck of Sea"; + } + + if (playerEnchantIds.containsKey(enchId)) { + Enchantment enchantment = new Enchantment(slotIndex, name, enchId, + Utils.getRawTooltip(book), playerEnchantIds.get(enchId), false, false + ); + if (!enchantment.overMaxLevel) { + removable.add(enchantment); + } + } else { + Enchantment enchantment = new Enchantment(slotIndex, name, enchId, + Utils.getRawTooltip(book), enchantments.getInteger(enchId), true, true + ); + applicable.add(enchantment); + } + } else { + if (playerEnchantIds.containsKey(enchId)) { + searchRemovedFromRemovable = true; + } else { + searchRemovedFromApplicable = true; + } + } + + } + } + } + } + } + } + NEUConfig cfg = NotEnoughUpdates.INSTANCE.config; + int mult = cfg.enchantingSolvers.enchantOrdering == 0 ? 1 : -1; + Comparator comparator = cfg.enchantingSolvers.enchantSorting == 0 ? + Comparator.comparingInt(e -> mult * e.xpCost) : + (c1, c2) -> mult * + c1.enchId.toLowerCase().compareTo(c2.enchId.toLowerCase()); + removable.sort(comparator); + applicable.sort(comparator); + } + } + } + + //Update book model state + if (lastState != currentState) { + while (true) { + this.pageOpenRandom += (float) (this.random.nextInt(4) - this.random.nextInt(4)); + + if (this.pageOpen > this.pageOpenRandom + 1.0F || this.pageOpen < this.pageOpenRandom - 1.0F) { + break; + } + } + } + + this.pageOpenLast = this.pageOpen; + this.bookOpenLast = this.bookOpen; + + if (currentState == EnchantState.HAS_ITEM || currentState == EnchantState.ADDING_ENCHANT) { + this.bookOpen += 0.2F; + } else { + this.bookOpen -= 0.2F; + } + + this.bookOpen = MathHelper.clamp_float(this.bookOpen, 0.0F, 1.0F); + float f1 = (this.pageOpenRandom - this.pageOpen) * 0.4F; + f1 = MathHelper.clamp_float(f1, -0.2F, 0.2F); + this.pageOpenVelocity += (f1 - this.pageOpenVelocity) * 0.9F; + this.pageOpen += this.pageOpenVelocity; + } + + private List createTooltip(String title, int selectedOption, String... options) { + String selPrefix = EnumChatFormatting.DARK_AQUA + " \u25b6 "; + String unselPrefix = EnumChatFormatting.GRAY.toString(); + + for (int i = 0; i < options.length; i++) { + if (i == selectedOption) { + options[i] = selPrefix + options[i]; + } else { + options[i] = unselPrefix + options[i]; + } + } + + List list = Lists.newArrayList(options); + list.add(0, ""); + list.add(0, EnumChatFormatting.GREEN + title); + return list; + } + + public void render(float partialTicks) { + if (!(Minecraft.getMinecraft().currentScreen instanceof GuiContainer)) return; + + long currentTime = System.currentTimeMillis(); + int playerXpLevel = Minecraft.getMinecraft().thePlayer.experienceLevel; + + GuiContainer chest = ((GuiContainer) Minecraft.getMinecraft().currentScreen); + ContainerChest cc = (ContainerChest) chest.inventorySlots; + + leftScroll.tick(); + rightScroll.tick(); + arrowAmount.tick(); + + 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; + + guiLeft = (width - X_SIZE) / 2; + guiTop = (height - Y_SIZE) / 2; + + List tooltipToDisplay = null; + boolean disallowClick = false; + ItemStack stackOnMouse = Minecraft.getMinecraft().thePlayer.inventory.getItemStack(); + int itemHoverX = -1; + int itemHoverY = -1; + boolean hoverLocked = false; + + drawGradientRect(0, 0, width, height, 0xc0101010, 0xd0101010); + + //Base Texture + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft, guiTop, X_SIZE, Y_SIZE, + 0, X_SIZE / 512f, 0, Y_SIZE / 512f, GL11.GL_NEAREST + ); + + Minecraft.getMinecraft().fontRendererObj.drawString("Applicable", guiLeft + 7, guiTop + 7, 0x404040, false); + Minecraft.getMinecraft().fontRendererObj.drawString("Removable", guiLeft + 247, guiTop + 7, 0x404040, false); + + //Page Text + if (currentState == EnchantState.HAS_ITEM || currentState == EnchantState.ADDING_ENCHANT) { + String pageStr = "Page: " + currentPage + "/" + expectedMaxPage; + int pageStrLen = Minecraft.getMinecraft().fontRendererObj.getStringWidth(pageStr); + Utils.drawStringCentered(pageStr, Minecraft.getMinecraft().fontRendererObj, + guiLeft + X_SIZE / 2, guiTop + 14, false, 0x404040 + ); + + //Page Arrows + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 - pageStrLen / 2 - 2 - 15, guiTop + 6, 15, 15, + 0, 15 / 512f, 372 / 512f, 387 / 512f, GL11.GL_NEAREST + ); + Utils.drawTexturedRect(guiLeft + X_SIZE / 2 + pageStrLen / 2 + 2, guiTop + 6, 15, 15, + 15 / 512f, 30 / 512f, 372 / 512f, 387 / 512f, GL11.GL_NEAREST + ); + } + + //Settings Buttons + Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); + GlStateManager.color(1, 1, 1, 1); + //On Settings Button + Utils.drawTexturedRect(guiLeft + 295, guiTop + 147, 16, 16, + 0, 16 / 512f, 387 / 512f, (387 + 16) / 512f, GL11.GL_NEAREST + ); + //Incompatible Settings Button /*float incompatibleMinU = NotEnoughUpdates.INSTANCE.config.enchantingSolvers.incompatibleEnchants * 16 / 512f; Utils.drawTexturedRect(guiLeft + 295 + 18, guiTop + 147, 16, 16, incompatibleMinU, incompatibleMinU + 16 / 512f, 403 / 512f, (403 + 16) / 512f, GL11.GL_NEAREST);*/ - //Sorting Settings Button - float sortingMinU = NotEnoughUpdates.INSTANCE.config.enchantingSolvers.enchantSorting * 16 / 512f; - Utils.drawTexturedRect(guiLeft + 295, guiTop + 147 + 18, 16, 16, - sortingMinU, sortingMinU + 16 / 512f, 419 / 512f, (419 + 16) / 512f, GL11.GL_NEAREST); - //Ordering Settings Button - float orderingMinU = NotEnoughUpdates.INSTANCE.config.enchantingSolvers.enchantOrdering * 16 / 512f; - Utils.drawTexturedRect(guiLeft + 295 + 18, guiTop + 147 + 18, 16, 16, - orderingMinU, orderingMinU + 16 / 512f, 435 / 512f, (435 + 16) / 512f, GL11.GL_NEAREST); - - if (mouseX >= guiLeft + 294 && mouseX < guiLeft + 294 + 36 && - mouseY >= guiTop + 146 && mouseY < guiTop + 146 + 36) { - int index = (mouseX - (guiLeft + 295)) / 18 + (mouseY - (guiTop + 147)) / 18 * 2; - switch (index) { - case 0: - Gui.drawRect(guiLeft + 295, guiTop + 147, guiLeft + 295 + 16, guiTop + 147 + 16, 0x80ffffff); - tooltipToDisplay = createTooltip("Enable GUI", 0, "On", "Off"); - break; + //Sorting Settings Button + float sortingMinU = NotEnoughUpdates.INSTANCE.config.enchantingSolvers.enchantSorting * 16 / 512f; + Utils.drawTexturedRect(guiLeft + 295, guiTop + 147 + 18, 16, 16, + sortingMinU, sortingMinU + 16 / 512f, 419 / 512f, (419 + 16) / 512f, GL11.GL_NEAREST + ); + //Ordering Settings Button + float orderingMinU = NotEnoughUpdates.INSTANCE.config.enchantingSolvers.enchantOrdering * 16 / 512f; + Utils.drawTexturedRect(guiLeft + 295 + 18, guiTop + 147 + 18, 16, 16, + orderingMinU, orderingMinU + 16 / 512f, 435 / 512f, (435 + 16) / 512f, GL11.GL_NEAREST + ); + + if (mouseX >= guiLeft + 294 && mouseX < guiLeft + 294 + 36 && + mouseY >= guiTop + 146 && mouseY < guiTop + 146 + 36) { + int index = (mouseX - (guiLeft + 295)) / 18 + (mouseY - (guiTop + 147)) / 18 * 2; + switch (index) { + case 0: + Gui.drawRect(guiLeft + 295, guiTop + 147, guiLeft + 295 + 16, guiTop + 147 + 16, 0x80ffffff); + tooltipToDisplay = createTooltip("Enable GUI", 0, "On", "Off"); + break; /*case 1: Gui.drawRect(guiLeft + 295 + 18, guiTop + 147, guiLeft + 295 + 16 + 18, guiTop + 147 + 16, 0x80ffffff); tooltipToDisplay = createTooltip("Incompatible Enchants", @@ -612,826 +628,1057 @@ public class GuiCustomEnchant extends Gui { tooltipToDisplay.add(2, EnumChatFormatting.GRAY + "incompatible with your current item,"); tooltipToDisplay.add(3, EnumChatFormatting.GRAY + "eg. Smite on a sword with Sharpness"); break;*/ - case 2: - Gui.drawRect(guiLeft + 295, guiTop + 147 + 18, guiLeft + 295 + 16, guiTop + 147 + 16 + 18, 0x80ffffff); - tooltipToDisplay = createTooltip("Sort enchants...", - NotEnoughUpdates.INSTANCE.config.enchantingSolvers.enchantSorting, - "By Cost", "Alphabetically"); - break; - case 3: - Gui.drawRect(guiLeft + 295 + 18, guiTop + 147 + 18, guiLeft + 295 + 16 + 18, guiTop + 147 + 16 + 18, 0x80ffffff); - tooltipToDisplay = createTooltip("Order enchants...", - NotEnoughUpdates.INSTANCE.config.enchantingSolvers.enchantOrdering, - "Ascending", "Descending"); - break; - } - } - - //Left scroll bar - { - int offset; - if (applicable.size() <= 6) { - offset = 0; - } else if (isScrollingLeft && clickedScrollOffset >= 0) { - offset = mouseY - clickedScrollOffset; - if (offset < 0) offset = 0; - if (offset > 96 - 15) offset = 96 - 15; - } else { - offset = Math.round((96 - 15) * (leftScroll.getValue() / (float) ((applicable.size() - 6) * 16))); - } - Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); - GlStateManager.color(1, 1, 1, 1); - Utils.drawTexturedRect(guiLeft + 104, guiTop + 18 + offset, 12, 15, - 0, 12 / 512f, 313 / 512f, (313 + 15) / 512f, GL11.GL_NEAREST); - } - //Right scroll bar - { - int offset; - if (removable.size() <= 6) { - offset = 0; - } else if (!isScrollingLeft && clickedScrollOffset >= 0) { - offset = mouseY - clickedScrollOffset; - if (offset < 0) offset = 0; - if (offset > 96 - 15) offset = 96 - 15; - } else { - offset = Math.round((96 - 15) * (rightScroll.getValue() / (float) ((removable.size() - 6) * 16))); - } - Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); - GlStateManager.color(1, 1, 1, 1); - Utils.drawTexturedRect(guiLeft + 344, guiTop + 18 + offset, 12, 15, - 0, 12 / 512f, 313 / 512f, (313 + 15) / 512f, GL11.GL_NEAREST); - } - - //Enchant book model - renderEnchantBook(scaledResolution, partialTicks); - - //Can't be enchanted text - if (currentState == EnchantState.INVALID_ITEM) { - GlStateManager.disableDepth(); - Utils.drawStringCentered("This item can't", Minecraft.getMinecraft().fontRendererObj, - guiLeft + X_SIZE / 2, guiTop + 88, true, 0xffff5555); - Utils.drawStringCentered("be enchanted", Minecraft.getMinecraft().fontRendererObj, - guiLeft + X_SIZE / 2, guiTop + 98, true, 0xffff5555); - GlStateManager.enableDepth(); - } - - //Enchant arrow - if (arrowAmount.getValue() > 0) { - Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); - GlStateManager.color(1, 1, 1, 1); - float w = 22 * arrowAmount.getValue(); - if (removingEnchantPlayerLevel < 0) { - Utils.drawTexturedRect(guiLeft + 134, guiTop + 58, w, 16, - 0, w / 512f, 297 / 512f, (297 + 16) / 512f, GL11.GL_NEAREST); - } else { - Utils.drawTexturedRect(guiLeft + 230 - w, guiTop + 58, w, 16, - (44 - w) / 512f, 44 / 512f, 297 / 512f, (297 + 16) / 512f, GL11.GL_NEAREST); - } - } - - //Text if no enchants appear - if (currentState == EnchantState.HAS_ITEM || currentState == EnchantState.ADDING_ENCHANT) { - if (applicable.isEmpty() && removable.isEmpty() && searchRemovedFromApplicable) { - Utils.drawStringCentered("Can't find that", Minecraft.getMinecraft().fontRendererObj, - guiLeft + 8 + 48, guiTop + 28, true, 0xffff5555); - Utils.drawStringCentered("enchant, perhaps", Minecraft.getMinecraft().fontRendererObj, - guiLeft + 8 + 48, guiTop + 38, true, 0xffff5555); - Utils.drawStringCentered("it is on", Minecraft.getMinecraft().fontRendererObj, - guiLeft + 8 + 48, guiTop + 48, true, 0xffff5555); - Utils.drawStringCentered("another page?", Minecraft.getMinecraft().fontRendererObj, - guiLeft + 8 + 48, guiTop + 58, true, 0xffff5555); - } else if (applicable.isEmpty() && !searchRemovedFromApplicable) { - Utils.drawStringCentered("No applicable", Minecraft.getMinecraft().fontRendererObj, - guiLeft + 8 + 48, guiTop + 28, true, 0xffff5555); - Utils.drawStringCentered("enchants on", Minecraft.getMinecraft().fontRendererObj, - guiLeft + 8 + 48, guiTop + 38, true, 0xffff5555); - Utils.drawStringCentered("this page...", Minecraft.getMinecraft().fontRendererObj, - guiLeft + 8 + 48, guiTop + 48, true, 0xffff5555); - } - if (applicable.isEmpty() && removable.isEmpty() && searchRemovedFromRemovable) { - Utils.drawStringCentered("Can't find that", Minecraft.getMinecraft().fontRendererObj, - guiLeft + 248 + 48, guiTop + 28, true, 0xffff5555); - Utils.drawStringCentered("enchant, perhaps", Minecraft.getMinecraft().fontRendererObj, - guiLeft + 248 + 48, guiTop + 38, true, 0xffff5555); - Utils.drawStringCentered("it is on", Minecraft.getMinecraft().fontRendererObj, - guiLeft + 248 + 48, guiTop + 48, true, 0xffff5555); - Utils.drawStringCentered("another page?", Minecraft.getMinecraft().fontRendererObj, - guiLeft + 248 + 48, guiTop + 58, true, 0xffff5555); - } else if (removable.isEmpty() && !searchRemovedFromRemovable) { - Utils.drawStringCentered("No removable", Minecraft.getMinecraft().fontRendererObj, - guiLeft + 248 + 48, guiTop + 28, true, 0xffff5555); - Utils.drawStringCentered("enchants on", Minecraft.getMinecraft().fontRendererObj, - guiLeft + 248 + 48, guiTop + 38, true, 0xffff5555); - Utils.drawStringCentered("this page...", Minecraft.getMinecraft().fontRendererObj, - guiLeft + 248 + 48, guiTop + 48, true, 0xffff5555); - } - } - //Available enchants (left) - GlScissorStack.push(0, guiTop + 18, width, guiTop + 18 + 96, scaledResolution); - for (int i = 0; i < 7; i++) { - int index = i + leftScroll.getValue() / 16; - - if (applicable.size() <= index) break; - Enchantment ench = applicable.get(index); - - int top = guiTop - (leftScroll.getValue() % 16) + 18 + 16 * i; - int vOffset = enchanterCurrentEnch != null && enchanterCurrentEnch.enchId.equals(ench.enchId) ? 16 : 0; - int uOffset = ench.conflicts ? 112 : 0; - int textOffset = vOffset / 16; - - Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); - GlStateManager.color(1, 1, 1, 1); - Utils.drawTexturedRect(guiLeft + 8, top, 96, 16, - uOffset / 512f, (96 + uOffset) / 512f, (249 + vOffset) / 512f, (249 + 16 + vOffset) / 512f, GL11.GL_NEAREST); - - if (mouseX > guiLeft + 8 && mouseX <= guiLeft + 8 + 96 && - mouseY > top && mouseY <= top + 16) { - disallowClick = true; - if (ench.displayLore != null) { - tooltipToDisplay = ench.displayLore; - } - } - - String levelStr = "" + ench.xpCost; - int colour = 0xc8ff8f; - if (ench.xpCost > playerXpLevel) { - colour = 0xff5555; - } - - int levelWidth = Minecraft.getMinecraft().fontRendererObj.getStringWidth(levelStr); - Minecraft.getMinecraft().fontRendererObj.drawString(levelStr, guiLeft + 16 - levelWidth / 2 - 1, top + 4, 0x2d2102, false); - Minecraft.getMinecraft().fontRendererObj.drawString(levelStr, guiLeft + 16 - levelWidth / 2 + 1, top + 4, 0x2d2102, false); - Minecraft.getMinecraft().fontRendererObj.drawString(levelStr, guiLeft + 16 - levelWidth / 2, top + 4 - 1, 0x2d2102, false); - Minecraft.getMinecraft().fontRendererObj.drawString(levelStr, guiLeft + 16 - levelWidth / 2, top + 4 + 1, 0x2d2102, false); - Minecraft.getMinecraft().fontRendererObj.drawString(levelStr, guiLeft + 16 - levelWidth / 2, top + 4, colour, false); - - Minecraft.getMinecraft().fontRendererObj.drawString(ench.enchantName, guiLeft + 8 + 16 + 2 + textOffset, top + 4 + textOffset, 0xffffffdd, true); - } - GlScissorStack.pop(scaledResolution); - - //Removable enchants (right) - GlScissorStack.push(0, guiTop + 18, width, guiTop + 18 + 96, scaledResolution); - for (int i = 0; i < 7; i++) { - int index = i + rightScroll.getValue() / 16; - - if (removable.size() <= index) break; - Enchantment ench = removable.get(index); - - int top = guiTop - (rightScroll.getValue() % 16) + 18 + 16 * i; - int vOffset = enchanterCurrentEnch != null && enchanterCurrentEnch.enchId.equals(ench.enchId) ? 16 : 0; - int textOffset = vOffset / 16; - - Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); - GlStateManager.color(1, 1, 1, 1); - Utils.drawTexturedRect(guiLeft + 248, top, 96, 16, - 0, 96 / 512f, (249 + vOffset) / 512f, (249 + 16 + vOffset) / 512f, GL11.GL_NEAREST); - - if (mouseX > guiLeft + 248 && mouseX <= guiLeft + 248 + 96 && - mouseY > top && mouseY <= top + 16) { - disallowClick = true; - if (ench.displayLore != null) { - tooltipToDisplay = ench.displayLore; - } - } - - String levelStr = "" + ench.xpCost; - if (ench.xpCost < 0) levelStr = "?"; - int colour = 0xc8ff8f; - if (ench.xpCost > playerXpLevel) { - colour = 0xff5555; - } - - int levelWidth = Minecraft.getMinecraft().fontRendererObj.getStringWidth(levelStr); - Minecraft.getMinecraft().fontRendererObj.drawString(levelStr, guiLeft + 256 - levelWidth / 2 - 1, top + 4, 0x2d2102, false); - Minecraft.getMinecraft().fontRendererObj.drawString(levelStr, guiLeft + 256 - levelWidth / 2 + 1, top + 4, 0x2d2102, false); - Minecraft.getMinecraft().fontRendererObj.drawString(levelStr, guiLeft + 256 - levelWidth / 2, top + 4 - 1, 0x2d2102, false); - Minecraft.getMinecraft().fontRendererObj.drawString(levelStr, guiLeft + 256 - levelWidth / 2, top + 4 + 1, 0x2d2102, false); - Minecraft.getMinecraft().fontRendererObj.drawString(levelStr, guiLeft + 256 - levelWidth / 2, top + 4, colour, false); - - Minecraft.getMinecraft().fontRendererObj.drawString(ench.enchantName, - guiLeft + 248 + 16 + 2 + textOffset, top + 4 + textOffset, 0xffffffdd, true); - } - GlScissorStack.pop(scaledResolution); - - //Player Inventory Items - Minecraft.getMinecraft().fontRendererObj.drawString(Minecraft.getMinecraft().thePlayer.inventory.getDisplayName().getUnformattedText(), - guiLeft + 102, guiTop + Y_SIZE - 96 + 2, 0x404040); - int inventoryStartIndex = cc.getLowerChestInventory().getSizeInventory(); - GlStateManager.enableDepth(); - for (int i = 0; i < 36; i++) { - int itemX = guiLeft + 102 + 18 * (i % 9); - int itemY = guiTop + 133 + 18 * (i / 9); - - if (i >= 27) { - itemY += 4; - } - - GlStateManager.pushMatrix(); - GlStateManager.translate(guiLeft + 102 - 8, guiTop + 191 - (inventoryStartIndex / 9 * 18 + 89), 0); - Slot slot = cc.getSlot(inventoryStartIndex + i); - chest.drawSlot(slot); - GlStateManager.popMatrix(); - - if (mouseX >= itemX && mouseX < itemX + 18 && - mouseY >= itemY && mouseY < itemY + 18) { - itemHoverX = itemX; - itemHoverY = itemY; - hoverLocked = SlotLocking.getInstance().isSlotLocked(slot); - - if (slot.getHasStack()) { - tooltipToDisplay = slot.getStack().getTooltip(Minecraft.getMinecraft().thePlayer, - Minecraft.getMinecraft().gameSettings.advancedItemTooltips); - } - } - } - - //Search bar - if (currentState == EnchantState.HAS_ITEM) { - if (searchField.getText().isEmpty() && !searchField.getFocus()) { - searchField.setSize(90, 14); - searchField.setPrependText("\u00a77Search..."); - } else { - if (searchField.getFocus()) { - int len = Minecraft.getMinecraft().fontRendererObj.getStringWidth(searchField.getTextDisplay()) + 10; - searchField.setSize(Math.max(90, len), 14); - } else { - searchField.setSize(90, 14); - } - searchField.setPrependText(""); - } - searchField.render(guiLeft + X_SIZE / 2 - searchField.getWidth() / 2, guiTop + 83); - } else if (currentState == EnchantState.ADDING_ENCHANT && - enchanterCurrentEnch != null && !enchanterEnchLevels.isEmpty()) { - int left = guiLeft + X_SIZE / 2 - 56; - int top = guiTop + 83; - - int uOffset = enchanterCurrentEnch.conflicts ? 112 : 0; - - Minecraft.getMinecraft().getTextureManager().bindTexture(TEXTURE); - GlStateManager.color(1, 1, 1, 1); - Utils.drawTexturedRect(left, top, 112, 16, - uOffset / 512f, (112 + uOffset) / 512f, 249 / 512f, (249 + 16) / 512f, GL11.GL_NEAREST); - - if (mouseX > left + 16 && mouseX <= left + 96 && - mouseY > top && mouseY <= top + 16) { - disallowClick = true; - if (enchanterCurrentEnch.displayLore != null) { - tooltipToDisplay = enchanterCurrentEnch.displayLore; - } - } - - //Enchant cost - String levelStr = "" + enchanterCurrentEnch.xpCost; - if (enchanterCurrentEnch.xpCost < 0) levelStr = "?"; - - int colour = 0xc8ff8f; - if (enchanterCurrentEnch.xpCost > playerXpLevel) { - colour = 0xff5555; - } - - int levelWidth = Minecraft.getMinecraft().fontRendererObj.getStringWidth(levelStr); - Minecraft.getMinecraft().fontRendererObj.drawString(levelStr, left + 8 - levelWidth / 2 - 1, top + 4, 0x2d2102, false); - Minecraft.getMinecraft().fontRendererObj.drawString(levelStr, left + 8 - levelWidth / 2 + 1, top + 4, 0x2d2102, false); - Minecraft.getMinecraft().fontRendererObj.drawString(levelStr, left + 8 - levelWidth / 2, top + 4 - 1, 0x2d2102, false); - Minecraft.getMinecraft().fontRendererObj.drawString(levelStr, left + 8 - levelWidth / 2, top + 4 + 1, 0x2d2102, false); - Minecraft.getMinecraft().fontRendererObj.drawString(levelStr, left + 8 - levelWidth / 2, top + 4, colour, false); - - //Enchant name - String name = WordUtils.capitalizeF