resonant-induction/archive/java/resonantinduction/mechanical/fluid/TileEntityReleaseValve.java
2014-01-11 17:44:07 +08:00

113 lines
3.3 KiB
Java

package resonantinduction.mechanical.fluid;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.IFluidHandler;
import resonantinduction.core.tilenetwork.ITileConnector;
import resonantinduction.mechanical.fluid.network.NetworkPipes;
import resonantinduction.mechanical.fluid.prefab.TileEntityFluidDevice;
import resonantinduction.old.api.fluid.INetworkPipe;
import calclavia.lib.utility.HelperMethods;
import dark.lib.interfaces.IReadOut;
public class TileEntityReleaseValve extends TileEntityFluidDevice implements ITileConnector, IReadOut
{
public TileEntity[] connected = new TileEntity[6];
@Override
public void updateEntity()
{
super.updateEntity();
if (this.ticks % 10 == 0)
{
this.refresh();
if (!this.worldObj.isRemote && !worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord))
{
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
{
if (connected[dir.ordinal()] instanceof IFluidHandler && !(connected[dir.ordinal()] instanceof INetworkPipe))
{
IFluidHandler drainedTank = (IFluidHandler) connected[dir.ordinal()];
FluidStack stack = drainedTank.drain(dir.getOpposite(), FluidContainerRegistry.BUCKET_VOLUME, false);
if (stack != null && stack.amount > 0)
{
INetworkPipe inputPipe = this.findValidPipe(stack);
if (inputPipe != null)
{
int ammountFilled = ((NetworkPipes) inputPipe.getTileNetwork()).addFluidToNetwork((TileEntity) drainedTank, stack, true);
drainedTank.drain(dir.getOpposite(), ammountFilled, true);
}
}
}
}
}
}
}
/** used to find a valid pipe for filling of the liquid type */
public INetworkPipe findValidPipe(FluidStack stack)
{
// find normal color selective pipe first
for (int i = 0; i < connected.length; i++)
{
TileEntity tile = connected[i];
if (tile instanceof INetworkPipe && ((INetworkPipe) tile).fill(ForgeDirection.getOrientation(i), stack, false) > 0)
{
return (INetworkPipe) tile;
}
}
return null;
}
/**
* Collects info about the surrounding 6 tiles and orders them into drain-able(ITankContainer)
* and fill-able(TileEntityPipes) instances
*/
public void refresh()
{
// cleanup
this.connected = HelperMethods.getSurroundingTileEntities(this);
// read surroundings
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
{
TileEntity tileEntity = connected[dir.ordinal()];
if (tileEntity instanceof ITileConnector)
{
if (this.canTileConnect(Connection.FLUIDS, dir.getOpposite()))
{
this.connected[dir.ordinal()] = tileEntity;
}
}
else if (tileEntity instanceof IFluidHandler)
{
this.connected[dir.ordinal()] = tileEntity;
}
}
}
@Override
public boolean canTileConnect(Connection type, ForgeDirection dir)
{
return type == Connection.FLUIDS;
}
@Override
public String getMeterReading(EntityPlayer user, ForgeDirection side, EnumTools tool)
{
// TODO maybe debug on # of connected units of input/output
String output = "";
if (!worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord))
{
output += "Open";
}
else
{
output += "Closed";
}
return output;
}
}