001    package net.minecraftforge.liquids;
002    
003    /**
004     * Reference implementation of ILiquidTank. Use this or implement your own.
005     */
006    public class LiquidTank implements ILiquidTank {
007        private LiquidStack liquid;
008        private int capacity;
009        
010        public LiquidTank(int capacity) {
011            this(null, capacity);
012        }
013        
014        public LiquidTank(int liquidId, int quantity, int capacity) {
015            this(new LiquidStack(liquidId, quantity), capacity);
016        }
017        public LiquidTank(LiquidStack liquid, int capacity) {
018            this.liquid = liquid;
019            this.capacity = capacity;
020        }
021        
022        @Override
023        public LiquidStack getLiquid() {
024            return this.liquid;
025        }
026        
027        @Override
028        public void setLiquid(LiquidStack liquid) {
029            this.liquid = liquid;
030        }
031        
032        @Override
033        public void setCapacity(int capacity) {
034            this.capacity = capacity;
035        }
036        
037        @Override
038        public int getCapacity() {
039            return this.capacity;
040        }
041        
042        @Override
043        public int fill(LiquidStack resource, boolean doFill) {
044            if(resource == null || resource.itemID <= 0)
045                return 0;
046            
047            if(liquid == null || liquid.itemID <= 0) {
048                if(resource.amount <= capacity) {
049                    if(doFill)
050                        this.liquid = resource.copy();
051                    return resource.amount;
052                } else {
053                    if(doFill) {
054                        this.liquid = resource.copy();
055                        this.liquid.amount = capacity;
056                    }
057                    return capacity;
058                }
059            }
060            
061            if(!liquid.isLiquidEqual(resource))
062                return 0;
063            
064            int space = capacity - liquid.amount;
065            if(resource.amount <= space) {
066                if(doFill)
067                    this.liquid.amount += resource.amount;
068                return resource.amount;
069            } else {
070    
071                if(doFill)
072                    this.liquid.amount = capacity;
073                return space;
074            }
075    
076        }
077        @Override
078        public LiquidStack drain(int maxDrain, boolean doDrain) {
079            if(liquid == null || liquid.itemID <= 0)
080                return null;
081            if(liquid.amount <= 0)
082                return null;
083            
084            int used = maxDrain;
085            if(liquid.amount < used)
086                used = liquid.amount;
087            
088            if(doDrain) {
089                liquid.amount -= used;
090            }
091            
092            LiquidStack drained = new LiquidStack(liquid.itemID, used, liquid.itemMeta);
093            
094            // Reset liquid if emptied
095            if(liquid.amount <= 0)
096                liquid = null;
097            
098            return drained;
099        }
100    }