Skip to content

Commit a8aa7b2

Browse files
authored
Merge pull request #154 from jchung01/fix/me-fluid-output
Fix ME fluid output voiding
2 parents d4b22d6 + 89f677f commit a8aa7b2

File tree

4 files changed

+55
-15
lines changed

4 files changed

+55
-15
lines changed

src/main/java/github/kasuminova/mmce/common/util/AEFluidInventoryUpgradeable.java

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import appeng.fluids.util.IAEFluidTank;
88
import appeng.util.Platform;
99
import github.kasuminova.mmce.common.util.concurrent.ReadWriteLockProvider;
10+
import hellfirepvp.modularmachinery.common.util.HybridFluidUtils;
1011
import net.minecraft.nbt.NBTTagCompound;
1112
import net.minecraftforge.fluids.FluidStack;
1213
import net.minecraftforge.fluids.capability.IFluidTankProperties;
@@ -21,7 +22,7 @@
2122
* From: <a href="https://github.com/PrototypeTrousers/Applied-Energistics-2/blob/AE2-Omnifactory/src/main/java/appeng/fluids/util/AEFluidInventory.java">...</a>
2223
*/
2324
@SuppressWarnings("unchecked")
24-
public class AEFluidInventoryUpgradeable implements IAEFluidTank, ReadWriteLockProvider {
25+
public class AEFluidInventoryUpgradeable implements IAEFluidTank, ReadWriteLockProvider, IOneToOneFluidHandler {
2526
private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
2627

2728
private final AtomicReference<IAEFluidStack>[] fluids;
@@ -54,6 +55,7 @@ public void setCapacity(int capacity) {
5455
}
5556
}
5657

58+
@Override
5759
public boolean isOneFluidOneSlot() {
5860
return oneFluidOneSlot;
5961
}
@@ -203,18 +205,9 @@ public int fill(final FluidStack fluid, final boolean doFill) {
203205
try {
204206
(doFill ? rwLock.writeLock() : rwLock.readLock()).lock();
205207

206-
if (oneFluidOneSlot) {
207-
int found = -1;
208-
for (int i = 0; i < fluids.length; i++) {
209-
final IAEFluidStack fluidInSlot = getFluid(i);
210-
if (fluidInSlot != null && fluidInSlot.getFluid() == insert.getFluid()) {
211-
found = i;
212-
break;
213-
}
214-
}
215-
if (found != -1) {
216-
return this.fill(found, insert, doFill);
217-
}
208+
int found = HybridFluidUtils.findSlotWithFluid(this, getTankProperties(), insert);
209+
if (found >= 0) {
210+
return this.fill(found, insert, doFill);
218211
}
219212

220213
int totalFillAmount = 0;
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package github.kasuminova.mmce.common.util;
2+
3+
/**
4+
* Implement this interface for a multi-fluid tank that only allows one slot per type of fluid.
5+
*/
6+
public interface IOneToOneFluidHandler {
7+
8+
/**
9+
* Returns whether distinct slots map to distinct types of fluids.
10+
* @return true if the mapping is one-to-one
11+
*/
12+
boolean isOneFluidOneSlot();
13+
14+
}

src/main/java/github/kasuminova/mmce/common/util/MultiFluidTank.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package github.kasuminova.mmce.common.util;
22

3+
import hellfirepvp.modularmachinery.common.util.HybridFluidUtils;
34
import net.minecraft.nbt.NBTTagCompound;
45
import net.minecraftforge.fluids.FluidStack;
56
import net.minecraftforge.fluids.capability.IFluidHandler;
@@ -10,11 +11,13 @@
1011
import java.util.Objects;
1112

1213
@SuppressWarnings("unused")
13-
public class MultiFluidTank implements IFluidHandler {
14+
public class MultiFluidTank implements IFluidHandler, IOneToOneFluidHandler {
1415
private final FluidStack[] contents;
1516
private final IFluidTankProperties[] props;
1617
private int capacity;
1718

19+
private boolean oneToOne;
20+
1821
public MultiFluidTank(int capacity, int tankCount) {
1922
this.capacity = capacity;
2023
this.contents = new FluidStack[tankCount];
@@ -49,6 +52,10 @@ public MultiFluidTank(IFluidHandler from) {
4952
contents[i] = stack.copy();
5053
}
5154
}
55+
56+
if (from instanceof IOneToOneFluidHandler oneToOneHandler) {
57+
this.oneToOne = oneToOneHandler.isOneFluidOneSlot();
58+
}
5259
}
5360

5461
public int getCapacity() {
@@ -60,6 +67,11 @@ public MultiFluidTank setCapacity(final int capacity) {
6067
return this;
6168
}
6269

70+
@Override
71+
public boolean isOneFluidOneSlot() {
72+
return oneToOne;
73+
}
74+
6375
@Override
6476
public IFluidTankProperties[] getTankProperties() {
6577
return props;
@@ -73,6 +85,11 @@ public synchronized int fill(final FluidStack fluid, final boolean doFill) {
7385

7486
final FluidStack insert = fluid.copy();
7587

88+
int foundSlot = HybridFluidUtils.findSlotWithFluid(this, props, fluid);
89+
if (foundSlot >= 0) {
90+
return fill(foundSlot, insert, doFill);
91+
}
92+
7693
int totalFillAmount = 0;
7794
for (int i = 0; i < contents.length; i++) {
7895
int filled = fill(i, insert, doFill);
@@ -151,7 +168,7 @@ public synchronized FluidStack drain(final FluidStack resource, final boolean do
151168
int drained = drainedStack.amount;
152169
totalDrainAmount += drained;
153170

154-
if (drained >= res.amount) {
171+
if (drained >= res.amount || oneToOne) {
155172
break;
156173
}
157174
res.amount -= drained;

src/main/java/hellfirepvp/modularmachinery/common/util/HybridFluidUtils.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.google.common.collect.Lists;
44
import github.kasuminova.mmce.common.concurrent.Sync;
55
import github.kasuminova.mmce.common.util.IExtendedGasHandler;
6+
import github.kasuminova.mmce.common.util.IOneToOneFluidHandler;
67
import github.kasuminova.mmce.common.util.MultiFluidTank;
78
import github.kasuminova.mmce.common.util.MultiGasTank;
89
import hellfirepvp.modularmachinery.common.crafting.helper.ProcessingComponent;
@@ -12,6 +13,7 @@
1213
import mekanism.api.gas.IGasHandler;
1314
import net.minecraftforge.fluids.FluidStack;
1415
import net.minecraftforge.fluids.capability.IFluidHandler;
16+
import net.minecraftforge.fluids.capability.IFluidTankProperties;
1517
import net.minecraftforge.fml.common.Optional;
1618

1719
import javax.annotation.Nonnull;
@@ -135,6 +137,20 @@ public static void doDrainOrFill(final GasStack drainOrFill, final long maxDrain
135137
}
136138
}
137139

140+
public static int findSlotWithFluid(final IOneToOneFluidHandler handler, final IFluidTankProperties[] props, final FluidStack fluid) {
141+
int found = -1;
142+
if (handler.isOneFluidOneSlot()) {
143+
for (int i = 0; i < props.length; i++) {
144+
FluidStack fluidInSlot = props[i].getContents();
145+
if (fluidInSlot != null && fluidInSlot.getFluid() == fluid.getFluid()) {
146+
found = i;
147+
break;
148+
}
149+
}
150+
}
151+
return found;
152+
}
153+
138154
@Nonnull
139155
public static List<IFluidHandler> castFluidHandlerComponents(final List<ProcessingComponent<?>> components) {
140156
if (components.size() == 1) {

0 commit comments

Comments
 (0)