package mekanism.common.recipe;
import mekanism.common.Mekanism;
import mekanism.common.inventory.InventoryBin;
import mekanism.common.item.ItemBlockBasic;
import mekanism.common.item.ItemProxy;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.world.World;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.PlayerEvent.ItemCraftedEvent;
public class BinRecipe implements IRecipe
{
private static boolean registered;
public BinRecipe()
{
if(!registered)
{
FMLCommonHandler.instance().bus().register(this);
registered = true;
}
}
@Override
public boolean matches(InventoryCrafting inv, World world)
{
return getCraftingResult(inv) != null;
}
private boolean isBin(ItemStack itemStack)
{
if(itemStack == null)
{
return false;
}
return itemStack.getItem() instanceof ItemBlockBasic && itemStack.getItemDamage() == 6;
}
@Override
public ItemStack getCraftingResult(InventoryCrafting inv)
{
return getResult(inv);
}
public ItemStack getResult(IInventory inv)
{
ItemStack bin = null;
for(int i = 0; i < inv.getSizeInventory(); i++)
{
ItemStack stack = inv.getStackInSlot(i);
if(isBin(stack))
{
if(bin != null)
{
return null;
}
bin = stack.copy();
}
}
if(bin == null)
{
return null;
}
ItemStack addStack = null;
for(int i = 0; i < 9; i++)
{
ItemStack stack = inv.getStackInSlot(i);
if(stack != null && !isBin(stack))
{
if(addStack != null)
{
return null;
}
addStack = stack.copy();
}
}
InventoryBin binInv = new InventoryBin(bin);
if(addStack != null)
{
if(binInv.getItemType() != null && !binInv.getItemType().isItemEqual(addStack))
{
return null;
}
binInv.add(addStack);
return bin;
}
else {
return binInv.removeStack();
}
}
@Override
public int getRecipeSize()
{
return 0;
}
@Override
public ItemStack getRecipeOutput()
{
return null;
}
@SubscribeEvent
public void onCrafting(ItemCraftedEvent event)
{
if(getResult(event.craftMatrix) != null)
{
if(!isBin(event.crafting))
{
for(int i = 0; i < event.craftMatrix.getSizeInventory(); i++)
{
if(isBin(event.craftMatrix.getStackInSlot(i)))
{
ItemStack bin = event.craftMatrix.getStackInSlot(i);
InventoryBin inv = new InventoryBin(bin.copy());
int size = inv.getItemCount();
ItemStack testRemove = inv.removeStack();
bin.stackTagCompound.setInteger("newCount", size-(testRemove != null ? testRemove.stackSize : 0));
}
}
}
else {
int bin = -1;
int other = -1;
for(int i = 0; i < event.craftMatrix.getSizeInventory(); i++)
{
if(isBin(event.craftMatrix.getStackInSlot(i)))
{
bin = i;
}
else if(!isBin(event.craftMatrix.getStackInSlot(i)) && event.craftMatrix.getStackInSlot(i) != null)
{
other = i;
}
}
ItemStack binStack = event.craftMatrix.getStackInSlot(bin);
ItemStack otherStack = event.craftMatrix.getStackInSlot(other);
ItemStack testRemain = new InventoryBin(binStack.copy()).add(otherStack.copy());
if(testRemain != null && testRemain.stackSize > 0)
{
ItemStack proxy = new ItemStack(Mekanism.ItemProxy);
((ItemProxy)proxy.getItem()).setSavedItem(proxy, testRemain.copy());
event.craftMatrix.setInventorySlotContents(other, proxy);
}
else {
event.craftMatrix.setInventorySlotContents(other, null);
}
event.craftMatrix.setInventorySlotContents(bin, null);
}
}
}
}