-
Notifications
You must be signed in to change notification settings - Fork 497
/
TankManager.java
134 lines (118 loc) · 3.23 KB
/
TankManager.java
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
/*
* Copyright (c) SpaceToad, 2011-2012
* http://www.mod-buildcraft.com
*
* BuildCraft is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt
*/
package buildcraft.core.liquids;
import com.google.common.collect.ForwardingList;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler;
/**
*
* @author CovertJaguar <http://www.railcraft.info/>
*/
public class TankManager extends ForwardingList<Tank> implements IFluidHandler, List<Tank> {
private List<Tank> tanks = new ArrayList<Tank>();
public TankManager() {
}
public TankManager(Tank... tanks) {
addAll(Arrays.asList(tanks));
}
@Override
protected List<Tank> delegate() {
return tanks;
}
@Override
public int fill(ForgeDirection from, FluidStack resource, boolean doFill) {
for (Tank tank : tanks) {
int used = tank.fill(resource, doFill);
if (used > 0)
return used;
}
return 0;
}
@Override
public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) {
if (resource == null)
return null;
for (Tank tank : tanks) {
if (!resource.isFluidEqual(tank.getFluid()))
continue;
FluidStack drained = tank.drain(resource.amount, doDrain);
if (drained != null && drained.amount > 0)
return drained;
}
return null;
}
@Override
public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) {
for (Tank tank : tanks) {
FluidStack drained = tank.drain(maxDrain, doDrain);
if (drained != null && drained.amount > 0)
return drained;
}
return null;
}
@Override
public boolean canFill(ForgeDirection from, Fluid fluid) {
return true;
}
@Override
public boolean canDrain(ForgeDirection from, Fluid fluid) {
return true;
}
@Override
public FluidTankInfo[] getTankInfo(ForgeDirection from) {
FluidTankInfo[] info = new FluidTankInfo[size()];
for (int i = 0; i < size(); i++) {
info[i] = get(i).getInfo();
}
return info;
}
public void writeToNBT(NBTTagCompound data) {
for (Tank tank : tanks) {
tank.writeToNBT(data);
}
}
public void readFromNBT(NBTTagCompound data) {
for (Tank tank : tanks) {
tank.readFromNBT(data);
}
}
public void writeData(DataOutputStream data) throws IOException {
for (Tank tank : tanks) {
FluidStack fluidStack = tank.getFluid();
if (fluidStack != null) {
data.writeShort(fluidStack.getFluid().getID());
data.writeInt(fluidStack.amount);
} else {
data.writeShort(-1);
}
}
}
@SideOnly(Side.CLIENT)
public void readData(DataInputStream data) throws IOException {
for (Tank tank : tanks) {
int fluidId = data.readShort();
if (fluidId > 0)
tank.setFluid(new FluidStack(fluidId, data.readInt()));
else
tank.setFluid(null);
}
}
}