package minefantasy.block.tileentity;
import java.util.Random;
import minefantasy.api.IMFCrafter;
import minefantasy.api.leatherwork.EnumToolType;
import minefantasy.api.tanner.LeathercuttingRecipes;
import minefantasy.api.tanner.TanningRecipes;
import minefantasy.system.network.PacketManagerMF;
import minefantasy.system.network.PacketUserMF;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.network.packet.Packet;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import com.google.common.io.ByteArrayDataInput;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.network.PacketDispatcher;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
/**
*
* @author Anonymous Productions
*
* Sources are provided for educational reasons.
* though small bits of code, or methods can be used in your own creations.
*/
public class TileEntityTanningRack extends TileEntity implements PacketUserMF, IMFCrafter, IInventory{
private int ticksExisted;
public int direction;
public float progress;
private ItemStack hungItem;
Random rand = new Random();
public TileEntityTanningRack() {
}
public boolean canTan()
{
return TanningRecipes.instance().getTanningResult(getHung()) != null;
}
public boolean canCut()
{
return LeathercuttingRecipes.instance().getCuttingResult(getHung()) != null;
}
public void setHung(ItemStack item)
{
hungItem = item;
}
public boolean use(EntityPlayer player, EnumToolType toolType, float quality)
{
if (canTan() && toolType == EnumToolType.KNIFE)
{
worldObj.playSoundEffect(xCoord+0.5, yCoord+0.5, zCoord+0.5, "step.cloth", 1.0F, 1.0F);
progress += quality;
if(progress >= getMaxProgress())
{
progress = 0.0F;
if(!worldObj.isRemote)
{
setHung(TanningRecipes.instance().getTanningResult(getHung()));
syncItem();
}
if(player.getHeldItem() != null)
{
player.getHeldItem().damageItem(1, player);
}
return true;
}
}
if (canCut() && toolType == EnumToolType.CUTTER)
{
worldObj.playSoundEffect(xCoord+0.5, yCoord+0.5, zCoord+0.5, "mob.sheep.shear", 0.5F, 0.65F);
progress += quality;
if(progress >= getMaxProgress())
{
progress = 0.0F;
if(!worldObj.isRemote)
{
int rs;
ItemStack result = LeathercuttingRecipes.instance().getCuttingResult(getHung()).copy();
rs = result.stackSize * hungItem.stackSize;
setHung(result);
hungItem.stackSize = rs;
this.retrieveItem(player);
syncItem();
}
if(player.getHeldItem() != null)
{
player.getHeldItem().damageItem(1, player);
}
return true;
}
}
return false;
}
private float getMaxProgress()
{
return 50F;
}
@Override
public void updateEntity()
{
super.updateEntity();
ticksExisted ++;
sendPacketToClients();
if(ticksExisted % 20 == 0)
{
syncItem();
}
if(!canCraft())
{
progress = 0.0F;
}
}
public boolean canHang()
{
return getHung() == null;
}
public void hang(ItemStack item)
{
setHung(item);
Random rand = new Random();
worldObj.playSoundEffect(xCoord, yCoord, zCoord, "mob.horse.leather", rand .nextFloat() + 1.5F, (rand.nextFloat()*0.4F) + 0.8F);
syncItem();
}
public ItemStack getHung()
{
return hungItem;
}
/**
* Writes a tile entity to NBT.
*/
public void writeToNBT(NBTTagCompound tag)
{
super.writeToNBT(tag);
if(getHung() != null)
{
NBTTagCompound slot = new NBTTagCompound();
this.hungItem.writeToNBT(slot);
tag.setTag("Hung", slot);
}
tag.setInteger("Dir", direction);
tag.setFloat("Progress", progress);
}
public void readFromNBT(NBTTagCompound tag)
{
super.readFromNBT(tag);
if(tag.hasKey("Hung"))
{
hungItem = ItemStack.loadItemStackFromNBT((NBTTagCompound) tag.getTag("Hung"));
}
direction = tag.getInteger("Dir");
progress = tag.getFloat("Progress");
}
private void sendPacketToClients() {
if(!worldObj.isRemote)
{
try
{
Packet packet = PacketManagerMF.getPacketIntegerArray(this, new int[]{direction, (int)progress*100});
FMLCommonHandler.instance().getMinecraftServerInstance().getConfigurationManager().sendPacketToAllPlayers(packet);
} catch(NullPointerException e)
{
System.out.println("MineFantasy: Lost Client connection");
}
}
}
@Override
public void recievePacket(ByteArrayDataInput data)
{
direction = data.readInt();
int p = data.readInt();
progress = (float)p / 100F;
}
public boolean canHang(ItemStack itemstack)
{
return TanningRecipes.instance().getTanningResult(itemstack)!= null ||
LeathercuttingRecipes.instance().getCuttingResult(itemstack)!= null;
}
public void syncItem()
{
if(!worldObj.isRemote)
{
Packet packet = PacketManagerMF.getPacketItemStackArray(this, 0, getHung());
try
{
FMLCommonHandler.instance().getMinecraftServerInstance().getConfigurationManager().sendPacketToAllPlayers(packet);
} catch(NullPointerException e)
{
System.out.println("MineFantasy: Client connection lost");
return;
}
}
}
@Override
public int getSizeInventory() {
return 1;
}
@Override
public ItemStack getStackInSlot(int i) {
return getHung();
}
@Override
public ItemStack decrStackSize(int i, int j) {
getHung().stackSize --;
if(getHung().stackSize <= 0)
{
setHung(null);
}
return getHung();
}
@Override
public ItemStack getStackInSlotOnClosing(int i) {
return null;
}
@Override
public void setInventorySlotContents(int i, ItemStack itemstack)
{
setHung(itemstack);
}
@Override
public String getInvName()
{
return null;
}
@Override
public boolean isInvNameLocalized()
{
return false;
}
@Override
public int getInventoryStackLimit()
{
return 1;
}
@Override
public boolean isUseableByPlayer(EntityPlayer entityplayer)
{
return false;
}
@Override
public void openChest() {}
@Override
public void closeChest() {}
@Override
public boolean isItemValidForSlot(int i, ItemStack itemstack)
{
return false;
}
public void retrieveItem(EntityPlayer player)
{
if(player.worldObj.isRemote)
{
return;
}
double x = player.posX;
double y = player.posY;
double z = player.posZ;
EntityItem drop = new EntityItem(worldObj, x+0.5D, y+0.5D, z+0.5D, getHung().copy());
worldObj.spawnEntityInWorld(drop);
hang(null);
}
private boolean canCraft()
{
return canTan() || canCut();
}
@Override
@SideOnly(Side.CLIENT)
public boolean shouldRenderCraftMetre()
{
return canCraft();
}
@Override
@SideOnly(Side.CLIENT)
public int getProgressBar(int i)
{
return (int)((float)i / 50F * progress);
}
@Override
public String getResultName()
{
return "";
}
@Override
@SideOnly(Side.CLIENT)
public void setTempResult(ItemStack item)
{
}
}