package net.glowstone.inventory; import net.glowstone.GlowServer; import org.bukkit.Bukkit; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.CraftingInventory; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.Recipe; import java.util.Arrays; /** * Represents a crafting grid inventory, both workbench and per-player. */ public class GlowCraftingInventory extends GlowInventory implements CraftingInventory { private static final int RESULT_SLOT = 0; private static final int MATRIX_START = 1; public GlowCraftingInventory(InventoryHolder owner, InventoryType type) { super(owner, type); if (type != InventoryType.CRAFTING && type != InventoryType.WORKBENCH) { throw new IllegalArgumentException("GlowCraftingInventory cannot be " + type + ", only CRAFTING or WORKBENCH."); } slotTypes[RESULT_SLOT] = InventoryType.SlotType.RESULT; Arrays.fill(slotTypes, MATRIX_START, getSize(), InventoryType.SlotType.CRAFTING); } @Override public void setItem(int index, ItemStack item) { super.setItem(index, item); if (index != RESULT_SLOT) { Recipe recipe = getRecipe(); if (recipe == null) { super.setItem(RESULT_SLOT, null); } else { super.setItem(RESULT_SLOT, recipe.getResult()); } } } @Override public boolean itemShiftClickAllowed(int slot, ItemStack stack) { // cannot ever shift-click into a crafting inventory return false; } @Override public int getRawSlots() { return 0; } /** * Remove a layer of items from the inventory according to the current recipe. */ public void craft() { ItemStack[] matrix = getMatrix(); CraftingManager cm = ((GlowServer) Bukkit.getServer()).getCraftingManager(); Recipe recipe = cm.getCraftingRecipe(matrix); if (recipe != null) { cm.removeItems(matrix, recipe); setMatrix(matrix); } } @Override public ItemStack getResult() { return getItem(RESULT_SLOT); } @Override public ItemStack[] getMatrix() { return Arrays.copyOfRange(getContents(), MATRIX_START, getSize()); } @Override public void setResult(ItemStack newResult) { setItem(RESULT_SLOT, newResult); } @Override public void setMatrix(ItemStack[] contents) { if (contents.length != getSize() - 1) { throw new IllegalArgumentException("Length must be " + (getSize() - 1)); } for (int i = 0; i < contents.length; ++i) { setItem(MATRIX_START + i, contents[i]); } } @Override public Recipe getRecipe() { return ((GlowServer) Bukkit.getServer()).getCraftingManager().getCraftingRecipe(getMatrix()); } }