package net.uomc.mineshaft.crafting; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.function.BiFunction; import java.util.function.Function; import net.dv8tion.jda.api.entities.Member; import net.uomc.mineshaft.Mineshaft; import net.uomc.mineshaft.MineshaftItem; public class CraftingRecipe { MineshaftItem item; long quantity; Map ingredients; String buyMessage; Function unlockCondition; private CraftingRecipe(MineshaftItem item, long quantity, Map ingredients) { this.item = item; this.quantity = quantity; this.ingredients = ingredients; } public static CraftingRecipe make(MineshaftItem item) { Map ingredients = new HashMap<>(); return new CraftingRecipe(item, 1, ingredients); } public CraftingRecipe addIngredient(MineshaftItem item, long amount) { ingredients.put(item, amount); return this; } public MineshaftItem getItem() { return item; } public long getQuantity() { return quantity; } public Map getIngredients() { return ingredients; } public String getBuyMessage() { if (buyMessage == null) return ""; return buyMessage; } public boolean isUnlocked(Member m) { if (unlockCondition == null) return true; return unlockCondition.apply(m); } public CraftingRecipe setBuyMessage(String message) { buyMessage = message; return this; } public CraftingRecipe setUnlockCondition(Function function) { this.unlockCondition = function; return this; } public Map getMissingIngredients(Map items) { return getMissingIngredients(items, 1); } public Map getMissingIngredients(Map items, long amount) { Map lacking = new HashMap(); getIngredients().forEach((item, q) -> { if (items.get(item) < q* amount) { lacking.put(item, (q * amount) - items.get(item)); } }); return Collections.unmodifiableMap(lacking); } }