Added waste create code as merge conflict

In the case that two liquids merge safely with no result it will create
waste liquid. To prevent this a mod should register a merge result
allowing for more complex or better liquid merging.
This commit is contained in:
DarkGuardsman 2013-07-25 07:54:06 -04:00
parent b618f85ce7
commit b607193f16

View file

@ -5,9 +5,11 @@ import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.FluidTank;
import net.minecraftforge.fluids.IFluidHandler; 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 */ * @param sumParts - loads the volume from the parts before leveling out the volumes */
public void balanceColletiveTank(boolean sumParts) public void balanceColletiveTank(boolean sumParts)
{ {
Fluid fluid = null; int fluid = -1;
NBTTagCompound tag = new NBTTagCompound();
int volume = 0; int volume = 0;
if (sumParts) if (sumParts)
@ -131,17 +134,18 @@ public class NetworkFluidTiles extends NetworkTileEntities
INetworkFluidPart part = ((INetworkFluidPart) par); INetworkFluidPart part = ((INetworkFluidPart) par);
if (part.getTank() != null && part.getTank().getFluid() != null) 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; 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 else
{ {
@ -153,7 +157,8 @@ public class NetworkFluidTiles extends NetworkTileEntities
if (this.combinedStorage().getFluid() != null && this.networkMember.size() > 0) if (this.combinedStorage().getFluid() != null && this.networkMember.size() > 0)
{ {
volume = this.combinedStorage().getFluid().amount / this.networkMember.size(); 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) for (INetworkPart par : this.networkMember)
{ {
@ -161,7 +166,7 @@ public class NetworkFluidTiles extends NetworkTileEntities
{ {
INetworkFluidPart part = ((INetworkFluidPart) par); INetworkFluidPart part = ((INetworkFluidPart) par);
part.setTankContent(null); 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(); 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<FluidStack> stacks = new ArrayList<FluidStack>();
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 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 //TODO check merge result first to allow for some liquids to merge in X way
} }
return stack; return stack;
} }
public List<FluidStack> getStacksFromWaste(FluidStack wasteStack)
{
List<FluidStack> stacks = new ArrayList<FluidStack>();
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 */ /** Checks if the liquid can be merged without damage */
public String canMergeFluids(FluidStack stackOne, FluidStack stackTwo) public String canMergeFluids(FluidStack stackOne, FluidStack stackTwo)
{ {
@ -228,6 +291,8 @@ public class NetworkFluidTiles extends NetworkTileEntities
{ {
if (this.mergeResult.containsKey(new Pair<Fluid, Fluid>(stackOne.getFluid(), stackTwo.getFluid()))) if (this.mergeResult.containsKey(new Pair<Fluid, Fluid>(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<Fluid, Fluid>(stackOne.getFluid(), stackTwo.getFluid())); return this.mergeResult.get(new Pair<Fluid, Fluid>(stackOne.getFluid(), stackTwo.getFluid()));
} }
} }