Got tanks almost working

This commit is contained in:
Calclavia 2014-01-19 15:14:20 +08:00
parent ff0dbfe5ad
commit c90d509d5e
8 changed files with 180 additions and 312 deletions

View file

@ -4,14 +4,16 @@ import net.minecraftforge.fluids.FluidTank;
import net.minecraftforge.fluids.IFluidHandler;
import universalelectricity.api.net.IConnector;
/** Generic interface for any tile that acts as part of a fluid network. Generally network assume
/**
* Generic interface for any tile that acts as part of a fluid network. Generally network assume
* that each part can only support one fluid tank internally
*
* @author DarkGuardsman */
* @author DarkGuardsman
*/
public interface IFluidConnector extends IConnector<IFluidNetwork>, IFluidHandler
{
/** FluidTank that the network will have access to fill or drain */
public FluidTank getInternalTank();
public void onFluidChanged();
/** FluidTank that the network will have access to fill or drain */
public FluidTank getInternalTank();
public void onFluidChanged();
}

View file

@ -13,140 +13,140 @@ import calclavia.lib.render.ColorCode.IColorCoded;
public class TilePipe extends TileFluidNetwork implements IColorCoded, IFluidPipe
{
/** gets the current color mark of the pipe */
@Override
public ColorCode getColor()
{
return EnumPipeType.getColorCode(this.colorID);
}
/** gets the current color mark of the pipe */
@Override
public ColorCode getColor()
{
return EnumPipeType.getColorCode(this.colorID);
}
/** sets the current color mark of the pipe */
@Override
public boolean setColor(Object cc)
{
if (!worldObj.isRemote)
{
int p = this.colorID;
this.colorID = EnumPipeType.getUpdatedID(colorID, ColorCode.get(cc));
return p != this.colorID;
}
return false;
}
/** sets the current color mark of the pipe */
@Override
public boolean setColor(Object cc)
{
if (!worldObj.isRemote)
{
int p = this.colorID;
this.colorID = EnumPipeType.getUpdatedID(colorID, ColorCode.get(cc));
return p != this.colorID;
}
return false;
}
@Override
public void validateConnectionSide(TileEntity tileEntity, ForgeDirection side)
{
int meta = new Vector3(this).getBlockMetadata(this.worldObj);
if (meta < FluidContainerMaterial.values().length)
{
FluidContainerMaterial pipeMat = FluidContainerMaterial.values()[meta];
if (pipeMat == FluidContainerMaterial.WOOD || pipeMat == FluidContainerMaterial.STONE)
{
if (side == ForgeDirection.UP)
{
return;
}
}
}
if (tileEntity instanceof TilePipe)
{
int metaOther = new Vector3(tileEntity).getBlockMetadata(this.worldObj);
if (meta < FluidContainerMaterial.values().length && metaOther < FluidContainerMaterial.values().length)
{
FluidContainerMaterial pipeMat = FluidContainerMaterial.values()[meta];
FluidContainerMaterial pipeMatOther = FluidContainerMaterial.values()[metaOther];
// Same pipe types can connect
if (pipeMat == pipeMatOther)
{
this.getNetwork().merge(((IFluidPipe) tileEntity).getNetwork());
connectedBlocks[side.ordinal()] = tileEntity;
setRenderSide(side, true);
}
else if ((pipeMat == FluidContainerMaterial.WOOD || pipeMat == FluidContainerMaterial.STONE) && (pipeMatOther == FluidContainerMaterial.WOOD || pipeMatOther == FluidContainerMaterial.STONE))
{
// Wood and stone pipes can connect to each other but not other pipe types since
// they are more like a trough than a pipe
this.getNetwork().merge(((IFluidPipe) tileEntity).getNetwork());
connectedBlocks[side.ordinal()] = tileEntity;
setRenderSide(side, true);
}
else if (pipeMat != FluidContainerMaterial.WOOD && pipeMat != FluidContainerMaterial.STONE && pipeMatOther != FluidContainerMaterial.WOOD && pipeMatOther != FluidContainerMaterial.STONE && pipeMat != FluidContainerMaterial.GLASS && pipeMatOther != FluidContainerMaterial.GLASS)
{
/*
* Any other pipe can connect to each other as long as the color matches except
* for glass which only works with itself at the moment
*/
this.getNetwork().merge(((IFluidPipe) tileEntity).getNetwork());
connectedBlocks[side.ordinal()] = tileEntity;
setRenderSide(side, true);
}
}
}
else if (tileEntity instanceof IFluidHandler)
{
connectedBlocks[side.ordinal()] = tileEntity;
setRenderSide(side, true);
}
@Override
public void validateConnectionSide(TileEntity tileEntity, ForgeDirection side)
{
int meta = new Vector3(this).getBlockMetadata(this.worldObj);
if (meta < FluidContainerMaterial.values().length)
{
FluidContainerMaterial pipeMat = FluidContainerMaterial.values()[meta];
if (pipeMat == FluidContainerMaterial.WOOD || pipeMat == FluidContainerMaterial.STONE)
{
if (side == ForgeDirection.UP)
{
return;
}
}
}
if (tileEntity instanceof TilePipe)
{
int metaOther = new Vector3(tileEntity).getBlockMetadata(this.worldObj);
if (meta < FluidContainerMaterial.values().length && metaOther < FluidContainerMaterial.values().length)
{
FluidContainerMaterial pipeMat = FluidContainerMaterial.values()[meta];
FluidContainerMaterial pipeMatOther = FluidContainerMaterial.values()[metaOther];
// Same pipe types can connect
if (pipeMat == pipeMatOther)
{
this.getNetwork().merge(((IFluidPipe) tileEntity).getNetwork());
connectedBlocks[side.ordinal()] = tileEntity;
setRenderSide(side, true);
}
else if ((pipeMat == FluidContainerMaterial.WOOD || pipeMat == FluidContainerMaterial.STONE) && (pipeMatOther == FluidContainerMaterial.WOOD || pipeMatOther == FluidContainerMaterial.STONE))
{
// Wood and stone pipes can connect to each other but not other pipe types since
// they are more like a trough than a pipe
this.getNetwork().merge(((IFluidPipe) tileEntity).getNetwork());
connectedBlocks[side.ordinal()] = tileEntity;
setRenderSide(side, true);
}
else if (pipeMat != FluidContainerMaterial.WOOD && pipeMat != FluidContainerMaterial.STONE && pipeMatOther != FluidContainerMaterial.WOOD && pipeMatOther != FluidContainerMaterial.STONE && pipeMat != FluidContainerMaterial.GLASS && pipeMatOther != FluidContainerMaterial.GLASS)
{
/*
* Any other pipe can connect to each other as long as the color matches except
* for glass which only works with itself at the moment
*/
this.getNetwork().merge(((IFluidPipe) tileEntity).getNetwork());
connectedBlocks[side.ordinal()] = tileEntity;
setRenderSide(side, true);
}
}
}
else if (tileEntity instanceof IFluidHandler)
{
connectedBlocks[side.ordinal()] = tileEntity;
setRenderSide(side, true);
}
}
}
@Override
public PipeNetwork getNetwork()
{
if (this.network == null)
{
this.network = new PipeNetwork();
this.network.addConnector(this);
}
return (PipeNetwork) this.network;
}
@Override
public IFluidNetwork getNetwork()
{
if (this.network == null)
{
this.network = new PipeNetwork();
this.network.addConnector(this);
}
return this.network;
}
@Override
public void setNetwork(IFluidNetwork network)
{
if (network instanceof PipeNetwork)
{
this.network = (PipeNetwork) network;
}
}
@Override
public void setNetwork(IFluidNetwork network)
{
if (network instanceof PipeNetwork)
{
this.network = (PipeNetwork) network;
}
}
@Override
public void sendTankUpdate()
{
if (this.getBlockMetadata() == FluidContainerMaterial.WOOD.ordinal() || this.getBlockMetadata() == FluidContainerMaterial.STONE.ordinal())
{
super.sendTankUpdate();
}
}
@Override
public void sendTankUpdate()
{
if (this.getBlockMetadata() == FluidContainerMaterial.WOOD.ordinal() || this.getBlockMetadata() == FluidContainerMaterial.STONE.ordinal())
{
super.sendTankUpdate();
}
}
@Override
public boolean canDrain(ForgeDirection from, Fluid fluid)
{
return false;
}
@Override
public boolean canDrain(ForgeDirection from, Fluid fluid)
{
return false;
}
@Override
public int getPressureIn(ForgeDirection side)
{
return this.getMaxPressure();
}
@Override
public int getPressureIn(ForgeDirection side)
{
return this.getMaxPressure();
}
@Override
public void onWrongPressure(ForgeDirection side, int pressure)
{
// TODO Auto-generated method stub
@Override
public void onWrongPressure(ForgeDirection side, int pressure)
{
// TODO Auto-generated method stub
}
}
@Override
public int getMaxPressure()
{
return 10000;
}
@Override
public int getMaxPressure()
{
return 10000;
}
@Override
public int getMaxFlowRate()
{
return 1000;
}
@Override
public int getMaxFlowRate()
{
return 1000;
}
}

