Unfinished errored work on nodes
This commit is contained in:
parent
07d4883a9e
commit
c029993500
13 changed files with 415 additions and 352 deletions
|
@ -17,8 +17,7 @@ public class MultipartMechanical implements IPartFactory
|
||||||
public MultipartMechanical()
|
public MultipartMechanical()
|
||||||
{
|
{
|
||||||
MultiPartRegistry.registerParts(this, PART_TYPES);
|
MultiPartRegistry.registerParts(this, PART_TYPES);
|
||||||
MultipartGenerator.registerPassThroughInterface("resonantinduction.core.fluid.IPressurizedNode");
|
MultipartGenerator.registerPassThroughInterface("resonantinduction.core.grid.fluid.IPressureNodeProvider");
|
||||||
MultipartGenerator.registerPassThroughInterface("resonantinduction.api.mechanical.fluid.IPressure");
|
|
||||||
MultipartGenerator.registerTrait("resonantinduction.mechanical.energy.network.IMechanicalNodeProvider", "resonantinduction.mechanical.trait.TraitMechanical");
|
MultipartGenerator.registerTrait("resonantinduction.mechanical.energy.network.IMechanicalNodeProvider", "resonantinduction.mechanical.trait.TraitMechanical");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@ package resonantinduction.mechanical.energy.network;
|
||||||
|
|
||||||
import resonantinduction.core.grid.INodeProvider;
|
import resonantinduction.core.grid.INodeProvider;
|
||||||
|
|
||||||
public interface IMechanicalNodeProvider extends INodeProvider<MechanicalNode>
|
public interface IMechanicalNodeProvider extends INodeProvider
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
import net.minecraftforge.common.ForgeDirection;
|
import net.minecraftforge.common.ForgeDirection;
|
||||||
import resonantinduction.core.ResonantInduction;
|
import resonantinduction.core.ResonantInduction;
|
||||||
|
import resonantinduction.core.grid.Node;
|
||||||
import resonantinduction.mechanical.Mechanical;
|
import resonantinduction.mechanical.Mechanical;
|
||||||
import universalelectricity.api.vector.Vector3;
|
import universalelectricity.api.vector.Vector3;
|
||||||
import calclavia.lib.network.IPacketReceiver;
|
import calclavia.lib.network.IPacketReceiver;
|
||||||
|
@ -68,7 +69,7 @@ public abstract class TileMechanical extends TileAdvanced implements IMechanical
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MechanicalNode getNode(ForgeDirection dir)
|
public MechanicalNode getNode(Class<? extends Node> clazz, ForgeDirection dir)
|
||||||
{
|
{
|
||||||
return mechanicalNode;
|
return mechanicalNode;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package resonantinduction.mechanical.fluid.pipe;
|
package resonantinduction.mechanical.fluid.pipe;
|
||||||
|
|
||||||
|
import calclavia.lib.utility.WorldUtility;
|
||||||
import net.minecraft.client.renderer.RenderBlocks;
|
import net.minecraft.client.renderer.RenderBlocks;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
@ -12,9 +13,9 @@ 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.core.ResonantInduction;
|
import resonantinduction.core.ResonantInduction;
|
||||||
import resonantinduction.core.fluid.IPressurizedNode;
|
import resonantinduction.core.grid.fluid.IPressureNodeProvider;
|
||||||
import resonantinduction.core.fluid.PressureNetwork;
|
import resonantinduction.core.grid.fluid.PressureNode;
|
||||||
import resonantinduction.core.prefab.part.PartFramedConnection;
|
import resonantinduction.core.prefab.part.PartFramedNode;
|
||||||
import resonantinduction.mechanical.Mechanical;
|
import resonantinduction.mechanical.Mechanical;
|
||||||
import codechicken.lib.data.MCDataInput;
|
import codechicken.lib.data.MCDataInput;
|
||||||
import codechicken.lib.render.CCRenderState;
|
import codechicken.lib.render.CCRenderState;
|
||||||
|
@ -28,10 +29,9 @@ import codechicken.multipart.TileMultipart;
|
||||||
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 PartPipe extends PartFramedConnection<EnumPipeMaterial, IPressurizedNode, PressureNetwork> implements IPressurizedNode, TSlottedPart, JNormalOcclusion, IHollowConnect
|
public class PartPipe extends PartFramedNode<EnumPipeMaterial, PressureNode, IPressureNodeProvider> implements IPressureNodeProvider, TSlottedPart, JNormalOcclusion, IHollowConnect
|
||||||
{
|
{
|
||||||
protected FluidTank tank = new FluidTank(FluidContainerRegistry.BUCKET_VOLUME);
|
protected FluidTank tank = new FluidTank(FluidContainerRegistry.BUCKET_VOLUME);
|
||||||
private int pressure;
|
|
||||||
private boolean markPacket = true;
|
private boolean markPacket = true;
|
||||||
|
|
||||||
public PartPipe(int typeID)
|
public PartPipe(int typeID)
|
||||||
|
@ -39,6 +39,76 @@ public class PartPipe extends PartFramedConnection<EnumPipeMaterial, IPressurize
|
||||||
super();
|
super();
|
||||||
material = EnumPipeMaterial.values()[typeID];
|
material = EnumPipeMaterial.values()[typeID];
|
||||||
requiresInsulation = false;
|
requiresInsulation = false;
|
||||||
|
|
||||||
|
node = new PressureNode(this)
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void recache()
|
||||||
|
{
|
||||||
|
synchronized (connections)
|
||||||
|
{
|
||||||
|
connections.clear();
|
||||||
|
byte previousConnections = getAllCurrentConnections();
|
||||||
|
currentConnections = 0;
|
||||||
|
|
||||||
|
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
|
||||||
|
{
|
||||||
|
TileEntity tile = position().translate(dir).getTileEntity(world());
|
||||||
|
|
||||||
|
if (tile instanceof IFluidHandler)
|
||||||
|
{
|
||||||
|
if (tile instanceof IPressureNodeProvider)
|
||||||
|
{
|
||||||
|
PressureNode check = ((IPressureNodeProvider) tile).getNode(dir.getOpposite());
|
||||||
|
|
||||||
|
if (check != null && canConnect(dir, check) && check.canConnect(dir.getOpposite(), this))
|
||||||
|
{
|
||||||
|
currentConnections = WorldUtility.setEnableSide(currentConnections, dir, true);
|
||||||
|
connections.put(check, dir);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
currentConnections = WorldUtility.setEnableSide(currentConnections, dir, true);
|
||||||
|
connections.put(tile, dir);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Only send packet updates if visuallyConnected changed. */
|
||||||
|
if (previousConnections != currentConnections)
|
||||||
|
{
|
||||||
|
sendConnectionUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canConnect(ForgeDirection from, Object source)
|
||||||
|
{return
|
||||||
|
super.canConnect(from, source);
|
||||||
|
/*Object obj = tile instanceof TileMultipart ? ((TileMultipart) tile).partMap(ForgeDirection.UNKNOWN.ordinal()) : tile;
|
||||||
|
|
||||||
|
if (obj instanceof PartPipe)
|
||||||
|
{
|
||||||
|
if (this.getMaterial() == ((PartPipe) obj).getMaterial())
|
||||||
|
{
|
||||||
|
return getColor() == ((PartPipe) obj).getColor() || (getColor() == DEFAULT_COLOR || ((PartPipe) obj).getColor() == DEFAULT_COLOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return tile instanceof IFluidHandler;*/
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getMaxFlowRate()
|
||||||
|
{
|
||||||
|
return 100;
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public PartPipe()
|
public PartPipe()
|
||||||
|
@ -104,19 +174,6 @@ public class PartPipe extends PartFramedConnection<EnumPipeMaterial, IPressurize
|
||||||
return new ItemStack(Mechanical.itemPipe);
|
return new ItemStack(Mechanical.itemPipe);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Fluid network methods. */
|
|
||||||
@Override
|
|
||||||
public PressureNetwork getNetwork()
|
|
||||||
{
|
|
||||||
if (this.network == null)
|
|
||||||
{
|
|
||||||
this.network = new PressureNetwork();
|
|
||||||
this.network.addConnector(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.network;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int fill(ForgeDirection from, FluidStack resource, boolean doFill)
|
public int fill(ForgeDirection from, FluidStack resource, boolean doFill)
|
||||||
{
|
{
|
||||||
|
@ -172,12 +229,7 @@ public class PartPipe extends PartFramedConnection<EnumPipeMaterial, IPressurize
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFluidChanged()
|
public FluidTank getPressureTank()
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public FluidTank getInternalTank()
|
|
||||||
{
|
{
|
||||||
if (this.tank == null)
|
if (this.tank == null)
|
||||||
{
|
{
|
||||||
|
@ -187,51 +239,7 @@ public class PartPipe extends PartFramedConnection<EnumPipeMaterial, IPressurize
|
||||||
return this.tank;
|
return this.tank;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean canConnectTo(TileEntity tile, ForgeDirection dir)
|
|
||||||
{
|
|
||||||
Object obj = tile instanceof TileMultipart ? ((TileMultipart) tile).partMap(ForgeDirection.UNKNOWN.ordinal()) : tile;
|
|
||||||
|
|
||||||
if (obj instanceof PartPipe)
|
|
||||||
{
|
|
||||||
if (this.getMaterial() == ((PartPipe) obj).getMaterial())
|
|
||||||
{
|
|
||||||
return getColor() == ((PartPipe) obj).getColor() || (getColor() == DEFAULT_COLOR || ((PartPipe) obj).getColor() == DEFAULT_COLOR);
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return tile instanceof IFluidHandler;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected IPressurizedNode getConnector(TileEntity tile)
|
|
||||||
{
|
|
||||||
if (tile instanceof IPressurizedNode)
|
|
||||||
if (((IPressurizedNode) tile).getInstance(ForgeDirection.UNKNOWN) instanceof IPressurizedNode)
|
|
||||||
return (IPressurizedNode) ((IPressurizedNode) tile).getInstance(ForgeDirection.UNKNOWN);
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPressure(ForgeDirection dir)
|
|
||||||
{
|
|
||||||
return pressure;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setPressure(int amount)
|
|
||||||
{
|
|
||||||
pressure = amount;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getMaxFlowRate()
|
|
||||||
{
|
|
||||||
return 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void drawBreaking(RenderBlocks renderBlocks)
|
public void drawBreaking(RenderBlocks renderBlocks)
|
||||||
|
@ -253,11 +261,4 @@ public class PartPipe extends PartFramedConnection<EnumPipeMaterial, IPressurize
|
||||||
super.load(nbt);
|
super.load(nbt);
|
||||||
tank.readFromNBT(nbt);
|
tank.readFromNBT(nbt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canFlow()
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -4,17 +4,43 @@ import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraftforge.common.ForgeDirection;
|
import net.minecraftforge.common.ForgeDirection;
|
||||||
import net.minecraftforge.fluids.Fluid;
|
import net.minecraftforge.fluids.Fluid;
|
||||||
import net.minecraftforge.fluids.FluidStack;
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
|
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.mechanical.fluid.IPressure;
|
import resonantinduction.core.grid.fluid.IPressureNodeProvider;
|
||||||
import resonantinduction.core.fluid.IPressurizedNode;
|
import resonantinduction.core.grid.fluid.PressureNode;
|
||||||
import resonantinduction.mechanical.energy.network.TileMechanical;
|
import resonantinduction.mechanical.energy.network.TileMechanical;
|
||||||
import universalelectricity.api.vector.Vector3;
|
import universalelectricity.api.vector.Vector3;
|
||||||
import calclavia.lib.prefab.tile.IRotatable;
|
import calclavia.lib.prefab.tile.IRotatable;
|
||||||
|
|
||||||
public class TilePump extends TileMechanical implements IFluidHandler, IRotatable, IPressure
|
public class TilePump extends TileMechanical implements IPressureNodeProvider, IRotatable
|
||||||
{
|
{
|
||||||
private final long maximumPower = 100000;
|
private final long maximumPower = 100000;
|
||||||
|
private final PressureNode pressureNode;
|
||||||
|
|
||||||
|
public TilePump()
|
||||||
|
{
|
||||||
|
pressureNode = new PressureNode(this)
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public int getPressure(ForgeDirection dir)
|
||||||
|
{
|
||||||
|
if (mechanicalNode.getPower() > 0)
|
||||||
|
{
|
||||||
|
if (dir == getDirection())
|
||||||
|
{
|
||||||
|
return (int) Math.max((((double) mechanicalNode.getPower() / (double) maximumPower) * 100), 2);
|
||||||
|
}
|
||||||
|
else if (dir == getDirection().getOpposite())
|
||||||
|
{
|
||||||
|
return (int) -Math.max((((double) mechanicalNode.getPower() / (double) maximumPower) * 100), 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void updateEntity()
|
public void updateEntity()
|
||||||
|
@ -28,7 +54,7 @@ public class TilePump extends TileMechanical implements IFluidHandler, IRotatabl
|
||||||
*/
|
*/
|
||||||
TileEntity tileIn = new Vector3(this).translate(getDirection().getOpposite()).getTileEntity(this.worldObj);
|
TileEntity tileIn = new Vector3(this).translate(getDirection().getOpposite()).getTileEntity(this.worldObj);
|
||||||
|
|
||||||
if (tileIn instanceof IFluidHandler && !(tileIn instanceof IPressurizedNode))
|
if (tileIn instanceof IFluidHandler && !(tileIn instanceof IPressureNodeProvider))
|
||||||
{
|
{
|
||||||
int flowRate = (int) (((double) mechanicalNode.getPower() / (double) maximumPower) * 500);
|
int flowRate = (int) (((double) mechanicalNode.getPower() / (double) maximumPower) * 500);
|
||||||
FluidStack drain = ((IFluidHandler) tileIn).drain(getDirection(), flowRate, false);
|
FluidStack drain = ((IFluidHandler) tileIn).drain(getDirection(), flowRate, false);
|
||||||
|
@ -98,26 +124,9 @@ public class TilePump extends TileMechanical implements IFluidHandler, IRotatabl
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setPressure(int amount)
|
public FluidTank getPressureTank()
|
||||||
{
|
{
|
||||||
}
|
return null;
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getPressure(ForgeDirection dir)
|
|
||||||
{
|
|
||||||
if (mechanicalNode.getPower() > 0)
|
|
||||||
{
|
|
||||||
if (dir == getDirection())
|
|
||||||
{
|
|
||||||
return (int) Math.max((((double) mechanicalNode.getPower() / (double) maximumPower) * 100), 2);
|
|
||||||
}
|
|
||||||
else if (dir == getDirection().getOpposite())
|
|
||||||
{
|
|
||||||
return (int) -Math.max((((double) mechanicalNode.getPower() / (double) maximumPower) * 100), 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +0,0 @@
|
||||||
package resonantinduction.api.mechanical.fluid;
|
|
||||||
|
|
||||||
import net.minecraftforge.common.ForgeDirection;
|
|
||||||
|
|
||||||
public interface IPressure
|
|
||||||
{
|
|
||||||
public void setPressure(int amount);
|
|
||||||
|
|
||||||
public int getPressure(ForgeDirection dir);
|
|
||||||
}
|
|
|
@ -1,27 +0,0 @@
|
||||||
package resonantinduction.core.fluid;
|
|
||||||
|
|
||||||
import net.minecraftforge.fluids.FluidTank;
|
|
||||||
import net.minecraftforge.fluids.IFluidHandler;
|
|
||||||
import resonantinduction.api.mechanical.fluid.IPressure;
|
|
||||||
import universalelectricity.api.net.IConnector;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Applied to tiles that are pipes and support pressure
|
|
||||||
*
|
|
||||||
* @author DarkGuardsman
|
|
||||||
*/
|
|
||||||
public interface IPressurizedNode extends IConnector<PressureNetwork>, IFluidHandler, IPressure
|
|
||||||
{
|
|
||||||
public FluidTank getInternalTank();
|
|
||||||
|
|
||||||
public void onFluidChanged();
|
|
||||||
|
|
||||||
public boolean canFlow();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Max flow rate of fluid this pipe can support
|
|
||||||
*
|
|
||||||
* @return amount in liters.
|
|
||||||
*/
|
|
||||||
public int getMaxFlowRate();
|
|
||||||
}
|
|
|
@ -1,206 +0,0 @@
|
||||||
package resonantinduction.core.fluid;
|
|
||||||
|
|
||||||
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.IPressure;
|
|
||||||
import universalelectricity.api.net.IUpdate;
|
|
||||||
import universalelectricity.core.net.NetworkTickHandler;
|
|
||||||
import universalelectricity.core.net.NodeNetwork;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The network for pipe fluid transfer. getNodes() is NOT used.
|
|
||||||
*
|
|
||||||
* @author Calclavia
|
|
||||||
*/
|
|
||||||
public class PressureNetwork extends NodeNetwork<PressureNetwork, IPressurizedNode, IFluidHandler> implements IUpdate
|
|
||||||
{
|
|
||||||
public PressureNetwork()
|
|
||||||
{
|
|
||||||
super(IPressurizedNode.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void update()
|
|
||||||
{
|
|
||||||
for (IPressurizedNode connector : getConnectors())
|
|
||||||
{
|
|
||||||
calculatePressure((IPressurizedNode) connector);
|
|
||||||
distribute((IPressurizedNode) connector);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean canUpdate()
|
|
||||||
{
|
|
||||||
return getConnectors().size() > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean continueUpdate()
|
|
||||||
{
|
|
||||||
return canUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Calculate pressure in this pipe.
|
|
||||||
*/
|
|
||||||
public void calculatePressure(IPressurizedNode sourcePipe)
|
|
||||||
{
|
|
||||||
int totalPressure = 0;
|
|
||||||
int findCount = 0;
|
|
||||||
int minPressure = 0;
|
|
||||||
int maxPressure = 0;
|
|
||||||
|
|
||||||
Object[] connections = sourcePipe.getConnections();
|
|
||||||
|
|
||||||
if (connections != null)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < connections.length; i++)
|
|
||||||
{
|
|
||||||
Object obj = connections[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 += 1;
|
|
||||||
if (maxPressure > 0)
|
|
||||||
maxPressure -= 1;
|
|
||||||
|
|
||||||
sourcePipe.setPressure(Math.max(minPressure, Math.min(maxPressure, totalPressure / findCount + Integer.signum(totalPressure))));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Distribute fluid in this pipe based on pressure.
|
|
||||||
*/
|
|
||||||
public void distribute(IPressurizedNode sourcePipe)
|
|
||||||
{
|
|
||||||
Object[] connections = sourcePipe.getConnections();
|
|
||||||
|
|
||||||
for (int i = 0; i < connections.length; i++)
|
|
||||||
{
|
|
||||||
Object obj = connections[i];
|
|
||||||
|
|
||||||
if (obj instanceof IPressurizedNode)
|
|
||||||
{
|
|
||||||
IPressurizedNode otherPipe = (IPressurizedNode) obj;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Move fluid from higher pressure to lower. In this case, move from tankA to tankB.
|
|
||||||
*/
|
|
||||||
ForgeDirection dir = ForgeDirection.getOrientation(i);
|
|
||||||
int pressureA = sourcePipe.getPressure(dir);
|
|
||||||
int pressureB = otherPipe.getPressure(dir.getOpposite());
|
|
||||||
|
|
||||||
if (pressureA >= pressureB)
|
|
||||||
{
|
|
||||||
FluidTank tankA = sourcePipe.getInternalTank();
|
|
||||||
FluidStack fluidA = tankA.getFluid();
|
|
||||||
|
|
||||||
if (tankA != null && fluidA != null)
|
|
||||||
{
|
|
||||||
int amountA = fluidA.amount;
|
|
||||||
|
|
||||||
if (amountA > 0)
|
|
||||||
{
|
|
||||||
FluidTank tankB = otherPipe.getInternalTank();
|
|
||||||
|
|
||||||
if (tankB != null)
|
|
||||||
{
|
|
||||||
int amountB = tankB.getFluidAmount();
|
|
||||||
|
|
||||||
int quantity = Math.max(pressureA > pressureB ? (pressureA - pressureB) * sourcePipe.getMaxFlowRate() : 0, Math.min((amountA - amountB) / 2, sourcePipe.getMaxFlowRate()));
|
|
||||||
quantity = Math.min(Math.min(quantity, tankB.getCapacity() - amountB), amountA);
|
|
||||||
|
|
||||||
if (quantity > 0)
|
|
||||||
{
|
|
||||||
FluidStack drainStack = sourcePipe.drain(dir.getOpposite(), quantity, false);
|
|
||||||
|
|
||||||
if (drainStack != null && drainStack.amount > 0)
|
|
||||||
sourcePipe.drain(dir.getOpposite(), otherPipe.fill(dir, drainStack, true), 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 = sourcePipe.drain(dir.getOpposite(), transferAmount, false);
|
|
||||||
sourcePipe.drain(dir.getOpposite(), fluidHandler.fill(dir.getOpposite(), drainStack, true), true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (pressure < tankPressure)
|
|
||||||
{
|
|
||||||
if (transferAmount > 0)
|
|
||||||
{
|
|
||||||
FluidStack drainStack = fluidHandler.drain(dir.getOpposite(), transferAmount, false);
|
|
||||||
|
|
||||||
if (drainStack != null)
|
|
||||||
{
|
|
||||||
fluidHandler.drain(dir.getOpposite(), sourcePipe.fill(dir.getOpposite(), drainStack, true), true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Class getConnectorClass()
|
|
||||||
{
|
|
||||||
return IPressurizedNode.class;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PressureNetwork newInstance()
|
|
||||||
{
|
|
||||||
return new PressureNetwork();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void reconstructConnector(IPressurizedNode connector)
|
|
||||||
{
|
|
||||||
connector.setNetwork(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void reconstruct()
|
|
||||||
{
|
|
||||||
NetworkTickHandler.addNetwork(this);
|
|
||||||
super.reconstruct();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -2,7 +2,19 @@ package resonantinduction.core.grid;
|
||||||
|
|
||||||
import net.minecraftforge.common.ForgeDirection;
|
import net.minecraftforge.common.ForgeDirection;
|
||||||
|
|
||||||
public interface INodeProvider<N extends Node>
|
/**
|
||||||
|
* Any inheritance of INodeProvider should have a method "getNode()"
|
||||||
|
*
|
||||||
|
* @author Calclavia
|
||||||
|
*
|
||||||
|
* @param <N> - Node type.
|
||||||
|
*/
|
||||||
|
public interface INodeProvider
|
||||||
{
|
{
|
||||||
public N getNode(ForgeDirection from);
|
/**
|
||||||
|
* @param nodeType - The type of node we are looking for.
|
||||||
|
* @param from - The direction.
|
||||||
|
* @return Returns the node object.
|
||||||
|
*/
|
||||||
|
public Object getNode(Class<? extends Node> nodeType, ForgeDirection from);
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,6 +95,11 @@ public abstract class Node<P extends INodeProvider, G extends Grid, N>
|
||||||
return connections;
|
return connections;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean canConnect(ForgeDirection from, Object source)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Must be called to load the node's data.
|
* Must be called to load the node's data.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -4,7 +4,7 @@ import net.minecraftforge.fluids.FluidTank;
|
||||||
import net.minecraftforge.fluids.IFluidHandler;
|
import net.minecraftforge.fluids.IFluidHandler;
|
||||||
import resonantinduction.core.grid.INodeProvider;
|
import resonantinduction.core.grid.INodeProvider;
|
||||||
|
|
||||||
public interface IPressureNodeProvider extends INodeProvider<PressureNode>, IFluidHandler
|
public interface IPressureNodeProvider extends INodeProvider, IFluidHandler
|
||||||
{
|
{
|
||||||
FluidTank getPressureTank();
|
FluidTank getPressureTank();
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,6 @@ import net.minecraftforge.common.ForgeDirection;
|
||||||
import net.minecraftforge.fluids.FluidStack;
|
import net.minecraftforge.fluids.FluidStack;
|
||||||
import net.minecraftforge.fluids.FluidTank;
|
import net.minecraftforge.fluids.FluidTank;
|
||||||
import net.minecraftforge.fluids.IFluidHandler;
|
import net.minecraftforge.fluids.IFluidHandler;
|
||||||
import resonantinduction.api.mechanical.fluid.IPressure;
|
|
||||||
import resonantinduction.core.grid.Node;
|
import resonantinduction.core.grid.Node;
|
||||||
import resonantinduction.core.grid.TickingGrid;
|
import resonantinduction.core.grid.TickingGrid;
|
||||||
import universalelectricity.api.vector.Vector3;
|
import universalelectricity.api.vector.Vector3;
|
||||||
|
@ -53,9 +52,9 @@ public class PressureNode extends Node<IPressureNodeProvider, TickingGrid, Objec
|
||||||
Entry<Object, ForgeDirection> entry = it.next();
|
Entry<Object, ForgeDirection> entry = it.next();
|
||||||
Object obj = entry.getKey();
|
Object obj = entry.getKey();
|
||||||
|
|
||||||
if (obj instanceof IPressure)
|
if (obj instanceof PressureNode)
|
||||||
{
|
{
|
||||||
int pressure = ((IPressure) obj).getPressure(entry.getValue().getOpposite());
|
int pressure = ((PressureNode) obj).getPressure(entry.getValue().getOpposite());
|
||||||
|
|
||||||
minPressure = Math.min(pressure, minPressure);
|
minPressure = Math.min(pressure, minPressure);
|
||||||
maxPressure = Math.max(pressure, maxPressure);
|
maxPressure = Math.max(pressure, maxPressure);
|
||||||
|
@ -138,7 +137,7 @@ public class PressureNode extends Node<IPressureNodeProvider, TickingGrid, Objec
|
||||||
{
|
{
|
||||||
IFluidHandler fluidHandler = (IFluidHandler) obj;
|
IFluidHandler fluidHandler = (IFluidHandler) obj;
|
||||||
int pressure = getPressure(dir);
|
int pressure = getPressure(dir);
|
||||||
int tankPressure = fluidHandler instanceof IPressure ? ((IPressure) fluidHandler).getPressure(dir.getOpposite()) : 0;
|
int tankPressure = fluidHandler instanceof IPressureNodeProvider ? ((IPressureNodeProvider) fluidHandler).getNode(getClass(),dir.getOpposite()).getPressure(dir.getOpposite()) : 0;
|
||||||
FluidTank sourceTank = parent.getPressureTank();
|
FluidTank sourceTank = parent.getPressureTank();
|
||||||
|
|
||||||
int transferAmount = (Math.max(pressure, tankPressure) - Math.min(pressure, tankPressure)) * getMaxFlowRate();
|
int transferAmount = (Math.max(pressure, tankPressure) - Math.min(pressure, tankPressure)) * getMaxFlowRate();
|
||||||
|
|
|
@ -0,0 +1,280 @@
|
||||||
|
package resonantinduction.core.prefab.part;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import net.minecraft.client.particle.EffectRenderer;
|
||||||
|
import net.minecraft.client.renderer.RenderBlocks;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.tileentity.TileEntity;
|
||||||
|
import net.minecraft.util.Icon;
|
||||||
|
import net.minecraft.util.MovingObjectPosition;
|
||||||
|
import net.minecraftforge.common.ForgeDirection;
|
||||||
|
import resonantinduction.core.grid.INodeProvider;
|
||||||
|
import resonantinduction.core.grid.Node;
|
||||||
|
import universalelectricity.api.vector.Vector3;
|
||||||
|
import universalelectricity.api.vector.VectorHelper;
|
||||||
|
import codechicken.lib.data.MCDataInput;
|
||||||
|
import codechicken.lib.data.MCDataOutput;
|
||||||
|
import codechicken.lib.raytracer.IndexedCuboid6;
|
||||||
|
import codechicken.lib.render.CCRenderState;
|
||||||
|
import codechicken.lib.render.IconTransformation;
|
||||||
|
import codechicken.lib.render.RenderUtils;
|
||||||
|
import codechicken.lib.vec.Cuboid6;
|
||||||
|
import codechicken.lib.vec.Translation;
|
||||||
|
import codechicken.microblock.IHollowConnect;
|
||||||
|
import codechicken.multipart.IconHitEffects;
|
||||||
|
import codechicken.multipart.JIconHitEffects;
|
||||||
|
import codechicken.multipart.JNormalOcclusion;
|
||||||
|
import codechicken.multipart.NormalOcclusionTest;
|
||||||
|
import codechicken.multipart.PartMap;
|
||||||
|
import codechicken.multipart.TMultiPart;
|
||||||
|
import codechicken.multipart.TSlottedPart;
|
||||||
|
import codechicken.multipart.TileMultipart;
|
||||||
|
import cpw.mods.fml.relauncher.Side;
|
||||||
|
import cpw.mods.fml.relauncher.SideOnly;
|
||||||
|
|
||||||
|
public abstract class PartFramedNode<M extends Enum, N extends Node, T extends INodeProvider> extends PartColorableMaterial<M> implements INodeProvider, TSlottedPart, JNormalOcclusion, IHollowConnect, JIconHitEffects
|
||||||
|
{
|
||||||
|
public static IndexedCuboid6[] sides = new IndexedCuboid6[7];
|
||||||
|
public static IndexedCuboid6[] insulatedSides = new IndexedCuboid6[7];
|
||||||
|
|
||||||
|
static
|
||||||
|
{
|
||||||
|
sides[0] = new IndexedCuboid6(0, new Cuboid6(0.36, 0.000, 0.36, 0.64, 0.36, 0.64));
|
||||||
|
sides[1] = new IndexedCuboid6(1, new Cuboid6(0.36, 0.64, 0.36, 0.64, 1.000, 0.64));
|
||||||
|
sides[2] = new IndexedCuboid6(2, new Cuboid6(0.36, 0.36, 0.000, 0.64, 0.64, 0.36));
|
||||||
|
sides[3] = new IndexedCuboid6(3, new Cuboid6(0.36, 0.36, 0.64, 0.64, 0.64, 1.000));
|
||||||
|
sides[4] = new IndexedCuboid6(4, new Cuboid6(0.000, 0.36, 0.36, 0.36, 0.64, 0.64));
|
||||||
|
sides[5] = new IndexedCuboid6(5, new Cuboid6(0.64, 0.36, 0.36, 1.000, 0.64, 0.64));
|
||||||
|
sides[6] = new IndexedCuboid6(6, new Cuboid6(0.36, 0.36, 0.36, 0.64, 0.64, 0.64));
|
||||||
|
insulatedSides[0] = new IndexedCuboid6(0, new Cuboid6(0.3, 0.0, 0.3, 0.7, 0.3, 0.7));
|
||||||
|
insulatedSides[1] = new IndexedCuboid6(1, new Cuboid6(0.3, 0.7, 0.3, 0.7, 1.0, 0.7));
|
||||||
|
insulatedSides[2] = new IndexedCuboid6(2, new Cuboid6(0.3, 0.3, 0.0, 0.7, 0.7, 0.3));
|
||||||
|
insulatedSides[3] = new IndexedCuboid6(3, new Cuboid6(0.3, 0.3, 0.7, 0.7, 0.7, 1.0));
|
||||||
|
insulatedSides[4] = new IndexedCuboid6(4, new Cuboid6(0.0, 0.3, 0.3, 0.3, 0.7, 0.7));
|
||||||
|
insulatedSides[5] = new IndexedCuboid6(5, new Cuboid6(0.7, 0.3, 0.3, 1.0, 0.7, 0.7));
|
||||||
|
insulatedSides[6] = new IndexedCuboid6(6, new Cuboid6(0.3, 0.3, 0.3, 0.7, 0.7, 0.7));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Object[] connections = new Object[6];
|
||||||
|
|
||||||
|
protected N node;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bitmask connections
|
||||||
|
*/
|
||||||
|
public byte currentConnections = 0x00;
|
||||||
|
|
||||||
|
/** Client Side */
|
||||||
|
private ForgeDirection testingSide;
|
||||||
|
|
||||||
|
@SideOnly(Side.CLIENT)
|
||||||
|
protected Icon breakIcon;
|
||||||
|
|
||||||
|
public void preparePlacement(int meta)
|
||||||
|
{
|
||||||
|
this.setMaterial(meta);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean occlusionTest(TMultiPart other)
|
||||||
|
{
|
||||||
|
return NormalOcclusionTest.apply(this, other);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<IndexedCuboid6> getSubParts()
|
||||||
|
{
|
||||||
|
Set<IndexedCuboid6> subParts = new HashSet<IndexedCuboid6>();
|
||||||
|
IndexedCuboid6[] currentSides = isInsulated() ? insulatedSides : sides;
|
||||||
|
|
||||||
|
if (tile() != null)
|
||||||
|
{
|
||||||
|
for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS)
|
||||||
|
{
|
||||||
|
int ord = side.ordinal();
|
||||||
|
if (connectionMapContainsSide(getAllCurrentConnections(), side) || side == testingSide)
|
||||||
|
subParts.add(currentSides[ord]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
subParts.add(currentSides[6]);
|
||||||
|
return subParts;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rendering and block bounds.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Iterable<Cuboid6> getCollisionBoxes()
|
||||||
|
{
|
||||||
|
Set<Cuboid6> collisionBoxes = new HashSet<Cuboid6>();
|
||||||
|
collisionBoxes.addAll((Collection<? extends Cuboid6>) getSubParts());
|
||||||
|
|
||||||
|
return collisionBoxes;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getStrength(MovingObjectPosition hit, EntityPlayer player)
|
||||||
|
{
|
||||||
|
return 10F;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawBreaking(RenderBlocks renderBlocks)
|
||||||
|
{
|
||||||
|
if (breakIcon != null)
|
||||||
|
{
|
||||||
|
CCRenderState.reset();
|
||||||
|
RenderUtils.renderBlock(sides[6], 0, new Translation(x(), y(), z()), new IconTransformation(breakIcon), null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Cuboid6 getBounds()
|
||||||
|
{
|
||||||
|
return new Cuboid6(0.375, 0.375, 0.375, 0.625, 0.625, 0.625);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Icon getBreakingIcon(Object subPart, int side)
|
||||||
|
{
|
||||||
|
return breakIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Icon getBrokenIcon(int side)
|
||||||
|
{
|
||||||
|
return breakIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterable<Cuboid6> getOcclusionBoxes()
|
||||||
|
{
|
||||||
|
return getCollisionBoxes();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getSlotMask()
|
||||||
|
{
|
||||||
|
return PartMap.CENTER.mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getHollowSize()
|
||||||
|
{
|
||||||
|
return isInsulated ? 8 : 6;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addHitEffects(MovingObjectPosition hit, EffectRenderer effectRenderer)
|
||||||
|
{
|
||||||
|
IconHitEffects.addHitEffects(this, hit, effectRenderer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addDestroyEffects(EffectRenderer effectRenderer)
|
||||||
|
{
|
||||||
|
IconHitEffects.addDestroyEffects(this, effectRenderer, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isBlockedOnSide(ForgeDirection side)
|
||||||
|
{
|
||||||
|
TMultiPart blocker = tile().partMap(side.ordinal());
|
||||||
|
testingSide = side;
|
||||||
|
boolean expandable = NormalOcclusionTest.apply(this, blocker);
|
||||||
|
testingSide = null;
|
||||||
|
return !expandable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte getAllCurrentConnections()
|
||||||
|
{
|
||||||
|
return (byte) (currentConnections);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean connectionMapContainsSide(byte connections, ForgeDirection side)
|
||||||
|
{
|
||||||
|
byte tester = (byte) (1 << side.ordinal());
|
||||||
|
return ((connections & tester) > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void bind(TileMultipart t)
|
||||||
|
{
|
||||||
|
node.deconstruct();
|
||||||
|
super.bind(t);
|
||||||
|
node.reconstruct();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCurrentlyConnected(ForgeDirection side)
|
||||||
|
{
|
||||||
|
return connectionMapContainsSide(getAllCurrentConnections(), side);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onWorldJoin()
|
||||||
|
{
|
||||||
|
node.reconstruct();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onWorldSeparate()
|
||||||
|
{
|
||||||
|
node.deconstruct();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void copyFrom(PartFramedNode<M, N, T> other)
|
||||||
|
{
|
||||||
|
this.isInsulated = other.isInsulated;
|
||||||
|
this.color = other.color;
|
||||||
|
this.connections = other.connections;
|
||||||
|
this.material = other.material;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Packet Methods */
|
||||||
|
public void sendConnectionUpdate()
|
||||||
|
{
|
||||||
|
tile().getWriteStream(this).writeByte(0).writeByte(currentConnections);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void readDesc(MCDataInput packet)
|
||||||
|
{
|
||||||
|
super.readDesc(packet);
|
||||||
|
currentConnections = packet.readByte();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void writeDesc(MCDataOutput packet)
|
||||||
|
{
|
||||||
|
super.writeDesc(packet);
|
||||||
|
packet.writeByte(currentConnections);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void read(MCDataInput packet)
|
||||||
|
{
|
||||||
|
read(packet, packet.readUByte());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void read(MCDataInput packet, int packetID)
|
||||||
|
{
|
||||||
|
if (packetID == 0)
|
||||||
|
{
|
||||||
|
currentConnections= packet.readByte();
|
||||||
|
tile().markRender();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
super.read(packet, packetID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public N getNode(ForgeDirection from)
|
||||||
|
{
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue