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