package advancedsystemsmanager.recipes; import advancedsystemsmanager.api.items.IElementItem; import advancedsystemsmanager.api.tileentities.ITileElement; import advancedsystemsmanager.api.tileentities.ITileFactory; import advancedsystemsmanager.registry.ClusterRegistry; import advancedsystemsmanager.tileentities.TileEntityCluster; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; import net.minecraft.world.World; import net.minecraftforge.oredict.RecipeSorter; import java.util.ArrayList; import java.util.List; import static net.minecraftforge.oredict.RecipeSorter.Category.SHAPED; public class ClusterRecipe implements IRecipe { private ItemStack output; static { RecipeSorter.register("asm:cluster", ClusterRecipe.class, SHAPED, "after:minecraft:shapeless"); } @Override public boolean matches(InventoryCrafting inventorycrafting, World world) { output = null; ItemStack clusterStack = ClusterRegistry.CLUSTER.getItemStack(); ItemStack advcluster = ClusterRegistry.CLUSTER.getItemStack(1); List<ItemStack> stacksToAdd = new ArrayList<ItemStack>(); for (int i = 0; i < inventorycrafting.getSizeInventory(); i++) { ItemStack item = inventorycrafting.getStackInSlot(i); if (item != null) { if (item.isItemEqual(clusterStack) || item.isItemEqual(advcluster)) { if (output != null) { return false; //multiple clusters } else { output = item; } } else if (item.getItem() instanceof IElementItem) { stacksToAdd.add(item); } else { return false; } } } if (output != null && !stacksToAdd.isEmpty()) { List<ItemStack> existing = TileEntityCluster.getSubblocks(output); List<ITileFactory> existingFactories = new ArrayList<ITileFactory>(); for (ItemStack element : existing) { ITileFactory factory = ((IElementItem) element.getItem()).getTileFactory(element); if (factory != null) existingFactories.add(factory); } for (ItemStack stack : stacksToAdd) { ITileFactory factory = ((IElementItem) stack.getItem()).getTileFactory(stack); if (factory == null || !factory.canBeAddedToCluster(existingFactories)) { return false; } existingFactories.add(factory); existing.add(stack); } TileEntityCluster.saveSubBlocks(output, existingFactories, existing); return true; } return false; } @Override public ItemStack getCraftingResult(InventoryCrafting inventorycrafting) { return output.copy(); } @Override public int getRecipeSize() { return 9; } @Override public ItemStack getRecipeOutput() { return output; } }