Added pump and new pressure fluid system

This commit is contained in:
Calclavia 2014-02-23 21:59:52 +08:00
parent 72bb31bcbf
commit 8b4afcac8c
15 changed files with 251 additions and 140 deletions

View file

@ -135,25 +135,24 @@ public class TileChannel extends TileFluidNetwork implements IBlockActivate, IFl
@Override
public void onWrongPressure(ForgeDirection side, int pressure)
{
// TODO place fluid blocks into the world
}
@Override
public int getMaxPressure()
public int getPressure(ForgeDirection dir)
{
return 0;
}
@Override
public int getPressure()
{
return this.getNetwork().getPressure();
}
@Override
public int getMaxFlowRate()
{
return 500;
}
@Override
public void setPressure(int amount)
{
}
}

View file

@ -95,7 +95,7 @@ dependencies {
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: '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 {

View file

@ -18,7 +18,9 @@ import resonantinduction.mechanical.fluid.pipe.ItemPipe;
import resonantinduction.mechanical.fluid.tank.BlockTank;
import resonantinduction.mechanical.fluid.tank.TileTank;
import resonantinduction.mechanical.fluid.transport.BlockGrate;
import resonantinduction.mechanical.fluid.transport.BlockPump;
import resonantinduction.mechanical.fluid.transport.TileGrate;
import resonantinduction.mechanical.fluid.transport.TilePump;
import resonantinduction.mechanical.gear.ItemGear;
import resonantinduction.mechanical.gear.ItemGearShaft;
import resonantinduction.mechanical.item.ItemPipeGauge;
@ -94,6 +96,7 @@ public class Mechanical
public static Block blockTank;
public static Block blockReleaseValve;
public static Block blockGrate;
public static Block blockPump;
public static Item itemPipe;
public static Item itemPipeGuage;
@ -124,6 +127,7 @@ public class Mechanical
blockTank = contentRegistry.createBlock(BlockTank.class, ItemBlockFluidContainer.class, TileTank.class);
blockGrate = contentRegistry.createTile(BlockGrate.class, TileGrate.class);
blockPump = contentRegistry.createTile(BlockPump.class, TilePump.class);
itemPipeGuage = contentRegistry.createItem(ItemPipeGauge.class);
itemPipe = contentRegistry.createItem(ItemPipe.class);

View file

@ -34,8 +34,8 @@ import cpw.mods.fml.relauncher.SideOnly;
public class PartPipe extends PartFramedConnection<EnumPipeMaterial, IFluidPipe, IFluidNetwork> implements IFluidPipe, TSlottedPart, JNormalOcclusion, IHollowConnect, JIconHitEffects
{
protected FluidTank tank = new FluidTank(1 * FluidContainerRegistry.BUCKET_VOLUME);
private boolean isExtracting = false;
protected FluidTank tank = new FluidTank(FluidContainerRegistry.BUCKET_VOLUME);
private int pressure;
public PartPipe()
{
@ -55,44 +55,16 @@ public class PartPipe extends PartFramedConnection<EnumPipeMaterial, IFluidPipe,
}
@Override
public void update()
public boolean doesTick()
{
super.update();
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);
}
}
}
}
return false;
}
@Override
public boolean activate(EntityPlayer player, MovingObjectPosition part, ItemStack item)
{
if (!world().isRemote)
System.out.println(getNetwork());
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;
}
System.out.println("Pressure: " + pressure + " : " + tank.getFluidAmount());
return super.activate(player, part, item);
}
@ -131,19 +103,19 @@ public class PartPipe extends PartFramedConnection<EnumPipeMaterial, IFluidPipe,
@Override
public int fill(ForgeDirection from, FluidStack resource, boolean doFill)
{
return getNetwork().fill(this, from, resource, doFill);
return tank.fill(resource, doFill);
}
@Override
public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain)
{
return null;
return tank.drain(resource.amount, doDrain);
}
@Override
public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain)
{
return null;
return tank.drain(maxDrain, doDrain);
}
@Override
@ -202,13 +174,15 @@ public class PartPipe extends PartFramedConnection<EnumPipeMaterial, IFluidPipe,
}
@Override
public int getPressure()
public int getPressure(ForgeDirection dir)
{
if (this.getNetwork() != null)
{
return this.getNetwork().getPressure();
}
return 0;
return pressure;
}
@Override
public void setPressure(int amount)
{
pressure = amount;
}
@Override
@ -217,16 +191,10 @@ public class PartPipe extends PartFramedConnection<EnumPipeMaterial, IFluidPipe,
}
@Override
public int getMaxPressure()
{
return 1000;
}
@Override
public int getMaxFlowRate()
{
return FluidContainerRegistry.BUCKET_VOLUME;
return 50;
}
@Override
@ -240,20 +208,18 @@ public class PartPipe extends PartFramedConnection<EnumPipeMaterial, IFluidPipe,
public void save(NBTTagCompound nbt)
{
super.save(nbt);
nbt.setBoolean("isExtracting", isExtracting);
}
@Override
public void load(NBTTagCompound nbt)
{
super.load(nbt);
isExtracting = nbt.getBoolean("isExtracting");
}
@Override
public boolean canFlow()
{
return !isExtracting;
return true;
}
}

