Skip to content

Commit 0a401ed

Browse files
committed
Possibly fixed underflow problem with fluids?
1 parent 8275c15 commit 0a401ed

File tree

2 files changed

+22
-17
lines changed

2 files changed

+22
-17
lines changed

fluids/src/main/java/sunsetsatellite/catalyst/fluids/impl/tiles/TileEntityFluidContainer.java

+13-10
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,8 @@
1616
import sunsetsatellite.catalyst.fluids.api.IMassFluidInventory;
1717
import sunsetsatellite.catalyst.fluids.util.FluidStack;
1818

19-
import java.util.ArrayList;
20-
import java.util.HashMap;
21-
import java.util.Map;
19+
import java.util.*;
20+
import java.util.stream.Collectors;
2221

2322
public class TileEntityFluidContainer extends TileEntity
2423
implements IFluidInventory, IFluidTransfer {
@@ -54,8 +53,9 @@ public void take(@NotNull FluidStack fluidStack, Direction dir){
5453
if(fluidTransfer.getConnection(dir.getOpposite()) == Connection.OUTPUT || fluidTransfer.getConnection(dir.getOpposite()) == Connection.BOTH){
5554
int maxFlow = Math.min(transferSpeed,fluidInv.getTransferSpeed());
5655
if(acceptedFluids.get(activeFluidSlots.get(dir)).contains(fluidStack.getLiquid())) {
57-
if (canInsertFluid(activeFluidSlots.get(dir), new FluidStack(fluidStack.liquid, maxFlow))) {
58-
FluidStack transferablePortion = fluidStack.splitStack(maxFlow);
56+
int maxAmount = Math.min(fluidStack.amount, maxFlow);
57+
if (canInsertFluid(activeFluidSlots.get(dir), new FluidStack(fluidStack.liquid, maxAmount))) {
58+
FluidStack transferablePortion = fluidStack.splitStack(maxAmount);
5959
if (fluidContents[activeFluidSlots.get(dir)] == null) {
6060
fluidContents[activeFluidSlots.get(dir)] = transferablePortion;
6161
} else {
@@ -81,16 +81,18 @@ public void give(Direction dir){
8181
if(tile instanceof IMassFluidInventory){
8282
IMassFluidInventory massFluidInv = (IMassFluidInventory) tile;
8383
if(fluidStack.isFluidEqual(massFluidInv.getFilter(dir.getOpposite())) || massFluidInv.getFilter(dir.getOpposite()) == null){
84-
if(massFluidInv.canInsertFluid(new FluidStack(fluidStack.liquid,maxFlow))){
85-
FluidStack transferablePortion = fluidStack.splitStack(maxFlow);
84+
int maxAmount = Math.min(fluidStack.amount, maxFlow);
85+
if(massFluidInv.canInsertFluid(new FluidStack(fluidStack.liquid,maxAmount))){
86+
FluidStack transferablePortion = fluidStack.splitStack(maxAmount);
8687
massFluidInv.insertFluid(transferablePortion);
8788
}
8889
}
8990
} else {
9091
int otherSlot = fluidInv.getActiveFluidSlot(dir.getOpposite());
9192
if(fluidInv.getAllowedFluidsForSlot(otherSlot).contains(fluidStack.getLiquid())){
92-
if(fluidInv.canInsertFluid(otherSlot,new FluidStack(fluidStack.liquid,maxFlow))){
93-
FluidStack transferablePortion = fluidStack.splitStack(maxFlow);
93+
int maxAmount = Math.min(fluidStack.amount, maxFlow);
94+
if(fluidInv.canInsertFluid(otherSlot,new FluidStack(fluidStack.liquid,maxAmount))){
95+
FluidStack transferablePortion = fluidStack.splitStack(maxAmount);
9496
fluidInv.insertFluid(otherSlot,transferablePortion);
9597
}
9698
/*if(fluidInv.getFluidInSlot(otherSlot) == null){
@@ -109,7 +111,7 @@ public void give(Direction dir){
109111
public FluidStack insertFluid(int slot, FluidStack fluidStack) {
110112
FluidStack stack = fluidContents[slot];
111113
FluidStack split = fluidStack.splitStack(Math.min(fluidStack.amount,getRemainingCapacity(slot)));
112-
if(stack != null){
114+
if(stack != null && split.amount > 0){
113115
fluidContents[slot].amount += split.amount;
114116
} else {
115117
fluidContents[slot] = split;
@@ -169,6 +171,7 @@ public void readFromNBT(CompoundTag CompoundTag1) {
169171
@Override
170172
public void tick() {
171173
super.tick();
174+
fluidContents = Arrays.stream(fluidContents).map((F)-> (F != null && F.amount <= 0) ? null : F).toArray(FluidStack[]::new);
172175
if(!worldObj.isClientSide){
173176
for (EntityPlayer player : worldObj.players) {
174177
if(player instanceof EntityPlayerMP){

fluids/src/main/java/sunsetsatellite/catalyst/fluids/impl/tiles/TileEntityMassFluidContainer.java

+9-7
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,9 @@ public void take(@NotNull FluidStack fluidStack, Direction dir) {
179179
int maxFlow = Math.min(transferSpeed,fluidInv.getTransferSpeed());
180180
if(acceptedFluids.contains(fluidStack.getLiquid())){
181181
if(fluidStack.isFluidEqual(fluidFilters.get(dir)) || fluidFilters.get(dir) == null) {
182-
if (canInsertFluid(new FluidStack(fluidStack.liquid, maxFlow))) {
183-
FluidStack transferablePortion = fluidStack.splitStack(maxFlow);
182+
int maxAmount = Math.min(fluidStack.amount, maxFlow);
183+
if (canInsertFluid(new FluidStack(fluidStack.liquid, maxAmount))) {
184+
FluidStack transferablePortion = fluidStack.splitStack(maxAmount);
184185
insertFluid(transferablePortion);
185186
}
186187
}
@@ -205,15 +206,16 @@ public void give(Direction dir) {
205206
if (filter == getFilter(dir)) {
206207
FluidStack fluidStack = filter == null ? fluidContents.get(0) : findStack(filter);
207208
if (fluidStack != null) {
208-
FluidStack transferablePortion = fluidStack.splitStack(maxFlow);
209+
int maxAmount = Math.min(fluidStack.amount, maxFlow);
210+
FluidStack transferablePortion = fluidStack.splitStack(maxAmount);
209211
massFluidInv.insertFluid(transferablePortion);
210212
}
211213
}
212214
} else {
213215
int otherSlot = fluidInv.getActiveFluidSlot(dir.getOpposite());
214216
BlockFluid filter = getFilter(dir);
215217
if(fluidInv.getAllowedFluidsForSlot(otherSlot).contains(filter) || filter == null){
216-
if(fluidContents.size() > 0 && fluidContents.get(0) != null){
218+
if(!fluidContents.isEmpty() && fluidContents.get(0) != null){
217219
FluidStack fluidStack = filter == null ? (fluidContents.get(0)) : findStack(filter);
218220
/*if(filter == null){
219221
for (BlockFluid blockFluid : fluidInv.getAllowedFluidsForSlot(otherSlot)) {
@@ -225,9 +227,9 @@ public void give(Direction dir) {
225227
fluidStack = findStack(filter);
226228
}*/
227229
if(fluidStack != null){
228-
//FluidAPI.LOGGER.info(fluidStack.toString());
229-
if(fluidInv.canInsertFluid(otherSlot,new FluidStack(fluidStack.liquid,maxFlow))){
230-
FluidStack transferablePortion = fluidStack.splitStack(maxFlow);
230+
int maxAmount = Math.min(fluidStack.amount, maxFlow);
231+
if(fluidInv.canInsertFluid(otherSlot,new FluidStack(fluidStack.liquid,maxAmount))){
232+
FluidStack transferablePortion = fluidStack.splitStack(maxAmount);
231233
fluidInv.insertFluid(otherSlot,transferablePortion);
232234
}
233235
}

0 commit comments

Comments
 (0)