diff --git a/src/minecraft/dark/core/network/fluid/NetworkFluidTiles.java b/src/minecraft/dark/core/network/fluid/NetworkFluidTiles.java index 5893f09a..305f2317 100644 --- a/src/minecraft/dark/core/network/fluid/NetworkFluidTiles.java +++ b/src/minecraft/dark/core/network/fluid/NetworkFluidTiles.java @@ -5,9 +5,11 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.IFluidHandler; @@ -119,7 +121,8 @@ public class NetworkFluidTiles extends NetworkTileEntities * @param sumParts - loads the volume from the parts before leveling out the volumes */ public void balanceColletiveTank(boolean sumParts) { - Fluid fluid = null; + int fluid = -1; + NBTTagCompound tag = new NBTTagCompound(); int volume = 0; if (sumParts) @@ -131,17 +134,18 @@ public class NetworkFluidTiles extends NetworkTileEntities INetworkFluidPart part = ((INetworkFluidPart) par); if (part.getTank() != null && part.getTank().getFluid() != null) { - if (fluid == null) + if (fluid == -1) { - fluid = part.getTank().getFluid().getFluid(); + fluid = part.getTank().getFluid().fluidID; + tag = part.getTank().getFluid().tag; } volume += part.getTank().getFluid().amount; } } } - if (fluid != null) + if (fluid != -1) { - this.combinedStorage().setFluid(new FluidStack(fluid, volume)); + this.combinedStorage().setFluid(new FluidStack(fluid, volume, tag)); } else { @@ -153,7 +157,8 @@ public class NetworkFluidTiles extends NetworkTileEntities if (this.combinedStorage().getFluid() != null && this.networkMember.size() > 0) { volume = this.combinedStorage().getFluid().amount / this.networkMember.size(); - fluid = this.combinedStorage().getFluid().getFluid(); + fluid = this.combinedStorage().getFluid().fluidID; + tag = this.combinedStorage().getFluid().tag; for (INetworkPart par : this.networkMember) { @@ -161,7 +166,7 @@ public class NetworkFluidTiles extends NetworkTileEntities { INetworkFluidPart part = ((INetworkFluidPart) par); part.setTankContent(null); - part.setTankContent(new FluidStack(fluid, volume)); + part.setTankContent(new FluidStack(fluid, volume, tag)); } } } @@ -213,14 +218,72 @@ public class NetworkFluidTiles extends NetworkTileEntities { stack = stackOne.copy(); } - else + else if (stackTwo != null && stackOne != null && !stackOne.isFluidEqual(stackTwo)) { + Fluid waste = FluidRegistry.getFluid("waste"); + /* If the two liquids are not waste merge and set tag too liquids */ + if (stackTwo.fluidID != waste.getID() && stackOne.fluidID != waste.getID()) + { + stack = new FluidStack(waste, stackTwo.amount + stackOne.amount); + stack.tag = new NBTTagCompound(); + stack.tag.setCompoundTag("Liquid1", stackTwo.writeToNBT(new NBTTagCompound())); + stack.tag.setCompoundTag("Liquid2", stackOne.writeToNBT(new NBTTagCompound())); + stack.tag.setInteger("liquids", 2); + } + else if (stackTwo.fluidID == waste.getID() && stackOne.fluidID == waste.getID()) + { + List stacks = new ArrayList(); + stacks.addAll(this.getStacksFromWaste(stackOne.copy())); + stacks.addAll(this.getStacksFromWaste(stackTwo.copy())); + stack = new FluidStack(waste, stackOne.amount + stackTwo.amount); + stack.tag = new NBTTagCompound(); + stack.tag.setInteger("liquids", stacks.size()); + for (int i = 0; i < stacks.size(); i++) + { + stack.tag.setCompoundTag("Liquids" + 1 + i, stacks.get(i).writeToNBT(new NBTTagCompound())); + } + } + else + { + FluidStack wasteStack = null, codeStack = null; + if (stackOne.fluidID != waste.getID() && stackTwo.fluidID == waste.getID()) + { + wasteStack = stackTwo.copy(); + codeStack = stackOne.copy(); + } + else if (stackOne.fluidID == waste.getID() && stackTwo.fluidID != waste.getID()) + { + wasteStack = stackOne.copy(); + codeStack = stackTwo.copy(); + } + if (wasteStack != null) + { + wasteStack.tag.setCompoundTag("Liquid" + wasteStack.tag.getInteger("liquids") + 1, codeStack.writeToNBT(new NBTTagCompound())); + } + } //TODO do mixing of liquids and create a new waste liquid stack that is encoded with the volume of the two liquids before it //TODO check merge result first to allow for some liquids to merge in X way } return stack; } + public List getStacksFromWaste(FluidStack wasteStack) + { + List stacks = new ArrayList(); + if (wasteStack.fluidID == FluidRegistry.getFluidID("waste")) + { + for (int i = 1; i <= wasteStack.tag.getInteger("liquids"); i++) + { + FluidStack readStack = FluidStack.loadFluidStackFromNBT(wasteStack.tag.getCompoundTag("Liquid" + i)); + if (readStack != null) + { + stacks.add(readStack); + } + } + } + return stacks; + } + /** Checks if the liquid can be merged without damage */ public String canMergeFluids(FluidStack stackOne, FluidStack stackTwo) { @@ -228,6 +291,8 @@ public class NetworkFluidTiles extends NetworkTileEntities { if (this.mergeResult.containsKey(new Pair(stackOne.getFluid(), stackTwo.getFluid()))) { + //TODO add volume calculation too see if merge can happen resulting in one liquid just vanishing + //Case 100mb of fuel 10000mb of lava will result in fuel being comsumed with no explosion return this.mergeResult.get(new Pair(stackOne.getFluid(), stackTwo.getFluid())); } }