Added pump and new pressure fluid system
This commit is contained in:
parent
72bb31bcbf
commit
8b4afcac8c
15 changed files with 251 additions and 140 deletions
|
@ -135,25 +135,24 @@ public class TileChannel extends TileFluidNetwork implements IBlockActivate, IFl
|
||||||
@Override
|
@Override
|
||||||
public void onWrongPressure(ForgeDirection side, int pressure)
|
public void onWrongPressure(ForgeDirection side, int pressure)
|
||||||
{
|
{
|
||||||
// TODO place fluid blocks into the world
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getMaxPressure()
|
public int getPressure(ForgeDirection dir)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPressure()
|
|
||||||
{
|
|
||||||
return this.getNetwork().getPressure();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getMaxFlowRate()
|
public int getMaxFlowRate()
|
||||||
{
|
{
|
||||||
return 500;
|
return 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPressure(int amount)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,7 +95,7 @@ dependencies {
|
||||||
compile group: 'calclaviacore', name: 'calclavia-core', version: "${config.version.calclaviacore}", classifier: "dev"
|
compile group: 'calclaviacore', name: 'calclavia-core', version: "${config.version.calclaviacore}", classifier: "dev"
|
||||||
compile name: 'CodeChickenLib', version: "${config.version.minecraft}-${config.version.cclib}", ext: 'jar'
|
compile name: 'CodeChickenLib', version: "${config.version.minecraft}-${config.version.cclib}", ext: 'jar'
|
||||||
compile name: 'ForgeMultipart', version: "${config.version.minecraft}-${config.version.fmp}", ext: 'jar'
|
compile name: 'ForgeMultipart', version: "${config.version.minecraft}-${config.version.fmp}", ext: 'jar'
|
||||||
compile name: 'NotEnoughItems', version: "${config.version.nei}", type: 'jar'
|
compile name: 'NotEnoughItems', version: "${config.version.nei}", ext: 'jar'
|
||||||
}
|
}
|
||||||
|
|
||||||
publishing {
|
publishing {
|
||||||
|
|
|
@ -18,7 +18,9 @@ import resonantinduction.mechanical.fluid.pipe.ItemPipe;
|
||||||
import resonantinduction.mechanical.fluid.tank.BlockTank;
|
import resonantinduction.mechanical.fluid.tank.BlockTank;
|
||||||
import resonantinduction.mechanical.fluid.tank.TileTank;
|
import resonantinduction.mechanical.fluid.tank.TileTank;
|
||||||
import resonantinduction.mechanical.fluid.transport.BlockGrate;
|
import resonantinduction.mechanical.fluid.transport.BlockGrate;
|
||||||
|
import resonantinduction.mechanical.fluid.transport.BlockPump;
|
||||||
import resonantinduction.mechanical.fluid.transport.TileGrate;
|
import resonantinduction.mechanical.fluid.transport.TileGrate;
|
||||||
|
import resonantinduction.mechanical.fluid.transport.TilePump;
|
||||||
import resonantinduction.mechanical.gear.ItemGear;
|
import resonantinduction.mechanical.gear.ItemGear;
|
||||||
import resonantinduction.mechanical.gear.ItemGearShaft;
|
import resonantinduction.mechanical.gear.ItemGearShaft;
|
||||||
import resonantinduction.mechanical.item.ItemPipeGauge;
|
import resonantinduction.mechanical.item.ItemPipeGauge;
|
||||||
|
@ -94,6 +96,7 @@ public class Mechanical
|
||||||
public static Block blockTank;
|
public static Block blockTank;
|
||||||
public static Block blockReleaseValve;
|
public static Block blockReleaseValve;
|
||||||
public static Block blockGrate;
|
public static Block blockGrate;
|
||||||
|
public static Block blockPump;
|
||||||
|
|
||||||
public static Item itemPipe;
|
public static Item itemPipe;
|
||||||
public static Item itemPipeGuage;
|
public static Item itemPipeGuage;
|
||||||
|
@ -124,6 +127,7 @@ public class Mechanical
|
||||||
|
|
||||||
blockTank = contentRegistry.createBlock(BlockTank.class, ItemBlockFluidContainer.class, TileTank.class);
|
blockTank = contentRegistry.createBlock(BlockTank.class, ItemBlockFluidContainer.class, TileTank.class);
|
||||||
blockGrate = contentRegistry.createTile(BlockGrate.class, TileGrate.class);
|
blockGrate = contentRegistry.createTile(BlockGrate.class, TileGrate.class);
|
||||||
|
blockPump = contentRegistry.createTile(BlockPump.class, TilePump.class);
|
||||||
|
|
||||||
itemPipeGuage = contentRegistry.createItem(ItemPipeGauge.class);
|
itemPipeGuage = contentRegistry.createItem(ItemPipeGauge.class);
|
||||||
itemPipe = contentRegistry.createItem(ItemPipe.class);
|
itemPipe = contentRegistry.createItem(ItemPipe.class);
|
||||||
|
|
|
@ -34,8 +34,8 @@ import cpw.mods.fml.relauncher.SideOnly;
|
||||||
|
|
||||||
public class PartPipe extends PartFramedConnection<EnumPipeMaterial, IFluidPipe, IFluidNetwork> implements IFluidPipe, TSlottedPart, JNormalOcclusion, IHollowConnect, JIconHitEffects
|
public class PartPipe extends PartFramedConnection<EnumPipeMaterial, IFluidPipe, IFluidNetwork> implements IFluidPipe, TSlottedPart, JNormalOcclusion, IHollowConnect, JIconHitEffects
|
||||||
{
|
{
|
||||||
protected FluidTank tank = new FluidTank(1 * FluidContainerRegistry.BUCKET_VOLUME);
|
protected FluidTank tank = new FluidTank(FluidContainerRegistry.BUCKET_VOLUME);
|
||||||
private boolean isExtracting = false;
|
private int pressure;
|
||||||
|
|
||||||
public PartPipe()
|
public PartPipe()
|
||||||
{
|
{
|
||||||
|
@ -55,44 +55,16 @@ public class PartPipe extends PartFramedConnection<EnumPipeMaterial, IFluidPipe,
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update()
|
public boolean doesTick()
|
||||||
{
|
{
|
||||||
super.update();
|
return false;
|
||||||
|
|
||||||
if (!world().isRemote)
|
|
||||||
{
|
|
||||||
if (isExtracting && getNetwork().getTank().getFluidAmount() < getNetwork().getTank().getCapacity())
|
|
||||||
{
|
|
||||||
|
|
||||||
for (int i = 0; i < this.getConnections().length; i++)
|
|
||||||
{
|
|
||||||
Object obj = this.getConnections()[i];
|
|
||||||
|
|
||||||
if (obj instanceof IFluidHandler)
|
|
||||||
{
|
|
||||||
FluidStack drain = ((IFluidHandler) obj).drain(ForgeDirection.getOrientation(i).getOpposite(), getMaxFlowRate(), true);
|
|
||||||
fill(null, drain, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean activate(EntityPlayer player, MovingObjectPosition part, ItemStack item)
|
public boolean activate(EntityPlayer player, MovingObjectPosition part, ItemStack item)
|
||||||
{
|
{
|
||||||
if (!world().isRemote)
|
if (!world().isRemote)
|
||||||
System.out.println(getNetwork());
|
System.out.println("Pressure: " + pressure + " : " + tank.getFluidAmount());
|
||||||
if (WrenchUtility.isUsableWrench(player, player.getCurrentEquippedItem(), x(), y(), z()))
|
|
||||||
{
|
|
||||||
if (!world().isRemote)
|
|
||||||
{
|
|
||||||
isExtracting = !isExtracting;
|
|
||||||
player.addChatMessage("Pipe extraction mode: " + isExtracting);
|
|
||||||
WrenchUtility.damageWrench(player, player.getCurrentEquippedItem(), x(), y(), z());
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return super.activate(player, part, item);
|
return super.activate(player, part, item);
|
||||||
}
|
}
|
||||||
|
@ -131,19 +103,19 @@ public class PartPipe extends PartFramedConnection<EnumPipeMaterial, IFluidPipe,
|
||||||
@Override
|
@Override
|
||||||
public int fill(ForgeDirection from, FluidStack resource, boolean doFill)
|
public int fill(ForgeDirection from, FluidStack resource, boolean doFill)
|
||||||
{
|
{
|
||||||
return getNetwork().fill(this, from, resource, doFill);
|
return tank.fill(resource, doFill);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain)
|
public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain)
|
||||||
{
|
{
|
||||||
return null;
|
return tank.drain(resource.amount, doDrain);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain)
|
public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain)
|
||||||
{
|
{
|
||||||
return null;
|
return tank.drain(maxDrain, doDrain);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -202,13 +174,15 @@ public class PartPipe extends PartFramedConnection<EnumPipeMaterial, IFluidPipe,
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getPressure()
|
public int getPressure(ForgeDirection dir)
|
||||||
{
|
{
|
||||||
if (this.getNetwork() != null)
|
return pressure;
|
||||||
{
|
}
|
||||||
return this.getNetwork().getPressure();
|
|
||||||
}
|
@Override
|
||||||
return 0;
|
public void setPressure(int amount)
|
||||||
|
{
|
||||||
|
pressure = amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -217,16 +191,10 @@ public class PartPipe extends PartFramedConnection<EnumPipeMaterial, IFluidPipe,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getMaxPressure()
|
|
||||||
{
|
|
||||||
return 1000;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getMaxFlowRate()
|
public int getMaxFlowRate()
|
||||||
{
|
{
|
||||||
return FluidContainerRegistry.BUCKET_VOLUME;
|
return 50;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -240,20 +208,18 @@ public class PartPipe extends PartFramedConnection<EnumPipeMaterial, IFluidPipe,
|
||||||
public void save(NBTTagCompound nbt)
|
public void save(NBTTagCompound nbt)
|
||||||
{
|
{
|
||||||
super.save(nbt);
|
super.save(nbt);
|
||||||
nbt.setBoolean("isExtracting", isExtracting);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void load(NBTTagCompound nbt)
|
public void load(NBTTagCompound nbt)
|
||||||
{
|
{
|
||||||
super.load(nbt);
|
super.load(nbt);
|
||||||
isExtracting = nbt.getBoolean("isExtracting");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canFlow()
|
public boolean canFlow()
|
||||||
{
|
{
|
||||||
return !isExtracting;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -75,13 +75,4 @@ public class TankNetwork extends FluidNetwork
|
||||||
{
|
{
|
||||||
return new TankNetwork();
|
return new TankNetwork();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPressure()
|
|
||||||
{
|
|
||||||
// TODO implement a compression system that would cause a tank to build up pressure greater
|
|
||||||
// than normal ATM
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,9 +9,9 @@ import calclavia.lib.prefab.block.BlockRotatable;
|
||||||
import cpw.mods.fml.relauncher.Side;
|
import cpw.mods.fml.relauncher.Side;
|
||||||
import cpw.mods.fml.relauncher.SideOnly;
|
import cpw.mods.fml.relauncher.SideOnly;
|
||||||
|
|
||||||
public class BlockHydrualicPump extends BlockRotatable
|
public class BlockPump extends BlockRotatable
|
||||||
{
|
{
|
||||||
public BlockHydrualicPump(int id)
|
public BlockPump(int id)
|
||||||
{
|
{
|
||||||
super(id, UniversalElectricity.machine);
|
super(id, UniversalElectricity.machine);
|
||||||
setTextureName(Reference.PREFIX + "material_steel");
|
setTextureName(Reference.PREFIX + "material_steel");
|
||||||
|
@ -21,7 +21,7 @@ public class BlockHydrualicPump extends BlockRotatable
|
||||||
@Override
|
@Override
|
||||||
public TileEntity createNewTileEntity(World world)
|
public TileEntity createNewTileEntity(World world)
|
||||||
{
|
{
|
||||||
return new TileHydraulicPump();
|
return new TilePump();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
|
@ -0,0 +1,34 @@
|
||||||
|
package resonantinduction.mechanical.fluid.transport;
|
||||||
|
|
||||||
|
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
|
||||||
|
import net.minecraft.tileentity.TileEntity;
|
||||||
|
import net.minecraft.util.ResourceLocation;
|
||||||
|
import net.minecraftforge.client.model.AdvancedModelLoader;
|
||||||
|
import net.minecraftforge.client.model.IModelCustom;
|
||||||
|
|
||||||
|
import org.lwjgl.opengl.GL11;
|
||||||
|
|
||||||
|
import resonantinduction.core.Reference;
|
||||||
|
import calclavia.lib.render.RenderUtility;
|
||||||
|
|
||||||
|
public class RenderPump extends TileEntitySpecialRenderer
|
||||||
|
{
|
||||||
|
public static final IModelCustom MODEL = AdvancedModelLoader.loadModel(Reference.MODEL_DIRECTORY + "pump.tcn");
|
||||||
|
public static final ResourceLocation TEXTURE = new ResourceLocation(Reference.DOMAIN, Reference.MODEL_PATH + "pump.png");
|
||||||
|
|
||||||
|
public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f)
|
||||||
|
{
|
||||||
|
TilePump tile = (TilePump) tileEntity;
|
||||||
|
|
||||||
|
GL11.glPushMatrix();
|
||||||
|
GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5);
|
||||||
|
|
||||||
|
GL11.glRotatef(90, 0, 1, 0);
|
||||||
|
if (tile.worldObj != null)
|
||||||
|
RenderUtility.rotateBlockBasedOnDirection(tile.getDirection());
|
||||||
|
|
||||||
|
bindTexture(TEXTURE);
|
||||||
|
MODEL.renderAll();
|
||||||
|
GL11.glPopMatrix();
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,23 +7,14 @@ import net.minecraftforge.fluids.FluidStack;
|
||||||
import net.minecraftforge.fluids.FluidTankInfo;
|
import net.minecraftforge.fluids.FluidTankInfo;
|
||||||
import net.minecraftforge.fluids.IFluidHandler;
|
import net.minecraftforge.fluids.IFluidHandler;
|
||||||
import resonantinduction.api.mechanical.fluid.IFluidPipe;
|
import resonantinduction.api.mechanical.fluid.IFluidPipe;
|
||||||
|
import resonantinduction.api.mechanical.fluid.IPressure;
|
||||||
import universalelectricity.api.vector.Vector3;
|
import universalelectricity.api.vector.Vector3;
|
||||||
import calclavia.lib.prefab.tile.IRotatable;
|
import calclavia.lib.prefab.tile.IRotatable;
|
||||||
import calclavia.lib.prefab.tile.TileAdvanced;
|
import calclavia.lib.prefab.tile.TileAdvanced;
|
||||||
|
|
||||||
public class TileHydraulicPump extends TileAdvanced implements IFluidHandler, IRotatable
|
public class TilePump extends TileAdvanced implements IFluidHandler, IRotatable, IPressure
|
||||||
{
|
{
|
||||||
ForgeDirection facing = ForgeDirection.UNKNOWN;
|
private int pressure;
|
||||||
boolean input = true;
|
|
||||||
final int maxFlow = 1000;
|
|
||||||
int volFilled = 0;
|
|
||||||
int averageVol = 0;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateEntity()
|
|
||||||
{
|
|
||||||
super.updateEntity();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int fill(ForgeDirection from, FluidStack resource, boolean doFill)
|
public int fill(ForgeDirection from, FluidStack resource, boolean doFill)
|
||||||
|
@ -31,61 +22,42 @@ public class TileHydraulicPump extends TileAdvanced implements IFluidHandler, IR
|
||||||
if (from == getDirection().getOpposite())
|
if (from == getDirection().getOpposite())
|
||||||
{
|
{
|
||||||
TileEntity tileOut = new Vector3(this).translate(from.getOpposite()).getTileEntity(this.worldObj);
|
TileEntity tileOut = new Vector3(this).translate(from.getOpposite()).getTileEntity(this.worldObj);
|
||||||
TileEntity tileIn = new Vector3(this).translate(from).getTileEntity(this.worldObj);
|
|
||||||
if (tileIn instanceof IFluidPipe && tileOut instanceof IFluidPipe)
|
if (tileOut instanceof IFluidHandler)
|
||||||
{
|
return ((IFluidHandler) tileOut).fill(from, resource, doFill);
|
||||||
if (((IFluidPipe) tileIn).getPressure() <= ((IFluidPipe) tileOut).getPressure())
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (tileOut instanceof IFluidHandler && !(tileOut instanceof TileHydraulicPump))
|
|
||||||
{
|
|
||||||
// TODO pass fluid on to the other side of the motor and get average flow rate
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain)
|
public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain)
|
||||||
{
|
{
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain)
|
public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain)
|
||||||
{
|
{
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canFill(ForgeDirection from, Fluid fluid)
|
public boolean canFill(ForgeDirection from, Fluid fluid)
|
||||||
{
|
{
|
||||||
return !input && from == this.getDirection().getOpposite();
|
return from == this.getDirection().getOpposite();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canDrain(ForgeDirection from, Fluid fluid)
|
public boolean canDrain(ForgeDirection from, Fluid fluid)
|
||||||
{
|
{
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FluidTankInfo[] getTankInfo(ForgeDirection from)
|
public FluidTankInfo[] getTankInfo(ForgeDirection from)
|
||||||
{
|
{
|
||||||
if (from == getDirection().getOpposite())
|
return null;
|
||||||
{
|
|
||||||
TileEntity tile = new Vector3(this).translate(from.getOpposite()).getTileEntity(this.worldObj);
|
|
||||||
if (tile instanceof IFluidHandler && !(tile instanceof TileHydraulicPump))
|
|
||||||
{
|
|
||||||
return ((IFluidHandler) tile).getTankInfo(from);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new FluidTankInfo[1];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -100,4 +72,25 @@ public class TileHydraulicPump extends TileAdvanced implements IFluidHandler, IR
|
||||||
this.worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, direction.ordinal(), 3);
|
this.worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, direction.ordinal(), 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPressure(int amount)
|
||||||
|
{
|
||||||
|
pressure = amount;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getPressure(ForgeDirection dir)
|
||||||
|
{
|
||||||
|
if (dir == getDirection())
|
||||||
|
{
|
||||||
|
return 20;
|
||||||
|
}
|
||||||
|
else if (dir == getDirection().getOpposite())
|
||||||
|
{
|
||||||
|
return -25;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -56,7 +56,4 @@ public interface IFluidNetwork extends INodeNetwork<IFluidNetwork, IFluidConnect
|
||||||
|
|
||||||
/** Information about the network's tank */
|
/** Information about the network's tank */
|
||||||
FluidTankInfo[] getTankInfo();
|
FluidTankInfo[] getTankInfo();
|
||||||
|
|
||||||
int getPressure();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package resonantinduction.api.mechanical.fluid;
|
package resonantinduction.api.mechanical.fluid;
|
||||||
|
|
||||||
|
import net.minecraftforge.common.ForgeDirection;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Applied to tiles that are pipes and support pressure
|
* Applied to tiles that are pipes and support pressure
|
||||||
*
|
*
|
||||||
|
@ -7,14 +9,6 @@ package resonantinduction.api.mechanical.fluid;
|
||||||
*/
|
*/
|
||||||
public interface IFluidPipe extends IFluidConnector, IPressureInput
|
public interface IFluidPipe extends IFluidConnector, IPressureInput
|
||||||
{
|
{
|
||||||
/**
|
|
||||||
* Max pressure this pipe can support.
|
|
||||||
*
|
|
||||||
* @return amount in pascals.
|
|
||||||
*/
|
|
||||||
int getMaxPressure();
|
|
||||||
|
|
||||||
int getPressure();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Max flow rate of fluid this pipe can support
|
* Max flow rate of fluid this pipe can support
|
||||||
|
@ -22,4 +16,5 @@ public interface IFluidPipe extends IFluidConnector, IPressureInput
|
||||||
* @return amount in liters.
|
* @return amount in liters.
|
||||||
*/
|
*/
|
||||||
int getMaxFlowRate();
|
int getMaxFlowRate();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
package resonantinduction.api.mechanical.fluid;
|
||||||
|
|
||||||
|
import net.minecraftforge.common.ForgeDirection;
|
||||||
|
|
||||||
|
public interface IPressure
|
||||||
|
{
|
||||||
|
public void setPressure(int amount);
|
||||||
|
|
||||||
|
public int getPressure(ForgeDirection dir);
|
||||||
|
}
|
|
@ -7,7 +7,7 @@ import net.minecraftforge.common.ForgeDirection;
|
||||||
*
|
*
|
||||||
* @author DarkGaurdsman
|
* @author DarkGaurdsman
|
||||||
*/
|
*/
|
||||||
public interface IPressureInput
|
public interface IPressureInput extends IPressure
|
||||||
{
|
{
|
||||||
public int getPressureIn(ForgeDirection side);
|
public int getPressureIn(ForgeDirection side);
|
||||||
|
|
||||||
|
|
|
@ -7,10 +7,12 @@ import java.util.Map.Entry;
|
||||||
|
|
||||||
import net.minecraftforge.common.ForgeDirection;
|
import net.minecraftforge.common.ForgeDirection;
|
||||||
import net.minecraftforge.fluids.FluidStack;
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
|
import net.minecraftforge.fluids.FluidTank;
|
||||||
import net.minecraftforge.fluids.IFluidHandler;
|
import net.minecraftforge.fluids.IFluidHandler;
|
||||||
import resonantinduction.api.mechanical.fluid.IFluidConnector;
|
import resonantinduction.api.mechanical.fluid.IFluidConnector;
|
||||||
import resonantinduction.api.mechanical.fluid.IFluidNetwork;
|
import resonantinduction.api.mechanical.fluid.IFluidNetwork;
|
||||||
import resonantinduction.api.mechanical.fluid.IFluidPipe;
|
import resonantinduction.api.mechanical.fluid.IFluidPipe;
|
||||||
|
import resonantinduction.api.mechanical.fluid.IPressure;
|
||||||
import calclavia.lib.utility.FluidUtility;
|
import calclavia.lib.utility.FluidUtility;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -23,12 +25,27 @@ public class PipeNetwork extends FluidNetwork
|
||||||
public HashMap<IFluidHandler, EnumSet<ForgeDirection>> sideMap = new HashMap<IFluidHandler, EnumSet<ForgeDirection>>();
|
public HashMap<IFluidHandler, EnumSet<ForgeDirection>> sideMap = new HashMap<IFluidHandler, EnumSet<ForgeDirection>>();
|
||||||
public HashMap<IFluidHandler, IFluidConnector> connectionMap = new HashMap<IFluidHandler, IFluidConnector>();
|
public HashMap<IFluidHandler, IFluidConnector> connectionMap = new HashMap<IFluidHandler, IFluidConnector>();
|
||||||
public int maxFlowRate = 0;
|
public int maxFlowRate = 0;
|
||||||
public int maxPressure = 0;
|
|
||||||
public int currentPressure = 0;
|
public int currentPressure = 0;
|
||||||
public int currentFlowRate = 0;
|
public int currentFlowRate = 0;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void update()
|
public void update()
|
||||||
|
{
|
||||||
|
for (IFluidConnector connector : getConnectors())
|
||||||
|
{
|
||||||
|
if (connector instanceof IFluidPipe)
|
||||||
|
{
|
||||||
|
calculatePressure((IFluidPipe) connector);
|
||||||
|
distribute((IFluidPipe) connector);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Old pipe distribution code.
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public void oldDistribution()
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Slight delay to allow visual effect to take place before draining the pipe's internal
|
* Slight delay to allow visual effect to take place before draining the pipe's internal
|
||||||
|
@ -58,7 +75,7 @@ public class PipeNetwork extends FluidNetwork
|
||||||
{
|
{
|
||||||
stack.amount -= handler.fill(dir, FluidUtility.getStack(stack, Math.min(volPerSide, this.maxFlowRate)), true);
|
stack.amount -= handler.fill(dir, FluidUtility.getStack(stack, Math.min(volPerSide, this.maxFlowRate)), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sideCount > 1)
|
if (sideCount > 1)
|
||||||
--sideCount;
|
--sideCount;
|
||||||
if (volPer <= 0)
|
if (volPer <= 0)
|
||||||
|
@ -80,10 +97,130 @@ public class PipeNetwork extends FluidNetwork
|
||||||
reconstructTankInfo();
|
reconstructTankInfo();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculate pressure in this pipe.
|
||||||
|
*/
|
||||||
|
public void calculatePressure(IFluidPipe sourcePipe)
|
||||||
|
{
|
||||||
|
int totalPressure = 0;
|
||||||
|
int findCount = 0;
|
||||||
|
int minPressure = 0;
|
||||||
|
int maxPressure = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < 6; i++)
|
||||||
|
{
|
||||||
|
Object obj = sourcePipe.getConnections()[i];
|
||||||
|
|
||||||
|
if (obj instanceof IPressure)
|
||||||
|
{
|
||||||
|
int pressure = ((IPressure) obj).getPressure(ForgeDirection.getOrientation(i).getOpposite());
|
||||||
|
minPressure = Math.min(pressure, minPressure);
|
||||||
|
maxPressure = Math.max(pressure, maxPressure);
|
||||||
|
totalPressure += pressure;
|
||||||
|
findCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (findCount == 0)
|
||||||
|
{
|
||||||
|
sourcePipe.setPressure(0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Create pressure loss.
|
||||||
|
*/
|
||||||
|
if (minPressure < 0)
|
||||||
|
minPressure++;
|
||||||
|
if (maxPressure > 0)
|
||||||
|
maxPressure--;
|
||||||
|
|
||||||
|
sourcePipe.setPressure(Math.max(minPressure, Math.min(maxPressure, totalPressure / findCount + Integer.signum(totalPressure))));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Distribute fluid in this pipe based on pressure.
|
||||||
|
*/
|
||||||
|
public static void distribute(IFluidPipe sourcePipe)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 6; i++)
|
||||||
|
{
|
||||||
|
Object obj = sourcePipe.getConnections()[i];
|
||||||
|
|
||||||
|
if (obj instanceof IFluidPipe)
|
||||||
|
{
|
||||||
|
IFluidPipe otherPipe = (IFluidPipe) obj;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Move fluid from higher pressure to lower. In this case, move from tankA to tankB.
|
||||||
|
*/
|
||||||
|
int pressureA = sourcePipe.getPressure(ForgeDirection.getOrientation(i));
|
||||||
|
int pressureB = otherPipe.getPressure(ForgeDirection.getOrientation(i).getOpposite());
|
||||||
|
|
||||||
|
if (pressureA >= pressureB)
|
||||||
|
{
|
||||||
|
FluidTank tankA = sourcePipe.getInternalTank();
|
||||||
|
|
||||||
|
if (tankA != null)
|
||||||
|
{
|
||||||
|
int amountA = tankA.getFluidAmount();
|
||||||
|
|
||||||
|
if (amountA > 0)
|
||||||
|
{
|
||||||
|
FluidTank tankB = otherPipe.getInternalTank();
|
||||||
|
|
||||||
|
if (tankB != null)
|
||||||
|
{
|
||||||
|
int amountB = tankB.getFluidAmount();
|
||||||
|
|
||||||
|
int quantity = Math.max(pressureA > pressureB ? 25 : 0, (amountA - amountB) / 2);
|
||||||
|
quantity = Math.min(Math.min(quantity, tankB.getCapacity() - amountB), amountA);
|
||||||
|
|
||||||
|
if (quantity > 0)
|
||||||
|
{
|
||||||
|
tankA.drain(quantity, true);
|
||||||
|
tankB.fill(new FluidStack(tankA.getFluid().getFluid(), quantity), true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (obj instanceof IFluidHandler)
|
||||||
|
{
|
||||||
|
IFluidHandler fluidHandler = (IFluidHandler) obj;
|
||||||
|
ForgeDirection dir = ForgeDirection.getOrientation(i);
|
||||||
|
int pressure = sourcePipe.getPressure(dir);
|
||||||
|
int tankPressure = fluidHandler instanceof IPressure ? ((IPressure) fluidHandler).getPressure(dir.getOpposite()) : 0;
|
||||||
|
FluidTank sourceTank = sourcePipe.getInternalTank();
|
||||||
|
|
||||||
|
int transferAmount = (Math.max(pressure, tankPressure) - Math.min(pressure, tankPressure)) * sourcePipe.getMaxFlowRate();
|
||||||
|
|
||||||
|
if (pressure > tankPressure)
|
||||||
|
{
|
||||||
|
if (sourceTank.getFluidAmount() > 0 && transferAmount > 0)
|
||||||
|
{
|
||||||
|
FluidStack drainStack = sourceTank.drain(transferAmount, false);
|
||||||
|
sourceTank.drain(fluidHandler.fill(dir.getOpposite(), drainStack, true), true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (pressure < tankPressure)
|
||||||
|
{
|
||||||
|
if (transferAmount > 0)
|
||||||
|
{
|
||||||
|
FluidStack drainStack = fluidHandler.drain(dir.getOpposite(), transferAmount, false);
|
||||||
|
fluidHandler.drain(dir.getOpposite(), sourceTank.fill(drainStack, true), true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canUpdate()
|
public boolean canUpdate()
|
||||||
{
|
{
|
||||||
return getTank().getFluidAmount() > 0 && sideMap.size() > 0 && getConnectors().size() > 0;
|
return getConnectors().size() > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -97,7 +234,6 @@ public class PipeNetwork extends FluidNetwork
|
||||||
{
|
{
|
||||||
this.sideMap.clear();
|
this.sideMap.clear();
|
||||||
this.maxFlowRate = Integer.MAX_VALUE;
|
this.maxFlowRate = Integer.MAX_VALUE;
|
||||||
this.maxPressure = Integer.MAX_VALUE;
|
|
||||||
super.reconstruct();
|
super.reconstruct();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,14 +242,6 @@ public class PipeNetwork extends FluidNetwork
|
||||||
{
|
{
|
||||||
super.reconstructConnector(connector);
|
super.reconstructConnector(connector);
|
||||||
|
|
||||||
if (connector instanceof IFluidPipe)
|
|
||||||
{
|
|
||||||
if (((IFluidPipe) connector).getMaxFlowRate() < this.maxFlowRate)
|
|
||||||
this.maxFlowRate = ((IFluidPipe) connector).getMaxFlowRate();
|
|
||||||
|
|
||||||
if (((IFluidPipe) connector).getMaxPressure() < this.maxPressure)
|
|
||||||
this.maxPressure = ((IFluidPipe) connector).getMaxPressure();
|
|
||||||
}
|
|
||||||
for (int i = 0; i < 6; i++)
|
for (int i = 0; i < 6; i++)
|
||||||
{
|
{
|
||||||
if (connector.getConnections()[i] instanceof IFluidHandler && !(connector.getConnections()[i] instanceof IFluidPipe))
|
if (connector.getConnections()[i] instanceof IFluidHandler && !(connector.getConnections()[i] instanceof IFluidPipe))
|
||||||
|
@ -154,10 +282,4 @@ public class PipeNetwork extends FluidNetwork
|
||||||
{
|
{
|
||||||
return new PipeNetwork();
|
return new PipeNetwork();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPressure()
|
|
||||||
{
|
|
||||||
return this.currentPressure;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
Loading…
Reference in a new issue