package minefantasy.block.tileentity;
import java.util.Random;
import com.google.common.io.ByteArrayDataInput;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import minefantasy.MineFantasyBase;
import minefantasy.api.IMFCrafter;
import minefantasy.api.anvil.IHammer;
import minefantasy.api.cooking.FoodPrepRecipe;
import minefantasy.api.cooking.IUtensil;
import minefantasy.api.cooking.UtensilManager;
import minefantasy.item.ToolMaterialMedieval;
import minefantasy.item.tool.ItemKnifeMF;
import minefantasy.system.data_minefantasy;
import minefantasy.system.network.PacketManagerMF;
import minefantasy.system.network.PacketUserMF;
import net.minecraft.block.Block;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.item.crafting.FurnaceRecipes;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.network.packet.Packet;
import net.minecraft.tileentity.TileEntity;
public class TileEntityPrepBlock extends TileEntity implements IInventory, PacketUserMF, IMFCrafter
{
/**
* The first slot (0) is the item on board, the second (1) is the texture mask
*/
private ItemStack[] inv = new ItemStack[2];
private float time;
private String requiredUtensil = "";
private FoodPrepRecipe recipe;
public int direction;
private int progBar;
private Random rand = new Random();
public boolean displayGlint;
public TileEntityPrepBlock()
{
inv[1] = new ItemStack(Block.planks);
}
@Override
public void updateEntity()
{
if(worldObj != null && !worldObj.isRemote)
{
progBar = this.getScaledProg(100);
sendPacketToClients();
int id = 0;
int ss = 0;
int meta = 0;
if(inv[0] != null)
{
id = inv[0].itemID;
ss = inv[0].stackSize;
meta = inv[0].getItemDamage();
}
}
}
private void sendPacketToClients() {
int id = 0;
int meta = 0;
int enc = 0;
if(inv[0] != null)
{
id = inv[0].itemID;
meta = inv[0].getItemDamage();
enc = inv[0].isItemEnchanted() ? 1 : 0;
}
int id2 = 0;
int meta2 = 0;
if(inv[1] != null)
{
id2 = inv[1].itemID;
meta2 = inv[1].getItemDamage();
}
if(!worldObj.isRemote || FMLCommonHandler.instance().getSide().isServer())
{
try
{
Packet packet = PacketManagerMF.getPacketIntegerArray(this, new int[]{direction, id, meta, id2, meta2, enc, progBar});
FMLCommonHandler.instance().getMinecraftServerInstance().getConfigurationManager().sendPacketToAllPlayers(packet);
}
catch(NullPointerException e)
{
System.out.println("MineFantasy: Client connections lost");
}
}
}
public boolean interact(EntityPlayer user, boolean leftClk)
{
boolean use = true;
ItemStack held = user.getHeldItem();
if(!worldObj.isRemote && held != null && held.getItem() != null && held.getItem() instanceof IUtensil)//BUILD SURFACE
{
String type = ((IUtensil)held.getItem()).getType(held);
if(type.equalsIgnoreCase("mallet") && inv[0] != null && inv[0].getItem() instanceof ItemBlock)
{
held.damageItem(1, user);
worldObj.playSoundEffect(xCoord+0.5F, yCoord, zCoord+0.5F, data_minefantasy.sound("mallet_build"), 1.0F, 0.8F + rand.nextFloat()*0.2F);
inv[1] = inv[0].copy();
return true;
}
}
if(!worldObj.isRemote && inv[0] == null && !leftClk)//PUT ITEM
{
if(held != null)
{
inv[0] = held.copy();
inv[0].stackSize = 1;
if(!user.capabilities.isCreativeMode)
{
held.stackSize --;
time = 0;
if(held.stackSize <= 0)
{
held = null;
}
}
}
else
{
use = false;
}
}
else if(!worldObj.isRemote && UtensilManager.getTypeOfTool(held) == "Null" && !leftClk)//TAKE ITEM
{
if(!user.capabilities.isCreativeMode)
{
worldObj.spawnEntityInWorld(new EntityItem(worldObj, user.posX, user.posY, user.posZ, inv[0]));
}
time = 0;
inv[0] = null;
}
tryToCraft(held, user);
return use;
}
private void tryToCraft(ItemStack tool, EntityPlayer user)
{
recipe = FoodPrepRecipe.getRecipeFor(inv[0], tool);
boolean cook = false;
if(recipe != null)
{
if(tool.getItem() instanceof ItemKnifeMF)
{
if(((ItemKnifeMF)tool.getItem()).getMaterial() == ToolMaterialMedieval.DRAGONFORGE)
{
cook = true;
worldObj.spawnParticle("flame", xCoord+rand.nextFloat(), yCoord+0.2D, zCoord+rand.nextFloat(), 0, 0, 0);
}
}
if(requiredUtensil != UtensilManager.getTypeOfTool(tool))
{
time = 0;
requiredUtensil = UtensilManager.getTypeOfTool(tool);
}
float e = 1.0F;
if(tool.getItem() != null && tool.getItem() instanceof IUtensil)
{
e = ((IUtensil)tool.getItem()).getEfficiency(tool);
}
if(!worldObj.isRemote)
{
time += e;
tool.damageItem(1, user);
if(tool.getItemDamage() >= tool.getMaxDamage() && tool.stackSize <= 1)
{
user.renderBrokenItemStack(tool);
user.destroyCurrentEquippedItem();
}
worldObj.playSoundEffect(xCoord+0.5D, yCoord, zCoord+0.5D, recipe.prepSound, 1, 1);
}
if(inv != null && inv[0] != null)
{
worldObj.spawnParticle("iconcrack_" + inv[0].itemID, xCoord+rand.nextFloat(), yCoord+0.2D, zCoord+rand.nextFloat(), 0F, 0F, 0F);
}
if(!worldObj.isRemote && time >= recipe.time)
{
ItemStack result = recipe.output;
if(cook && result != null && FurnaceRecipes.smelting().getSmeltingResult(recipe.output) != null)
{
result = FurnaceRecipes.smelting().getSmeltingResult(recipe.output);
}
int ss = result.stackSize;
if(inv[0] != null)
{
ss *= inv[0].stackSize;
}
if(ss <= result.getMaxStackSize())
{
inv[0] = result.copy();
inv[0].stackSize = ss;
time = 0;
}
}
}
}
public void readFromNBT(NBTTagCompound nbt)
{
super.readFromNBT(nbt);
NBTTagList var2 = nbt.getTagList("Items");
this.inv = new ItemStack[this.getSizeInventory()];
for (int var3 = 0; var3 < var2.tagCount(); ++var3)
{
NBTTagCompound var4 = (NBTTagCompound)var2.tagAt(var3);
byte var5 = var4.getByte("Slot");
if (var5 >= 0 && var5 < this.inv.length)
{
this.inv[var5] = ItemStack.loadItemStackFromNBT(var4);
}
}
direction = nbt.getInteger("Dir");
time = nbt.getFloat("Time");
if(nbt.hasKey("Tool"))
{
requiredUtensil = nbt.getString("Tool");
}
}
/**
* Writes a tile entity to NBT.
*/
public void writeToNBT(NBTTagCompound nbt)
{
super.writeToNBT(nbt);
nbt.setFloat("Time", time);
if(requiredUtensil != null)
{
nbt.setString("Tool", requiredUtensil);
}
nbt.setInteger("Dir", direction);
NBTTagList var2 = new NBTTagList();
for (int var3 = 0; var3 < this.inv.length; ++var3)
{
if (this.inv[var3] != null)
{
NBTTagCompound var4 = new NBTTagCompound();
var4.setByte("Slot", (byte)var3);
this.inv[var3].writeToNBT(var4);
var2.appendTag(var4);
}
}
nbt.setTag("Items", var2);
}
@Override
public int getSizeInventory() {
return 2;
}
@Override
public ItemStack getStackInSlot(int i) {
return inv[i];
}
public ItemStack decrStackSize(int i, int j) {
if(inv[i] != null && inv[i].getItem() != null)
{
if(inv[i].getItem().hasContainerItem())
{
inv[i] = inv[i].getItem().getContainerItemStack(inv[i]);
return inv[i];
}
}
if (inv[i] != null)
{
if (inv[i].stackSize <= j)
{
ItemStack itemstack = inv[i];
inv[i] = null;
return itemstack;
}
ItemStack itemstack1 = inv[i].splitStack(j);
if (inv[i].stackSize == 0) {
inv[i] = null;
}
return itemstack1;
} else
{
return null;
}
}
@Override
public ItemStack getStackInSlotOnClosing(int i) {
return null;
}
@Override
public void setInventorySlotContents(int i, ItemStack itemstack)
{
inv[i] = itemstack;
}
@Override
public String getInvName()
{
return "Board";
}
@Override
public boolean isInvNameLocalized()
{
return true;
}
@Override
public int getInventoryStackLimit()
{
return 1;
}
@Override
public boolean isUseableByPlayer(EntityPlayer entityplayer)
{
return entityplayer.getDistance(xCoord, yCoord, zCoord) < 8;
}
@Override
public void openChest() {}
@Override
public void closeChest() {}
@Override
public boolean isItemValidForSlot(int i, ItemStack itemstack)
{
return false;
}
@Override
public void recievePacket(ByteArrayDataInput data)
{
direction = data.readInt();
int id = data.readInt();
int meta = data.readInt();
int id2 = data.readInt();
int meta2 = data.readInt();
int enc = data.readInt();
progBar = data.readInt();
if(worldObj != null && worldObj.isRemote)
{
inv[0] = new ItemStack(id, 1, meta);
if(blockChange(id2, meta2))
{
if(MineFantasyBase.isDebug())
System.out.println("Detected Benchtop tex change");
worldObj.markBlockForRenderUpdate(xCoord, yCoord, zCoord);
}
inv[1] = new ItemStack(id2, 1, meta2);
displayGlint = enc == 1;
}
}
private boolean blockChange(int id, int meta)
{
int id2 = 0;
int meta2 = 0;
if(inv[1] != null)
{
id2 = inv[1].itemID;
meta2 = inv[1].getItemDamage();
}
if(id != id2)return true;
if(meta != meta2)return true;
return false;
}
@Override
@SideOnly(Side.CLIENT)
public boolean shouldRenderCraftMetre()
{
return progBar > 0;
}
@Override
@SideOnly(Side.CLIENT)
public int getProgressBar(int i)
{
return (int)((float)i / 100F * (float)progBar);
}
public int getScaledProg(int i)
{
if(recipe == null)return -1;
return (int)((float)i / (float)recipe.time * (float)time);
}
@Override
public String getResultName()
{
return "";
}
@Override
@SideOnly(Side.CLIENT)
public void setTempResult(ItemStack item)
{
}
}