    001    package net.minecraftforge.liquids;
    002
    003    import net.minecraft.tileentity.TileEntity;
    004
    005    /**
    006     * Reference implementation of ILiquidTank. Use this or implement your own.
    007     */
    008    public class LiquidTank implements ILiquidTank {
    009        private LiquidStack liquid;
    010        private int capacity;
    011        private int tankPressure;
    012        private TileEntity tile;
    013
    014        public LiquidTank(int capacity)
    015        {
    016            this(null, capacity);
    017        }
    018
    019        public LiquidTank(int liquidId, int quantity, int capacity)
    020        {
    021            this(new LiquidStack(liquidId, quantity), capacity);
    022        }
    023
    024        public LiquidTank(int liquidId, int quantity, int capacity, TileEntity tile)
    025        {
    026            this(liquidId, quantity, capacity);
    027            this.tile = tile;
    028        }
    029
    030        public LiquidTank(LiquidStack liquid, int capacity)
    031        {
    032            this.liquid = liquid;
    033            this.capacity = capacity;
    034        }
    035
    036        public LiquidTank(LiquidStack liquid, int capacity, TileEntity tile)
    037        {
    038            this(liquid, capacity);
    039            this.tile = tile;
    040        }
    041
    042        @Override
    043        public LiquidStack getLiquid()
    044        {
    045            return this.liquid;
    046        }
    047
    048        @Override
    049        public int getCapacity()
    050        {
    051            return this.capacity;
    052        }
    053
    054        public void setLiquid(LiquidStack liquid)
    055        {
    056            this.liquid = liquid;
    057        }
    058
    059        public void setCapacity(int capacity)
    060        {
    061            this.capacity = capacity;
    062        }
    063
    064        @Override
    065        public int fill(LiquidStack resource, boolean doFill)
    066        {
    067            if (resource == null || resource.itemID <= 0) return 0;
    068
    069            if (liquid == null || liquid.itemID <= 0)
    070            {
    071                if (resource.amount <= capacity)
    072                {
    073                    if (doFill) this.liquid = resource.copy();
    074                    return resource.amount;
    075                }
    076                else
    077                {
    078                    if (doFill)
    079                    {
    080                        this.liquid = resource.copy();
    081                        this.liquid.amount = capacity;
    082                        if (tile != null)
    083                            LiquidEvent.fireEvent(new LiquidEvent.LiquidFillingEvent(liquid, tile.worldObj, tile.xCoord, tile.yCoord, tile.zCoord, this));
    084                    }
    085                    return capacity;
    086                }
    087            }
    088
    089            if (!liquid.isLiquidEqual(resource)) return 0;
    090
    091            int space = capacity - liquid.amount;
    092            if (resource.amount <= space)
    093            {
    094                if (doFill) this.liquid.amount += resource.amount;
    095                return resource.amount;
    096            }
    097            else
    098            {
    099
    100                if (doFill) this.liquid.amount = capacity;
    101                return space;
    102            }
    103
    104        }
    105
    106        @Override
    107        public LiquidStack drain(int maxDrain, boolean doDrain)
    108        {
    109            if (liquid == null || liquid.itemID <= 0) return null;
    110            if (liquid.amount <= 0) return null;
    111
    112            int used = maxDrain;
    113            if (liquid.amount < used) used = liquid.amount;
    114
    115            if (doDrain)
    116            {
    117                liquid.amount -= used;
    118            }
    119
    120            LiquidStack drained = new LiquidStack(liquid.itemID, used, liquid.itemMeta);
    121
    122            // Reset liquid if emptied
    123            if (liquid.amount <= 0) liquid = null;
    124
    125            if (doDrain && tile != null)
    126                LiquidEvent.fireEvent(new LiquidEvent.LiquidDrainingEvent(drained, tile.worldObj, tile.xCoord, tile.yCoord, tile.zCoord, this));
    127
    128            return drained;
    129        }
    130
    131        @Override
    132        public int getTankPressure()
    133        {
    134            return tankPressure;
    135        }
    136
    137        public void setTankPressure(int pressure)
    138        {
    139            this.tankPressure = pressure;
    140        }
    141
    142    }