package net.blay09.mods.cookingbook.block;

import cpw.mods.fml.common.registry.GameRegistry;
import net.blay09.mods.cookingbook.CookingBook;
import net.blay09.mods.cookingbook.api.kitchen.IKitchenItemProvider;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.fluids.*;

import java.util.ArrayList;
import java.util.List;

public class TileEntitySink extends TileEntity implements IKitchenItemProvider {

    private static class WaterTank extends FluidTank {
        public WaterTank(int capacity) {
            super(capacity);
        }

        @Override
        public int fill(FluidStack resource, boolean doFill) {
            if(resource.getFluid() != FluidRegistry.WATER) {
                return 0;
            }
            return super.fill(resource, doFill);
        }
    }

    private final List<ItemStack> itemStacks = new ArrayList<>();
    private final FluidTank waterTank = new WaterTank(16000);
    private int craftingBuffer;

    public TileEntitySink() {
        itemStacks.add(new ItemStack(Items.water_bucket));
        ItemStack pamsWater = GameRegistry.findItemStack("harvestcraft", "freshwaterItem", 1);
        if(pamsWater != null) {
            itemStacks.add(pamsWater);
        }
    }

    @Override
    public List<ItemStack> getProvidedItemStacks() {
        return itemStacks;
    }

    @Override
    public boolean addToCraftingBuffer(ItemStack itemStack) {
        if(!CookingBook.sinkRequiresWater) {
            return true;
        }
        if(waterTank.getFluidAmount() < 1000) {
            return false;
        }
        craftingBuffer += 1000;
        return true;
    }

    @Override
    public void clearCraftingBuffer() {
        craftingBuffer = 0;
    }

    @Override
    public void craftingComplete() {
        waterTank.drain(craftingBuffer, true);
    }

    @Override
    public void writeToNBT(NBTTagCompound tagCompound) {
        super.writeToNBT(tagCompound);
        waterTank.writeToNBT(tagCompound);
    }

    @Override
    public void readFromNBT(NBTTagCompound tagCompound) {
        super.readFromNBT(tagCompound);
        waterTank.readFromNBT(tagCompound);
    }
}

@@ -359,16 +359,70 @@
 Entity;%0A
+import net.minecraftforge.common.util.ForgeDirection;%0A
 import n
@@ -580,16 +580,31 @@
 Provider
+, IFluidHandler
  %7B%0A%0A    
@@ -2332,11 +2332,885 @@
 );%0A    %7D
+%0A%0A    @Override%0A    public int fill(ForgeDirection from, FluidStack resource, boolean doFill) %7B%0A        return waterTank.fill(resource, doFill);%0A    %7D%0A%0A    @Override%0A    public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) %7B%0A        return waterTank.drain(resource.amount, doDrain);%0A    %7D%0A%0A    @Override%0A    public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) %7B%0A        return waterTank.drain(maxDrain, doDrain);%0A    %7D%0A%0A    @Override%0A    public boolean canFill(ForgeDirection from, Fluid fluid) %7B%0A        return fluid == FluidRegistry.WATER;%0A    %7D%0A%0A    @Override%0A    public boolean canDrain(ForgeDirection from, Fluid fluid) %7B%0A        return fluid == FluidRegistry.WATER;%0A    %7D%0A%0A    @Override%0A    public FluidTankInfo%5B%5D getTankInfo(ForgeDirection from) %7B%0A        return new FluidTankInfo%5B%5D %7B waterTank.getInfo() %7D;%0A    %7D
 %0A%7D%0A

Mark sink as Fluid Handler. It should now be able to accept water from pipes and such.