View file

@ -75,13 +75,4 @@ public class TankNetwork extends FluidNetwork
{
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;
}
}

View file

@ -9,9 +9,9 @@ import calclavia.lib.prefab.block.BlockRotatable;
import cpw.mods.fml.relauncher.Side;
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);
setTextureName(Reference.PREFIX + "material_steel");
@ -21,7 +21,7 @@ public class BlockHydrualicPump extends BlockRotatable
@Override
public TileEntity createNewTileEntity(World world)
{
return new TileHydraulicPump();
return new TilePump();
}
@Override

View file

@ -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();
}
}

View file

@ -7,23 +7,14 @@ import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler;
import resonantinduction.api.mechanical.fluid.IFluidPipe;
import resonantinduction.api.mechanical.fluid.IPressure;
import universalelectricity.api.vector.Vector3;
import calclavia.lib.prefab.tile.IRotatable;
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;
boolean input = true;
final int maxFlow = 1000;
int volFilled = 0;
int averageVol = 0;
@Override
public void updateEntity()
{
super.updateEntity();
}
private int pressure;
@Override
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())
{
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 (((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
}
if (tileOut instanceof IFluidHandler)
return ((IFluidHandler) tileOut).fill(from, resource, doFill);
}
return 0;
}
@Override
public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain)
{
// TODO Auto-generated method stub
return null;
}
@Override
public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain)
{
// TODO Auto-generated method stub
return null;
}
@Override
public boolean canFill(ForgeDirection from, Fluid fluid)
{
return !input && from == this.getDirection().getOpposite();
return from == this.getDirection().getOpposite();
}
@Override
public boolean canDrain(ForgeDirection from, Fluid fluid)
{
// TODO Auto-generated method stub
return false;
}
@Override
public FluidTankInfo[] getTankInfo(ForgeDirection from)
{
if (from == getDirection().getOpposite())
{
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];
return null;
}
@Override
@ -100,4 +72,25 @@ public class TileHydraulicPump extends TileAdvanced implements IFluidHandler, IR
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;
}
}

View file

@ -56,7 +56,4 @@ public interface IFluidNetwork extends INodeNetwork<IFluidNetwork, IFluidConnect
/** Information about the network's tank */
FluidTankInfo[] getTankInfo();
int getPressure();
}

View file

@ -1,5 +1,7 @@
package resonantinduction.api.mechanical.fluid;
import net.minecraftforge.common.ForgeDirection;
/**
* Applied to tiles that are pipes and support pressure
*
@ -7,14 +9,6 @@ package resonantinduction.api.mechanical.fluid;
*/
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
@ -22,4 +16,5 @@ public interface IFluidPipe extends IFluidConnector, IPressureInput
* @return amount in liters.
*/
int getMaxFlowRate();
}

View file

@ -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);
}

View file

@ -7,7 +7,7 @@ import net.minecraftforge.common.ForgeDirection;
*
* @author DarkGaurdsman
*/
public interface IPressureInput
public interface IPressureInput extends IPressure
{
public int getPressureIn(ForgeDirection side);

View file

@ -7,10 +7,12 @@ import java.util.Map.Entry;
import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTank;
import net.minecraftforge.fluids.IFluidHandler;
import resonantinduction.api.mechanical.fluid.IFluidConnector;
import resonantinduction.api.mechanical.fluid.IFluidNetwork;
import resonantinduction.api.mechanical.fluid.IFluidPipe;
import resonantinduction.api.mechanical.fluid.IPressure;
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, IFluidConnector> connectionMap = new HashMap<IFluidHandler, IFluidConnector>();
public int maxFlowRate = 0;
public int maxPressure = 0;
public int currentPressure = 0;
public int currentFlowRate = 0;
@Override
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
@ -58,7 +75,7 @@ public class PipeNetwork extends FluidNetwork
{
stack.amount -= handler.fill(dir, FluidUtility.getStack(stack, Math.min(volPerSide, this.maxFlowRate)), true);
}
if (sideCount > 1)
--sideCount;
if (volPer <= 0)
@ -80,10 +97,130 @@ public class PipeNetwork extends FluidNetwork
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
public boolean canUpdate()
{
return getTank().getFluidAmount() > 0 && sideMap.size() > 0 && getConnectors().size() > 0;
return getConnectors().size() > 0;
}
@Override
@ -97,7 +234,6 @@ public class PipeNetwork extends FluidNetwork
{
this.sideMap.clear();
this.maxFlowRate = Integer.MAX_VALUE;
this.maxPressure = Integer.MAX_VALUE;
super.reconstruct();
}
@ -106,14 +242,6 @@ public class PipeNetwork extends FluidNetwork
{
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++)
{
if (connector.getConnections()[i] instanceof IFluidHandler && !(connector.getConnections()[i] instanceof IFluidPipe))
@ -154,10 +282,4 @@ public class PipeNetwork extends FluidNetwork
{
return new PipeNetwork();
}
@Override
public int getPressure()
{
return this.currentPressure;
}
}

Binary file not shown.