package codechicken.nei; import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; import java.util.ArrayList; import java.util.List; /** * Simply an {@link ItemStack} with position. * Mainly used in the recipe handlers. */ public class PositionedStack { public int relx; public int rely; public ItemStack items[]; //compatibility dummy public ItemStack item; private boolean permutated = false; public PositionedStack(Object object, int x, int y, boolean genPerms) { items = NEIServerUtils.extractRecipeItems(object); relx = x; rely = y; if(genPerms) generatePermutations(); else setPermutationToRender(0); } public PositionedStack(Object object, int x, int y) { this(object, x, y, true); } public void generatePermutations() { if(permutated) return; ArrayList<ItemStack> stacks = new ArrayList<ItemStack>(); for(ItemStack item : items) { if(item == null || item.getItem() == null) continue; if(item.getItemDamage() == Short.MAX_VALUE) { List<ItemStack> permutations = ItemList.itemMap.get(item.getItem()); if(!permutations.isEmpty()) { for(ItemStack stack : permutations) stacks.add(stack.copy()); } else { ItemStack base = new ItemStack(item.getItem(), item.stackSize); base.setTagCompound(item.getTagCompound()); stacks.add(base); } continue; } stacks.add(item.copy()); } items = stacks.toArray(new ItemStack[0]); if(items.length == 0) items = new ItemStack[]{new ItemStack(Blocks.fire)}; permutated = true; setPermutationToRender(0); } public void setMaxSize(int i) { for(ItemStack item : items) if(item.stackSize > i) item.stackSize = i; } public PositionedStack copy() { return new PositionedStack(items, relx, rely); } public void setPermutationToRender(int index) { item = items[index].copy(); if(item.getItem() == null) item = new ItemStack(Blocks.fire); else if(item.getItemDamage() == OreDictionary.WILDCARD_VALUE) item.setItemDamage(0); } public boolean contains(ItemStack ingredient) { for(ItemStack item : items) if(NEIServerUtils.areStacksSameTypeCrafting(item, ingredient)) return true; return false; } public boolean contains(Item ingred) { for(ItemStack item : items) if(item.getItem() == ingred) return true; return false; } }