package matteroverdrive.items;
import matteroverdrive.init.MatterOverdriveFluids;
import matteroverdrive.items.includes.MOItemEnergyContainer;
import matteroverdrive.util.MatterHelper;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import net.minecraftforge.common.util.Constants;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.IFluidHandler;
import java.text.DecimalFormat;
import java.util.List;
/**
* Created by Simeon on 1/9/2016.
*/
public class PortableDecomposer extends MOItemEnergyContainer
{
private int defaultMatter;
private float defaultMatterRatio;
public PortableDecomposer(String name,int capacity,int chargeSpeed,int defaultMatter,float defaultMatterRatio)
{
super(name,capacity,chargeSpeed,0);
this.defaultMatter = defaultMatter;
this.defaultMatterRatio = defaultMatterRatio;
}
@Override
public void addDetails(ItemStack itemstack, EntityPlayer player, List infos)
{
super.addDetails(itemstack,player,infos);
infos.add(String.format("%s/%s %s", DecimalFormat.getIntegerInstance().format(getMatter(itemstack)),getMaxMatter(itemstack),MatterHelper.MATTER_UNIT));
if (itemstack.getTagCompound() != null)
{
ItemStack s;
NBTTagList list = itemstack.getTagCompound().getTagList("Items", Constants.NBT.TAG_COMPOUND);
for (int i = 0;i < list.tagCount();i++)
{
s = ItemStack.loadItemStackFromNBT(list.getCompoundTagAt(i));
infos.add(EnumChatFormatting.GRAY + s.getDisplayName());
}
}
}
@Override
public boolean onItemUse(ItemStack itemStack, EntityPlayer entityPlayer, World world, int x, int y, int z, int side, float p_77648_8_, float p_77648_9_, float p_77648_10_)
{
if (world.getTileEntity(x,y,z) instanceof IFluidHandler)
{
IFluidHandler fluidHandler = (IFluidHandler)world.getTileEntity(x,y,z);
FluidStack fluidStack = new FluidStack(MatterOverdriveFluids.matterPlasma,getMatter(itemStack));
int filled = fluidHandler.fill(ForgeDirection.getOrientation(side),fluidStack,true);
setMatter(itemStack,Math.max(0,fluidStack.amount-filled));
return true;
}
return false;
}
public int getMatter(ItemStack itemStack)
{
if (itemStack.getTagCompound() != null)
{
return itemStack.getTagCompound().getInteger("Matter");
}
return 0;
}
public void setMatter(ItemStack itemStack,float matter)
{
if (itemStack.getTagCompound() == null)
itemStack.setTagCompound(new NBTTagCompound());
itemStack.getTagCompound().setFloat("Matter",matter);
}
public float getMaxMatter(ItemStack itemStack)
{
if (itemStack.getTagCompound() != null && itemStack.getTagCompound().hasKey("MaxMatter"))
{
return itemStack.getTagCompound().getFloat("MaxMatter");
}
return defaultMatter;
}
public boolean isStackListed(ItemStack decomposer,ItemStack itemStack)
{
if (decomposer.getTagCompound() != null && MatterHelper.containsMatter(itemStack))
{
NBTTagList stackList = decomposer.getTagCompound().getTagList("Items", Constants.NBT.TAG_COMPOUND);
for (int i = 0;i < stackList.tagCount();i++)
{
ItemStack s = ItemStack.loadItemStackFromNBT(stackList.getCompoundTagAt(i));
if (s.isItemEqual(itemStack) && ItemStack.areItemStackTagsEqual(s,itemStack))
{
return true;
}
}
}
return false;
}
public void addStackToList(ItemStack decomposer,ItemStack itemStack)
{
if (decomposer.getTagCompound() == null)
decomposer.setTagCompound(new NBTTagCompound());
NBTTagList list = decomposer.getTagCompound().getTagList("Items", Constants.NBT.TAG_COMPOUND);
if (MatterHelper.containsMatter(itemStack))
{
NBTTagCompound tagCompound = new NBTTagCompound();
itemStack.writeToNBT(tagCompound);
list.appendTag(tagCompound);
}
decomposer.getTagCompound().setTag("Items",list);
}
public void decomposeItem(ItemStack decomposer,ItemStack itemStack)
{
if (MatterHelper.containsMatter(itemStack) && isStackListed(decomposer,itemStack))
{
float matterFromItem = MatterHelper.getMatterAmountFromItem(itemStack) * defaultMatterRatio;
int energyForItem = MathHelper.ceiling_float_int(matterFromItem/defaultMatterRatio);
float freeMatter = getMaxMatter(decomposer) - getMatter(decomposer);
if (freeMatter > 0 && getEnergyStored(decomposer) > energyForItem)
{
int canTakeCount = (int)(freeMatter / matterFromItem);
int itemsTaken = Math.min(canTakeCount,itemStack.stackSize);
itemsTaken = Math.min(itemsTaken,getEnergyStored(decomposer)/energyForItem);
setEnergyStored(decomposer,getEnergyStored(decomposer)-(itemsTaken*energyForItem));
setMatter(decomposer,getMatter(decomposer)+itemsTaken*matterFromItem);
itemStack.stackSize = Math.max(0,itemStack.stackSize-itemsTaken);
}
}
}
}