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