package pneumaticCraft.common.tileentity;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.block.Block;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTank;
import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler;
import pneumaticCraft.common.block.Blockss;
import pneumaticCraft.common.item.ItemMachineUpgrade;
import pneumaticCraft.common.network.DescSynced;
import pneumaticCraft.common.util.FluidUtils;
import pneumaticCraft.common.util.IOHelper;
import pneumaticCraft.lib.PneumaticValues;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class TileEntityLiquidHopper extends TileEntityOmnidirectionalHopper implements IFluidHandler{
@DescSynced
private final FluidTank tank = new FluidTank(PneumaticValues.NORMAL_TANK_CAPACITY);
public TileEntityLiquidHopper(){
setUpgradeSlots(0, 1, 2, 3);
}
@Override
protected int getInvSize(){
return 4;
}
@Override
public String getInventoryName(){
return Blockss.liquidHopper.getUnlocalizedName();
}
@Override
public int[] getAccessibleSlotsFromSide(int var1){
return new int[]{0, 1, 2, 3};
}
@Override
protected boolean exportItem(int maxItems){
ForgeDirection dir = ForgeDirection.getOrientation(getBlockMetadata());
if(tank.getFluid() != null) {
TileEntity neighbor = IOHelper.getNeighbor(this, dir);
if(neighbor instanceof IFluidHandler) {
IFluidHandler fluidHandler = (IFluidHandler)neighbor;
if(fluidHandler.canFill(dir.getOpposite(), tank.getFluid().getFluid())) {
FluidStack fluid = tank.getFluid().copy();
fluid.amount = Math.min(maxItems * 100, tank.getFluid().amount - (leaveMaterial ? 1000 : 0));
if(fluid.amount > 0) {
tank.getFluid().amount -= fluidHandler.fill(dir.getOpposite(), fluid, true);
if(tank.getFluidAmount() <= 0) tank.setFluid(null);
return true;
}
}
}
}
if(worldObj.isAirBlock(xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ)) {
for(EntityItem entity : getNeighborItems(this, dir)) {
if(!entity.isDead) {
List<ItemStack> returnedItems = new ArrayList<ItemStack>();
if(FluidUtils.tryExtractingLiquid(this, entity.getEntityItem(), returnedItems)) {
if(entity.getEntityItem().stackSize <= 0) entity.setDead();
for(ItemStack stack : returnedItems) {
EntityItem item = new EntityItem(worldObj, entity.posX, entity.posY, entity.posZ, stack);
item.motionX = entity.motionX;
item.motionY = entity.motionY;
item.motionZ = entity.motionZ;
worldObj.spawnEntityInWorld(item);
}
return true;
}
}
}
}
if(getUpgrades(ItemMachineUpgrade.UPGRADE_DISPENSER_DAMAGE) > 0) {
if(worldObj.isAirBlock(xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ)) {
FluidStack extractedFluid = drain(ForgeDirection.UNKNOWN, 1000, false);
if(extractedFluid != null && extractedFluid.amount == 1000) {
Block fluidBlock = extractedFluid.getFluid().getBlock();
if(fluidBlock != null) {
drain(ForgeDirection.UNKNOWN, 1000, true);
worldObj.setBlock(xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, fluidBlock);
}
}
}
}
return false;
}
@Override
protected boolean suckInItem(int maxItems){
TileEntity inputInv = IOHelper.getNeighbor(this, inputDir);
if(inputInv instanceof IFluidHandler) {
IFluidHandler fluidHandler = (IFluidHandler)inputInv;
FluidStack fluid = fluidHandler.drain(inputDir.getOpposite(), maxItems * 100, false);
if(fluid != null && fluidHandler.canDrain(inputDir.getOpposite(), fluid.getFluid())) {
int filledFluid = fill(inputDir, fluid, true);
if(filledFluid > 0) {
fluidHandler.drain(inputDir.getOpposite(), filledFluid, true);
return true;
}
}
}
if(worldObj.isAirBlock(xCoord + inputDir.offsetX, yCoord + inputDir.offsetY, zCoord + inputDir.offsetZ)) {
for(EntityItem entity : getNeighborItems(this, inputDir)) {
if(!entity.isDead) {
List<ItemStack> returnedItems = new ArrayList<ItemStack>();
if(FluidUtils.tryInsertingLiquid(this, entity.getEntityItem(), false, returnedItems)) {
if(entity.getEntityItem().stackSize <= 0) entity.setDead();
for(ItemStack stack : returnedItems) {
EntityItem item = new EntityItem(worldObj, entity.posX, entity.posY, entity.posZ, stack);
item.motionX = entity.motionX;
item.motionY = entity.motionY;
item.motionZ = entity.motionZ;
worldObj.spawnEntityInWorld(item);
}
return true;
}
}
}
}
if(getUpgrades(ItemMachineUpgrade.UPGRADE_DISPENSER_DAMAGE) > 0 && worldObj.getBlockMetadata(xCoord + inputDir.offsetX, yCoord + inputDir.offsetY, zCoord + inputDir.offsetZ) == 0) {
Fluid fluid = FluidRegistry.lookupFluidForBlock(worldObj.getBlock(xCoord + inputDir.offsetX, yCoord + inputDir.offsetY, zCoord + inputDir.offsetZ));
if(fluid != null) {
if(fill(ForgeDirection.UNKNOWN, new FluidStack(fluid, 1000), false) == 1000) {
fill(ForgeDirection.UNKNOWN, new FluidStack(fluid, 1000), true);
worldObj.setBlockToAir(xCoord + inputDir.offsetX, yCoord + inputDir.offsetY, zCoord + inputDir.offsetZ);
return true;
}
}
}
return false;
}
@Override
public int fill(ForgeDirection from, FluidStack resource, boolean doFill){
return tank.fill(resource, doFill);
}
@Override
public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain){
return tank.getFluid() != null && tank.getFluid().isFluidEqual(resource) ? drain(ForgeDirection.UNKNOWN, resource.amount, doDrain) : null;
}
@Override
public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain){
return tank.drain(leaveMaterial ? Math.min(maxDrain, tank.getFluidAmount() - 1000) : maxDrain, doDrain);
}
@Override
public boolean canFill(ForgeDirection from, Fluid fluid){
return true;
}
@Override
public boolean canDrain(ForgeDirection from, Fluid fluid){
return true;
}
@Override
public FluidTankInfo[] getTankInfo(ForgeDirection from){
return new FluidTankInfo[]{new FluidTankInfo(tank)};
}
@SideOnly(Side.CLIENT)
public FluidTank getTank(){
return tank;
}
@Override
public void writeToNBT(NBTTagCompound tag){
super.writeToNBT(tag);
NBTTagCompound tankTag = new NBTTagCompound();
tank.writeToNBT(tankTag);
tag.setTag("tank", tankTag);
}
@Override
public void readFromNBT(NBTTagCompound tag){
super.readFromNBT(tag);
tank.readFromNBT(tag.getCompoundTag("tank"));
}
}