package com.jaquadro.minecraft.gardenstuff.block.tile;
import com.jaquadro.minecraft.gardenstuff.block.BlockBloomeryFurnace;
import com.jaquadro.minecraft.gardenstuff.core.ModBlocks;
import com.jaquadro.minecraft.gardenstuff.core.ModItems;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.Constants;
public class TileEntityBloomeryFurnace extends TileEntity implements ISidedInventory
{
private static final int SLOT_PRIMARY = 0;
private static final int SLOT_SECONDARY = 1;
private static final int SLOT_FUEL = 2;
private static final int SLOT_OUTPUT = 3;
private static final int[] slots = new int[] { 0, 1, 2, 3 };
private ItemStack[] furnaceItemStacks = new ItemStack[4];
private String customName;
public int furnaceBurnTime;
public int currentItemBurnTime;
public int furnaceCookTime;
@Override
public void readFromNBT (NBTTagCompound tag) {
super.readFromNBT(tag);
NBTTagList list = tag.getTagList("Items", Constants.NBT.TAG_COMPOUND);
furnaceItemStacks = new ItemStack[getSizeInventory()];
for (int i = 0, n = list.tagCount(); i < n; i++) {
NBTTagCompound itemTag = list.getCompoundTagAt(i);
byte slot = itemTag.getByte("Slot");
if (slot >= 0 && slot < furnaceItemStacks.length)
furnaceItemStacks[slot] = ItemStack.loadItemStackFromNBT(itemTag);
}
furnaceBurnTime = tag.getShort("BurnTime");
furnaceCookTime = tag.getShort("CookTime");
currentItemBurnTime = getItemBurnTime(furnaceItemStacks[SLOT_FUEL]);
if (tag.hasKey("CustomName", Constants.NBT.TAG_STRING))
customName = tag.getString("CustomName");
}
@Override
public void writeToNBT (NBTTagCompound tag) {
super.writeToNBT(tag);
tag.setShort("BurnTime", (short)furnaceBurnTime);
tag.setShort("CookTime", (short)furnaceCookTime);
NBTTagList list = new NBTTagList();
for (int i = 0, n = furnaceItemStacks.length; i < n; i++) {
if (furnaceItemStacks[i] != null) {
NBTTagCompound itemTag = new NBTTagCompound();
itemTag.setByte("Slot", (byte)i);
furnaceItemStacks[i].writeToNBT(itemTag);
list.appendTag(itemTag);
}
}
tag.setTag("Items", list);
if (hasCustomInventoryName())
tag.setString("CustomName", customName);
}
@SideOnly(Side.CLIENT)
public int getCookProgressScaled (int ceiling) {
return ceiling * furnaceCookTime / 200;
}
@SideOnly(Side.CLIENT)
public int getBurnTimeRemainingScaled (int ceiling) {
if (currentItemBurnTime == 0)
currentItemBurnTime = 200;
return ceiling * furnaceBurnTime / currentItemBurnTime;
}
public boolean isBurning () {
return furnaceBurnTime > 0;
}
public void setCustomName (String name) {
customName = name;
}
@Override
public void updateEntity () {
boolean hasPrevBurnTime = furnaceBurnTime > 0;
boolean isDirty = false;
if (furnaceBurnTime > 0)
furnaceBurnTime--;
if (!worldObj.isRemote) {
if (furnaceBurnTime != 0 || (furnaceItemStacks[SLOT_FUEL] != null && furnaceItemStacks[SLOT_PRIMARY] != null && furnaceItemStacks[SLOT_SECONDARY] != null)) {
if (furnaceBurnTime == 0 && canSmelt()) {
currentItemBurnTime = furnaceBurnTime = getItemBurnTime(furnaceItemStacks[SLOT_FUEL]);
if (furnaceBurnTime > 0) {
isDirty = true;
if (furnaceItemStacks[SLOT_FUEL] != null) {
furnaceItemStacks[SLOT_FUEL].stackSize--;
if (furnaceItemStacks[SLOT_FUEL].stackSize == 0)
furnaceItemStacks[SLOT_FUEL] = furnaceItemStacks[SLOT_FUEL].getItem().getContainerItem(furnaceItemStacks[SLOT_FUEL]);
}
}
}
if (isBurning() && canSmelt()) {
furnaceCookTime++;
if (furnaceCookTime == 200) {
furnaceCookTime = 0;
smeltItem();
isDirty = true;
}
}
else
furnaceCookTime = 0;
}
if (hasPrevBurnTime != furnaceBurnTime > 0) {
isDirty = true;
BlockBloomeryFurnace.updateFurnaceBlockState(worldObj, xCoord, yCoord, zCoord, furnaceBurnTime > 0);
}
}
if (isDirty)
markDirty();
}
private boolean canSmelt () {
if (furnaceItemStacks[SLOT_PRIMARY] == null || furnaceItemStacks[SLOT_SECONDARY] == null)
return false;
if (!isItemPrimaryInput(furnaceItemStacks[SLOT_PRIMARY]))
return false;
if (!isItemSecondaryInput(furnaceItemStacks[SLOT_SECONDARY]))
return false;
ItemStack itemOutput = new ItemStack(ModItems.wroughtIronIngot);
if (furnaceItemStacks[SLOT_OUTPUT] == null)
return true;
if (!furnaceItemStacks[SLOT_OUTPUT].isItemEqual(itemOutput))
return false;
int result = furnaceItemStacks[SLOT_OUTPUT].stackSize + itemOutput.stackSize;
return result <= getInventoryStackLimit() && result <= furnaceItemStacks[SLOT_OUTPUT].getMaxStackSize();
}
public void smeltItem () {
if (!canSmelt())
return;
ItemStack itemOutput = new ItemStack(ModItems.wroughtIronIngot);
if (furnaceItemStacks[SLOT_OUTPUT] == null)
furnaceItemStacks[SLOT_OUTPUT] = itemOutput.copy();
else if (furnaceItemStacks[SLOT_OUTPUT].getItem() == itemOutput.getItem())
furnaceItemStacks[SLOT_OUTPUT].stackSize += itemOutput.stackSize;
furnaceItemStacks[SLOT_PRIMARY].stackSize--;
furnaceItemStacks[SLOT_SECONDARY].stackSize--;
if (furnaceItemStacks[SLOT_PRIMARY].stackSize <= 0)
furnaceItemStacks[SLOT_PRIMARY] = null;
if (furnaceItemStacks[SLOT_SECONDARY].stackSize <= 0)
furnaceItemStacks[SLOT_SECONDARY] = null;
}
public static int getItemBurnTime (ItemStack stack) {
if (stack == null)
return 0;
Item item = stack.getItem();
if (item instanceof ItemBlock) {
Block block = Block.getBlockFromItem(item);
if (block == ModBlocks.stoneBlock && stack.getItemDamage() == 0)
return ModBlocks.stoneBlock.getBurnTime(stack);
}
if (item == Items.coal && stack.getItemDamage() == 1)
return 1600;
return 0;
}
public static boolean isItemFuel (ItemStack stack) {
return getItemBurnTime(stack) > 0;
}
public static boolean isItemPrimaryInput (ItemStack stack) {
if (stack == null)
return false;
if (stack.getItem() == Items.iron_ingot)
return true;
if (stack.getItem() == Item.getItemFromBlock(Blocks.iron_ore))
return true;
return false;
}
public static boolean isItemSecondaryInput (ItemStack stack) {
if (stack == null)
return false;
if (stack.getItem() == Item.getItemFromBlock(Blocks.sand))
return true;
return false;
}
@Override
public int[] getAccessibleSlotsFromSide (int side) {
return slots;
}
@Override
public boolean canInsertItem (int slot, ItemStack stack, int side) {
return isItemValidForSlot(slot, stack);
}
@Override
public boolean canExtractItem (int slot, ItemStack stack, int side) {
return slot == SLOT_OUTPUT;
}
@Override
public int getSizeInventory () {
return furnaceItemStacks.length;
}
@Override
public ItemStack getStackInSlot (int slot) {
return furnaceItemStacks[slot];
}
@Override
public ItemStack decrStackSize (int slot, int count) {
if (furnaceItemStacks[slot] != null) {
if (furnaceItemStacks[slot].stackSize <= count) {
ItemStack stack = furnaceItemStacks[slot];
furnaceItemStacks[slot] = null;
return stack;
}
else {
ItemStack stack = furnaceItemStacks[slot].splitStack(count);
if (furnaceItemStacks[slot].stackSize == 0)
furnaceItemStacks[slot] = null;
return stack;
}
}
return null;
}
@Override
public ItemStack getStackInSlotOnClosing (int slot) {
return null;
}
@Override
public void setInventorySlotContents (int slot, ItemStack stack) {
furnaceItemStacks[slot] = stack;
if (stack != null && stack.stackSize > getInventoryStackLimit())
stack.stackSize = getInventoryStackLimit();
}
@Override
public String getInventoryName () {
return hasCustomInventoryName() ? customName : "container.gardenstuff.bloomeryFurnace";
}
@Override
public boolean hasCustomInventoryName () {
return customName != null && customName.length() > 0;
}
@Override
public int getInventoryStackLimit () {
return 64;
}
@Override
public boolean isUseableByPlayer (EntityPlayer player) {
return worldObj.getTileEntity(xCoord, yCoord, zCoord) == this && player.getDistanceSq(xCoord + .5, yCoord + .5, zCoord + .5) <= 64;
}
@Override
public void openInventory () { }
@Override
public void closeInventory () { }
@Override
public boolean isItemValidForSlot (int slot, ItemStack stack) {
if (slot == SLOT_OUTPUT)
return false;
if (slot == SLOT_FUEL)
return isItemFuel(stack);
if (slot == SLOT_PRIMARY)
return isItemPrimaryInput(stack);
if (slot == SLOT_SECONDARY)
return isItemSecondaryInput(stack);
return false;
}
}