package blusunrize.immersiveengineering.common.blocks.metal;
import blusunrize.immersiveengineering.api.Lib;
import blusunrize.immersiveengineering.common.Config.IEConfig;
import blusunrize.immersiveengineering.common.IEContent;
import blusunrize.immersiveengineering.common.blocks.BlockTypes_MetalsAll;
import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.IBlockOverlayText;
import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.IComparatorOverride;
import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.IPlayerInteraction;
import blusunrize.immersiveengineering.common.blocks.TileEntityMultiblockPart;
import blusunrize.immersiveengineering.common.blocks.wooden.BlockTypes_WoodenDecoration;
import blusunrize.immersiveengineering.common.util.Utils;
import net.minecraft.block.Block;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.RayTraceResult;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTank;
import net.minecraftforge.fluids.FluidUtil;
import net.minecraftforge.fluids.IFluidTank;
import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class TileEntitySheetmetalTank extends TileEntityMultiblockPart<TileEntitySheetmetalTank> implements IBlockOverlayText, IPlayerInteraction, IComparatorOverride
{
public FluidTank tank = new FluidTank(512000);
private int[] oldComps = new int[4];
private int masterCompOld;
// @Override
// public TileEntitySheetmetalTank master()
// {
// if(offset[0]==0&&offset[1]==0&&offset[2]==0)
// return null;
// TileEntity te = worldObj.getTileEntity(xCoord-offset[0], yCoord-offset[1], zCoord-offset[2]);
// return te instanceof TileEntitySheetmetalTank?(TileEntitySheetmetalTank)te : null;
// }
@Override
public String[] getOverlayText(EntityPlayer player, RayTraceResult mop, boolean hammer)
{
if(Utils.isFluidRelatedItemStack(player.getHeldItem(EnumHand.MAIN_HAND)))
{
TileEntitySheetmetalTank master = master();
FluidStack fs = master!=null?master.tank.getFluid():this.tank.getFluid();
String s = null;
if(fs!=null)
s = fs.getLocalizedName()+": "+fs.amount+"mB";
else
s = I18n.format(Lib.GUI+"empty");
return new String[]{s};
}
return null;
}
@Override
public boolean useNixieFont(EntityPlayer player, RayTraceResult mop)
{
return false;
}
@Override
public void update()
{
if(pos==4 && !worldObj.isRemote && worldObj.isBlockIndirectlyGettingPowered(getPos())>0)
for(int i=0; i<6; i++)
if(i!=1 && tank.getFluidAmount()>0)
{
EnumFacing f = EnumFacing.getFront(i);
int outSize = Math.min(144, tank.getFluidAmount());
FluidStack out = new FluidStack(tank.getFluid().getFluid(), outSize);
BlockPos outputPos = getPos().offset(f);
IFluidHandler output = FluidUtil.getFluidHandler(worldObj, outputPos, f.getOpposite());
if(output != null)
{
int accepted = output.fill(out, false);
if(accepted > 0)
{
int drained = output.fill(Utils.copyFluidStackWithAmount(out, Math.min(out.amount, accepted), false), true);
this.tank.drain(drained, true);
this.markContainingBlockForUpdate(null);
updateComparatorValuesPart2();
}
}
}
}
@Override
public void readCustomNBT(NBTTagCompound nbt, boolean descPacket)
{
super.readCustomNBT(nbt, descPacket);
tank.readFromNBT(nbt.getCompoundTag("tank"));
}
@Override
public void writeCustomNBT(NBTTagCompound nbt, boolean descPacket)
{
super.writeCustomNBT(nbt, descPacket);
NBTTagCompound tankTag = tank.writeToNBT(new NBTTagCompound());
nbt.setTag("tank", tankTag);
}
@Override
public float[] getBlockBounds()
{
if(pos==9)
return new float[]{.375f,0,.375f,.625f,1,.625f};
if(pos==0||pos==2||pos==6||pos==8)
return new float[]{.375f,0,.375f,.625f,1,.625f};
return new float[]{0,0,0,1,1,1};
}
@Override
public ItemStack getOriginalBlock()
{
return pos==0||pos==2||pos==6||pos==8?new ItemStack(IEContent.blockWoodenDecoration,1,BlockTypes_WoodenDecoration.FENCE.getMeta()):new ItemStack(IEContent.blockSheetmetal,1,BlockTypes_MetalsAll.IRON.getMeta());
}
@Override
public void disassemble()
{
super.invalidate();
if(formed && !worldObj.isRemote)
{
BlockPos startPos = this.getPos().add(-offset[0],-offset[1],-offset[2]);
if(!(offset[0]==0&&offset[1]==0&&offset[2]==0) && !(worldObj.getTileEntity(startPos) instanceof TileEntitySheetmetalTank))
return;
for(int yy=0;yy<=4;yy++)
for(int xx=-1;xx<=1;xx++)
for(int zz=-1;zz<=1;zz++)
{
ItemStack s = null;
TileEntity te = worldObj.getTileEntity(startPos.add(xx, yy, zz));
if(te instanceof TileEntitySheetmetalTank)
{
s = ((TileEntitySheetmetalTank)te).getOriginalBlock();
((TileEntitySheetmetalTank)te).formed=false;
}
if(startPos.add(xx, yy, zz).equals(getPos()))
s = this.getOriginalBlock();
if(s!=null && Block.getBlockFromItem(s.getItem())!=null)
{
if(startPos.add(xx, yy, zz).equals(getPos()))
worldObj.spawnEntityInWorld(new EntityItem(worldObj, getPos().getX()+.5,getPos().getY()+.5,getPos().getZ()+.5, s));
else
{
if(Block.getBlockFromItem(s.getItem())==IEContent.blockMetalMultiblock)
worldObj.setBlockToAir(startPos.add(xx, yy, zz));
worldObj.setBlockState(startPos.add(xx, yy, zz), Block.getBlockFromItem(s.getItem()).getStateFromMeta(s.getItemDamage()));
}
}
}
}
}
@Override
protected IFluidTank[] getAccessibleFluidTanks(EnumFacing side)
{
TileEntitySheetmetalTank master = master();
if(master!=null && (pos==4||pos==40))
return new FluidTank[]{master.tank};
return new FluidTank[0];
}
@Override
protected boolean canFillTankFrom(int iTank, EnumFacing side, FluidStack resource)
{
return pos==4||pos==40;
}
@Override
protected boolean canDrainTankFrom(int iTank, EnumFacing side)
{
return pos==4;
}
@Override
public boolean interact(EnumFacing side, EntityPlayer player, EnumHand hand, ItemStack heldItem, float hitX, float hitY, float hitZ)
{
TileEntitySheetmetalTank master = this.master();
if(master!=null)
{
FluidStack f = FluidUtil.getFluidContained(heldItem);
if(FluidUtil.interactWithFluidHandler(heldItem, master.tank, player))
{
this.updateMasterBlock(null, true);
return true;
}
}
return false;
}
@SideOnly(Side.CLIENT)
private AxisAlignedBB renderAABB;
@Override
@SideOnly(Side.CLIENT)
public AxisAlignedBB getRenderBoundingBox()
{
if(renderAABB==null)
if(pos==4)
renderAABB = new AxisAlignedBB(getPos().add(-1,0,-1), getPos().add(2,5,2));
else
renderAABB = new AxisAlignedBB(getPos(),getPos());
return renderAABB;
}
@Override
@SideOnly(Side.CLIENT)
public double getMaxRenderDistanceSquared()
{
return super.getMaxRenderDistanceSquared()* IEConfig.increasedTileRenderdistance;
}
@Override
public int getComparatorInputOverride()
{
if (pos==4)
return (15*tank.getFluidAmount())/tank.getCapacity();
TileEntitySheetmetalTank master = master();
if (offset[1]>=1&&offset[1]<=4&&master!=null)//4 layers of storage
{
FluidTank t = master.tank;
int layer = offset[1]-1;
int vol = t.getCapacity()/4;
int filled = t.getFluidAmount()-layer*vol;
int ret = Math.min(15, Math.max(0, (15*filled)/vol));
return ret;
}
return 0;
}
private void updateComparatorValuesPart1()
{
int vol = tank.getCapacity() / 4;
for (int i = 0; i < 4; i++)
{
int filled = tank.getFluidAmount() - i * vol;
oldComps[i] = Math.min(15, Math.max((15*filled)/vol, 0));
}
masterCompOld = (15*tank.getFluidAmount())/tank.getCapacity();
}
private void updateComparatorValuesPart2()
{
int vol = tank.getCapacity() / 6;
if ((15*tank.getFluidAmount())/tank.getCapacity()!=masterCompOld)
worldObj.notifyNeighborsOfStateChange(getPos(), getBlockType());
for(int i=0; i<4; i++)
{
int filled = tank.getFluidAmount() - i * vol;
int now = Math.min(15, Math.max((15*filled)/vol, 0));
if (now!=oldComps[i])
{
for(int x=-1; x<=1; x++)
for(int z=-1; z<=1; z++)
{
BlockPos pos = getPos().add(-offset[0]+x, -offset[1]+i+1, -offset[2]+z);
worldObj.notifyNeighborsOfStateChange(pos, worldObj.getBlockState(pos).getBlock());
}
}
}
}
}