View file

@ -1,18 +0,0 @@
package resonantinduction.mechanical.fluid.prefab;
import java.util.Random;
import resonantinduction.core.tilenetwork.prefab.NetworkTileEntities;
import calclavia.lib.prefab.tile.TileAdvanced;
public abstract class TileEntityFluidDevice extends TileAdvanced
{
public Random random = new Random();
@Override
public void invalidate()
{
super.invalidate();
NetworkTileEntities.invalidate(this);
}
}

View file

@ -1,116 +0,0 @@
package resonantinduction.mechanical.fluid.prefab;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTank;
import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler;
import calclavia.lib.render.ColorCode.IColorCoded;
import calclavia.lib.utility.FluidUtility;
public abstract class TileEntityFluidStorage extends TileEntityFluidDevice implements IFluidHandler, IColorCoded
{
public FluidTank fluidTank;
@Override
public int fill(ForgeDirection from, FluidStack resource, boolean doFill)
{
if (resource == null || resource.getFluid() == null)
{
return 0;
}
else if (this.getTank().getFluid() != null && !resource.isFluidEqual(this.getTank().getFluid()))
{
return 0;
}
return this.getTank().fill(resource, doFill);
}
@Override
public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain)
{
if (this.getTank().getFluid() == null)
{
return null;
}
FluidStack stack = this.getTank().getFluid();
if (maxDrain < stack.amount)
{
stack = FluidUtility.getStack(stack, maxDrain);
}
return this.getTank().drain(maxDrain, doDrain);
}
@Override
public FluidTankInfo[] getTankInfo(ForgeDirection from)
{
if (this.getTank() != null)
{
return new FluidTankInfo[] { new FluidTankInfo(this.getTank()) };
}
return new FluidTankInfo[1];
}
@Override
public void readFromNBT(NBTTagCompound nbt)
{
super.readFromNBT(nbt);
if (nbt.hasKey("stored"))
{
NBTTagCompound tag = nbt.getCompoundTag("stored");
String name = tag.getString("LiquidName");
int amount = nbt.getInteger("Amount");
Fluid fluid = FluidRegistry.getFluid(name);
if (fluid != null)
{
FluidStack liquid = new FluidStack(fluid, amount);
getTank().setFluid(liquid);
}
}
else
{
// System.out.println("Loading fluid tank");
getTank().readFromNBT(nbt.getCompoundTag("FluidTank"));
// System.out.println("Tank: "+ (getTank().getFluid() != null ?
// getTank().getFluid().fluidID +"@"+getTank().getFluid().amount+"mb" : "Empty"));
}
}
@Override
public void writeToNBT(NBTTagCompound nbt)
{
super.writeToNBT(nbt);
if (this.getTank() != null)
{
// System.out.println("Saving fluid tank");
// System.out.println("Tank: "+ (getTank().getFluid() != null ?
// getTank().getFluid().fluidID +"@"+getTank().getFluid().amount+"mb" : "Empty"));
nbt.setCompoundTag("FluidTank", this.getTank().writeToNBT(new NBTTagCompound()));
}
}
/** Is the internal tank full */
public boolean isFull()
{
return this.getTank().getFluidAmount() >= this.getTank().getCapacity();
}
public FluidTank getTank()
{
if (this.fluidTank == null)
{
this.fluidTank = new FluidTank(this.getTankSize());
}
return this.fluidTank;
}
/** gets the max storage limit of the tank */
public abstract int getTankSize();
}

