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 }