1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
package tectech.mechanics.enderStorage;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import net.minecraft.nbt.CompressedStreamTools;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler;
import tectech.TecTech;
public class EnderFluidContainer implements IFluidHandler, Serializable {
private static final long serialVersionUID = 2L;
private static final int SERIALIZE_TYPE_WITH_NBT = 0;
private static final int SERIALIZE_TYPE_WITHOUT_NBT = 1;
private static final int SERIALIZE_TYPE_NULL = 2;
private static final int CAPACITY = 64000;
private transient FluidStack fluidStack;
public EnderFluidContainer() {}
private FluidStack getFluidStack() {
return fluidStack;
}
private void setFluidStack(FluidStack fluidStack) {
this.fluidStack = fluidStack;
}
@Override
public int fill(ForgeDirection side, FluidStack fluidStackIn, boolean doFill) {
int filledFluid = 0;
FluidStack fluidStackStored = getFluidStack();
if (fluidStackIn != null) {
if (fluidStackStored == null) {
fluidStackStored = fluidStackIn.copy();
fluidStackStored.amount = 0;
}
if (fluidStackStored.amount < CAPACITY && fluidStackIn.isFluidEqual(fluidStackStored)) {
filledFluid = Math.min(CAPACITY - fluidStackStored.amount, fluidStackIn.amount);
if (doFill) {
fluidStackStored.amount += filledFluid;
setFluidStack(fluidStackStored);
}
}
}
return filledFluid;
}
@Override
public FluidStack drain(ForgeDirection side, FluidStack fluidStack, boolean doDrain) {
FluidStack fluidStackOutput = null;
if (fluidStack != null && fluidStack.isFluidEqual(getFluidStack())) {
fluidStackOutput = drain(side, fluidStack.amount, doDrain);
}
return fluidStackOutput;
}
@Override
public FluidStack drain(ForgeDirection side, int amount, boolean doDrain) {
FluidStack fluidStackOutput = null;
FluidStack fluidStackStored = getFluidStack();
if (fluidStackStored != null && fluidStackStored.amount > 0) {
int drainedFluid = Math.min(fluidStackStored.amount, amount);
fluidStackOutput = fluidStackStored.copy();
fluidStackOutput.amount = drainedFluid;
if (doDrain) {
fluidStackStored.amount -= drainedFluid;
if (fluidStackStored.amount == 0) {
fluidStackStored = null;
}
setFluidStack(fluidStackStored);
}
}
return fluidStackOutput;
}
@Override
public boolean canFill(ForgeDirection forgeDirection, Fluid fluid) {
return true;
}
@Override
public boolean canDrain(ForgeDirection forgeDirection, Fluid fluid) {
return true;
}
@Override
public FluidTankInfo[] getTankInfo(ForgeDirection forgeDirection) {
return new FluidTankInfo[] { new FluidTankInfo(getFluidStack(), CAPACITY) };
}
private void writeObject(ObjectOutputStream out) throws IOException {
if (fluidStack != null) {
out.writeByte(fluidStack.tag != null ? SERIALIZE_TYPE_WITH_NBT : SERIALIZE_TYPE_WITHOUT_NBT);
if (fluidStack.tag != null) CompressedStreamTools.write(fluidStack.tag, out);
out.writeUTF(
fluidStack.getFluid()
.getName());
out.writeInt(fluidStack.amount);
} else {
out.writeByte(SERIALIZE_TYPE_NULL);
}
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
byte type = in.readByte();
NBTTagCompound tag = null;
switch (type) {
case SERIALIZE_TYPE_WITH_NBT:
tag = CompressedStreamTools.read(new DataInputStream(in));
case SERIALIZE_TYPE_WITHOUT_NBT:
fluidStack = FluidRegistry.getFluidStack(in.readUTF(), in.readInt());
break;
case SERIALIZE_TYPE_NULL:
fluidStack = null;
break;
default:
TecTech.LOGGER.error("Something very wrong... got a fluid container with state " + type);
fluidStack = null;
}
if (fluidStack != null) fluidStack.tag = tag;
}
}
|