package com.austinv11.peripheralsplusplus.recipe;
import com.austinv11.collectiveframework.minecraft.utils.Colors;
import com.austinv11.collectiveframework.minecraft.utils.NBTHelper;
import com.austinv11.collectiveframework.utils.ArrayUtils;
import com.austinv11.peripheralsplusplus.blocks.BlockPeripheralContainer;
import com.austinv11.peripheralsplusplus.init.ModBlocks;
import com.austinv11.peripheralsplusplus.reference.Config;
import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.api.peripheral.IPeripheralProvider;
import net.minecraft.block.Block;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
public class ContainerRecipe implements IRecipe {
private static Block[] blacklist = new Block[]{ModBlocks.antenna};
@Override
public boolean matches(InventoryCrafting craftingInventory, World world) {
boolean hasContainer = false;
boolean hasPeripheral = false;
int numOfPeripherals = 0;
int numOfContained = 0;
ItemStack container = new ItemStack(ModBlocks.peripheralContainer);
for (int i = 0; i < craftingInventory.getSizeInventory(); i++)
if (craftingInventory.getStackInSlot(i) != null) {
if (!(craftingInventory.getStackInSlot(i).getItem() instanceof ItemBlock))
return false;
else {
Block block = Block.getBlockFromItem(craftingInventory.getStackInSlot(i).getItem());
if (block instanceof BlockPeripheralContainer && hasContainer)
return false;
else if (block instanceof BlockPeripheralContainer) {
hasContainer = true;
container = craftingInventory.getStackInSlot(i);
} else if (ArrayUtils.indexOf(blacklist, block) == -1) {
return false;
} else if (block instanceof IPeripheralProvider) {
hasPeripheral = true;
numOfPeripherals++;
}
}
}
numOfContained = container.stackTagCompound == null || container.stackTagCompound.hasNoTags() ? 0 : NBTHelper.getIntArray(container, "ids").length;
return hasContainer && hasPeripheral && (numOfContained+numOfPeripherals <= Config.maxNumberOfPeripherals);
}
@Override
public ItemStack getCraftingResult(InventoryCrafting craftingInventory) {
HashMap<Integer,IPeripheral> map = new HashMap<Integer,IPeripheral>();
ItemStack base = new ItemStack(ModBlocks.peripheralContainer);
for (int i = 0; i < craftingInventory.getSizeInventory(); i++)
if (craftingInventory.getStackInSlot(i) != null)
if (Block.getBlockFromItem(craftingInventory.getStackInSlot(i).getItem()) instanceof IPeripheralProvider && !(Block.getBlockFromItem(craftingInventory.getStackInSlot(i).getItem()) instanceof BlockPeripheralContainer)) {
TileEntity ent = Block.getBlockFromItem(craftingInventory.getStackInSlot(i).getItem()).createTileEntity(null, 0);
if (ent != null && ent instanceof IPeripheral)
map.put(Block.getIdFromBlock(Block.getBlockFromItem(craftingInventory.getStackInSlot(i).getItem())), (IPeripheral)ent);
}else if (Block.getBlockFromItem(craftingInventory.getStackInSlot(i).getItem()) instanceof BlockPeripheralContainer)
base.stackTagCompound = craftingInventory.getStackInSlot(i).stackTagCompound == null ? null : (NBTTagCompound) craftingInventory.getStackInSlot(i).stackTagCompound.copy();
List<String> text = new ArrayList<String>();
if (base.stackTagCompound == null || base.stackTagCompound.hasNoTags() || !base.stackTagCompound.hasKey("ids")) {
NBTHelper.setIntArray(base, "ids", setToArray(map.keySet()));
text.add(Colors.RESET.toString()+Colors.UNDERLINE+"Contained Peripherals:");
for (IPeripheral p : map.values())
text.add(Colors.RESET+p.getType());
NBTHelper.addInfo(base, text);
} else {
text.add(Colors.RESET.toString()+Colors.UNDERLINE+"Contained Peripherals:");
int[] ids = NBTHelper.getIntArray(base, "ids");
int[] newIds = new int[ids.length+map.size()];
for (int j = 0; j < ids.length+map.size(); j++)
newIds[j] = j >= ids.length ? (Integer)map.keySet().toArray()[j-ids.length] : ids[j];
NBTHelper.setIntArray(base, "ids", newIds);
for (int id : newIds) {
Block peripheral = Block.getBlockById(id);
IPeripheral iPeripheral = (IPeripheral)peripheral.createTileEntity(null, 0);
text.add(Colors.RESET+iPeripheral.getType());
}
NBTHelper.setInfo(base, text);
}
return base;
}
private int[] setToArray(Set<Integer> c) {
int[] array = new int[c.size()];
int i = 0;
for (int j : c) {
array[i] = j;
i++;
}
return array;
}
@Override
public int getRecipeSize() {
return 9;
}
@Override
public ItemStack getRecipeOutput() {
return new ItemStack(ModBlocks.peripheralContainer);
}
}