package micdoodle8.mods.galacticraft.core.tile;
import micdoodle8.mods.galacticraft.api.recipe.CircuitFabricatorRecipes;
import micdoodle8.mods.galacticraft.core.GCItems;
import micdoodle8.mods.galacticraft.core.energy.item.ItemElectricBase;
import micdoodle8.mods.galacticraft.core.energy.tile.TileBaseElectricBlockWithInventory;
import micdoodle8.mods.galacticraft.core.items.ItemBasic;
import micdoodle8.mods.galacticraft.core.util.ConfigManagerCore;
import micdoodle8.mods.galacticraft.core.util.GCCoreUtil;
import micdoodle8.mods.galacticraft.planets.mars.blocks.BlockMachineMars;
import micdoodle8.mods.miccore.Annotations.NetworkedField;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.IChatComponent;
import net.minecraftforge.fml.relauncher.Side;
import java.util.ArrayList;
import java.util.Arrays;
public class TileEntityCircuitFabricator extends TileBaseElectricBlockWithInventory implements ISidedInventory
{
public static final int PROCESS_TIME_REQUIRED = 300;
@NetworkedField(targetSide = Side.CLIENT)
public int processTicks = 0;
private ItemStack producingStack = null;
private long ticks;
private ItemStack[] containingItems = new ItemStack[7];
public TileEntityCircuitFabricator()
{
this.storage.setMaxExtract(ConfigManagerCore.hardMode ? 40 : 20);
}
@Override
public void update()
{
super.update();
this.updateInput();
if (!this.worldObj.isRemote)
{
boolean updateInv = false;
if (this.hasEnoughEnergyToRun)
{
if (this.canCompress())
{
++this.processTicks;
if (this.processTicks >= this.getProcessTimeRequired())
{
this.worldObj.playSoundEffect(this.getPos().getX(), this.getPos().getY(), this.getPos().getZ(), "random.anvil_land", 0.2F, 0.5F);
this.processTicks = 0;
this.compressItems();
updateInv = true;
}
}
else
{
this.processTicks = 0;
}
}
else
{
this.processTicks = 0;
}
if (updateInv)
{
this.markDirty();
}
}
this.ticks++;
}
public int getProcessTimeRequired()
{
return TileEntityCircuitFabricator.PROCESS_TIME_REQUIRED * 2 / (1 + this.poweredByTierGC);
}
public void updateInput()
{
this.producingStack = CircuitFabricatorRecipes.getOutputForInput(Arrays.copyOfRange(this.containingItems, 1, 6));
}
private boolean canCompress()
{
ItemStack itemstack = this.producingStack;
if (itemstack == null)
{
return false;
}
if (this.containingItems[6] == null)
{
return true;
}
if (this.containingItems[6] != null && !this.containingItems[6].isItemEqual(itemstack))
{
return false;
}
int result = this.containingItems[6] == null ? 0 : this.containingItems[6].stackSize + itemstack.stackSize;
return result <= this.getInventoryStackLimit() && result <= itemstack.getMaxStackSize();
}
public void compressItems()
{
if (this.canCompress())
{
ItemStack resultItemStack = this.producingStack.copy();
if (ConfigManagerCore.quickMode)
{
if (resultItemStack.getItem() == GCItems.basicItem)
{
if (resultItemStack.getItemDamage() == ItemBasic.WAFER_BASIC)
{
resultItemStack.stackSize = 5;
}
else if (resultItemStack.getItemDamage() == ItemBasic.WAFER_ADVANCED)
{
resultItemStack.stackSize = 2;
}
}
}
if (this.containingItems[6] == null)
{
this.containingItems[6] = resultItemStack;
}
else if (this.containingItems[6].isItemEqual(resultItemStack))
{
if (this.containingItems[6].stackSize + resultItemStack.stackSize > 64)
{
for (int i = 0; i < this.containingItems[6].stackSize + resultItemStack.stackSize - 64; i++)
{
float var = 0.7F;
double dx = this.worldObj.rand.nextFloat() * var + (1.0F - var) * 0.5D;
double dy = this.worldObj.rand.nextFloat() * var + (1.0F - var) * 0.5D;
double dz = this.worldObj.rand.nextFloat() * var + (1.0F - var) * 0.5D;
EntityItem entityitem = new EntityItem(this.worldObj, this.getPos().getX() + dx, this.getPos().getY() + dy, this.getPos().getZ() + dz, new ItemStack(resultItemStack.getItem(), 1, resultItemStack.getItemDamage()));
entityitem.setPickupDelay(10);
this.worldObj.spawnEntityInWorld(entityitem);
}
this.containingItems[6].stackSize = 64;
}
else
{
this.containingItems[6].stackSize += resultItemStack.stackSize;
}
}
}
for (int i = 1; i < 6; i++)
{
this.decrStackSize(i, 1);
}
}
@Override
public void readFromNBT(NBTTagCompound par1NBTTagCompound)
{
super.readFromNBT(par1NBTTagCompound);
this.processTicks = par1NBTTagCompound.getInteger("smeltingTicks");
this.containingItems = this.readStandardItemsFromNBT(par1NBTTagCompound);
}
@Override
public void writeToNBT(NBTTagCompound par1NBTTagCompound)
{
super.writeToNBT(par1NBTTagCompound);
par1NBTTagCompound.setInteger("smeltingTicks", this.processTicks);
this.writeStandardItemsToNBT(par1NBTTagCompound);
}
@Override
protected ItemStack[] getContainingItems()
{
return this.containingItems;
}
@Override
public String getName()
{
return GCCoreUtil.translate("tile.machine2.5.name");
}
@Override
public boolean hasCustomName()
{
return false;
}
@Override
public IChatComponent getDisplayName()
{
return null;
}
@Override
public boolean isItemValidForSlot(int slotID, ItemStack itemStack)
{
if (slotID == 0)
{
return itemStack != null && ItemElectricBase.isElectricItem(itemStack.getItem());
}
if (slotID > 5)
{
return false;
}
ArrayList<ItemStack> list = CircuitFabricatorRecipes.slotValidItems.get(slotID - 1);
for (ItemStack test : list)
{
if (test.isItemEqual(itemStack))
{
return true;
}
}
return false;
}
@Override
public int[] getSlotsForFace(EnumFacing side)
{
if (side == EnumFacing.UP)
{
return new int[] { 6 };
}
//Offer whichever silicon slot has less silicon
boolean siliconFlag = this.containingItems[2] != null && (this.containingItems[3] == null || this.containingItems[3].stackSize < this.containingItems[2].stackSize);
return siliconFlag ? new int[] { 0, 1, 3, 4, 5 } : new int[] { 0, 1, 2, 4, 5 };
}
@Override
public boolean canInsertItem(int slotID, ItemStack par2ItemStack, EnumFacing par3)
{
return slotID < 6 && this.isItemValidForSlot(slotID, par2ItemStack);
}
@Override
public boolean canExtractItem(int slotID, ItemStack par2ItemStack, EnumFacing par3)
{
return slotID == 6;
}
@Override
public boolean shouldUseEnergy()
{
return this.processTicks > 0;
}
@Override
public EnumFacing getFront()
{
return this.worldObj.getBlockState(getPos()).getValue(BlockMachineMars.FACING);
}
@Override
public EnumFacing getElectricInputDirection()
{
return getFront().rotateY();
}
}