Package mekanism.common.recipe

Source Code of mekanism.common.recipe.BinRecipe

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);
      }
    }
  }
}
TOP

Related Classes of mekanism.common.recipe.BinRecipe

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.