View file

@ -13,14 +13,14 @@ import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTank;
import net.minecraftforge.fluids.FluidTankInfo;
import resonantinduction.api.IReadOut;
import resonantinduction.api.fluid.IFluidNetwork;
import resonantinduction.api.fluid.IFluidConnector;
import resonantinduction.api.fluid.IFluidNetwork;
import resonantinduction.core.ResonantInduction;
import resonantinduction.mechanical.Mechanical;
import resonantinduction.mechanical.fluid.network.FluidNetwork;
import universalelectricity.api.vector.Vector3;
import calclavia.lib.network.IPacketReceiverWithID;
import calclavia.lib.network.PacketHandler;
import calclavia.lib.prefab.tile.TileAdvanced;
import calclavia.lib.utility.FluidUtility;
import com.google.common.io.ByteArrayDataInput;
@ -34,9 +34,8 @@ import cpw.mods.fml.relauncher.SideOnly;
* @author DarkCow
*
*/
public abstract class TileFluidNetwork<N extends FluidNetwork> extends TileEntityFluidDevice implements IFluidConnector, IPacketReceiverWithID, IReadOut
public abstract class TileFluidNetwork extends TileAdvanced implements IFluidConnector, IPacketReceiverWithID, IReadOut
{
public static int refreshRate = 10;
protected FluidTank tank = new FluidTank(1 * FluidContainerRegistry.BUCKET_VOLUME);
protected Object[] connectedBlocks = new Object[6];
protected int colorID = 0;
@ -45,7 +44,7 @@ public abstract class TileFluidNetwork<N extends FluidNetwork> extends TileEntit
protected FluidStack prevStack = null;
/** Network used to link all parts together */
protected N network;
protected IFluidNetwork network;
public static final int PACKET_DESCRIPTION = Mechanical.contentRegistry.getNextPacketID();
public static final int PACKET_RENDER = Mechanical.contentRegistry.getNextPacketID();
@ -61,7 +60,8 @@ public abstract class TileFluidNetwork<N extends FluidNetwork> extends TileEntit
public void initiate()
{
super.initiate();
this.refresh();
refresh();
getNetwork().reconstruct();
}
@Override
@ -71,7 +71,7 @@ public abstract class TileFluidNetwork<N extends FluidNetwork> extends TileEntit
if (!worldObj.isRemote)
{
if (this.updateFluidRender && ticks % TileFluidNetwork.refreshRate == 0)
if (this.updateFluidRender)
{
if (!FluidUtility.matchExact(prevStack, this.getInternalTank().getFluid()))
{

View file

@ -15,13 +15,13 @@ import net.minecraftforge.fluids.FluidTank;
import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler;
import resonantinduction.api.fluid.IDrain;
import resonantinduction.mechanical.fluid.prefab.TileEntityFluidDevice;
import universalelectricity.api.vector.Vector3;
import calclavia.lib.prefab.tile.TileAdvanced;
import calclavia.lib.utility.FluidUtility;
import com.builtbroken.common.Pair;
public class TileGrate extends TileEntityFluidDevice implements IFluidHandler, IDrain
public class TileGrate extends TileAdvanced implements IFluidHandler, IDrain
{
/* MAX BLOCKS DRAINED PER 1/2 SECOND */
public static int MAX_WORLD_EDITS_PER_PROCESS = 50;

View file

@ -3,51 +3,51 @@ package resonantinduction.mechanical.fluid.tank;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.fluids.FluidContainerRegistry;
import resonantinduction.api.fluid.IFluidNetwork;
import resonantinduction.api.fluid.IFluidConnector;
import resonantinduction.api.fluid.IFluidNetwork;
import resonantinduction.mechanical.fluid.prefab.TileFluidNetwork;
public class TileTank extends TileFluidNetwork
{
public static final int VOLUME = 16;
public static final int VOLUME = 16;
public TileTank()
{
this.getInternalTank().setCapacity(VOLUME * FluidContainerRegistry.BUCKET_VOLUME);
}
public TileTank()
{
this.getInternalTank().setCapacity(VOLUME * FluidContainerRegistry.BUCKET_VOLUME);
}
@Override
public TankNetwork getNetwork()
{
if (this.network == null)
{
this.network = new TankNetwork();
this.network.addConnector(this);
}
return (TankNetwork) this.network;
}
@Override
public IFluidNetwork getNetwork()
{
if (this.network == null)
{
this.network = new TankNetwork();
this.network.addConnector(this);
}
return this.network;
}
@Override
public void setNetwork(IFluidNetwork network)
{
if (network instanceof TankNetwork)
{
this.network = (TankNetwork) network;
}
}
@Override
public void setNetwork(IFluidNetwork network)
{
if (network instanceof TankNetwork)
{
this.network = (TankNetwork) network;
}
}
@Override
public void validateConnectionSide(TileEntity tileEntity, ForgeDirection side)
{
if (!this.worldObj.isRemote)
{
if (tileEntity instanceof TileTank)
{
this.getNetwork().merge(((IFluidConnector) tileEntity).getNetwork());
this.setRenderSide(side, true);
connectedBlocks[side.ordinal()] = tileEntity;
}
}
}
@Override
public void validateConnectionSide(TileEntity tileEntity, ForgeDirection side)
{
if (!this.worldObj.isRemote)
{
if (tileEntity instanceof TileTank)
{
this.getNetwork().merge(((IFluidConnector) tileEntity).getNetwork());
this.setRenderSide(side, true);
connectedBlocks[side.ordinal()] = tileEntity;
}
}
}
}

View file

@ -9,10 +9,10 @@ import net.minecraftforge.fluids.IFluidHandler;
import resonantinduction.api.IReadOut;
import resonantinduction.api.fluid.IFluidPipe;
import resonantinduction.core.tilenetwork.ITileConnector;
import resonantinduction.mechanical.fluid.prefab.TileEntityFluidDevice;
import resonantinduction.mechanical.fluid.pipe.TilePipe;
import calclavia.lib.utility.WorldUtility;
public class TileReleaseValve extends TileEntityFluidDevice implements ITileConnector, IReadOut
public class TileReleaseValve extends TilePipe implements ITileConnector, IReadOut
{
public TileEntity[] connected = new TileEntity[6];