Finished pipe system and fixed tanks

This commit is contained in:
Calclavia 2014-01-19 19:20:57 +08:00
parent 8436dd5b41
commit bd496c66bd
12 changed files with 180 additions and 564 deletions

View file

@ -1,13 +1,23 @@
package resonantinduction.api.fluid; package resonantinduction.api.fluid;
/** Applied to tiles that are pipes and support pressure /**
* Applied to tiles that are pipes and support pressure
* *
* @author DarkGuardsman */ * @author DarkGuardsman
*/
public interface IFluidPipe extends IFluidConnector, IPressureInput public interface IFluidPipe extends IFluidConnector, IPressureInput
{ {
/** Max pressure this pipe can support */ /**
int getMaxPressure(); * Max pressure this pipe can support.
*
* @return amount in pascals.
*/
int getMaxPressure();
/** Max flow rate of fluid this pipe can support */ /**
int getMaxFlowRate(); * Max flow rate of fluid this pipe can support
*
* @return amount in liters.
*/
int getMaxFlowRate();
} }

View file

@ -3,34 +3,28 @@ package resonantinduction.mechanical.fluid.network;
import java.util.Set; import java.util.Set;
import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ForgeDirection;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.ForgeSubscribe;
import net.minecraftforge.event.world.WorldEvent.Save;
import net.minecraftforge.fluids.FluidStack; 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 net.minecraftforge.fluids.IFluidHandler; import net.minecraftforge.fluids.IFluidHandler;
import resonantinduction.api.fluid.IFluidConnector; import resonantinduction.api.fluid.IFluidConnector;
import resonantinduction.api.fluid.IFluidNetwork; import resonantinduction.api.fluid.IFluidNetwork;
import resonantinduction.mechanical.fluid.tank.TileTank;
import universalelectricity.api.net.IConnector; import universalelectricity.api.net.IConnector;
import universalelectricity.core.net.ConnectionPathfinder; import universalelectricity.core.net.ConnectionPathfinder;
import universalelectricity.core.net.Network; import universalelectricity.core.net.Network;
import universalelectricity.core.net.NetworkTickHandler; import universalelectricity.core.net.NetworkTickHandler;
import calclavia.lib.utility.FluidUtility; import calclavia.lib.utility.FluidUtility;
/**
* The fluid network.
*
* @author DarkCow, Calclavia
*
*/
public abstract class FluidNetwork extends Network<IFluidNetwork, IFluidConnector, IFluidHandler> implements IFluidNetwork public abstract class FluidNetwork extends Network<IFluidNetwork, IFluidConnector, IFluidHandler> implements IFluidNetwork
{ {
protected FluidTank tank = new FluidTank(0); protected FluidTank tank = new FluidTank(0);
protected final FluidTankInfo[] tankInfo = new FluidTankInfo[1]; protected final FluidTankInfo[] tankInfo = new FluidTankInfo[1];
protected boolean reloadTanks = false;
protected long ticks = 0;
public FluidNetwork()
{
NetworkTickHandler.addNetwork(this);
MinecraftForge.EVENT_BUS.register(this);
}
@Override @Override
public void addConnector(IFluidConnector connector) public void addConnector(IFluidConnector connector)
@ -39,14 +33,29 @@ public abstract class FluidNetwork extends Network<IFluidNetwork, IFluidConnecto
super.addConnector(connector); super.addConnector(connector);
} }
@Override
public void update()
{
}
@Override
public boolean canUpdate()
{
return false;
}
@Override
public boolean continueUpdate()
{
return false;
}
@Override @Override
public void reconstruct() public void reconstruct()
{ {
if (this.reloadTanks)
{
this.reloadTanks();
}
this.tank = new FluidTank(0); this.tank = new FluidTank(0);
for (IFluidConnector part : this.getConnectors()) for (IFluidConnector part : this.getConnectors())
{ {
if (part.getNetwork() instanceof IFluidNetwork) if (part.getNetwork() instanceof IFluidNetwork)
@ -54,15 +63,17 @@ public abstract class FluidNetwork extends Network<IFluidNetwork, IFluidConnecto
part.setNetwork(this); part.setNetwork(this);
} }
this.buildPart(part); this.reconstructConnector(part);
} }
this.rebuildHandler();
this.reloadTanks(); this.reconstructTankInfo();
this.distributeConnectors();
} }
public void buildPart(IFluidConnector part) public void reconstructConnector(IFluidConnector connector)
{ {
FluidTank tank = part.getInternalTank(); FluidTank tank = connector.getInternalTank();
if (tank != null) if (tank != null)
{ {
this.tank.setCapacity(this.tank.getCapacity() + tank.getCapacity()); this.tank.setCapacity(this.tank.getCapacity() + tank.getCapacity());
@ -81,7 +92,7 @@ public abstract class FluidNetwork extends Network<IFluidNetwork, IFluidConnecto
} }
} }
public void rebuildHandler() public void reconstructTankInfo()
{ {
if (this.getTank() != null) if (this.getTank() != null)
{ {
@ -91,7 +102,8 @@ public abstract class FluidNetwork extends Network<IFluidNetwork, IFluidConnecto
{ {
this.tankInfo[0] = null; this.tankInfo[0] = null;
} }
this.reloadTanks = true;
this.distributeConnectors();
NetworkTickHandler.addNetwork(this); NetworkTickHandler.addNetwork(this);
} }
@ -100,9 +112,10 @@ public abstract class FluidNetwork extends Network<IFluidNetwork, IFluidConnecto
{ {
int prev = this.getTank().getFluidAmount(); int prev = this.getTank().getFluidAmount();
int fill = this.getTank().fill(resource, doFill); int fill = this.getTank().fill(resource, doFill);
if (prev != this.getTank().getFluidAmount()) if (prev != this.getTank().getFluidAmount())
{ {
this.rebuildHandler(); this.reconstructTankInfo();
} }
return fill; return fill;
@ -115,10 +128,10 @@ public abstract class FluidNetwork extends Network<IFluidNetwork, IFluidConnecto
{ {
FluidStack before = this.getTank().getFluid(); FluidStack before = this.getTank().getFluid();
FluidStack drain = this.getTank().drain(resource.amount, doDrain); FluidStack drain = this.getTank().drain(resource.amount, doDrain);
if (before != this.getTank().getFluid() || this.getTank().getFluid() == null || this.getTank().getFluid().amount != before.amount) if (before != this.getTank().getFluid() || this.getTank().getFluid() == null || this.getTank().getFluid().amount != before.amount)
{ {
this.rebuildHandler(); this.reconstructTankInfo();
} }
return drain; return drain;
@ -136,59 +149,28 @@ public abstract class FluidNetwork extends Network<IFluidNetwork, IFluidConnecto
return null; return null;
} }
@Override public void distributeConnectors()
public boolean canUpdate()
{ {
return this.reloadTanks;
}
@Override
public boolean continueUpdate()
{
return this.reloadTanks;
}
@Override
public void update()
{
this.ticks++;
if (ticks >= Long.MAX_VALUE - 10)
{
ticks = 1;
}
if (this.reloadTanks && ticks % 10 == 0)
{
this.reloadTanks();
}
}
@ForgeSubscribe
public void onWorldSave(Save event)
{
this.reloadTanks();
}
public void reloadTanks()
{
this.reloadTanks = false;
FluidStack stack = this.getTank().getFluid(); FluidStack stack = this.getTank().getFluid();
this.fillTankSet(stack != null ? stack.copy() : null, this.getConnectors()); this.fillTankSet(stack != null ? stack.copy() : null, this.getConnectors());
} }
public void fillTankSet(FluidStack stack, Set<IFluidConnector> tankList) public void fillTankSet(FluidStack stack, Set<IFluidConnector> connectors)
{ {
int parts = tankList.size(); int parts = connectors.size();
for (IFluidConnector part : tankList) for (IFluidConnector part : connectors)
{ {
part.getInternalTank().setFluid(null); part.getInternalTank().setFluid(null);
if (stack != null) if (stack != null)
{ {
int fillPer = (stack.amount / parts) + (stack.amount % parts); int fillPer = (stack.amount / parts) + (stack.amount % parts);
stack.amount -= part.getInternalTank().fill(FluidUtility.getStack(stack, fillPer), true); stack.amount -= part.getInternalTank().fill(FluidUtility.getStack(stack, fillPer), true);
part.onFluidChanged();
if (parts > 1) if (parts > 1)
parts--; parts--;
} }
part.onFluidChanged();
} }
} }

View file

@ -13,7 +13,11 @@ import resonantinduction.api.fluid.IFluidPipe;
import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.Vector3;
import calclavia.lib.utility.FluidUtility; import calclavia.lib.utility.FluidUtility;
/** @author DarkGuardsman */ /**
* The network for pipe fluid transfer. getNodes() is NOT used.
*
* @author DarkGuardsman
*/
public class PipeNetwork extends FluidNetwork public class PipeNetwork extends FluidNetwork
{ {
public HashMap<IFluidHandler, EnumSet<ForgeDirection>> connectionMap = new HashMap<IFluidHandler, EnumSet<ForgeDirection>>(); public HashMap<IFluidHandler, EnumSet<ForgeDirection>> connectionMap = new HashMap<IFluidHandler, EnumSet<ForgeDirection>>();
@ -21,60 +25,62 @@ public class PipeNetwork extends FluidNetwork
@Override @Override
public void update() public void update()
{ {
super.update();
/* /*
* 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
* tank * tank
*/ */
if (this.getTank().getFluidAmount() > 0) FluidStack stack = this.getTank().getFluid().copy();
int count = this.connectionMap.size();
for (Entry<IFluidHandler, EnumSet<ForgeDirection>> entry : this.connectionMap.entrySet())
{ {
FluidStack stack = this.getTank().getFluid().copy(); int sideCount = entry.getValue().size();
int count = this.connectionMap.size(); for (ForgeDirection dir : entry.getValue())
for (Entry<IFluidHandler, EnumSet<ForgeDirection>> entry : this.connectionMap.entrySet())
{ {
int sideCount = entry.getValue().size(); int volPer = (stack.amount / count);
for (ForgeDirection dir : entry.getValue()) int volPerSide = (volPer / sideCount);
int maxFill = 1000;
TileEntity tile = new Vector3((TileEntity) entry.getKey()).modifyPositionFromSide(dir).getTileEntity(((TileEntity) entry.getKey()).worldObj);
if (tile instanceof IFluidPipe)
{ {
int volPer = (stack.amount / count) + (stack.amount % count); maxFill = ((IFluidPipe) tile).getMaxFlowRate();
int volPerSide = (volPer / sideCount) + (volPer % count);
int maxFill = 1000;
TileEntity entity = new Vector3((TileEntity) entry.getKey()).modifyPositionFromSide(dir).getTileEntity(((TileEntity) entry.getKey()).worldObj);
if (entity instanceof IFluidPipe)
{
maxFill = ((IFluidPipe) entity).getMaxFlowRate();
}
stack.amount -= entry.getKey().fill(dir, FluidUtility.getStack(stack, Math.min(volPerSide, maxFill)), true);
if (sideCount > 1)
--sideCount;
if (volPer <= 0)
break;
} }
if (count > 1)
count--; stack.amount -= entry.getKey().fill(dir, FluidUtility.getStack(stack, Math.min(volPerSide, maxFill)), true);
if (stack == null || stack.amount <= 0)
if (sideCount > 1)
--sideCount;
if (volPer <= 0)
break; break;
} }
this.getTank().setFluid(stack); if (count > 1)
// TODO check for change before rebuilding count--;
this.rebuildHandler();
if (stack == null || stack.amount <= 0)
{
stack = null;
break;
}
} }
this.getTank().setFluid(stack);
// TODO check for change before rebuilding
this.reconstructTankInfo();
} }
@Override @Override
public boolean canUpdate() public boolean canUpdate()
{ {
return true; return getTank().getFluidAmount() > 0 && connectionMap.size() > 0 && getConnectors().size() > 0;
} }
@Override @Override
public boolean continueUpdate() public boolean continueUpdate()
{ {
return this.getConnectors().size() > 0; return canUpdate();
} }
@Override @Override
@ -85,9 +91,9 @@ public class PipeNetwork extends FluidNetwork
} }
@Override @Override
public void buildPart(IFluidConnector part) public void reconstructConnector(IFluidConnector part)
{ {
super.buildPart(part); super.reconstructConnector(part);
for (int i = 0; i < 6; i++) for (int i = 0; i < 6; i++)
{ {
if (part.getConnections()[i] instanceof IFluidHandler && !(part.getConnections()[i] instanceof IFluidPipe)) if (part.getConnections()[i] instanceof IFluidHandler && !(part.getConnections()[i] instanceof IFluidPipe))

View file

@ -5,18 +5,12 @@ import net.minecraftforge.client.IItemRenderer;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import resonantinduction.mechanical.Mechanical;
import resonantinduction.mechanical.fluid.valve.ModelReleaseValve;
import resonantinduction.mechanical.fluid.valve.RenderReleaseValve;
import cpw.mods.fml.client.FMLClientHandler;
import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly; import cpw.mods.fml.relauncher.SideOnly;
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
public class ItemPipeRenderer implements IItemRenderer public class ItemPipeRenderer implements IItemRenderer
{ {
private ModelReleaseValve valve = new ModelReleaseValve();
@Override @Override
public boolean handleRenderType(ItemStack item, ItemRenderType type) public boolean handleRenderType(ItemStack item, ItemRenderType type)
{ {

View file

@ -190,7 +190,7 @@ public class PartPipe extends PartFramedConnection<EnumPipeMaterial, IFluidPipe,
@Override @Override
public int getMaxPressure() public int getMaxPressure()
{ {
return 0; return 1000;
} }
@Override @Override

View file

@ -36,7 +36,7 @@ import cpw.mods.fml.relauncher.SideOnly;
*/ */
public abstract class TileFluidNetwork extends TileAdvanced implements IFluidConnector, IPacketReceiverWithID, IReadOut public abstract class TileFluidNetwork extends TileAdvanced implements IFluidConnector, IPacketReceiverWithID, IReadOut
{ {
protected FluidTank tank = new FluidTank(1 * FluidContainerRegistry.BUCKET_VOLUME); protected FluidTank tank;
protected Object[] connectedBlocks = new Object[6]; protected Object[] connectedBlocks = new Object[6];
protected int colorID = 0; protected int colorID = 0;
@ -53,9 +53,6 @@ public abstract class TileFluidNetwork extends TileAdvanced implements IFluidCon
/** Bitmask that handles connections for the renderer **/ /** Bitmask that handles connections for the renderer **/
public byte renderSides = 0b0; public byte renderSides = 0b0;
/** Tells the tank that on next update to check if it should update the client render data */
public boolean updateFluidRender = false;
@Override @Override
public void initiate() public void initiate()
{ {
@ -64,30 +61,18 @@ public abstract class TileFluidNetwork extends TileAdvanced implements IFluidCon
getNetwork().reconstruct(); getNetwork().reconstruct();
} }
@Override
public void updateEntity()
{
super.updateEntity();
if (!worldObj.isRemote)
{
if (this.updateFluidRender)
{
//if (!FluidUtility.matchExact(prevStack, this.getInternalTank().getFluid()))
{
this.sendTankUpdate();
}
this.prevStack = this.tank.getFluid();
this.updateFluidRender = false;
}
}
}
@Override @Override
public void onFluidChanged() public void onFluidChanged()
{ {
this.updateFluidRender = true; if (!worldObj.isRemote)
{
if (!FluidUtility.matchExact(prevStack, this.getInternalTank().getFluid()))
{
this.sendTankUpdate();
}
this.prevStack = this.tank.getFluid();
}
} }
@Override @Override
@ -253,8 +238,7 @@ public abstract class TileFluidNetwork extends TileAdvanced implements IFluidCon
} }
else if (id == PACKET_TANK) else if (id == PACKET_TANK)
{ {
this.tank = new FluidTank(data.readInt()); this.tank = new FluidTank(data.readInt()).readFromNBT(PacketHandler.readNBTTagCompound(data));
this.getInternalTank().readFromNBT(PacketHandler.readNBTTagCompound(data));
return true; return true;
} }
} }
@ -280,10 +264,8 @@ public abstract class TileFluidNetwork extends TileAdvanced implements IFluidCon
public void sendTankUpdate() public void sendTankUpdate()
{ {
if (this.getInternalTank() != null) System.out.println("Send Amount: " + this.getInternalTank().getFluidAmount());
{ PacketHandler.sendPacketToClients(ResonantInduction.PACKET_TILE.getPacketWithID(PACKET_TANK, this, getInternalTank().getCapacity(), getInternalTank().writeToNBT(new NBTTagCompound())), this.worldObj, new Vector3(this), 60);
PacketHandler.sendPacketToClients(ResonantInduction.PACKET_TILE.getPacketWithID(PACKET_TANK, this, this.getInternalTank().getCapacity(), this.getInternalTank().writeToNBT(new NBTTagCompound())), this.worldObj, new Vector3(this), 60);
}
} }
@Override @Override

View file

@ -59,7 +59,18 @@ public class BlockTank extends BlockFluidNetwork
@Override @Override
public boolean onMachineActivated(World world, int x, int y, int z, EntityPlayer entityplayer, int side, float hitX, float hitY, float hitZ) public boolean onMachineActivated(World world, int x, int y, int z, EntityPlayer entityplayer, int side, float hitX, float hitY, float hitZ)
{ {
return FluidUtility.playerActivatedFluidItem(world, x, y, z, entityplayer, side); if (world.getBlockTileEntity(x, y, z) instanceof TileTank)
{
System.out.println(world.isRemote + " Amount: " + ((TileTank) world.getBlockTileEntity(x, y, z)).getInternalTank().getFluidAmount());
world.markBlockForUpdate(x, y, z);
}
if (!world.isRemote)
{
return FluidUtility.playerActivatedFluidItem(world, x, y, z, entityplayer, side);
}
return true;
} }
@Override @Override

View file

@ -8,60 +8,62 @@ import net.minecraftforge.fluids.FluidStack;
import resonantinduction.api.fluid.IFluidConnector; import resonantinduction.api.fluid.IFluidConnector;
import resonantinduction.mechanical.fluid.network.FluidNetwork; import resonantinduction.mechanical.fluid.network.FluidNetwork;
/** Network that handles connected tanks /**
* Network that handles connected tanks
* *
* @author DarkGuardsman */ * @author DarkGuardsman
*/
public class TankNetwork extends FluidNetwork public class TankNetwork extends FluidNetwork
{ {
@Override
public void distributeConnectors()
{
FluidStack fillStack = this.getTank().getFluid();
int lowestY = 255, highestY = 0;
@Override if (fillStack == null || fillStack.getFluid().isGaseous())
public void reloadTanks() {
{ super.distributeConnectors();
FluidStack fillStack = this.getTank().getFluid(); }
int lowestY = 255, highestY = 0; else if (this.getConnectors().size() > 0)
{
fillStack = fillStack.copy();
for (IFluidConnector part : this.getConnectors())
{
part.getInternalTank().setFluid(null);
if (part instanceof TileEntity && ((TileEntity) part).yCoord < lowestY)
{
lowestY = ((TileEntity) part).yCoord;
}
if (part instanceof TileEntity && ((TileEntity) part).yCoord > highestY)
{
highestY = ((TileEntity) part).yCoord;
}
}
if (fillStack == null || fillStack.getFluid().isGaseous()) // TODO Add path finder to prevent filling when tanks are only connected at the top
{ for (int y = lowestY; y <= highestY; y++)
super.reloadTanks(); {
} Set<IFluidConnector> parts = new LinkedHashSet<IFluidConnector>();
else if (this.getConnectors().size() > 0)
{
fillStack = fillStack.copy();
for (IFluidConnector part : this.getConnectors())
{
part.getInternalTank().setFluid(null);
if (part instanceof TileEntity && ((TileEntity) part).yCoord < lowestY)
{
lowestY = ((TileEntity) part).yCoord;
}
if (part instanceof TileEntity && ((TileEntity) part).yCoord > highestY)
{
highestY = ((TileEntity) part).yCoord;
}
}
//TODO Add path finder to prevent filling when tanks are only connected at the top for (IFluidConnector part : this.getConnectors())
for (int y = lowestY; y <= highestY; y++) {
{ if (part instanceof IFluidConnector && ((TileEntity) part).yCoord == y)
Set<IFluidConnector> parts = new LinkedHashSet<IFluidConnector>(); {
parts.add((IFluidConnector) part);
}
}
if (!parts.isEmpty())
{
this.fillTankSet(fillStack, parts);
}
for (IFluidConnector part : this.getConnectors()) if (fillStack == null || fillStack.amount <= 0)
{ {
if (part instanceof IFluidConnector && ((TileEntity) part).yCoord == y) break;
{ }
parts.add((IFluidConnector) part); }
} }
} }
if (!parts.isEmpty())
{
this.fillTankSet(fillStack, parts);
}
if (fillStack == null || fillStack.amount <= 0)
{
break;
}
}
}
}
} }

View file

@ -1,71 +0,0 @@
package resonantinduction.mechanical.fluid.valve;
import java.util.Random;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import resonantinduction.core.prefab.block.BlockRI;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
public class BlockReleaseValve extends BlockRI
{
public BlockReleaseValve()
{
super("releaseValve");
this.setHardness(1f);
this.setResistance(5f);
}
@Override
public TileEntity createNewTileEntity(World var1)
{
return new TileReleaseValve();
}
@Override
public boolean canConnectRedstone(IBlockAccess world, int x, int y, int z, int side)
{
return true;
}
@Override
public boolean isOpaqueCube()
{
return false;
}
@Override
@SideOnly(Side.CLIENT)
public boolean renderAsNormalBlock()
{
return false;
}
@Override
@SideOnly(Side.CLIENT)
public int getRenderType()
{
return -1;
}
@Override
public int damageDropped(int meta)
{
return 0;
}
@Override
public int quantityDropped(Random par1Random)
{
return 1;
}
@Override
public void onNeighborBlockChange(World par1World, int x, int y, int z, int side)
{
super.onNeighborBlockChange(par1World, x, y, z, side);
}
}

View file

@ -1,137 +0,0 @@
// Date: 1/7/2013 12:20:13 PM
// Template version 1.1
// Java generated by Techne
// Keep in mind that you still need to fill in some blanks
// - ZeuX
package resonantinduction.mechanical.fluid.valve;
import net.minecraft.client.model.ModelBase;
import net.minecraft.client.model.ModelRenderer;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@SideOnly(Side.CLIENT)
public class ModelReleaseValve extends ModelBase
{
// fields
ModelRenderer ValveStem;
ModelRenderer ValveWheelCenter;
ModelRenderer ValveRest;
ModelRenderer WheelBar3;
ModelRenderer WheelBar4;
ModelRenderer Wheel;
ModelRenderer Wheel2;
ModelRenderer Wheel3;
ModelRenderer Wheel4;
ModelRenderer WheelB;
ModelRenderer WheelB2;
ModelRenderer WheelB3;
ModelRenderer WheelB4;
ModelRenderer[] renders;
public ModelReleaseValve()
{
textureWidth = 128;
textureHeight = 32;
ValveStem = new ModelRenderer(this, 50, 21);
ValveStem.addBox(-1F, -6F, -1F, 2, 3, 2);
ValveStem.setRotationPoint(0F, 16F, 0F);
ValveStem.setTextureSize(128, 32);
ValveStem.mirror = true;
setRotation(ValveStem, 0F, 0F, 0F);
ValveWheelCenter = new ModelRenderer(this, 50, 17);
ValveWheelCenter.addBox(-0.5F, -7.5F, -0.5F, 1, 2, 1);
ValveWheelCenter.setRotationPoint(0F, 16F, 0F);
ValveWheelCenter.setTextureSize(128, 32);
ValveWheelCenter.mirror = true;
setRotation(ValveWheelCenter, 0F, 0F, 0F);
ValveRest = new ModelRenderer(this, 50, 27);
ValveRest.addBox(-1.5F, -4F, -1.5F, 3, 1, 3);
ValveRest.setRotationPoint(0F, 16F, 0F);
ValveRest.setTextureSize(128, 32);
ValveRest.mirror = true;
setRotation(ValveRest, 0F, 0F, 0F);
WheelBar3 = new ModelRenderer(this, 85, 15);
WheelBar3.addBox(-3F, -7F, -0.5F, 6, 1, 1);
WheelBar3.setRotationPoint(0F, 16F, 0F);
WheelBar3.setTextureSize(128, 32);
WheelBar3.mirror = true;
setRotation(WheelBar3, 0F, 0.7853982F, 0F);
WheelBar4 = new ModelRenderer(this, 85, 18);
WheelBar4.addBox(-3F, -7F, -0.5F, 6, 1, 1);
WheelBar4.setRotationPoint(0F, 16F, 0F);
WheelBar4.setTextureSize(128, 32);
WheelBar4.mirror = true;
setRotation(WheelBar4, 0F, -0.7853982F, 0F);
Wheel = new ModelRenderer(this, 50, 13);
Wheel.addBox(-1.5F, -7.5F, -3.5F, 3, 1, 1);
Wheel.setRotationPoint(0F, 16F, 0F);
Wheel.setTextureSize(128, 32);
Wheel.mirror = true;
setRotation(Wheel, 0F, -0.7853982F, 0F);
Wheel2 = new ModelRenderer(this, 50, 13);
Wheel2.addBox(-1.5F, -7.5F, -3.5F, 3, 1, 1);
Wheel2.setRotationPoint(0F, 16F, 0F);
Wheel2.setTextureSize(128, 32);
Wheel2.mirror = true;
setRotation(Wheel2, 0F, 2.356194F, 0F);
Wheel3 = new ModelRenderer(this, 50, 13);
Wheel3.addBox(-1.5F, -7.5F, -3.5F, 3, 1, 1);
Wheel3.setRotationPoint(0F, 16F, 0F);
Wheel3.setTextureSize(128, 32);
Wheel3.mirror = true;
setRotation(Wheel3, 0F, -2.356194F, 0F);
Wheel4 = new ModelRenderer(this, 50, 13);
Wheel4.addBox(-1.5F, -7.5F, -3.5F, 3, 1, 1);
Wheel4.setRotationPoint(0F, 16F, 0F);
Wheel4.setTextureSize(128, 32);
Wheel4.mirror = true;
setRotation(Wheel4, 0F, 0.7853982F, 0F);
WheelB = new ModelRenderer(this, 50, 13);
WheelB.addBox(-1.5F, -7.5F, 2.5F, 3, 1, 1);
WheelB.setRotationPoint(0F, 16F, 0F);
WheelB.setTextureSize(128, 32);
WheelB.mirror = true;
setRotation(WheelB, 0F, -3.141593F, 0F);
WheelB2 = new ModelRenderer(this, 50, 13);
WheelB2.addBox(-1.5F, -7.5F, 2.5F, 3, 1, 1);
WheelB2.setRotationPoint(0F, 16F, 0F);
WheelB2.setTextureSize(128, 32);
WheelB2.mirror = true;
setRotation(WheelB2, 0F, 0F, 0F);
WheelB3 = new ModelRenderer(this, 50, 13);
WheelB3.addBox(-1.5F, -7.5F, 2.5F, 3, 1, 1);
WheelB3.setRotationPoint(0F, 16F, 0F);
WheelB3.setTextureSize(128, 32);
WheelB3.mirror = true;
setRotation(WheelB3, 0F, 1.570796F, 0F);
WheelB4 = new ModelRenderer(this, 50, 13);
WheelB4.addBox(-1.5F, -7.5F, 2.5F, 3, 1, 1);
WheelB4.setRotationPoint(0F, 16F, 0F);
WheelB4.setTextureSize(128, 32);
WheelB4.mirror = true;
setRotation(WheelB4, 0F, -1.570796F, 0F);
renders = new ModelRenderer[] { ValveStem, ValveWheelCenter, ValveRest, WheelBar3, WheelBar4, Wheel, Wheel2, Wheel3, Wheel4, WheelB, WheelB2, WheelB3, WheelB4 };
}
public void render()
{
ModelRenderer[] renderSet = renders;
for (int i = 0; i < renders.length; i++)
{
renderSet[i].render(0.0625F);
}
}
private void setRotation(ModelRenderer model, float x, float y, float z)
{
model.rotateAngleX = x;
model.rotateAngleY = y;
model.rotateAngleZ = z;
}
}

View file

@ -1,53 +0,0 @@
package resonantinduction.mechanical.fluid.valve;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ResourceLocation;
import org.lwjgl.opengl.GL11;
import resonantinduction.core.Reference;
import resonantinduction.mechanical.fluid.pipe.RenderPipe;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
@SideOnly(Side.CLIENT)
public class RenderReleaseValve extends TileEntitySpecialRenderer
{
public static ModelReleaseValve valve = new ModelReleaseValve();
private TileEntity[] ents = new TileEntity[6];
public static final ResourceLocation VALVE_TEXTURE = new ResourceLocation(Reference.DOMAIN, Reference.MODEL_PATH + "releaseValve.png");
@Override
public void renderTileEntityAt(TileEntity te, double d, double d1, double d2, float f)
{
// Texture file
GL11.glPushMatrix();
GL11.glTranslatef((float) d + 0.5F, (float) d1 + 1.5F, (float) d2 + 0.5F);
GL11.glScalef(1.0F, -1F, -1F);
if (te instanceof TileReleaseValve)
{
ents = ((TileReleaseValve) te).connected;
}
bindTexture(RenderPipe.TEXTURE);
if (ents[0] != null)
RenderPipe.MODEL_PIPE.renderBottom();
if (ents[1] != null)
RenderPipe.MODEL_PIPE.renderTop();
if (ents[3] != null)
RenderPipe.MODEL_PIPE.renderFront();
if (ents[2] != null)
RenderPipe.MODEL_PIPE.renderBack();
if (ents[5] != null)
RenderPipe.MODEL_PIPE.renderRight();
if (ents[4] != null)
RenderPipe.MODEL_PIPE.renderLeft();
RenderPipe.MODEL_PIPE.renderMiddle();
bindTexture(VALVE_TEXTURE);
if (ents[1] == null)
valve.render();
GL11.glPopMatrix();
}
}

View file

@ -1,110 +0,0 @@
package resonantinduction.mechanical.fluid.valve;
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.api.IReadOut;
import resonantinduction.api.fluid.IFluidPipe;
import resonantinduction.core.tilenetwork.ITileConnector;
import resonantinduction.mechanical.fluid.pipe.TilePipe;
import calclavia.lib.utility.WorldUtility;
public class TileReleaseValve extends TilePipe 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 IFluidPipe))
{
IFluidHandler drainedTank = (IFluidHandler) connected[dir.ordinal()];
FluidStack stack = drainedTank.drain(dir.getOpposite(), FluidContainerRegistry.BUCKET_VOLUME, false);
if (stack != null && stack.amount > 0)
{
IFluidPipe inputPipe = this.findValidPipe(stack);
if (inputPipe != null)
{
int ammountFilled = inputPipe.getNetwork().fill(inputPipe, dir, stack, true);
drainedTank.drain(dir.getOpposite(), ammountFilled, true);
}
}
}
}
}
}
}
/** used to find a valid pipe for filling of the liquid type */
public IFluidPipe findValidPipe(FluidStack stack)
{
// find normal color selective pipe first
for (int i = 0; i < connected.length; i++)
{
TileEntity tile = connected[i];
if (tile instanceof IFluidPipe && ((IFluidPipe) tile).fill(ForgeDirection.getOrientation(i), stack, false) > 0)
{
return (IFluidPipe) 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 = WorldUtility.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;
}
}