package net.uomc.mineshaft; import com.mouldycheerio.dbot.CustomBot; import com.mouldycheerio.dbot.commands.CommandDetails; import com.mouldycheerio.dbot.commands.CommandFail; import com.mouldycheerio.dbot.commands.DetailedCommand; import com.mouldycheerio.dbot.util.PeelingUtils; import com.vdurmont.emoji.EmojiParser; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; public class EnchantCommand extends DetailedCommand { private static final String COMMAND_IMAGE = "https://minecraft.wiki/images/Enchanting_Table.gif"; private static final double MIN_DISCOUNT = 0.4; private static final double MAX_BOOKSHELVES = 24; private static final String COMMAND_TITLE = "Enchanting Table"; Mineshaft bot; public EnchantCommand(Mineshaft bot) { setCommandDetails(CommandDetails.from("enchant,enchanting,ench,etable,enchantingtable", "", "enchant")); this.bot = bot; } @Override public void execute(MessageReceivedEvent e, CustomBot b, String[] args) throws CommandFail { long ench_tables = bot.getItem(e.getMember(), MineshaftItem.ENCHANTING_TABLE); if (ench_tables < 1) { b.sendErrorMessage(e, ":x: You need to have at least **" + bot.getItem(MineshaftItem.ENCHANTING_TABLE).prettyValue(1) + "** to use this!"); return; } if (args.length > 0) { enchant(e, args); return; } int fortune = bot.getPickaxes().getPickaxeFortune(e.getMember()); long bookshelves = bot.getItem(e.getMember(), MineshaftItem.BOOKSHELF); String bookshelfDiscountPercent = "-" + (int) Math.ceil((1 -bookshelfDiscount(bookshelves))*100) + "%"; long xpLevel = getXpLevel(fortune, bookshelves); long lapisLevel = getLapisLevel(fortune, bookshelves); long xpLevelNormal = getXpLevel(fortune, 0); long lapisLevelNormal = getLapisLevel(fortune, 0); String curr = ""; if (fortune > 0) { curr = "Your pickaxe has **Fortune " + Pickaxes.getRomanNumber(fortune) + "**\n\n"; } String description = curr + "Enchant your pickaxe with `" + b.getPrefixManager().getPrefix(e.getGuild()) + "enchant fortune`\n\n"; description += "**Cost:**\n"; if (bookshelves > 0) description += "~~" + PeelingUtils.amountToString(lapisLevelNormal) + "~~ "; description += "**" + bot.getItem(MineshaftItem.LAPIS).prettyValue(lapisLevel) + "**"; description += "\n"; if (bookshelves > 0) description += "~~" + PeelingUtils.amountToString(xpLevelNormal) + "~~ "; description += "**" + bot.getItem(MineshaftItem.XP).prettyValue(xpLevel) + "**"; if (bookshelves > 0) { description += "\n\nYour "; description += bot.getItem(MineshaftItem.BOOKSHELF).prettyValue(bookshelves); description += " are giving you a **" + bookshelfDiscountPercent + "** discount!"; } EmbedBuilder em = new EmbedBuilder(); em.setTitle(COMMAND_TITLE); em.setDescription(description); em.setThumbnail(COMMAND_IMAGE); em.setColor(PeelingUtils.hex2Rgb("#0a0711")); if (bookshelves == 0) { em.setFooter(EmojiParser.parseToUnicode(":bulb:") + "Bookshelves give you a discount on your enchantments"); } e.getMessage().replyEmbeds(em.build()).queue(); } private long getLapisLevel(int fortune, long bookshelves) { return (long) (Math.pow(2, fortune + 4) * bookshelfDiscount(bookshelves)); } private double bookshelfDiscount(long bookshelves) { double b = Math.min(bookshelves, MAX_BOOKSHELVES); return MIN_DISCOUNT + Math.log10( 1.0 + (9.0 * ((MAX_BOOKSHELVES - b) / MAX_BOOKSHELVES))) * MIN_DISCOUNT; } private long getXpLevel(int fortune, long bookshelves) { return (long) (15000l * Math.pow(fortune + 1, 2) * bookshelfDiscount(bookshelves)); } private void enchant(MessageReceivedEvent e, String[] args) { int fortune = bot.getPickaxes().getPickaxeFortune(e.getMember()); long bookshelves = bot.getItem(e.getMember(), MineshaftItem.BOOKSHELF); long xpLevel = getXpLevel(fortune, bookshelves); long lapisLevel = getLapisLevel(fortune, bookshelves); long memberLapis = bot.getItem(e.getMember(), MineshaftItem.LAPIS); long memberXp = bot.getItem(e.getMember(), MineshaftItem.XP); if (memberLapis < lapisLevel) { bot.sendErrorMessage(e, ":x: You need " + bot.getItem(MineshaftItem.LAPIS).prettyValue(lapisLevel - memberLapis) + " more lapis!" ); return; } if (memberXp < xpLevel) { bot.sendErrorMessage(e, ":x: You need " + bot.getItem(MineshaftItem.XP).prettyValue(xpLevel - memberXp) + " more xp!" ); return; } bot.removeItem(e.getMember(), MineshaftItem.LAPIS, lapisLevel); bot.removeItem(e.getMember(), MineshaftItem.XP, xpLevel); int level = bot.getPickaxes().incrementFortune(e.getMember()); bot.sendSuccessMessage(e, ":white_check_mark: You enchanted your pickaxe. Now it has **Fortune " + Pickaxes.getRomanNumber(level) + "**"); } }