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 net.minecraftforge.fluids.IFluidHandler;
import universalelectricity.api.net.IConnector; 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 * that each part can only support one fluid tank internally
* *
* @author DarkGuardsman */ * @author DarkGuardsman
*/
public interface IFluidConnector extends IConnector<IFluidNetwork>, IFluidHandler public interface IFluidConnector extends IConnector<IFluidNetwork>, IFluidHandler
{ {
/** FluidTank that the network will have access to fill or drain */ /** FluidTank that the network will have access to fill or drain */
public FluidTank getInternalTank(); public FluidTank getInternalTank();
public void onFluidChanged(); public void onFluidChanged();
} }

View file

@ -13,140 +13,140 @@ import calclavia.lib.render.ColorCode.IColorCoded;
public class TilePipe extends TileFluidNetwork implements IColorCoded, IFluidPipe public class TilePipe extends TileFluidNetwork implements IColorCoded, IFluidPipe
{ {
/** gets the current color mark of the pipe */ /** gets the current color mark of the pipe */
@Override @Override
public ColorCode getColor() public ColorCode getColor()
{ {
return EnumPipeType.getColorCode(this.colorID); return EnumPipeType.getColorCode(this.colorID);
} }
/** sets the current color mark of the pipe */ /** sets the current color mark of the pipe */
@Override @Override
public boolean setColor(Object cc) public boolean setColor(Object cc)
{ {
if (!worldObj.isRemote) if (!worldObj.isRemote)
{ {
int p = this.colorID; int p = this.colorID;
this.colorID = EnumPipeType.getUpdatedID(colorID, ColorCode.get(cc)); this.colorID = EnumPipeType.getUpdatedID(colorID, ColorCode.get(cc));
return p != this.colorID; return p != this.colorID;
} }
return false; return false;
} }
@Override @Override
public void validateConnectionSide(TileEntity tileEntity, ForgeDirection side) public void validateConnectionSide(TileEntity tileEntity, ForgeDirection side)
{ {
int meta = new Vector3(this).getBlockMetadata(this.worldObj); int meta = new Vector3(this).getBlockMetadata(this.worldObj);
if (meta < FluidContainerMaterial.values().length) if (meta < FluidContainerMaterial.values().length)
{ {
FluidContainerMaterial pipeMat = FluidContainerMaterial.values()[meta]; FluidContainerMaterial pipeMat = FluidContainerMaterial.values()[meta];
if (pipeMat == FluidContainerMaterial.WOOD || pipeMat == FluidContainerMaterial.STONE) if (pipeMat == FluidContainerMaterial.WOOD || pipeMat == FluidContainerMaterial.STONE)
{ {
if (side == ForgeDirection.UP) if (side == ForgeDirection.UP)
{ {
return; return;
} }
} }
} }
if (tileEntity instanceof TilePipe) if (tileEntity instanceof TilePipe)
{ {
int metaOther = new Vector3(tileEntity).getBlockMetadata(this.worldObj); int metaOther = new Vector3(tileEntity).getBlockMetadata(this.worldObj);
if (meta < FluidContainerMaterial.values().length && metaOther < FluidContainerMaterial.values().length) if (meta < FluidContainerMaterial.values().length && metaOther < FluidContainerMaterial.values().length)
{ {
FluidContainerMaterial pipeMat = FluidContainerMaterial.values()[meta]; FluidContainerMaterial pipeMat = FluidContainerMaterial.values()[meta];
FluidContainerMaterial pipeMatOther = FluidContainerMaterial.values()[metaOther]; FluidContainerMaterial pipeMatOther = FluidContainerMaterial.values()[metaOther];
// Same pipe types can connect // Same pipe types can connect
if (pipeMat == pipeMatOther) if (pipeMat == pipeMatOther)
{ {
this.getNetwork().merge(((IFluidPipe) tileEntity).getNetwork()); this.getNetwork().merge(((IFluidPipe) tileEntity).getNetwork());
connectedBlocks[side.ordinal()] = tileEntity; connectedBlocks[side.ordinal()] = tileEntity;
setRenderSide(side, true); setRenderSide(side, true);
} }
else if ((pipeMat == FluidContainerMaterial.WOOD || pipeMat == FluidContainerMaterial.STONE) && (pipeMatOther == FluidContainerMaterial.WOOD || pipeMatOther == FluidContainerMaterial.STONE)) 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 // Wood and stone pipes can connect to each other but not other pipe types since
// they are more like a trough than a pipe // they are more like a trough than a pipe
this.getNetwork().merge(((IFluidPipe) tileEntity).getNetwork()); this.getNetwork().merge(((IFluidPipe) tileEntity).getNetwork());
connectedBlocks[side.ordinal()] = tileEntity; connectedBlocks[side.ordinal()] = tileEntity;
setRenderSide(side, true); setRenderSide(side, true);
} }
else if (pipeMat != FluidContainerMaterial.WOOD && pipeMat != FluidContainerMaterial.STONE && pipeMatOther != FluidContainerMaterial.WOOD && pipeMatOther != FluidContainerMaterial.STONE && pipeMat != FluidContainerMaterial.GLASS && pipeMatOther != FluidContainerMaterial.GLASS) 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 * 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 * for glass which only works with itself at the moment
*/ */
this.getNetwork().merge(((IFluidPipe) tileEntity).getNetwork()); this.getNetwork().merge(((IFluidPipe) tileEntity).getNetwork());
connectedBlocks[side.ordinal()] = tileEntity; connectedBlocks[side.ordinal()] = tileEntity;
setRenderSide(side, true); setRenderSide(side, true);
} }
} }
} }
else if (tileEntity instanceof IFluidHandler) else if (tileEntity instanceof IFluidHandler)
{ {
connectedBlocks[side.ordinal()] = tileEntity; connectedBlocks[side.ordinal()] = tileEntity;
setRenderSide(side, true); setRenderSide(side, true);
} }
} }
@Override @Override
public PipeNetwork getNetwork() public IFluidNetwork getNetwork()
{ {
if (this.network == null) if (this.network == null)
{ {
this.network = new PipeNetwork(); this.network = new PipeNetwork();
this.network.addConnector(this); this.network.addConnector(this);
} }
return (PipeNetwork) this.network; return this.network;
} }
@Override @Override
public void setNetwork(IFluidNetwork network) public void setNetwork(IFluidNetwork network)
{ {
if (network instanceof PipeNetwork) if (network instanceof PipeNetwork)
{ {
this.network = (PipeNetwork) network; this.network = (PipeNetwork) network;
} }
} }
@Override @Override
public void sendTankUpdate() public void sendTankUpdate()
{ {
if (this.getBlockMetadata() == FluidContainerMaterial.WOOD.ordinal() || this.getBlockMetadata() == FluidContainerMaterial.STONE.ordinal()) if (this.getBlockMetadata() == FluidContainerMaterial.WOOD.ordinal() || this.getBlockMetadata() == FluidContainerMaterial.STONE.ordinal())
{ {
super.sendTankUpdate(); super.sendTankUpdate();
} }
} }
@Override @Override
public boolean canDrain(ForgeDirection from, Fluid fluid) public boolean canDrain(ForgeDirection from, Fluid fluid)
{ {
return false; return false;
} }
@Override @Override
public int getPressureIn(ForgeDirection side) public int getPressureIn(ForgeDirection side)
{ {
return this.getMaxPressure(); return this.getMaxPressure();
} }
@Override @Override
public void onWrongPressure(ForgeDirection side, int pressure) public void onWrongPressure(ForgeDirection side, int pressure)
{ {
// TODO Auto-generated method stub // TODO Auto-generated method stub
} }
@Override @Override
public int getMaxPressure() public int getMaxPressure()
{ {
return 10000; return 10000;
} }
@Override @Override
public int getMaxFlowRate() public int getMaxFlowRate()
{ {
return 1000; 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.FluidTank;
import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.FluidTankInfo;
import resonantinduction.api.IReadOut; import resonantinduction.api.IReadOut;
import resonantinduction.api.fluid.IFluidNetwork;
import resonantinduction.api.fluid.IFluidConnector; import resonantinduction.api.fluid.IFluidConnector;
import resonantinduction.api.fluid.IFluidNetwork;
import resonantinduction.core.ResonantInduction; import resonantinduction.core.ResonantInduction;
import resonantinduction.mechanical.Mechanical; import resonantinduction.mechanical.Mechanical;
import resonantinduction.mechanical.fluid.network.FluidNetwork;
import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.Vector3;
import calclavia.lib.network.IPacketReceiverWithID; import calclavia.lib.network.IPacketReceiverWithID;
import calclavia.lib.network.PacketHandler; import calclavia.lib.network.PacketHandler;
import calclavia.lib.prefab.tile.TileAdvanced;
import calclavia.lib.utility.FluidUtility; import calclavia.lib.utility.FluidUtility;
import com.google.common.io.ByteArrayDataInput; import com.google.common.io.ByteArrayDataInput;
@ -34,9 +34,8 @@ import cpw.mods.fml.relauncher.SideOnly;
* @author DarkCow * @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 FluidTank tank = new FluidTank(1 * FluidContainerRegistry.BUCKET_VOLUME);
protected Object[] connectedBlocks = new Object[6]; protected Object[] connectedBlocks = new Object[6];
protected int colorID = 0; protected int colorID = 0;
@ -45,7 +44,7 @@ public abstract class TileFluidNetwork<N extends FluidNetwork> extends TileEntit
protected FluidStack prevStack = null; protected FluidStack prevStack = null;
/** Network used to link all parts together */ /** 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_DESCRIPTION = Mechanical.contentRegistry.getNextPacketID();
public static final int PACKET_RENDER = 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() public void initiate()
{ {
super.initiate(); super.initiate();
this.refresh(); refresh();
getNetwork().reconstruct();
} }
@Override @Override
@ -71,7 +71,7 @@ public abstract class TileFluidNetwork<N extends FluidNetwork> extends TileEntit
if (!worldObj.isRemote) if (!worldObj.isRemote)
{ {
if (this.updateFluidRender && ticks % TileFluidNetwork.refreshRate == 0) if (this.updateFluidRender)
{ {
if (!FluidUtility.matchExact(prevStack, this.getInternalTank().getFluid())) 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.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler; import net.minecraftforge.fluids.IFluidHandler;
import resonantinduction.api.fluid.IDrain; import resonantinduction.api.fluid.IDrain;
import resonantinduction.mechanical.fluid.prefab.TileEntityFluidDevice;
import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.Vector3;
import calclavia.lib.prefab.tile.TileAdvanced;
import calclavia.lib.utility.FluidUtility; import calclavia.lib.utility.FluidUtility;
import com.builtbroken.common.Pair; 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 */ /* MAX BLOCKS DRAINED PER 1/2 SECOND */
public static int MAX_WORLD_EDITS_PER_PROCESS = 50; 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.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidContainerRegistry;
import resonantinduction.api.fluid.IFluidNetwork;
import resonantinduction.api.fluid.IFluidConnector; import resonantinduction.api.fluid.IFluidConnector;
import resonantinduction.api.fluid.IFluidNetwork;
import resonantinduction.mechanical.fluid.prefab.TileFluidNetwork; import resonantinduction.mechanical.fluid.prefab.TileFluidNetwork;
public class TileTank extends TileFluidNetwork public class TileTank extends TileFluidNetwork
{ {
public static final int VOLUME = 16; public static final int VOLUME = 16;
public TileTank() public TileTank()
{ {
this.getInternalTank().setCapacity(VOLUME * FluidContainerRegistry.BUCKET_VOLUME); this.getInternalTank().setCapacity(VOLUME * FluidContainerRegistry.BUCKET_VOLUME);
} }
@Override @Override
public TankNetwork getNetwork() public IFluidNetwork getNetwork()
{ {
if (this.network == null) if (this.network == null)
{ {
this.network = new TankNetwork(); this.network = new TankNetwork();
this.network.addConnector(this); this.network.addConnector(this);
} }
return (TankNetwork) this.network; return this.network;
} }
@Override @Override
public void setNetwork(IFluidNetwork network) public void setNetwork(IFluidNetwork network)
{ {
if (network instanceof TankNetwork) if (network instanceof TankNetwork)
{ {
this.network = (TankNetwork) network; this.network = (TankNetwork) network;
} }
} }
@Override @Override
public void validateConnectionSide(TileEntity tileEntity, ForgeDirection side) public void validateConnectionSide(TileEntity tileEntity, ForgeDirection side)
{ {
if (!this.worldObj.isRemote) if (!this.worldObj.isRemote)
{ {
if (tileEntity instanceof TileTank) if (tileEntity instanceof TileTank)
{ {
this.getNetwork().merge(((IFluidConnector) tileEntity).getNetwork()); this.getNetwork().merge(((IFluidConnector) tileEntity).getNetwork());
this.setRenderSide(side, true); this.setRenderSide(side, true);
connectedBlocks[side.ordinal()] = tileEntity; connectedBlocks[side.ordinal()] = tileEntity;
} }
} }
} }
} }

View file

@ -9,10 +9,10 @@ import net.minecraftforge.fluids.IFluidHandler;
import resonantinduction.api.IReadOut; import resonantinduction.api.IReadOut;
import resonantinduction.api.fluid.IFluidPipe; import resonantinduction.api.fluid.IFluidPipe;
import resonantinduction.core.tilenetwork.ITileConnector; import resonantinduction.core.tilenetwork.ITileConnector;
import resonantinduction.mechanical.fluid.prefab.TileEntityFluidDevice; import resonantinduction.mechanical.fluid.pipe.TilePipe;
import calclavia.lib.utility.WorldUtility; 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]; public TileEntity[] connected = new TileEntity[6];