package minefantasy.mf2.block.tileentity.blastfurnace;
import java.util.Random;
import minefantasy.mf2.MineFantasyII;
import minefantasy.mf2.api.MineFantasyAPI;
import minefantasy.mf2.api.refine.BlastFurnaceRecipes;
import minefantasy.mf2.api.refine.ISmokeCarrier;
import minefantasy.mf2.api.refine.SmokeMechanics;
import minefantasy.mf2.block.list.BlockListMF;
import minefantasy.mf2.item.list.ComponentListMF;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Items;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.oredict.OreDictionary;
public class TileEntityBlastFC extends TileEntity implements IInventory, ISidedInventory, ISmokeCarrier
{
protected ItemStack[] items = new ItemStack[2];
protected int smokeStorage;
public int ticksExisted;
public boolean isBuilt = false;
public int fireTime;
protected Random rand = new Random();
@Override
public void updateEntity()
{
super.updateEntity();
++ticksExisted;
int dropFrequency = 5;
if(!worldObj.isRemote && ticksExisted % dropFrequency == 0)
{
TileEntity neighbour = worldObj.getTileEntity(xCoord, yCoord-1, zCoord);
if(neighbour != null && neighbour instanceof TileEntityBlastFC && !(neighbour instanceof TileEntityBlastFH))
{
interact((TileEntityBlastFC)neighbour);
}
}
if(ticksExisted % 200 == 0)
{
updateBuild();
}
if(smokeStorage > 0)
{
SmokeMechanics.emitSmokeFromCarrier(worldObj, xCoord, yCoord, zCoord, this, 5);
}
if(!worldObj.isRemote && smokeStorage > getMaxSmokeStorage() && rand.nextInt(1000) == 0)
{
worldObj.newExplosion(null, xCoord+0.5D, yCoord+0.5D, zCoord+0.5D, 5F, true, true);
}
}
protected void interact(TileEntityBlastFC tile)
{
if(!tile.isBuilt)return;
for(int a = 0; a < getSizeInventory(); a++)
{
ItemStack mySlot = getStackInSlot(a);
if(mySlot != null && canShare(mySlot, a))
{
ItemStack theirSlot = tile.getStackInSlot(a);
if(theirSlot == null)
{
ItemStack copy = mySlot.copy();
copy.stackSize = 1;
tile.setInventorySlotContents(a, copy);
this.decrStackSize(a, 1);
}
else if(theirSlot.isItemEqual(mySlot))
{
if((theirSlot.stackSize) < getMaxStackSizeForDistribute())
{
theirSlot.stackSize++;
this.decrStackSize(a, 1);
tile.setInventorySlotContents(a, theirSlot);
}
}
}
}
}
private boolean canShare(ItemStack mySlot, int a)
{
if(a == 1)return isInput(mySlot);
return isCoal(mySlot);
}
public void updateBuild()
{
isBuilt = getIsBuilt();
}
protected boolean getIsBuilt()
{
return (isFirebrick(-1, 0, 0) && isFirebrick(1, 0, 0) && isFirebrick(0, 0, -1) && isFirebrick(0, 0, 1));
}
protected boolean isFirebrick(int x, int y, int z)
{
Block block = worldObj.getBlock(xCoord+x, yCoord+y, zCoord+z);
if(block != null)
{
return block == BlockListMF.firebricks;
}
return false;
}
protected boolean isAir(int x, int y, int z)
{
return !worldObj.isBlockNormalCubeDefault(xCoord+x, yCoord+y, zCoord+z, false);
}
private int getMaxStackSizeForDistribute()
{
return 1;
}
@Override
public void writeToNBT(NBTTagCompound nbt)
{
super.writeToNBT(nbt);
nbt.setInteger("fireTime", fireTime);
nbt.setBoolean("isBuilt", isBuilt);
nbt.setInteger("ticksExisted", ticksExisted);
nbt.setInteger("StoredSmoke", smokeStorage);
NBTTagList savedItems = new NBTTagList();
for (int i = 0; i < this.items.length; ++i)
{
if (this.items[i] != null)
{
NBTTagCompound savedSlot = new NBTTagCompound();
savedSlot.setByte("Slot", (byte)i);
this.items[i].writeToNBT(savedSlot);
savedItems.appendTag(savedSlot);
}
}
nbt.setTag("Items", savedItems);
}
@Override
public void readFromNBT(NBTTagCompound nbt)
{
super.readFromNBT(nbt);
fireTime = nbt.getInteger("fireTime");
isBuilt = nbt.getBoolean("isBuilt");
ticksExisted = nbt.getInteger("ticksExisted");
smokeStorage = nbt.getInteger("StoredSmoke");
NBTTagList savedItems = nbt.getTagList("Items", 10);
this.items = new ItemStack[this.getSizeInventory()];
for (int i = 0; i < savedItems.tagCount(); ++i)
{
NBTTagCompound savedSlot = savedItems.getCompoundTagAt(i);
byte slotNum = savedSlot.getByte("Slot");
if (slotNum >= 0 && slotNum < this.items.length)
{
this.items[slotNum] = ItemStack.loadItemStackFromNBT(savedSlot);
}
}
}
//INVENTORY
public void onInventoryChanged()
{
}
@Override
public int getSizeInventory()
{
return items.length;
}
@Override
public ItemStack getStackInSlot(int slot)
{
return items[slot];
}
@Override
public ItemStack decrStackSize(int slot, int num)
{
onInventoryChanged();
if (this.items[slot] != null)
{
ItemStack itemstack;
if (this.items[slot].stackSize <= num)
{
itemstack = this.items[slot];
this.items[slot] = null;
return itemstack;
}
else
{
itemstack = this.items[slot].splitStack(num);
if (this.items[slot].stackSize == 0)
{
this.items[slot] = null;
}
return itemstack;
}
}
else
{
return null;
}
}
@Override
public ItemStack getStackInSlotOnClosing(int slot)
{
return items[slot];
}
@Override
public void setInventorySlotContents(int slot, ItemStack item)
{
onInventoryChanged();
items[slot] = item;
}
@Override
public String getInventoryName()
{
return "gui.bombcraftmf.name";
}
@Override
public boolean hasCustomInventoryName()
{
return false;
}
@Override
public int getInventoryStackLimit()
{
return 64;
}
@Override
public boolean isUseableByPlayer(EntityPlayer user)
{
return user.getDistance(xCoord+0.5D, yCoord+0.5D, zCoord+0.5D) < 8D;
}
@Override
public void openInventory()
{
}
@Override
public void closeInventory()
{
}
@Override
public boolean isItemValidForSlot(int slot, ItemStack item)
{
if(slot == 0)
{
return isCoal(item);
}
return isInput(item);
}
public static boolean isCoal(ItemStack item)
{
return MineFantasyAPI.isCarbon(item);
}
public static boolean isFlux(ItemStack item)
{
return true;
}
public static boolean isInput(ItemStack item)
{
return getResult(item) != null;
}
protected static ItemStack getResult(ItemStack input)
{
if(BlastFurnaceRecipes.smelting().getSmeltingResult(input) != null)
{
return BlastFurnaceRecipes.smelting().getSmeltingResult(input).copy();
}
return null;
}
@Override
public int[] getAccessibleSlotsFromSide(int side)
{
return side == 1 ? new int[]{0, 1} : new int[]{};
}
@Override
public boolean canInsertItem(int slot, ItemStack item, int side)
{
return isItemValidForSlot(slot, item);
}
@Override
public boolean canExtractItem(int slot, ItemStack item, int side)
{
return false;
}
@Override
public int getSmokeValue()
{
return smokeStorage;
}
@Override
public void setSmokeValue(int smoke)
{
smokeStorage = smoke;
}
@Override
public int getMaxSmokeStorage()
{
return 10;
}
@Override
public boolean canAbsorbIndirect()
{
return false;
}
}