diff options
Diffstat (limited to 'src/main')
5 files changed, 221 insertions, 36 deletions
diff --git a/src/main/java/de/cowtipper/cowlection/config/MooConfig.java b/src/main/java/de/cowtipper/cowlection/config/MooConfig.java index 533a767..a19218e 100644 --- a/src/main/java/de/cowtipper/cowlection/config/MooConfig.java +++ b/src/main/java/de/cowtipper/cowlection/config/MooConfig.java @@ -77,6 +77,8 @@ public class MooConfig { private static String showPetExp; private static String numeralSystem; private static String tooltipAuctionHousePriceEach; + public static String[] tooltipAuctionHousePriceEachEnchantments; + private static String auctionHouseMarkEndedAuctions; private static String bazaarConnectGraphsNodes; public static int bazaarConnectGraphsLineWidth; public static String bestiaryOverviewOrder; @@ -112,6 +114,7 @@ public class MooConfig { private final Cowlection main; private Property propMooCmdAlias; private Property propTabCompletableNamesCommands; + private Property propTooltipAuctionHousePriceEachEnchantments; private List<Property> logSearchProperties; public MooConfig(Cowlection main, Configuration configuration) { @@ -362,7 +365,7 @@ public class MooConfig { "notifyServerAge", true, "Show server age notifications?")); // Sub-Category: Tooltip enhancements - subCat = configCat.addSubCategory("Tooltip enhancements"); + subCat = configCat.addSubCategory("Tooltip & GUI enhancements"); Property propTooltipToggleKeyBinding = subCat.addConfigEntry(cfg.get(configCat.getConfigName(), "tooltipToggleKeyBinding", Keyboard.KEY_LSHIFT, "Key to toggle tooltip")); @@ -399,6 +402,13 @@ public class MooConfig { Property propTooltipAuctionHousePriceEach = subCat.addConfigEntry(cfg.get(configCat.getConfigName(), "tooltipAuctionHousePriceEach", "always", "Add price per item if multiple items are bought or sold", new String[]{"always", "key press", "never"}), ahItemPreview); + propTooltipAuctionHousePriceEachEnchantments = subCat.addConfigEntry(cfg.get(configCat.getConfigName(), + "tooltipAuctionHousePriceEachEnchantments", new String[]{"overload", "rejuvenate"}, "Price per lvl 1 book enchantment") + .setValidationPattern(Pattern.compile("^[A-Za-z_ -]+$"))); + + Property propAuctionHouseMarkEndedAuctions = subCat.addConfigEntry(cfg.get(configCat.getConfigName(), + "auctionHouseMarkEndedAuctions", "a letter", "Mark ended auctions", new String[]{"a letter", "a word", "disabled"})); + MooConfigPreview bazaarGraphPreview = new MooConfigPreview(MooConfigPreview.createDemoItem("paper", "§aBuy Price §731d §77d §e24h", new String[]{ "§7The price at which buy orders have been filled.", "", "§r┌----------------------------------------------┐", "§r│§66. 1k§r+§bxxxxxx§8·································§bxx§r│", @@ -571,6 +581,8 @@ public class MooConfig { String mooCmdAliasPreChange = mooCmdAlias; boolean modifiedTabCompletableCommandsList = false; String[] tabCompletableCommandsPreChange = tabCompletableNamesCommands != null ? tabCompletableNamesCommands.clone() : null; + boolean modifiedTooltipAuctionHousePriceEachEnchantments = false; + String[] tooltipAuctionHousePriceEachEnchantmentsPreChange = tooltipAuctionHousePriceEachEnchantments != null ? tooltipAuctionHousePriceEachEnchantments.clone() : null; if (readFieldsFromConfig) { // Category: General configGuiExplanations = propConfigGuiExplanations.getString(); @@ -600,6 +612,8 @@ public class MooConfig { showPetExp = propShowPetExp.getString(); numeralSystem = propNumeralSystem.getString(); tooltipAuctionHousePriceEach = propTooltipAuctionHousePriceEach.getString(); + tooltipAuctionHousePriceEachEnchantments = propTooltipAuctionHousePriceEachEnchantments.getStringList(); + auctionHouseMarkEndedAuctions = propAuctionHouseMarkEndedAuctions.getString(); bazaarConnectGraphsNodes = propBazaarConnectGraphsNodes.getString(); bazaarConnectGraphsLineWidth = propBazaarConnectGraphsLineWidth.getInt(); bestiaryOverviewOrder = propBestiaryOverviewOrder.getString(); @@ -629,13 +643,15 @@ public class MooConfig { dungMarkPartiesWithMage = propDungMarkPartiesWithMage.getString(); dungMarkPartiesWithTank = propDungMarkPartiesWithTank.getString(); - if (!StringUtils.equals(mooCmdAliasPreChange, mooCmdAlias)) { modifiedMooCmdAlias = true; } if (!Arrays.equals(tabCompletableCommandsPreChange, tabCompletableNamesCommands)) { modifiedTabCompletableCommandsList = true; } + if (!Arrays.equals(tooltipAuctionHousePriceEachEnchantmentsPreChange, tooltipAuctionHousePriceEachEnchantments)) { + modifiedTooltipAuctionHousePriceEachEnchantments = true; + } } // Category: General @@ -666,6 +682,8 @@ public class MooConfig { propShowPetExp.set(showPetExp); propNumeralSystem.set(numeralSystem); propTooltipAuctionHousePriceEach.set(tooltipAuctionHousePriceEach); + propTooltipAuctionHousePriceEachEnchantments.set(tooltipAuctionHousePriceEachEnchantments); + propAuctionHouseMarkEndedAuctions.set(auctionHouseMarkEndedAuctions); propBazaarConnectGraphsNodes.set(bazaarConnectGraphsNodes); propBazaarConnectGraphsLineWidth.set(bazaarConnectGraphsLineWidth); propBestiaryOverviewOrder.set(bestiaryOverviewOrder); @@ -736,6 +754,15 @@ public class MooConfig { propTabCompletableNamesCommands.set(tabCompletableNamesCommands); } } + if (modifiedTooltipAuctionHousePriceEachEnchantments) { + for (int i = 0, enchantmentsLength = tooltipAuctionHousePriceEachEnchantments.length; i < enchantmentsLength; i++) { + // standardize enchantment names to match their names in the NBT data + String enchantmentName = tooltipAuctionHousePriceEachEnchantments[i]; + String standardizedEnchantmentName = enchantmentName.toLowerCase().replace(' ', '_'); + tooltipAuctionHousePriceEachEnchantments[i] = standardizedEnchantmentName; + } + propTooltipAuctionHousePriceEachEnchantments.set(tooltipAuctionHousePriceEachEnchantments); + } cfg.save(); } @@ -803,6 +830,10 @@ public class MooConfig { return Setting.get(tooltipAuctionHousePriceEach); } + public static Setting getMarkAuctionHouseEndedAuctions() { + return Setting.get(auctionHouseMarkEndedAuctions); + } + public static Setting getBazaarConnectGraphsNodes() { return Setting.get(bazaarConnectGraphsNodes); } @@ -965,6 +996,10 @@ public class MooConfig { return logSearchProperties; } + public Property getTooltipAuctionHousePriceEachEnchantmentsProperty() { + return propTooltipAuctionHousePriceEachEnchantments; + } + public class ConfigEventHandler { @SubscribeEvent(priority = EventPriority.NORMAL) @@ -989,6 +1024,7 @@ public class MooConfig { return TOOLTIP; case "in chat": case "as text": + case "a word": return TEXT; case "hidden": case "never": @@ -997,6 +1033,7 @@ public class MooConfig { case "on SkyBlock": case "key press": case "as tooltip ①§0⬛": + case "a letter": return SPECIAL; default: return UNKNOWN; diff --git a/src/main/java/de/cowtipper/cowlection/config/gui/MooConfigCategoryScrolling.java b/src/main/java/de/cowtipper/cowlection/config/gui/MooConfigCategoryScrolling.java index 7e8f3eb..27e6914 100644 --- a/src/main/java/de/cowtipper/cowlection/config/gui/MooConfigCategoryScrolling.java +++ b/src/main/java/de/cowtipper/cowlection/config/gui/MooConfigCategoryScrolling.java @@ -133,6 +133,13 @@ public class MooConfigCategoryScrolling extends GuiListExtended { Cowlection.MODID, "cowlectionMooCmdAlias", false, false, EnumChatFormatting.GOLD + "Press Done to save changes. " + EnumChatFormatting.RED + "Requires a game restart to take effect!")))); continue; + } else if (configEntry.equals(Cowlection.getInstance().getConfig().getTooltipAuctionHousePriceEachEnchantmentsProperty())) { + this.listEntries.add(new GuiSwitchEntry("tooltipAuctionHousePriceEachEnchantments", "➡ modify", () -> + mc.displayGuiScreen(new GuiConfig(MooConfigCategoryScrolling.this.parent, + Lists.newArrayList(new ConfigElement(Cowlection.getInstance().getConfig().getTooltipAuctionHousePriceEachEnchantmentsProperty())), + Cowlection.MODID, "cowlectionTooltipAuctionHousePriceEachEnchantments", false, false, + EnumChatFormatting.GOLD + "Press 2x Done to save changes. " + EnumChatFormatting.LIGHT_PURPLE + EnumChatFormatting.BOLD + "Ultimate" + EnumChatFormatting.RESET + EnumChatFormatting.RED + " and " + EnumChatFormatting.YELLOW + "Turbo-Crop" + EnumChatFormatting.RED + " enchants are always included!")))); + continue; } else if (configEntry.getValidValues() != null && configEntry.getValidValues().length > 0) { if ("dungOverlayTextBorder".equals(configEntry.getName())) { // special case: Dung Performance Overlay: show preview on button click diff --git a/src/main/java/de/cowtipper/cowlection/listener/skyblock/SkyBlockListener.java b/src/main/java/de/cowtipper/cowlection/listener/skyblock/SkyBlockListener.java index 1555e2d..09a8152 100644 --- a/src/main/java/de/cowtipper/cowlection/listener/skyblock/SkyBlockListener.java +++ b/src/main/java/de/cowtipper/cowlection/listener/skyblock/SkyBlockListener.java @@ -13,20 +13,25 @@ import de.cowtipper.cowlection.util.Utils; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.audio.SoundCategory; +import net.minecraft.client.gui.FontRenderer; 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.GlStateManager; import net.minecraft.command.NumberInvalidException; import net.minecraft.enchantment.Enchantment; 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.inventory.Slot; import net.minecraft.item.EnumDyeColor; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagInt; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; @@ -36,6 +41,7 @@ import net.minecraftforge.client.event.GuiScreenEvent; import net.minecraftforge.common.util.Constants; import net.minecraftforge.event.entity.player.ItemTooltipEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import net.minecraftforge.fml.relauncher.ReflectionHelper; import org.apache.commons.lang3.StringUtils; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; @@ -395,48 +401,179 @@ public class SkyBlockListener { } } - // for auction house: show price for each item if multiple items are sold at once + // for auction house: show price for each item if multiple items are sold at once or if higher tier ultimate enchantment books are sold MooConfig.Setting tooltipAuctionHousePriceEachDisplay = MooConfig.getTooltipAuctionHousePriceEachDisplay(); if ((tooltipAuctionHousePriceEachDisplay == MooConfig.Setting.ALWAYS || tooltipAuctionHousePriceEachDisplay == MooConfig.Setting.SPECIAL && MooConfig.isTooltipToggleKeyBindingPressed()) && (e.entityPlayer.openContainer instanceof ContainerChest || Minecraft.getMinecraft().currentScreen instanceof MooConfigGui)) { - int stackSize = e.itemStack.stackSize; - boolean isSubmitBidItem = isSubmitBidItem(e.itemStack); - if ((stackSize == 1 && !isSubmitBidItem) || e.toolTip.size() < 4) { - // only 1 item or irrelevant tooltip - nothing to do here, abort! - return; - } - if (isSubmitBidItem) { - // special case: "place bid on an item" interface ("Auction View") - ItemStack auctionedItem = e.entityPlayer.openContainer.getInventory().get(13); - if (auctionedItem == null || auctionedItem.stackSize == 1) { - // still only 1 item, abort! + int itemAmount = -1; + String superEnchant = null; + if (e.itemStack.getItem() == Items.enchanted_book && extraAttributes != null && extraAttributes.hasKey("enchantments", Constants.NBT.TAG_COMPOUND)) { + NBTTagCompound enchants = extraAttributes.getCompoundTag("enchantments"); + try { + Map<String, NBTBase> enchantmentsMap = ReflectionHelper.getPrivateValue(NBTTagCompound.class, enchants, "tagMap", "field_74784_a"); + + if (enchantmentsMap.size() == 1) { + for (Map.Entry<String, NBTBase> enchant : enchantmentsMap.entrySet()) { + String enchantKey = enchant.getKey(); + if (enchantKey.startsWith("ultimate_") && enchant.getValue() instanceof NBTTagInt) { + // enchanted book with 1 enchantment (which is an ultimate enchant) + // enchantment tier => amount of books needed + // I = 2^0 = 1 + // II = 2^1 = 2 + // III = 2^2 = 4 + // IV = 2^3 = 8 + // V = 2^4 = 16 + itemAmount = (int) Math.pow(2, ((NBTTagInt) enchant.getValue()).getInt() - 1); + superEnchant = Utils.fancyCase(enchantKey.substring("ultimate_".length())); + break; + } else if (enchantKey.startsWith("turbo_") && enchant.getValue() instanceof NBTTagInt) { + itemAmount = (int) Math.pow(2, ((NBTTagInt) enchant.getValue()).getInt() - 1); + superEnchant = "Turbo-" + Utils.fancyCase(enchantKey.substring("turbo_".length())); + if (superEnchant.equals("Turbo-Cactus")) { + // (╯°□°)╯︵ ┻━┻ + superEnchant = "Turbo-Cacti"; + } + break; + } + for (String priceEachEnchantment : MooConfig.tooltipAuctionHousePriceEachEnchantments) { + String priceEachEnchantKey = priceEachEnchantment; + int dashInEnchantName = priceEachEnchantKey.indexOf('-'); + if (dashInEnchantName > 0) { + priceEachEnchantKey = priceEachEnchantKey.replace('-', '_'); + } + if (enchantKey.equals(priceEachEnchantKey) && enchant.getValue() instanceof NBTTagInt) { + itemAmount = (int) Math.pow(2, ((NBTTagInt) enchant.getValue()).getInt() - 1); + superEnchant = Utils.fancyCase(priceEachEnchantment); + } + } + } + } + } catch (ReflectionHelper.UnableToAccessFieldException ignored) { + return; + } + } else { + itemAmount = e.itemStack.stackSize; + boolean isSubmitBidItem = isSubmitBidItem(e.itemStack); + if ((itemAmount == 1 && !isSubmitBidItem) || e.toolTip.size() < 4) { + // only 1 item or irrelevant tooltip - nothing to do here, abort! return; } - stackSize = auctionedItem.stackSize; + + if (isSubmitBidItem) { + // special case: "place bid on an item" interface ("Auction View") + ItemStack auctionedItem = e.entityPlayer.openContainer.getInventory().get(13); + if (auctionedItem == null || auctionedItem.stackSize == 1) { + // still only 1 item, abort! + return; + } + itemAmount = auctionedItem.stackSize; + } } + if (itemAmount > 1) { + List<String> toolTip = e.toolTip; + String superEnchantName = null; + + // starting with i=1 because first line is never the one we're looking for + for (int i = 1; i < toolTip.size(); i++) { + String toolTipLine = toolTip.get(i); + String toolTipLineUnformatted = EnumChatFormatting.getTextWithoutFormattingCodes(toolTipLine); + if (superEnchant != null && superEnchantName == null && (toolTipLineUnformatted.startsWith(superEnchant) || toolTipLineUnformatted.startsWith("Ultimate " + superEnchant))) { + int lastSpace = toolTipLine.lastIndexOf(' '); + if (lastSpace > 0) { + superEnchantName = toolTipLine.substring(0, lastSpace); + } + } + if (toolTipLineUnformatted.startsWith("Top bid: ") + || toolTipLineUnformatted.startsWith("Starting bid: ") + || toolTipLineUnformatted.startsWith("Item price: ") + || toolTipLineUnformatted.startsWith("Buy it now: ") + || toolTipLineUnformatted.startsWith("Sold for: ") + || toolTipLineUnformatted.startsWith("New bid: ") /* special case: 'Submit Bid' item */) { - List<String> toolTip = e.toolTip; + try { + long price = numberFormatter.parse(StringUtils.substringBetween(toolTipLineUnformatted, ": ", " coins")).longValue(); + double priceEach = price / (double) itemAmount; + String formattedPriceEach = priceEach < 5000 ? numberFormatter.format(priceEach) : Utils.formatNumberWithAbbreviations(priceEach); + if (superEnchantName != null) { + toolTip.add(i + 1, EnumChatFormatting.YELLOW + " (≙ " + itemAmount + "x " + superEnchantName + " " + (MooConfig.useRomanNumerals() ? "I" : "1") + EnumChatFormatting.RESET + EnumChatFormatting.YELLOW + " for " + formattedPriceEach + " each)"); + } else { + String pricePerItem = EnumChatFormatting.YELLOW + " (" + formattedPriceEach + " each)"; + toolTip.set(i, toolTipLine + pricePerItem); + } + return; + } catch (ParseException ex) { + return; + } + } + } + } + } + } - // starting with i=1 because first line is never the one we're looking for - for (int i = 1; i < toolTip.size(); i++) { - String toolTipLineUnformatted = EnumChatFormatting.getTextWithoutFormattingCodes(toolTip.get(i)); - if (toolTipLineUnformatted.startsWith("Top bid: ") - || toolTipLineUnformatted.startsWith("Starting bid: ") - || toolTipLineUnformatted.startsWith("Item price: ") - || toolTipLineUnformatted.startsWith("Buy it now: ") - || toolTipLineUnformatted.startsWith("Sold for: ") - || toolTipLineUnformatted.startsWith("New bid: ") /* special case: 'Submit Bid' item */) { + @SubscribeEvent + public void onRenderGuiBackground(GuiScreenEvent.DrawScreenEvent.Pre e) { + if (e.gui instanceof GuiChest) { + MooConfig.Setting markAuctionHouseEndedAuctions = MooConfig.getMarkAuctionHouseEndedAuctions(); + if (markAuctionHouseEndedAuctions == MooConfig.Setting.DISABLED) { + return; + } + GuiChest guiChest = (GuiChest) e.gui; - try { - long price = numberFormatter.parse(StringUtils.substringBetween(toolTipLineUnformatted, ": ", " coins")).longValue(); - double priceEach = price / (double) stackSize; - String formattedPriceEach = priceEach < 5000 ? numberFormatter.format(priceEach) : Utils.formatNumberWithAbbreviations(priceEach); - String pricePerItem = EnumChatFormatting.YELLOW + " (" + formattedPriceEach + " each)"; - toolTip.set(i, toolTip.get(i) + pricePerItem); - return; - } catch (ParseException ex) { - return; + Container inventorySlots = guiChest.inventorySlots; + IInventory inventory = inventorySlots.getSlot(0).inventory; + if (inventory.getName().contains("Auction")) { + // Auctions Browser, Auction: "<search term>", <player>'s Auctions, Auction View + FontRenderer fontRenderer = e.gui.mc.fontRendererObj; + // formulas from GuiContainer#initGui (guiLeft, guiTop) and GuiChest (ySize) + int guiLeft = (guiChest.width - 176) / 2; + int inventoryRows = inventory.getSizeInventory() / 9; + int ySize = 222 - 108 + inventoryRows * 18; + int guiTop = (guiChest.height - ySize) / 2; + + for (Slot inventorySlot : inventorySlots.inventorySlots) { + if (inventorySlot.getHasStack()) { + int slotRow = inventorySlot.slotNumber / 9; + int slotColumn = inventorySlot.slotNumber % 9; + // check if slot is one of the middle slots with parties + if (slotRow == 0 || slotRow == (inventoryRows - 1) || slotColumn == 0 || slotColumn == 8) { + // one of the glass pane borders + continue; + } + NBTTagCompound itemNbtDisplay = inventorySlot.getStack().getSubCompound("display", false); + if (itemNbtDisplay != null && itemNbtDisplay.hasKey("Lore", Constants.NBT.TAG_LIST)) { + NBTTagList loreList = itemNbtDisplay.getTagList("Lore", Constants.NBT.TAG_STRING); + if (loreList.tagCount() < 5) { + continue; + } + for (int loreLineNr = loreList.tagCount() - 1; loreLineNr >= 0; --loreLineNr) { + String loreLineFormatted = loreList.getStringTagAt(loreLineNr); + String loreLine = EnumChatFormatting.getTextWithoutFormattingCodes(loreLineFormatted); + + String auctionStatus; + if (loreLine.startsWith("Ends in: ")) { + // auction is still going + break; + } else if (loreLine.equals("Status: Expired!")) { + auctionStatus = EnumChatFormatting.RED + (markAuctionHouseEndedAuctions == MooConfig.Setting.TEXT ? "Expired" : "E"); + } else if (loreLine.equals("Status: Ended!")) { + auctionStatus = EnumChatFormatting.GREEN + (markAuctionHouseEndedAuctions == MooConfig.Setting.TEXT ? "Ended" : "E"); + } else if (loreLine.equals("Status: Sold!")) { + auctionStatus = EnumChatFormatting.GREEN + (markAuctionHouseEndedAuctions == MooConfig.Setting.TEXT ? "Sold" : "S"); + } else { + continue; + } + GlStateManager.pushMatrix(); + GlStateManager.translate(0, 0, 281); + double scaleFactor = markAuctionHouseEndedAuctions == MooConfig.Setting.TEXT ? 0.4 : 0.5; + GlStateManager.scale(scaleFactor, scaleFactor, 0); + int slotX = guiLeft + inventorySlot.xDisplayPosition; + int slotY = guiTop + inventorySlot.yDisplayPosition; + fontRenderer.drawStringWithShadow(auctionStatus, (float) (slotX / scaleFactor), (float) (slotY / scaleFactor), 0xffcc00); + GlStateManager.popMatrix(); + break; + } + } } } } diff --git a/src/main/java/de/cowtipper/cowlection/util/Utils.java b/src/main/java/de/cowtipper/cowlection/util/Utils.java index d5c846d..bfeef4b 100644 --- a/src/main/java/de/cowtipper/cowlection/util/Utils.java +++ b/src/main/java/de/cowtipper/cowlection/util/Utils.java @@ -41,7 +41,7 @@ public final class Utils { } public static String fancyCase(String string) { - return WordUtils.capitalizeFully(string.replace('_', ' ')); + return WordUtils.capitalizeFully(string.replace('_', ' '), ' ', '-'); } /** diff --git a/src/main/resources/assets/cowlection/lang/en_US.lang b/src/main/resources/assets/cowlection/lang/en_US.lang index e9d9091..c531329 100644 --- a/src/main/resources/assets/cowlection/lang/en_US.lang +++ b/src/main/resources/assets/cowlection/lang/en_US.lang @@ -53,7 +53,11 @@ cowlection.config.showPetExp.tooltip=Show pet exp?\n§7§oExp for max level pets cowlection.config.numeralSystem=Numeral system cowlection.config.numeralSystem.tooltip=Use Roman or Arabic numeral system?\nThis is currently used to display numbers in the commands /moo stalkSkyBlock and /moo analyzeIsland cowlection.config.tooltipAuctionHousePriceEach=§7Auction house: §rprice per item -cowlection.config.tooltipAuctionHousePriceEach.tooltip=Add price per item if multiple items are bought or sold? +cowlection.config.tooltipAuctionHousePriceEach.tooltip=Add price per item if multiple items are bought or sold?\nAlso add price for level 1 books for enchanted books with one single enchant. +cowlection.config.tooltipAuctionHousePriceEachEnchantments=§7AH: §rprice per lvl 1 enchantment +cowlection.config.tooltipAuctionHousePriceEachEnchantments.tooltip=Breaks down the price of enchanted books with one higher-tiered enchantment into their potential level 1 book prices.\n§d§lUltimate§r and §eTurbo-Crop §renchantments are always included. Enchantments set in this config option get broken down additionally.\n§7Keep in mind that not all high-level enchantments can be created by combining lower level books! +cowlection.config.auctionHouseMarkEndedAuctions=§7AH: §rmark sold/ended/expired auctions with... +cowlection.config.auctionHouseMarkEndedAuctions.tooltip=Add indicators to auctions that...\n ‣ sold: §aSold §ror §aS\n ‣ ended: §aEnded §ror §aE\n ‣ expired: §cExpired §ror §cE cowlection.config.bazaarConnectGraphsNodes=§7Bazaar: §rconnect the graph nodes cowlection.config.bazaarConnectGraphsNodes.tooltip=Draw a line through the nodes of the bazaar graphs?\n§7§oThis also (tries to) fix the graphs when using the MC unicode font. cowlection.config.bazaarConnectGraphsLineWidth=§7Bazaar: §rline width |