More work to fix issues with tanks being filled by a bucket

This commit is contained in:
Robert S 2014-05-16 14:41:11 -04:00
parent 0e5633fcd0
commit ae3cba60f6
3 changed files with 135 additions and 127 deletions

View file

@ -5,7 +5,6 @@ import java.util.LinkedList;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.fluids.FluidStack;
import resonant.lib.utility.FluidUtility;
import resonantinduction.core.fluid.FluidDistributionetwork;
import resonantinduction.core.fluid.IFluidDistribution;
@ -23,22 +22,30 @@ public class TankNetwork extends FluidDistributionetwork
@Override
public void update()
{
System.out.println("\nTankNetwork>Tank: " + getTank());
System.out.println("TankNetwork>Fluid: " + getTank().getFluid());
System.out.println("TankNetwork>Tank: " + getTank().getFluidAmount());
final FluidStack networkTankFluid = getTank().getFluid();
int lowestY = 255;
int highestY = 0;
int connectorCount = 0;
int totalFluid = networkTankFluid != null ? networkTankFluid.amount : 0;
boolean didChange = false;
//If we only have one tank only fill one tank
if (getConnectors().size() == 1)
if (getConnectors().size() > 0)
{
IFluidDistribution tank = ((IFluidDistribution) getConnectors().toArray()[0]);
tank.getInternalTank().setFluid(networkTankFluid);
tank.onFluidChanged();
}
else if (getConnectors().size() > 0)
{
if (!((TileEntity) tank).getWorldObj().isRemote)
System.out.println(this.toString());
if (getConnectors().size() == 1)
{
tank.getInternalTank().setFluid(networkTankFluid);
tank.onFluidChanged();
needsUpdate = false;
return;
}
if (networkTankFluid != null)
{
//If fluid is gaseous fill all tanks equally
@ -97,7 +104,8 @@ public class TankNetwork extends FluidDistributionetwork
if (connectorCount <= 0)
continue;
if (!((TileEntity) tank).getWorldObj().isRemote)
System.out.println("Filling Y: " + yLevel + " Tanks: " + connectorCount);
//Loop threw tanks in each level
for (IFluidDistribution connector : heightMap.get(yLevel))
{
@ -114,7 +122,7 @@ public class TankNetwork extends FluidDistributionetwork
connector.getInternalTank().setFluid(null);
totalFluid -= connector.getInternalTank().fill(input, true);
connector.onFluidChanged();
if (connectorCount > 1)
connectorCount--;
@ -133,8 +141,8 @@ public class TankNetwork extends FluidDistributionetwork
connector.onFluidChanged();
}
}
needsUpdate = false;
}
needsUpdate = false;
}
@Override

View file

