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    }