package net.uomc.mineshaft.crafting; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.stream.Collector; import java.util.stream.Collectors; import com.mouldycheerio.dbot.CustomBot; import com.mouldycheerio.dbot.util.PeelingUtils; import com.vdurmont.emoji.EmojiParser; import com.mouldycheerio.dbot.commands.CommandFail; import com.mouldycheerio.dbot.commands.DetailedCommand; import com.mouldycheerio.dbot.commands.CommandDetails; import net.uomc.mineshaft.resources.Resource; import net.uomc.mineshaft.Mineshaft; import net.uomc.mineshaft.MineshaftItem; import net.dv8tion.jda.api.EmbedBuilder; import net.dv8tion.jda.api.entities.Member; import net.dv8tion.jda.api.entities.MessageEmbed; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; public class Crafting extends DetailedCommand { private static final String COMMAND_IMAGE = "https://minecraft.wiki/images/Crafting_Table_JE4_BE3.png"; private static final String COMMAND_TITLE = "Crafting Table"; List recipes; private Mineshaft bot; public Crafting(Mineshaft bot) { setDetails(CommandDetails.from("craft", "Craft an item", "craft [item]")); this.bot = bot; recipes = new ArrayList<>(); addRecipe( CraftingRecipe.make(MineshaftItem.ENCHANTING_TABLE) .addIngredient(MineshaftItem.BOOK, 1) .addIngredient(MineshaftItem.OBSIDIAN, 4) .addIngredient(MineshaftItem.DIAMOND, 2) .setBuyMessage("Use `" + bot.getCommandController().getPrefix() + "enchant` to use your enchanting table!") ); addRecipe( CraftingRecipe.make(MineshaftItem.BOOKSHELF) .addIngredient(MineshaftItem.BOOK, 3) .setUnlockCondition((m) -> bot.getItem(m, MineshaftItem.BOOK) > 0) .setBuyMessage("**+1 enchanting table level**") ); addRecipe( CraftingRecipe.make(MineshaftItem.FURNACE) .addIngredient(MineshaftItem.COAL, 800l) .setBuyMessage("Use `" + bot.getCommandController().getPrefix() + "furnace` to get free ores") ); addRecipe( CraftingRecipe.make(MineshaftItem.PORTAL) .addIngredient(MineshaftItem.OBSIDIAN, 10l) .setUnlockCondition((m) -> bot.getItem(m, MineshaftItem.OBSIDIAN) > 0) .setBuyMessage("You can now use your `" + bot.getCommandController().getPrefix() + "portal`") ); addRecipe( CraftingRecipe.make(MineshaftItem.WOOL) .addIngredient(MineshaftItem.STRING, 4l) .setUnlockCondition((m) -> bot.getItem(m, MineshaftItem.STRING) > 0) ); addRecipe( CraftingRecipe.make(MineshaftItem.BED) .addIngredient(MineshaftItem.WOOL, 3l) .setUnlockCondition((m) -> bot.getItem(m, MineshaftItem.STRING) > 0) ); addRecipe( CraftingRecipe.make(MineshaftItem.VILLAGER) .addIngredient(MineshaftItem.EMERALD, 64l) .addIngredient(MineshaftItem.BED, 1l) .setUnlockCondition((m) -> bot.getItem(m, MineshaftItem.BED) > 0 && bot.getItem(m, MineshaftItem.EMERALD) > 0) .setBuyMessage("You are now able to `" + bot.getCommandController().getPrefix() + "trade` with the wandering trader") ); addRecipe( CraftingRecipe.make(MineshaftItem.COMPOSTER) .addIngredient(MineshaftItem.IRON, 14l) .setUnlockCondition((m) -> bot.getItem(m, MineshaftItem.FISH) > 0 || bot.getItem(m, MineshaftItem.POTATO) > 0 || bot.getItem(m, MineshaftItem.CARROT) > 0 || bot.getItem(m, MineshaftItem.CANE) > 0) .setBuyMessage("You are now able to `" + bot.getCommandController().getPrefix() + "compost` your items") ); addRecipe( CraftingRecipe.make(MineshaftItem.PAPER) .addIngredient(MineshaftItem.CANE, 3l) .setUnlockCondition((m) -> bot.getItem(m, MineshaftItem.CANE) > 0) ); addRecipe( CraftingRecipe.make(MineshaftItem.BOOK) .addIngredient(MineshaftItem.PAPER, 27l) .setUnlockCondition((m) -> bot.getItem(m, MineshaftItem.PAPER) > 0) ); } public List getRecipes() { return recipes; } public Crafting addRecipe(CraftingRecipe craft) { recipes.add(craft); return this; } @Override public void execute(MessageReceivedEvent e, CustomBot b, String[] args) throws CommandFail { if (args.length > 0) { craft(e, args); return; } String description = "This is your crafting table. Craft an item with `" + b.getPrefixManager().getPrefix(e.getGuild()) + "craft [item] [amount]`\n\n"; description += getCraftingRecipesList(e.getMember()); EmbedBuilder em = new EmbedBuilder(); em.setTitle(COMMAND_TITLE); em.setDescription(description); em.setThumbnail(COMMAND_IMAGE); em.setColor(PeelingUtils.hex2Rgb("#93764c")); if (bot.getItem(e.getMember(), MineshaftItem.DIAMOND) < 1) { em.setFooter(EmojiParser.parseToUnicode(":bulb:") + "View your inventory with " +b.getPrefixManager().getPrefix(e.getGuild()) + "inv"); } else { em.setFooter(EmojiParser.parseToUnicode(":bulb:") + "Come back once you have more items to unlock more recipes!"); } e.getMessage().replyEmbeds(em.build()).queue(); } public String getCraftingRecipesList(Member member) { return getRecipes().stream() .filter(r -> r.isUnlocked(member)) .map(recipe -> { Resource r = bot.getItem(recipe.getItem()); return "**" + r.getPrettyName() + "**\n" + bot.createItemList(recipe.getIngredients(), "%s", ", ") + " -> " + r.prettyValue(recipe.getQuantity()); }).collect(Collectors.joining("\n\n")); } private void craft(MessageReceivedEvent e, String[] args) { long amount = 1; String toCraft; if (PeelingUtils.isLong(args[args.length-1])) { amount = Long.parseLong(args[args.length-1]); toCraft = String.join("_", Arrays.copyOfRange(args, 0, args.length -1)).toLowerCase(); } else { toCraft = String.join("_", args).toLowerCase(); } Optional selected = getRecipes().stream().filter(r -> r.getItem().toString().equalsIgnoreCase(toCraft)).findFirst(); if (selected.isEmpty()) { bot.sendErrorMessage(e, ":x: That item does not have a crafting recipe"); return; } CraftingRecipe recipe = selected.get(); Map missing = recipe.getMissingIngredients(bot.getInventory(e.getMember()), amount); if (!missing.isEmpty()) { bot.sendErrorMessage(e, ":x: Unable to craft!\nIngredients missing: **" + bot.createItemList(missing, "%s", ", ") + "**"); return; } bot.removeItems(e.getMember(), bot.multiply(recipe.getIngredients(), amount)); bot.addItem(e.getMember(), recipe.getItem(), recipe.getQuantity() * amount); bot.sendSuccessMessage(e, "You crafted " + bot.getItem(recipe.getItem()).prettyValue(recipe.getQuantity() * amount) + "!\n" + recipe.getBuyMessage() ); } }