@ -9,133 +9,133 @@ import universalelectricity.api.net.IUpdate;
import universalelectricity.core.net.NetworkTickHandler;
import universalelectricity.core.net.NodeNetwork;
/**
* The fluid network for instantaneous equal distribution between all nodes. Used for tanks.
/** The fluid network for instantaneous equal distribution between all nodes. Used for tanks.
*
* @author DarkCow, Calclavia
*
*/
* @author DarkCow, Calclavia */
public abstract class FluidDistributionetwork extends NodeNetwork<FluidDistributionetwork, IFluidDistribution, IFluidHandler> implements IUpdate
{
protected FluidTank tank = new FluidTank(0);
public boolean needsUpdate = false;
protected FluidTank tank = new FluidTank(0);
public boolean needsUpdate = false;
public FluidDistributionetwork()
{
super(IFluidDistribution.class);
}
public FluidDistributionetwork()
{
super(IFluidDistribution.class);
}
@Override
public void addConnector(IFluidDistribution connector)
{
super.addConnector(connector);
NetworkTickHandler.addNetwork(this);
}
@Override
public void addConnector(IFluidDistribution connector)
{
super.addConnector(connector);
NetworkTickHandler.addNetwork(this);
}
@Override
public boolean canUpdate()
{
return needsUpdate && getConnectors().size() > 0;
}
@Override
public boolean canUpdate()
{
return needsUpdate && getConnectors().size() > 0;
}
@Override
public boolean continueUpdate()
{
return canUpdate();
}
@Override
public boolean continueUpdate()
{
return canUpdate();
}
@Override
public void reconstruct()
{
this.tank = new FluidTank(0);
super.reconstruct();
needsUpdate = true;
NetworkTickHandler.addNetwork(this);
}
@Override
public void reconstruct()
{
this.tank.setCapacity(0);
this.tank.setFluid(null);
super.reconstruct();
needsUpdate = true;
NetworkTickHandler.addNetwork(this);
}
@Override
public void reconstructConnector(IFluidDistribution connector)
{
if (connector.getNetwork() instanceof FluidDistributionetwork)
connector.setNetwork(this);
@Override
public void reconstructConnector(IFluidDistribution connector)
{
if (connector.getNetwork() instanceof FluidDistributionetwork)
connector.setNetwork(this);
FluidTank connectorTank = connector.getInternalTank();
FluidTank connectorTank = connector.getInternalTank();
if (connectorTank != null)
{
tank.setCapacity(tank.getCapacity() + connectorTank.getCapacity());
if (connectorTank != null)
{
tank.setCapacity(tank.getCapacity() + connectorTank.getCapacity());
if (connectorTank.getFluid() != null)
{
if (tank.getFluid() == null)
{
tank.setFluid(connectorTank.getFluid().copy());
}
else if (tank.getFluid().isFluidEqual(connectorTank.getFluid()))
{
tank.getFluid().amount += connectorTank.getFluidAmount();
}
else if (tank.getFluid() != null)
{
// TODO: Cause a mixing event
}
}
}
}
if (connectorTank.getFluid() != null)
{
if (tank.getFluid() == null)
{
tank.setFluid(connectorTank.getFluid().copy());
}
else if (tank.getFluid().isFluidEqual(connectorTank.getFluid()))
{
tank.getFluid().amount += connectorTank.getFluidAmount();
}
else if (tank.getFluid() != null)
{
// TODO: Cause a mixing event
}
}
}
}
public int fill(IFluidDistribution source, ForgeDirection from, FluidStack resource, boolean doFill)
{
int fill = this.getTank().fill(resource.copy(), doFill);
needsUpdate = true;
NetworkTickHandler.addNetwork(this);
return fill;
}
public int fill(IFluidDistribution source, ForgeDirection from, FluidStack resource, boolean doFill)
{
System.out.println("FluidDistributionNetwork: Filling " + resource + " Tank: " + this.getTank().getFluidAmount());
System.out.println("FluidDistributionNetwork: Tank Contains Fluid: " + getTank().getFluid() + " Tank: " + this.getTank().getFluidAmount());
int fill = this.getTank().fill(resource.copy(), doFill);
System.out.println("FluidDistributionNetwork: Filled " + fill + " Tank: " + this.getTank().getFluidAmount());
needsUpdate = true;
NetworkTickHandler.addNetwork(this);
return fill;
}
public FluidStack drain(IFluidDistribution source, ForgeDirection from, FluidStack resource, boolean doDrain)
{
if (resource != null && resource.isFluidEqual(getTank().getFluid()))
{
FluidStack drain = getTank().drain(resource.amount, doDrain);
needsUpdate = true;
NetworkTickHandler.addNetwork(this);
return drain;
}
public FluidStack drain(IFluidDistribution source, ForgeDirection from, FluidStack resource, boolean doDrain)
{
if (resource != null && resource.isFluidEqual(getTank().getFluid()))
{
FluidStack drain = getTank().drain(resource.amount, doDrain);
needsUpdate = true;
NetworkTickHandler.addNetwork(this);
return drain;
}
return null;
}
return null;
}
public FluidStack drain(IFluidDistribution source, ForgeDirection from, int resource, boolean doDrain)
{
FluidStack drain = getTank().drain(resource, doDrain);
needsUpdate = true;
NetworkTickHandler.addNetwork(this);
return drain;
}
public FluidStack drain(IFluidDistribution source, ForgeDirection from, int resource, boolean doDrain)
{
FluidStack drain = getTank().drain(resource, doDrain);
needsUpdate = true;
NetworkTickHandler.addNetwork(this);
return drain;
}
public FluidTank getTank()
{
if (this.tank == null)
{
this.tank = new FluidTank(0);
}
public FluidTank getTank()
{
if (this.tank == null)
{
this.tank = new FluidTank(0);
}
return this.tank;
}
return this.tank;
}
@Override
public Class getConnectorClass()
{
return IFluidDistribution.class;
}
@Override
public Class getConnectorClass()
{
return IFluidDistribution.class;
}
public FluidTankInfo[] getTankInfo()
{
return new FluidTankInfo[] { getTank().getInfo() };
}
public FluidTankInfo[] getTankInfo()
{
return new FluidTankInfo[] { getTank().getInfo() };
}
@Override
public String toString()
{
return super.toString() + " Volume: " + this.tank.getFluidAmount();
}
@Override
public String toString()
{
return super.toString() + " Volume: " + this.tank.getFluidAmount();
}
}

View file

@ -14,29 +14,28 @@ import universalelectricity.api.vector.Vector3;
* @author DarkGuardsman */
public abstract class TileFluidDistribution extends TileFluidNode implements IFluidDistribution
{
public TileFluidDistribution(Material material, int tankSize)
{
super(material, tankSize);
}
protected Object[] connectedBlocks = new Object[6];
/** Network used to link all parts together */
protected FluidDistributionetwork network;
public TileFluidDistribution(Material material, int tankSize)
{
super(material, tankSize);
}
@Override
public void initiate()
{
super.initiate();
refresh();
getNetwork().reconstruct();
}
@Override
protected void onNeighborChanged()
{
refresh();
getNetwork().reconstruct();
}
@Override
@ -104,8 +103,9 @@ public abstract class TileFluidDistribution extends TileFluidNode implements IFl
/** Only send packet updates if visuallyConnected changed. */
if (previousConnections != renderSides)
{
sendRenderUpdate();
getNetwork().update();
getNetwork().reconstruct();
sendRenderUpdate();
}
}