package crazypants.enderio.machine.invpanel; import java.util.List; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.CraftingManager; import net.minecraft.nbt.NBTTagCompound; import com.enderio.core.common.util.ItemUtil; public class StoredCraftingRecipe { private final ItemStack[] slots; private boolean updateResult; private ItemStack result; public StoredCraftingRecipe() { slots = new ItemStack[9]; } public boolean loadFromCraftingGrid(List<Slot> craftingGrid) { if (craftingGrid.size() != 9) { return false; } int count = 0; for(int slotIdx = 0; slotIdx < 9 && slotIdx < craftingGrid.size(); slotIdx++) { Slot slot = craftingGrid.get(slotIdx); ItemStack stack = slot.getStack(); if(stack != null) { stack = stack.copy(); stack.stackSize = 1; slots[slotIdx] = stack; count++; } } return count > 0; } public ItemStack get(int index) { return slots[index]; } public boolean isEqual(List<Slot> craftingGrid) { for(int slotIdx = 0; slotIdx < 9; slotIdx++) { ItemStack a = slots[slotIdx]; ItemStack b = craftingGrid.get(slotIdx).getStack(); if((a != null || b != null) && !ItemUtil.areStacksEqual(a, b)) { return false; } } return true; } public void writeToNBT(NBTTagCompound nbtRoot) { for(int slotIdx = 0; slotIdx < 9; slotIdx++) { ItemStack itemStack = slots[slotIdx]; if(itemStack != null) { NBTTagCompound itemStackNBT = new NBTTagCompound(); itemStack.writeToNBT(itemStackNBT); nbtRoot.setTag(Integer.toString(slotIdx), itemStackNBT); } } } public boolean readFromNBT(NBTTagCompound nbtRoot) { boolean hasSlots = false; for(int slotIdx = 0; slotIdx < 9; slotIdx++) { NBTTagCompound itemStackNBT = (NBTTagCompound) nbtRoot.getTag(Integer.toString(slotIdx)); if(itemStackNBT != null) { slots[slotIdx] = ItemStack.loadItemStackFromNBT(itemStackNBT); hasSlots = true; } else { slots[slotIdx] = null; } } updateResult = true; result = null; return hasSlots; } public ItemStack getResult(TileInventoryPanel te) { if(updateResult) { findCraftingResult(te); } return result; } private void findCraftingResult(TileInventoryPanel te) { InventoryCrafting tmp = new InventoryCrafting(new Container() { @Override public boolean canInteractWith(EntityPlayer ep) { return false; } }, 3, 3); for (int i = 0; i < 9; i++) { tmp.setInventorySlotContents(i, slots[i]); } result = CraftingManager.getInstance().findMatchingRecipe(tmp, te.getWorldObj()); if(result != null) { result = result.copy(); result.stackSize = 1; } updateResult = false; } }