A lot more work on new grid design
This commit is contained in:
parent
503c3a9904
commit
dacf725587
16 changed files with 630 additions and 681 deletions
|
@ -5,8 +5,8 @@ import java.util.EnumSet;
|
|||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraftforge.common.ForgeDirection;
|
||||
import resonantinduction.api.mechanical.IMechanical;
|
||||
import resonantinduction.api.mechanical.IMechanicalNetwork;
|
||||
import resonantinduction.mechanical.energy.network.IMechanicalNodeProvider;
|
||||
import resonantinduction.mechanical.energy.network.MechanicalNode;
|
||||
import universalelectricity.api.energy.EnergyStorageHandler;
|
||||
import universalelectricity.api.vector.Vector3;
|
||||
import calclavia.lib.prefab.tile.IRotatable;
|
||||
|
@ -17,9 +17,9 @@ import calclavia.lib.prefab.tile.TileElectrical;
|
|||
*
|
||||
* @author Calclavia
|
||||
*/
|
||||
public class TileGenerator extends TileElectrical implements IRotatable
|
||||
public class TileGenerator extends TileElectrical implements IRotatable, IMechanicalNodeProvider
|
||||
{
|
||||
private IMechanicalNetwork network;
|
||||
protected MechanicalNode node = new MechanicalNode(this).setLoad(0.5f);;
|
||||
|
||||
/** Generator turns KE -> EE. Inverted one will turn EE -> KE. */
|
||||
public boolean isInversed = true;
|
||||
|
@ -161,4 +161,10 @@ public class TileGenerator extends TileElectrical implements IRotatable
|
|||
nbt.setBoolean("isInversed", isInversed);
|
||||
nbt.setByte("gear", gearRatio);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MechanicalNode getNode(ForgeDirection from)
|
||||
{
|
||||
return node;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,88 @@
|
|||
package resonantinduction.electrical.multimeter;
|
||||
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTTagList;
|
||||
|
||||
public class GraphD extends Graph<Double>
|
||||
{
|
||||
public GraphD(String name, int maxPoints)
|
||||
{
|
||||
super(name, maxPoints);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void queue(Double value)
|
||||
{
|
||||
queue += value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doneQueue()
|
||||
{
|
||||
super.doneQueue();
|
||||
queue = 0d;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double getDefault()
|
||||
{
|
||||
return 0d;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void load(NBTTagCompound nbt)
|
||||
{
|
||||
super.load(nbt);
|
||||
|
||||
NBTTagList nbtList = nbt.getTagList("DataPoints");
|
||||
|
||||
for (int i = 0; i < nbtList.tagCount(); ++i)
|
||||
{
|
||||
NBTTagCompound nbtPoint = (NBTTagCompound) nbtList.tagAt(i);
|
||||
points.add(nbtPoint.getDouble("data"));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public NBTTagCompound save()
|
||||
{
|
||||
NBTTagCompound nbt = new NBTTagCompound();
|
||||
NBTTagList data = new NBTTagList();
|
||||
|
||||
for (Double value : points)
|
||||
{
|
||||
NBTTagCompound nbtPoint = new NBTTagCompound();
|
||||
nbtPoint.setDouble("data", value);
|
||||
data.appendTag(nbtPoint);
|
||||
}
|
||||
|
||||
nbt.setTag("DataPoints", data);
|
||||
return nbt;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getDouble()
|
||||
{
|
||||
return get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double getAverage()
|
||||
{
|
||||
if (points.size() > 0)
|
||||
{
|
||||
double average = 0;
|
||||
|
||||
for (double point : points)
|
||||
{
|
||||
average += point;
|
||||
}
|
||||
|
||||
average /= points.size();
|
||||
|
||||
return average;
|
||||
}
|
||||
|
||||
return 0d;
|
||||
}
|
||||
}
|
|
@ -32,8 +32,8 @@ public class MultimeterNetwork extends Network<MultimeterNetwork, PartMultimeter
|
|||
public final GraphL powerGraph = new GraphL("Power", maxData);
|
||||
public final GraphL energyCapacityGraph = new GraphL("Capacity", 1);
|
||||
public final GraphL voltageGraph = new GraphL("Voltage", maxData);
|
||||
public final GraphL torqueGraph = new GraphL("Torque", maxData);
|
||||
public final GraphF angularVelocityGraph = new GraphF("Speed", maxData);
|
||||
public final GraphD torqueGraph = new GraphD("Torque", maxData);
|
||||
public final GraphD angularVelocityGraph = new GraphD("Speed", maxData);
|
||||
public final GraphI fluidGraph = new GraphI("Fluid", maxData);
|
||||
public final GraphF thermalGraph = new GraphF("Temperature", maxData);
|
||||
public final GraphI pressureGraph = new GraphI("Pressure", maxData);
|
||||
|
|
|
@ -11,11 +11,12 @@ import net.minecraft.util.MovingObjectPosition;
|
|||
import net.minecraftforge.common.ForgeDirection;
|
||||
import net.minecraftforge.fluids.FluidTankInfo;
|
||||
import net.minecraftforge.fluids.IFluidHandler;
|
||||
import resonantinduction.api.mechanical.IMechanical;
|
||||
import resonantinduction.api.mechanical.fluid.IPressure;
|
||||
import resonantinduction.core.ResonantInduction;
|
||||
import resonantinduction.core.prefab.part.PartFace;
|
||||
import resonantinduction.electrical.Electrical;
|
||||
import resonantinduction.mechanical.energy.network.IMechanicalNodeProvider;
|
||||
import resonantinduction.mechanical.energy.network.MechanicalNode;
|
||||
import universalelectricity.api.CompatibilityModule;
|
||||
import universalelectricity.api.electricity.IElectricalNetwork;
|
||||
import universalelectricity.api.energy.IConductor;
|
||||
|
@ -267,9 +268,9 @@ public class PartMultimeter extends PartFace implements IConnector<MultimeterNet
|
|||
}
|
||||
}
|
||||
|
||||
if (tileEntity instanceof IMechanical)
|
||||
if (tileEntity instanceof IMechanicalNodeProvider)
|
||||
{
|
||||
IMechanical instance = ((IMechanical) tileEntity).getInstance(receivingSide);
|
||||
MechanicalNode instance = ((IMechanicalNodeProvider) tileEntity).getNode(receivingSide);
|
||||
|
||||
for (ForgeDirection dir : ForgeDirection.values())
|
||||
{
|
||||
|
@ -278,14 +279,14 @@ public class PartMultimeter extends PartFace implements IConnector<MultimeterNet
|
|||
break;
|
||||
}
|
||||
|
||||
instance = ((IMechanical) tileEntity).getInstance(dir);
|
||||
instance = ((IMechanicalNodeProvider) tileEntity).getNode(dir);
|
||||
}
|
||||
|
||||
if (instance != null)
|
||||
{
|
||||
getNetwork().torqueGraph.queue(instance.getTorque());
|
||||
getNetwork().angularVelocityGraph.queue(instance.getAngularVelocity());
|
||||
getNetwork().energyGraph.queue((long) (instance.getTorque() * instance.getAngularVelocity()));
|
||||
getNetwork().energyGraph.queue((long) (instance.getEnergy()));
|
||||
getNetwork().powerGraph.queue(getNetwork().energyGraph.getAverage() * 20);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -612,7 +612,7 @@ public class TileTesla extends TileElectrical implements IMultiBlockStructure<Ti
|
|||
|
||||
if (t instanceof TileTesla)
|
||||
{
|
||||
vectors.add(checkPosition.clone().subtract(getPosition()));
|
||||
vectors.add(checkPosition.clone().subtract(position()));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -656,7 +656,7 @@ public class TileTesla extends TileElectrical implements IMultiBlockStructure<Ti
|
|||
}
|
||||
|
||||
@Override
|
||||
public Vector3 getPosition()
|
||||
public Vector3 position()
|
||||
{
|
||||
return new Vector3(this);
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ public class MultipartMechanical implements IPartFactory
|
|||
MultiPartRegistry.registerParts(this, PART_TYPES);
|
||||
MultipartGenerator.registerPassThroughInterface("resonantinduction.core.fluid.IPressurizedNode");
|
||||
MultipartGenerator.registerPassThroughInterface("resonantinduction.api.mechanical.fluid.IPressure");
|
||||
MultipartGenerator.registerTrait("resonantinduction.api.mechanical.IMechanical", "resonantinduction.mechanical.trait.TraitMechanical");
|
||||
MultipartGenerator.registerTrait("resonantinduction.api.mechanical.IMechanicalNodeProvider", "resonantinduction.mechanical.trait.TraitMechanical");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -11,10 +11,11 @@ import net.minecraft.tileentity.TileEntity;
|
|||
import net.minecraft.util.MovingObjectPosition;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.ForgeDirection;
|
||||
import resonantinduction.api.mechanical.IMechanical;
|
||||
import resonantinduction.core.Reference;
|
||||
import resonantinduction.core.resource.ItemHandCrank;
|
||||
import resonantinduction.mechanical.Mechanical;
|
||||
import resonantinduction.mechanical.energy.network.IMechanicalNodeProvider;
|
||||
import resonantinduction.mechanical.energy.network.MechanicalNode;
|
||||
import resonantinduction.mechanical.energy.network.PartMechanical;
|
||||
import calclavia.lib.multiblock.reference.IMultiBlockStructure;
|
||||
import calclavia.lib.multiblock.reference.MultiBlockHandler;
|
||||
|
@ -35,7 +36,7 @@ import cpw.mods.fml.relauncher.SideOnly;
|
|||
*
|
||||
* @author Calclavia
|
||||
*/
|
||||
public class PartGear extends PartMechanical implements IMechanical, IMultiBlockStructure<PartGear>
|
||||
public class PartGear extends PartMechanical implements IMultiBlockStructure<PartGear>
|
||||
{
|
||||
public static Cuboid6[][] oBoxes = new Cuboid6[6][2];
|
||||
|
||||
|
@ -55,6 +56,287 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
|
|||
private int manualCrankTime = 0;
|
||||
private int multiBlockRadius = 1;
|
||||
|
||||
public PartGear()
|
||||
{
|
||||
super();
|
||||
node = new MechanicalNode(this)
|
||||
{
|
||||
@Override
|
||||
public void onUpdate()
|
||||
{
|
||||
if (!getMultiBlock().isPrimary())
|
||||
{
|
||||
torque = 0;
|
||||
angularVelocity = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getTorqueLoad()
|
||||
{
|
||||
// Decelerate the gear based on tier.
|
||||
switch (tier)
|
||||
{
|
||||
default:
|
||||
return 0.4;
|
||||
case 1:
|
||||
return 0.3;
|
||||
case 2:
|
||||
return 0.2;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getAngularVelocityLoad()
|
||||
{
|
||||
// Decelerate the gear based on tier.
|
||||
switch (tier)
|
||||
{
|
||||
default:
|
||||
return 0.3;
|
||||
case 1:
|
||||
return 0.4;
|
||||
case 2:
|
||||
return 0.2;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void recache()
|
||||
{
|
||||
synchronized (connections)
|
||||
{
|
||||
connections.clear();
|
||||
|
||||
/**
|
||||
* Only call refresh if this is the main block of a multiblock gear or a single
|
||||
* gear
|
||||
* block.
|
||||
*/
|
||||
if (!getMultiBlock().isPrimary() || world() == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
/** Look for gears that are back-to-back with this gear. Equate torque. */
|
||||
TileEntity tileBehind = new universalelectricity.api.vector.Vector3(tile()).translate(placementSide).getTileEntity(world());
|
||||
|
||||
if (tileBehind instanceof IMechanicalNodeProvider)
|
||||
{
|
||||
MechanicalNode instance = ((IMechanicalNodeProvider) tileBehind).getNode(placementSide.getOpposite());
|
||||
|
||||
if (instance != null && instance != this && !(instance.parent instanceof PartGearShaft) && instance.canConnect(placementSide.getOpposite(), this))
|
||||
{
|
||||
connections.put(instance, placementSide);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Look for gears that are internal and adjacent to this gear. (The 4 sides +
|
||||
* the
|
||||
* internal
|
||||
* center)
|
||||
*/
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
ForgeDirection checkDir = ForgeDirection.getOrientation(i);
|
||||
|
||||
TileEntity tile = tile();
|
||||
|
||||
if (getMultiBlock().isConstructed() && checkDir != placementSide && checkDir != placementSide.getOpposite())
|
||||
{
|
||||
tile = new universalelectricity.api.vector.Vector3(tile()).translate(checkDir).getTileEntity(world());
|
||||
}
|
||||
|
||||
if (tile instanceof IMechanicalNodeProvider)
|
||||
{
|
||||
/**
|
||||
* If we're checking for the block that is opposite to the gear's
|
||||
* placement
|
||||
* side
|
||||
* (the center), then we try to look for a gear shaft in the center.
|
||||
*/
|
||||
MechanicalNode instance = ((IMechanicalNodeProvider) tile).getNode(checkDir == placementSide.getOpposite() ? ForgeDirection.UNKNOWN : checkDir);
|
||||
|
||||
if (!connections.containsValue(checkDir) && instance != this && checkDir != placementSide && instance != null && instance.canConnect(checkDir.getOpposite(), this))
|
||||
{
|
||||
connections.put(instance, checkDir);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int displaceCheck = 1;
|
||||
|
||||
if (getMultiBlock().isPrimary() && getMultiBlock().isConstructed())
|
||||
{
|
||||
displaceCheck = 2;
|
||||
}
|
||||
|
||||
/** Look for gears outside this block space, the relative UP, DOWN, LEFT, RIGHT */
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
ForgeDirection checkDir = ForgeDirection.getOrientation(Rotation.rotateSide(PartGear.this.placementSide.ordinal(), i));
|
||||
TileEntity checkTile = new universalelectricity.api.vector.Vector3(tile()).translate(checkDir, displaceCheck).getTileEntity(world());
|
||||
|
||||
if (!connections.containsValue(checkDir) && checkTile instanceof IMechanicalNodeProvider)
|
||||
{
|
||||
MechanicalNode instance = ((IMechanicalNodeProvider) checkTile).getNode(placementSide);
|
||||
|
||||
if (instance != null && instance != this && instance.canConnect(checkDir.getOpposite(), this) && !(instance.parent instanceof PartGearShaft))
|
||||
{
|
||||
connections.put(instance, checkDir);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Can this gear be connected BY the source?
|
||||
*
|
||||
* @param from - Direction source is coming from.
|
||||
* @param source - The source of the connection.
|
||||
* @return True is so.
|
||||
*/
|
||||
@Override
|
||||
public boolean canConnect(ForgeDirection from, Object with)
|
||||
{
|
||||
if (!getMultiBlock().isPrimary())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (with instanceof MechanicalNode)
|
||||
{
|
||||
IMechanicalNodeProvider source = ((MechanicalNode) with).parent;
|
||||
|
||||
/**
|
||||
* Check for flat connections (gear face on gear face) to make sure it's
|
||||
* actually on
|
||||
* this gear block.
|
||||
*/
|
||||
if (from == placementSide.getOpposite())
|
||||
{
|
||||
if (source instanceof PartGear || source instanceof PartGearShaft)
|
||||
{
|
||||
if (source instanceof PartGearShaft)
|
||||
{
|
||||
PartGearShaft shaft = (PartGearShaft) source;
|
||||
return shaft.tile().partMap(from.getOpposite().ordinal()) == PartGear.this && Math.abs(shaft.placementSide.offsetX) == Math.abs(placementSide.offsetX) && Math.abs(shaft.placementSide.offsetY) == Math.abs(placementSide.offsetY) && Math.abs(shaft.placementSide.offsetZ) == Math.abs(placementSide.offsetZ);
|
||||
}
|
||||
else if (source instanceof PartGear)
|
||||
{
|
||||
if (((PartGear) source).tile() == tile() && !getMultiBlock().isConstructed())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (((PartGear) source).placementSide != placementSide)
|
||||
{
|
||||
TMultiPart part = tile().partMap(((PartGear) source).placementSide.ordinal());
|
||||
|
||||
if (part instanceof PartGear)
|
||||
{
|
||||
/**
|
||||
* Case when we connect gears via edges internally. Large
|
||||
* gear
|
||||
* attempt to connect to small gear.
|
||||
*/
|
||||
PartGear sourceGear = (PartGear) part;
|
||||
|
||||
if (sourceGear.isCenterMultiBlock() && !sourceGear.getMultiBlock().isPrimary())
|
||||
{
|
||||
// For large gear to small gear on edge connection.
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/** Small gear attempting to connect to large gear. */
|
||||
if (getMultiBlock().isConstructed())
|
||||
{
|
||||
TMultiPart checkPart = ((PartGear) source).tile().partMap(placementSide.ordinal());
|
||||
|
||||
if (checkPart instanceof PartGear)
|
||||
{
|
||||
ForgeDirection requiredDirection = ((PartGear) checkPart).position().subtract(position()).toForgeDirection();
|
||||
return ((PartGear) checkPart).isCenterMultiBlock() && ((PartGear) source).placementSide == requiredDirection;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Face to face stick connection. */
|
||||
TileEntity sourceTile = position().translate(from.getOpposite()).getTileEntity(world());
|
||||
|
||||
if (sourceTile instanceof IMechanicalNodeProvider)
|
||||
{
|
||||
MechanicalNode sourceInstance = ((IMechanicalNodeProvider) sourceTile).getNode(from);
|
||||
return sourceInstance == source;
|
||||
}
|
||||
}
|
||||
else if (from == placementSide)
|
||||
{
|
||||
/** Face to face stick connection. */
|
||||
TileEntity sourceTile = position().translate(from).getTileEntity(world());
|
||||
|
||||
if (sourceTile instanceof IMechanicalNodeProvider)
|
||||
{
|
||||
MechanicalNode sourceInstance = ((IMechanicalNodeProvider) sourceTile).getNode(from.getOpposite());
|
||||
return sourceInstance == source;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
TileEntity destinationTile = ((MechanicalNode) with).position().translate(from.getOpposite()).getTileEntity(world());
|
||||
|
||||
if (destinationTile instanceof IMechanicalNodeProvider && destinationTile instanceof TileMultipart)
|
||||
{
|
||||
TMultiPart destinationPart = ((TileMultipart) destinationTile).partMap(placementSide.ordinal());
|
||||
|
||||
if (destinationPart instanceof PartGear)
|
||||
{
|
||||
if (PartGear.this != destinationPart)
|
||||
{
|
||||
return ((PartGear) destinationPart).isCenterMultiBlock();
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getRatio(ForgeDirection dir, MechanicalNode with)
|
||||
{
|
||||
universalelectricity.api.vector.Vector3 deltaPos = with.position().subtract(position());
|
||||
|
||||
boolean caseX = placementSide.offsetX != 0 && deltaPos.y == 0 && deltaPos.z == 0;
|
||||
boolean caseY = placementSide.offsetY != 0 && deltaPos.x == 0 && deltaPos.z == 0;
|
||||
boolean caseZ = placementSide.offsetZ != 0 && deltaPos.x == 0 && deltaPos.y == 0;
|
||||
|
||||
if (caseX || caseY || caseZ)
|
||||
{
|
||||
return super.getRatio(dir, with);
|
||||
}
|
||||
|
||||
return getMultiBlock().isConstructed() ? 1.5f : super.getRatio(dir, with);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update()
|
||||
{
|
||||
|
@ -64,36 +346,10 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
|
|||
{
|
||||
if (manualCrankTime > 0)
|
||||
{
|
||||
torque += isClockwiseCrank ? 4 : -4;
|
||||
angularVelocity += isClockwiseCrank ? 0.03f : -0.03f;
|
||||
|
||||
node.apply(isClockwiseCrank ? 4 : -4, isClockwiseCrank ? 0.03f : -0.03f);
|
||||
manualCrankTime--;
|
||||
}
|
||||
|
||||
if (getMultiBlock().isPrimary())
|
||||
{
|
||||
// Decelerate the gear based on tier.
|
||||
switch (tier)
|
||||
{
|
||||
default:
|
||||
torque *= 0.96f;
|
||||
angularVelocity *= 0.97f;
|
||||
break;
|
||||
case 1:
|
||||
torque *= 0.97f;
|
||||
angularVelocity *= 0.96f;
|
||||
break;
|
||||
case 2:
|
||||
torque *= 0.98f;
|
||||
angularVelocity *= 0.98f;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
torque = 0;
|
||||
angularVelocity = 0;
|
||||
}
|
||||
}
|
||||
|
||||
getMultiBlock().update();
|
||||
|
@ -113,8 +369,8 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
|
|||
{
|
||||
if (!world().isRemote && ControlKeyModifer.isControlDown(player))
|
||||
{
|
||||
getMultiBlock().get().torque = -getMultiBlock().get().torque;
|
||||
getMultiBlock().get().angularVelocity = -getMultiBlock().get().angularVelocity;
|
||||
getMultiBlock().get().node.torque = -getMultiBlock().get().node.torque;
|
||||
getMultiBlock().get().node.angularVelocity = -getMultiBlock().get().node.angularVelocity;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -141,88 +397,6 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
|
|||
getMultiBlock().deconstruct();
|
||||
}
|
||||
|
||||
/** Refresh should be called sparingly. */
|
||||
@Override
|
||||
public Object[] getConnections()
|
||||
{
|
||||
Object[] connections = new Object[6];
|
||||
|
||||
/** Only call refresh if this is the main block of a multiblock gear or a single gear block. */
|
||||
if (!getMultiBlock().isPrimary() || world() == null)
|
||||
{
|
||||
return connections;
|
||||
}
|
||||
|
||||
/** Look for gears that are back-to-back with this gear. Equate torque. */
|
||||
TileEntity tileBehind = new universalelectricity.api.vector.Vector3(tile()).translate(placementSide).getTileEntity(world());
|
||||
|
||||
if (tileBehind instanceof IMechanical)
|
||||
{
|
||||
IMechanical instance = ((IMechanical) tileBehind).getInstance(placementSide.getOpposite());
|
||||
|
||||
if (instance != null && instance != this && !(instance instanceof PartGearShaft) && instance.canConnect(placementSide.getOpposite(), this))
|
||||
{
|
||||
connections[placementSide.ordinal()] = instance;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Look for gears that are internal and adjacent to this gear. (The 4 sides + the internal
|
||||
* center)
|
||||
*/
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
ForgeDirection checkDir = ForgeDirection.getOrientation(i);
|
||||
|
||||
TileEntity tile = tile();
|
||||
|
||||
if (getMultiBlock().isConstructed() && checkDir != placementSide && checkDir != placementSide.getOpposite())
|
||||
{
|
||||
tile = new universalelectricity.api.vector.Vector3(tile()).translate(checkDir).getTileEntity(world());
|
||||
}
|
||||
|
||||
if (tile instanceof IMechanical)
|
||||
{
|
||||
/**
|
||||
* If we're checking for the block that is opposite to the gear's placement side
|
||||
* (the center), then we try to look for a gear shaft in the center.
|
||||
*/
|
||||
IMechanical instance = ((IMechanical) tile).getInstance(checkDir == placementSide.getOpposite() ? ForgeDirection.UNKNOWN : checkDir);
|
||||
|
||||
if (connections[checkDir.ordinal()] == null && instance != this && checkDir != placementSide && instance != null && instance.canConnect(checkDir.getOpposite(), this))
|
||||
{
|
||||
connections[checkDir.ordinal()] = instance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int displaceCheck = 1;
|
||||
|
||||
if (getMultiBlock().isPrimary() && getMultiBlock().isConstructed())
|
||||
{
|
||||
displaceCheck = 2;
|
||||
}
|
||||
|
||||
/** Look for gears outside this block space, the relative UP, DOWN, LEFT, RIGHT */
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
ForgeDirection checkDir = ForgeDirection.getOrientation(Rotation.rotateSide(this.placementSide.ordinal(), i));
|
||||
TileEntity checkTile = new universalelectricity.api.vector.Vector3(tile()).translate(checkDir, displaceCheck).getTileEntity(world());
|
||||
|
||||
if (connections[checkDir.ordinal()] == null && checkTile instanceof IMechanical)
|
||||
{
|
||||
IMechanical instance = ((IMechanical) checkTile).getInstance(placementSide);
|
||||
|
||||
if (instance != null && instance != this && instance.canConnect(checkDir.getOpposite(), this) && !(instance instanceof PartGearShaft))
|
||||
{
|
||||
connections[checkDir.ordinal()] = instance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return connections;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is this gear block the one in the center-edge of the multiblock that can interact with other
|
||||
* gears?
|
||||
|
@ -356,152 +530,9 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
|
|||
}
|
||||
|
||||
@Override
|
||||
public float getRatio(ForgeDirection dir, Object source)
|
||||
public MechanicalNode getNode(ForgeDirection from)
|
||||
{
|
||||
if (source instanceof IMechanical)
|
||||
{
|
||||
universalelectricity.api.vector.Vector3 deltaPos = ((IMechanical) source).position().subtract(position());
|
||||
|
||||
boolean caseX = placementSide.offsetX != 0 && deltaPos.y == 0 && deltaPos.z == 0;
|
||||
boolean caseY = placementSide.offsetY != 0 && deltaPos.x == 0 && deltaPos.z == 0;
|
||||
boolean caseZ = placementSide.offsetZ != 0 && deltaPos.x == 0 && deltaPos.y == 0;
|
||||
|
||||
if (caseX || caseY || caseZ)
|
||||
{
|
||||
return super.getRatio(dir, source);
|
||||
}
|
||||
}
|
||||
|
||||
return getMultiBlock().isConstructed() ? 1.5f : super.getRatio(dir, source);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IMechanical getInstance(ForgeDirection from)
|
||||
{
|
||||
return getMultiBlock().get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Can this gear be connected BY the source?
|
||||
*
|
||||
* @param from - Direction source is coming from.
|
||||
* @param source - The source of the connection.
|
||||
* @return True is so.
|
||||
*/
|
||||
@Override
|
||||
public boolean canConnect(ForgeDirection from, Object source)
|
||||
{
|
||||
if (!getMultiBlock().isPrimary())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (source instanceof IMechanical)
|
||||
{
|
||||
/**
|
||||
* Check for flat connections (gear face on gear face) to make sure it's actually on
|
||||
* this gear block.
|
||||
*/
|
||||
if (from == placementSide.getOpposite())
|
||||
{
|
||||
if (source instanceof PartGear || source instanceof PartGearShaft)
|
||||
{
|
||||
if (source instanceof PartGearShaft)
|
||||
{
|
||||
PartGearShaft shaft = (PartGearShaft) source;
|
||||
return shaft.tile().partMap(from.getOpposite().ordinal()) == this && Math.abs(shaft.placementSide.offsetX) == Math.abs(placementSide.offsetX) && Math.abs(shaft.placementSide.offsetY) == Math.abs(placementSide.offsetY) && Math.abs(shaft.placementSide.offsetZ) == Math.abs(placementSide.offsetZ);
|
||||
}
|
||||
else if (source instanceof PartGear)
|
||||
{
|
||||
if (((PartGear) source).tile() == tile() && !getMultiBlock().isConstructed())
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (((PartGear) source).placementSide != placementSide)
|
||||
{
|
||||
TMultiPart part = tile().partMap(((PartGear) source).placementSide.ordinal());
|
||||
|
||||
if (part instanceof PartGear)
|
||||
{
|
||||
/**
|
||||
* Case when we connect gears via edges internally. Large gear
|
||||
* attempt to connect to small gear.
|
||||
*/
|
||||
PartGear sourceGear = (PartGear) part;
|
||||
|
||||
if (sourceGear.isCenterMultiBlock() && !sourceGear.getMultiBlock().isPrimary())
|
||||
{
|
||||
// For large gear to small gear on edge connection.
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/** Small gear attempting to connect to large gear. */
|
||||
if (getMultiBlock().isConstructed())
|
||||
{
|
||||
TMultiPart checkPart = ((PartGear) source).tile().partMap(placementSide.ordinal());
|
||||
|
||||
if (checkPart instanceof PartGear)
|
||||
{
|
||||
ForgeDirection requiredDirection = ((PartGear) checkPart).position().subtract(position()).toForgeDirection();
|
||||
return ((PartGear) checkPart).isCenterMultiBlock() && ((PartGear) source).placementSide == requiredDirection;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Face to face stick connection. */
|
||||
TileEntity sourceTile = position().translate(from.getOpposite()).getTileEntity(world());
|
||||
|
||||
if (sourceTile instanceof IMechanical)
|
||||
{
|
||||
IMechanical sourceInstance = ((IMechanical) sourceTile).getInstance(from);
|
||||
return sourceInstance == source;
|
||||
}
|
||||
}
|
||||
else if (from == placementSide)
|
||||
{
|
||||
/** Face to face stick connection. */
|
||||
TileEntity sourceTile = position().translate(from).getTileEntity(world());
|
||||
|
||||
if (sourceTile instanceof IMechanical)
|
||||
{
|
||||
IMechanical sourceInstance = ((IMechanical) sourceTile).getInstance(from.getOpposite());
|
||||
return sourceInstance == source;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
TileEntity destinationTile = ((IMechanical) source).position().translate(from.getOpposite()).getTileEntity(world());
|
||||
|
||||
if (destinationTile instanceof IMechanical && destinationTile instanceof TileMultipart)
|
||||
{
|
||||
TMultiPart destinationPart = ((TileMultipart) destinationTile).partMap(placementSide.ordinal());
|
||||
|
||||
if (destinationPart instanceof PartGear)
|
||||
{
|
||||
if (this != destinationPart)
|
||||
{
|
||||
return ((PartGear) destinationPart).isCenterMultiBlock();
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
return getMultiBlock().get().node;
|
||||
}
|
||||
|
||||
/** Multipart Bounds */
|
||||
|
@ -523,12 +554,6 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock
|
|||
return FaceMicroClass.aBounds()[0x10 | this.placementSide.ordinal()];
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean inverseRotation(ForgeDirection dir, IMechanical with)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@SideOnly(Side.CLIENT)
|
||||
public Cuboid6 getRenderBounds()
|
||||
|
|
|
@ -7,8 +7,9 @@ import java.util.Set;
|
|||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraftforge.common.ForgeDirection;
|
||||
import resonantinduction.api.mechanical.IMechanical;
|
||||
import resonantinduction.mechanical.Mechanical;
|
||||
import resonantinduction.mechanical.energy.network.IMechanicalNodeProvider;
|
||||
import resonantinduction.mechanical.energy.network.MechanicalNode;
|
||||
import resonantinduction.mechanical.energy.network.PartMechanical;
|
||||
import codechicken.lib.raytracer.IndexedCuboid6;
|
||||
import codechicken.lib.vec.Cuboid6;
|
||||
|
@ -47,79 +48,114 @@ public class PartGearShaft extends PartMechanical
|
|||
tier = itemDamage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update()
|
||||
public PartGearShaft()
|
||||
{
|
||||
super.update();
|
||||
super();
|
||||
|
||||
if (!this.world().isRemote)
|
||||
node = new MechanicalNode(this)
|
||||
{
|
||||
// Decelerate the shaft.
|
||||
switch (tier)
|
||||
@Override
|
||||
public double getTorqueLoad()
|
||||
{
|
||||
default:
|
||||
torque *= 0.997f;
|
||||
angularVelocity *= 0.998f;
|
||||
break;
|
||||
case 1:
|
||||
torque *= 0.998f;
|
||||
angularVelocity *= 0.997f;
|
||||
break;
|
||||
case 2:
|
||||
torque *= 0.99f;
|
||||
angularVelocity *= 0.999f;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Refresh should be called sparingly.
|
||||
*/
|
||||
@Override
|
||||
public Object[] getConnections()
|
||||
{
|
||||
Object[] connections = new Object[6];
|
||||
|
||||
/** Check for internal connections, the FRONT and BACK. */
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
ForgeDirection checkDir = ForgeDirection.getOrientation(i);
|
||||
|
||||
if (checkDir == placementSide || checkDir == placementSide.getOpposite())
|
||||
{
|
||||
IMechanical instance = ((IMechanical) tile()).getInstance(checkDir);
|
||||
|
||||
if (instance != null && instance != this && instance.canConnect(checkDir.getOpposite(), this))
|
||||
// Decelerate the gear based on tier.
|
||||
switch (tier)
|
||||
{
|
||||
connections[checkDir.ordinal()] = instance;
|
||||
default:
|
||||
return 0.04;
|
||||
case 1:
|
||||
return 0.03;
|
||||
case 2:
|
||||
return 0.02;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Look for connections outside this block space, the relative FRONT and BACK */
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
ForgeDirection checkDir = ForgeDirection.getOrientation(i);
|
||||
|
||||
if (connections[checkDir.ordinal()] == null && (checkDir == placementSide || checkDir == placementSide.getOpposite()))
|
||||
@Override
|
||||
public double getAngularVelocityLoad()
|
||||
{
|
||||
TileEntity checkTile = new universalelectricity.api.vector.Vector3(tile()).translate(checkDir).getTileEntity(world());
|
||||
|
||||
if (checkTile instanceof IMechanical)
|
||||
// Decelerate the gear based on tier.
|
||||
switch (tier)
|
||||
{
|
||||
IMechanical instance = ((IMechanical) checkTile).getInstance(checkDir.getOpposite());
|
||||
default:
|
||||
return 0.03;
|
||||
case 1:
|
||||
return 0.04;
|
||||
case 2:
|
||||
return 0.02;
|
||||
}
|
||||
}
|
||||
|
||||
// Only connect to shafts outside of this block space.
|
||||
if (instance != null && instance != this && instance instanceof PartGearShaft && instance.canConnect(checkDir.getOpposite(), this))
|
||||
@Override
|
||||
public void recache()
|
||||
{
|
||||
synchronized (connections)
|
||||
{
|
||||
connections.clear();
|
||||
|
||||
/** Check for internal connections, the FRONT and BACK. */
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
connections[checkDir.ordinal()] = instance;
|
||||
ForgeDirection checkDir = ForgeDirection.getOrientation(i);
|
||||
|
||||
if (checkDir == placementSide || checkDir == placementSide.getOpposite())
|
||||
{
|
||||
MechanicalNode instance = ((IMechanicalNodeProvider) tile()).getNode(checkDir);
|
||||
|
||||
if (instance != null && instance != this && instance.canConnect(checkDir.getOpposite(), this))
|
||||
{
|
||||
connections.put(instance, checkDir);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Look for connections outside this block space, the relative FRONT and BACK */
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
ForgeDirection checkDir = ForgeDirection.getOrientation(i);
|
||||
|
||||
if (!connections.containsValue(checkDir) && (checkDir == placementSide || checkDir == placementSide.getOpposite()))
|
||||
{
|
||||
TileEntity checkTile = new universalelectricity.api.vector.Vector3(tile()).translate(checkDir).getTileEntity(world());
|
||||
|
||||
if (checkTile instanceof IMechanicalNodeProvider)
|
||||
{
|
||||
MechanicalNode instance = ((IMechanicalNodeProvider) checkTile).getNode(checkDir.getOpposite());
|
||||
|
||||
// Only connect to shafts outside of this block space.
|
||||
if (instance != null && instance != this && instance.parent instanceof PartGearShaft && instance.canConnect(checkDir.getOpposite(), this))
|
||||
{
|
||||
connections.put(instance, checkDir);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return connections;
|
||||
@Override
|
||||
public boolean canConnect(ForgeDirection from, Object source)
|
||||
{
|
||||
if (source instanceof PartGear)
|
||||
{
|
||||
PartGear gear = (PartGear) source;
|
||||
|
||||
if (!(Math.abs(gear.placementSide.offsetX) == Math.abs(placementSide.offsetX) && Math.abs(gear.placementSide.offsetY) == Math.abs(placementSide.offsetY) && Math.abs(gear.placementSide.offsetZ) == Math.abs(placementSide.offsetZ)))
|
||||
return false;
|
||||
}
|
||||
|
||||
return from == placementSide || from == placementSide.getOpposite();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean inverseRotation(ForgeDirection dir, MechanicalNode with)
|
||||
{
|
||||
if (placementSide.offsetY != 0 || placementSide.offsetZ != 0)
|
||||
{
|
||||
return dir == placementSide.getOpposite();
|
||||
}
|
||||
|
||||
return dir == placementSide;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -144,20 +180,6 @@ public class PartGearShaft extends PartMechanical
|
|||
return "resonant_induction_gear_shaft";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canConnect(ForgeDirection from, Object source)
|
||||
{
|
||||
if (source instanceof PartGear)
|
||||
{
|
||||
PartGear gear = (PartGear) source;
|
||||
|
||||
if (!(Math.abs(gear.placementSide.offsetX) == Math.abs(placementSide.offsetX) && Math.abs(gear.placementSide.offsetY) == Math.abs(placementSide.offsetY) && Math.abs(gear.placementSide.offsetZ) == Math.abs(placementSide.offsetZ)))
|
||||
return false;
|
||||
}
|
||||
|
||||
return from == placementSide || from == placementSide.getOpposite();
|
||||
}
|
||||
|
||||
/**
|
||||
* Multipart Bounds
|
||||
*/
|
||||
|
@ -207,15 +229,4 @@ public class PartGearShaft extends PartMechanical
|
|||
return new Cuboid6(0.375, 0.375, 0.375, 0.625, 0.625, 0.625);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean inverseRotation(ForgeDirection dir, IMechanical with)
|
||||
{
|
||||
if (placementSide.offsetY != 0 || placementSide.offsetZ != 0)
|
||||
{
|
||||
return dir == placementSide.getOpposite();
|
||||
}
|
||||
|
||||
return dir == placementSide;
|
||||
}
|
||||
|
||||
}
|
|
@ -5,11 +5,11 @@ import java.util.Iterator;
|
|||
import java.util.Map.Entry;
|
||||
import java.util.WeakHashMap;
|
||||
|
||||
import resonantinduction.core.grid.IGrid;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.ForgeDirection;
|
||||
import resonantinduction.core.grid.IGrid;
|
||||
import universalelectricity.api.vector.Vector3;
|
||||
import codechicken.multipart.TMultiPart;
|
||||
|
||||
|
@ -17,7 +17,7 @@ public class MechanicalNode extends EnergyNode
|
|||
{
|
||||
protected final AbstractMap<MechanicalNode, ForgeDirection> connections = new WeakHashMap<MechanicalNode, ForgeDirection>();
|
||||
|
||||
protected final IMechanicalNodeProvider parent;
|
||||
public final IMechanicalNodeProvider parent;
|
||||
|
||||
public double torque = 0;
|
||||
public double prevAngularVelocity, angularVelocity = 0;
|
||||
|
@ -29,6 +29,7 @@ public class MechanicalNode extends EnergyNode
|
|||
public double angle = 0;
|
||||
|
||||
protected double load = 1;
|
||||
protected byte connectionMap = Byte.parseByte("111111", 2);
|
||||
|
||||
public MechanicalNode(IMechanicalNodeProvider parent)
|
||||
{
|
||||
|
@ -41,22 +42,21 @@ public class MechanicalNode extends EnergyNode
|
|||
return this;
|
||||
}
|
||||
|
||||
public MechanicalNode setConnection(byte connectionMap)
|
||||
{
|
||||
this.connectionMap = connectionMap;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(float deltaTime)
|
||||
{
|
||||
float acceleration = this.acceleration * deltaTime;
|
||||
double load = getLoad() * deltaTime;
|
||||
|
||||
prevAngularVelocity = angularVelocity;
|
||||
|
||||
onUpdate();
|
||||
|
||||
/**
|
||||
* Loss energy
|
||||
*/
|
||||
torque -= torque * torque * load;
|
||||
angularVelocity -= angularVelocity * angularVelocity * load;
|
||||
|
||||
angle += angularVelocity / 20;
|
||||
|
||||
if (angle % (Math.PI * 2) != angle)
|
||||
|
@ -65,35 +65,44 @@ public class MechanicalNode extends EnergyNode
|
|||
angle = angle % (Math.PI * 2);
|
||||
}
|
||||
|
||||
synchronized (connections)
|
||||
if (!world().isRemote)
|
||||
{
|
||||
Iterator<Entry<MechanicalNode, ForgeDirection>> it = connections.entrySet().iterator();
|
||||
/**
|
||||
* Loss energy
|
||||
*/
|
||||
torque -= torque * torque * getTorqueLoad() * deltaTime;
|
||||
angularVelocity -= angularVelocity * angularVelocity * getAngularVelocityLoad() * deltaTime;
|
||||
|
||||
while (it.hasNext())
|
||||
synchronized (connections)
|
||||
{
|
||||
Entry<MechanicalNode, ForgeDirection> entry = it.next();
|
||||
Iterator<Entry<MechanicalNode, ForgeDirection>> it = connections.entrySet().iterator();
|
||||
|
||||
ForgeDirection dir = entry.getValue();
|
||||
MechanicalNode adjacentMech = entry.getKey();
|
||||
while (it.hasNext())
|
||||
{
|
||||
Entry<MechanicalNode, ForgeDirection> entry = it.next();
|
||||
|
||||
/**
|
||||
* Calculate angular velocity and torque.
|
||||
*/
|
||||
float ratio = adjacentMech.getRatio(dir.getOpposite(), this) / getRatio(dir, adjacentMech);
|
||||
boolean inverseRotation = inverseRotation(dir, adjacentMech) && adjacentMech.inverseRotation(dir.getOpposite(), this);
|
||||
ForgeDirection dir = entry.getValue();
|
||||
MechanicalNode adjacentMech = entry.getKey();
|
||||
|
||||
int inversion = inverseRotation ? -1 : 1;
|
||||
/**
|
||||
* Calculate angular velocity and torque.
|
||||
*/
|
||||
float ratio = adjacentMech.getRatio(dir.getOpposite(), this) / getRatio(dir, adjacentMech);
|
||||
boolean inverseRotation = inverseRotation(dir, adjacentMech) && adjacentMech.inverseRotation(dir.getOpposite(), this);
|
||||
|
||||
if (Math.abs(torque + inversion * (adjacentMech.getTorque() / ratio * acceleration)) < Math.abs(adjacentMech.getTorque() / ratio))
|
||||
torque = torque + inversion * (adjacentMech.getTorque() / ratio * acceleration);
|
||||
int inversion = inverseRotation ? -1 : 1;
|
||||
|
||||
if (Math.abs(angularVelocity + inversion * (adjacentMech.getAngularVelocity() * ratio * acceleration)) < Math.abs(adjacentMech.getAngularVelocity() * ratio))
|
||||
angularVelocity = angularVelocity + (inversion * adjacentMech.getAngularVelocity() * ratio * acceleration);
|
||||
if (Math.abs(torque + inversion * (adjacentMech.getTorque() / ratio * acceleration)) < Math.abs(adjacentMech.getTorque() / ratio))
|
||||
torque = torque + inversion * (adjacentMech.getTorque() / ratio * acceleration);
|
||||
|
||||
/**
|
||||
* Set all current rotations
|
||||
*/
|
||||
adjacentMech.angle = Math.abs(angle) * (adjacentMech.angle >= 0 ? 1 : -1);
|
||||
if (Math.abs(angularVelocity + inversion * (adjacentMech.getAngularVelocity() * ratio * acceleration)) < Math.abs(adjacentMech.getAngularVelocity() * ratio))
|
||||
angularVelocity = angularVelocity + (inversion * adjacentMech.getAngularVelocity() * ratio * acceleration);
|
||||
|
||||
/**
|
||||
* Set all current rotations
|
||||
*/
|
||||
adjacentMech.angle = Math.abs(angle) * (adjacentMech.angle >= 0 ? 1 : -1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -119,12 +128,12 @@ public class MechanicalNode extends EnergyNode
|
|||
|
||||
public double getTorque()
|
||||
{
|
||||
return torque;
|
||||
return angularVelocity != 0 ? torque : 0;
|
||||
}
|
||||
|
||||
public double getAngularVelocity()
|
||||
{
|
||||
return angularVelocity;
|
||||
return torque != 0 ? angularVelocity : 0;
|
||||
}
|
||||
|
||||
public float getRatio(ForgeDirection dir, MechanicalNode with)
|
||||
|
@ -140,7 +149,12 @@ public class MechanicalNode extends EnergyNode
|
|||
/**
|
||||
* The energy percentage loss due to resistance in seconds.
|
||||
*/
|
||||
public double getLoad()
|
||||
public double getTorqueLoad()
|
||||
{
|
||||
return load;
|
||||
}
|
||||
|
||||
public double getAngularVelocityLoad()
|
||||
{
|
||||
return load;
|
||||
}
|
||||
|
@ -189,7 +203,7 @@ public class MechanicalNode extends EnergyNode
|
|||
|
||||
public boolean canConnect(ForgeDirection from, Object source)
|
||||
{
|
||||
return true;
|
||||
return (source instanceof MechanicalNode) && (connectionMap & (1 << from.ordinal())) != 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -219,4 +233,5 @@ public class MechanicalNode extends EnergyNode
|
|||
nbt.setDouble("torque", torque);
|
||||
nbt.setDouble("angularVelocity", angularVelocity);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -7,8 +7,6 @@ import net.minecraft.item.ItemStack;
|
|||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.util.MovingObjectPosition;
|
||||
import net.minecraftforge.common.ForgeDirection;
|
||||
import resonantinduction.api.mechanical.IMechanical;
|
||||
import resonantinduction.api.mechanical.IMechanicalNetwork;
|
||||
import codechicken.lib.data.MCDataInput;
|
||||
import codechicken.lib.data.MCDataOutput;
|
||||
import codechicken.multipart.JCuboidPart;
|
||||
|
@ -22,12 +20,11 @@ import codechicken.multipart.TMultiPart;
|
|||
* @author Calclavia
|
||||
*
|
||||
*/
|
||||
public abstract class PartMechanical extends JCuboidPart implements JNormalOcclusion, TFacePart, IMechanical
|
||||
public abstract class PartMechanical extends JCuboidPart implements JNormalOcclusion, TFacePart, IMechanicalNodeProvider
|
||||
{
|
||||
private IMechanicalNetwork network;
|
||||
protected MechanicalNode node;
|
||||
|
||||
protected float prevAngularVelocity, angularVelocity;
|
||||
protected long torque;
|
||||
protected double prevAngularVelocity;
|
||||
|
||||
/**
|
||||
* Packets
|
||||
|
@ -38,9 +35,6 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
|
|||
/** Side of the block this is placed on */
|
||||
public ForgeDirection placementSide = ForgeDirection.UNKNOWN;
|
||||
|
||||
/** The current angle the gear is on. In radians. */
|
||||
public float angle = 0;
|
||||
|
||||
public int tier;
|
||||
|
||||
public void preparePlacement(int side, int itemDamage)
|
||||
|
@ -53,7 +47,6 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
|
|||
public void update()
|
||||
{
|
||||
ticks++;
|
||||
angle += angularVelocity / 20;
|
||||
|
||||
if (!world().isRemote)
|
||||
checkClientUpdate();
|
||||
|
@ -63,9 +56,9 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
|
|||
|
||||
public void checkClientUpdate()
|
||||
{
|
||||
if (Math.abs(prevAngularVelocity - angularVelocity) > 0.05f || (prevAngularVelocity != angularVelocity && (prevAngularVelocity == 0 || angularVelocity == 0)))
|
||||
if (Math.abs(prevAngularVelocity - node.angularVelocity) > 0.05f || (prevAngularVelocity != node.angularVelocity && (prevAngularVelocity == 0 || node.angularVelocity == 0)))
|
||||
{
|
||||
prevAngularVelocity = angularVelocity;
|
||||
prevAngularVelocity = node.angularVelocity;
|
||||
markPacketUpdate = true;
|
||||
}
|
||||
|
||||
|
@ -76,28 +69,33 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
|
|||
}
|
||||
}
|
||||
|
||||
public MechanicalNode getNode(ForgeDirection dir)
|
||||
{
|
||||
return node;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onWorldJoin()
|
||||
{
|
||||
getNetwork().reconstruct();
|
||||
node.reconstruct();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onNeighborChanged()
|
||||
{
|
||||
getNetwork().reconstruct();
|
||||
node.reconstruct();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPartChanged(TMultiPart part)
|
||||
{
|
||||
getNetwork().reconstruct();
|
||||
node.reconstruct();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onWorldSeparate()
|
||||
{
|
||||
getNetwork().split(this);
|
||||
node.split();
|
||||
}
|
||||
|
||||
/** Packet Code. */
|
||||
|
@ -119,7 +117,7 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
|
|||
readDesc(packet);
|
||||
break;
|
||||
case 1:
|
||||
angularVelocity = packet.readFloat();
|
||||
node.angularVelocity = packet.readFloat();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -163,16 +161,16 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
|
|||
public void load(NBTTagCompound nbt)
|
||||
{
|
||||
placementSide = ForgeDirection.getOrientation(nbt.getByte("side"));
|
||||
angularVelocity = nbt.getFloat("angularVelocity");
|
||||
tier = nbt.getByte("tier");
|
||||
node.load(nbt);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void save(NBTTagCompound nbt)
|
||||
{
|
||||
nbt.setByte("side", (byte) placementSide.ordinal());
|
||||
nbt.setFloat("angularVelocity", angularVelocity);
|
||||
nbt.setByte("tier", (byte) tier);
|
||||
node.save(nbt);
|
||||
}
|
||||
|
||||
protected abstract ItemStack getItem();
|
||||
|
@ -191,66 +189,6 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu
|
|||
return getItem();
|
||||
}
|
||||
|
||||
/**
|
||||
* Mechanical implementations
|
||||
*/
|
||||
@Override
|
||||
public IMechanicalNetwork getNetwork()
|
||||
{
|
||||
if (network == null)
|
||||
{
|
||||
network = new MechanicalNetwork();
|
||||
network.addConnector(this);
|
||||
}
|
||||
|
||||
return network;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setNetwork(IMechanicalNetwork network)
|
||||
{
|
||||
this.network = network;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getAngularVelocity()
|
||||
{
|
||||
return torque != 0 ? angularVelocity : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAngularVelocity(float velocity)
|
||||
{
|
||||
if (world() != null && !world().isRemote)
|
||||
this.angularVelocity = velocity;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getTorque()
|
||||
{
|
||||
return angularVelocity != 0 ? torque : 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTorque(long torque)
|
||||
{
|
||||
if (world() != null && !world().isRemote)
|
||||
this.torque = torque;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getRatio(ForgeDirection dir, Object source)
|
||||
{
|
||||
return 0.5f;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IMechanical getInstance(ForgeDirection from)
|
||||
{
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public universalelectricity.api.vector.Vector3 position()
|
||||
{
|
||||
return new universalelectricity.api.vector.Vector3(x(), y(), z());
|
||||
|
|
|
@ -3,101 +3,62 @@ package resonantinduction.mechanical.energy.turbine;
|
|||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraftforge.common.ForgeDirection;
|
||||
import resonantinduction.api.mechanical.IMechanical;
|
||||
import resonantinduction.api.mechanical.IMechanicalNetwork;
|
||||
import resonantinduction.mechanical.energy.network.MechanicalNetwork;
|
||||
import resonantinduction.mechanical.energy.network.IMechanicalNodeProvider;
|
||||
import resonantinduction.mechanical.energy.network.MechanicalNode;
|
||||
import universalelectricity.api.energy.EnergyStorageHandler;
|
||||
import calclavia.lib.network.Synced.SyncedInput;
|
||||
import calclavia.lib.network.Synced.SyncedOutput;
|
||||
import calclavia.lib.prefab.turbine.TileTurbine;
|
||||
|
||||
public class TileMechanicalTurbine extends TileTurbine implements IMechanical
|
||||
public class TileMechanicalTurbine extends TileTurbine implements IMechanicalNodeProvider
|
||||
{
|
||||
protected MechanicalNode node;
|
||||
|
||||
public TileMechanicalTurbine()
|
||||
{
|
||||
super();
|
||||
energy = new EnergyStorageHandler(0);
|
||||
}
|
||||
|
||||
private IMechanicalNetwork network;
|
||||
|
||||
@Override
|
||||
public IMechanicalNetwork getNetwork()
|
||||
{
|
||||
if (this.network == null)
|
||||
node = new MechanicalNode(this)
|
||||
{
|
||||
this.network = new MechanicalNetwork();
|
||||
this.network.addConnector(this);
|
||||
}
|
||||
return this.network;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setNetwork(IMechanicalNetwork network)
|
||||
{
|
||||
this.network = network;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getRatio(ForgeDirection dir, Object source)
|
||||
{
|
||||
return 0.5f;
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getAngularVelocity()
|
||||
{
|
||||
return angularVelocity;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAngularVelocity(float velocity)
|
||||
{
|
||||
this.angularVelocity = velocity;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTorque(long torque)
|
||||
{
|
||||
this.torque = torque;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean inverseRotation(ForgeDirection dir, IMechanical with)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IMechanical getInstance(ForgeDirection dir)
|
||||
{
|
||||
return (IMechanical) getMultiBlock().get();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canConnect(ForgeDirection from, Object source)
|
||||
{
|
||||
if (source instanceof IMechanical && !(source instanceof TileMechanicalTurbine))
|
||||
{
|
||||
/**
|
||||
* Face to face stick connection.
|
||||
*/
|
||||
TileEntity sourceTile = position().translate(from).getTileEntity(getWorld());
|
||||
|
||||
if (sourceTile instanceof IMechanical)
|
||||
@Override
|
||||
public boolean canConnect(ForgeDirection from, Object source)
|
||||
{
|
||||
IMechanical sourceInstance = ((IMechanical) sourceTile).getInstance(from.getOpposite());
|
||||
return sourceInstance == source && from == getDirection().getOpposite();
|
||||
if (source instanceof MechanicalNode && !(source instanceof TileMechanicalTurbine))
|
||||
{
|
||||
/**
|
||||
* Face to face stick connection.
|
||||
*/
|
||||
TileEntity sourceTile = position().translate(from).getTileEntity(getWorld());
|
||||
|
||||
if (sourceTile instanceof IMechanicalNodeProvider)
|
||||
{
|
||||
MechanicalNode sourceInstance = ((IMechanicalNodeProvider) sourceTile).getNode(from.getOpposite());
|
||||
return sourceInstance == source && from == getDirection().getOpposite();
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
@Override
|
||||
public boolean inverseRotation(ForgeDirection dir, MechanicalNode with)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] getConnections()
|
||||
public MechanicalNode getNode(ForgeDirection dir)
|
||||
{
|
||||
return null;
|
||||
return ((TileMechanicalTurbine) getMultiBlock().get()).node;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void invalidate()
|
||||
{
|
||||
node.split();
|
||||
super.invalidate();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -106,6 +67,7 @@ public class TileMechanicalTurbine extends TileTurbine implements IMechanical
|
|||
{
|
||||
super.readFromNBT(nbt);
|
||||
tier = nbt.getInteger("tier");
|
||||
node.load(nbt);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -117,5 +79,6 @@ public class TileMechanicalTurbine extends TileTurbine implements IMechanical
|
|||
{
|
||||
super.writeToNBT(nbt);
|
||||
nbt.setInteger("tier", tier);
|
||||
node.save(nbt);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,11 +4,9 @@ import java.lang.reflect.Method;
|
|||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockFluid;
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.Vec3;
|
||||
import net.minecraft.world.IBlockAccess;
|
||||
import net.minecraftforge.common.ForgeDirection;
|
||||
import resonantinduction.api.mechanical.IMechanical;
|
||||
import universalelectricity.api.vector.Vector3;
|
||||
import cpw.mods.fml.relauncher.ReflectionHelper;
|
||||
|
||||
|
@ -29,13 +27,6 @@ public class TileWaterTurbine extends TileMechanicalTurbine
|
|||
torque = defaultTorque;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void invalidate()
|
||||
{
|
||||
getNetwork().split(this);
|
||||
super.invalidate();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateEntity()
|
||||
{
|
||||
|
@ -107,33 +98,4 @@ public class TileWaterTurbine extends TileMechanicalTurbine
|
|||
{
|
||||
return maxPower / (2 - tier + 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canConnect(ForgeDirection from, Object source)
|
||||
{
|
||||
if (getDirection().offsetY == 0)
|
||||
{
|
||||
if (source instanceof IMechanical)
|
||||
{
|
||||
/**
|
||||
* Face to face stick connection.
|
||||
*/
|
||||
TileEntity sourceTile = position().translate(from).getTileEntity(getWorld());
|
||||
|
||||
if (sourceTile instanceof IMechanical)
|
||||
{
|
||||
IMechanical sourceInstance = ((IMechanical) sourceTile).getInstance(from.getOpposite());
|
||||
return sourceInstance == source && from == getDirection();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return super.canConnect(from, source);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean inverseRotation(ForgeDirection dir, IMechanical with)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,13 +12,13 @@ import net.minecraft.inventory.IInventory;
|
|||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.AxisAlignedBB;
|
||||
import net.minecraftforge.common.ForgeDirection;
|
||||
import resonantinduction.api.mechanical.IMechanical;
|
||||
import resonantinduction.api.recipe.MachineRecipes;
|
||||
import resonantinduction.api.recipe.MachineRecipes.RecipeType;
|
||||
import resonantinduction.archaic.filter.Timer;
|
||||
import resonantinduction.core.Reference;
|
||||
import resonantinduction.core.resource.ResourceGenerator;
|
||||
import resonantinduction.core.resource.fluid.BlockFluidMixture;
|
||||
import resonantinduction.mechanical.energy.network.MechanicalNode;
|
||||
import resonantinduction.mechanical.energy.network.TileMechanical;
|
||||
import universalelectricity.api.vector.Vector3;
|
||||
import calclavia.lib.utility.inventory.InventoryUtility;
|
||||
|
@ -33,6 +33,19 @@ public class TileMixer extends TileMechanical implements IInventory
|
|||
public static final int PROCESS_TIME = 12 * 20;
|
||||
public static final Timer<EntityItem> timer = new Timer<EntityItem>();
|
||||
|
||||
public TileMixer()
|
||||
{
|
||||
mechanicalNode = new PacketMechanicalNode(this)
|
||||
{
|
||||
@Override
|
||||
public boolean inverseRotation(ForgeDirection dir, MechanicalNode with)
|
||||
{
|
||||
return dir == ForgeDirection.DOWN;
|
||||
}
|
||||
|
||||
}.setConnection(Byte.parseByte("000011", 2));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateEntity()
|
||||
{
|
||||
|
@ -51,7 +64,7 @@ public class TileMixer extends TileMechanical implements IInventory
|
|||
*/
|
||||
public boolean canWork()
|
||||
{
|
||||
return angularVelocity != 0;
|
||||
return mechanicalNode.getAngularVelocity() != 0;
|
||||
}
|
||||
|
||||
public void doWork()
|
||||
|
@ -70,7 +83,7 @@ public class TileMixer extends TileMechanical implements IInventory
|
|||
*/
|
||||
Vector3 originalPosition = new Vector3(entity);
|
||||
Vector3 relativePosition = originalPosition.clone().subtract(new Vector3(this).add(0.5));
|
||||
relativePosition.rotate(-angularVelocity, 0, 0);
|
||||
relativePosition.rotate(-mechanicalNode.getAngularVelocity(), 0, 0);
|
||||
Vector3 newPosition = new Vector3(this).add(0.5).add(relativePosition);
|
||||
Vector3 difference = newPosition.difference(originalPosition).scale(0.5);
|
||||
|
||||
|
@ -162,18 +175,6 @@ public class TileMixer extends TileMechanical implements IInventory
|
|||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canConnect(ForgeDirection from, Object source)
|
||||
{
|
||||
return from == ForgeDirection.UP || from == ForgeDirection.DOWN;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean inverseRotation(ForgeDirection dir, IMechanical with)
|
||||
{
|
||||
return dir == ForgeDirection.DOWN;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSizeInventory()
|
||||
{
|
||||
|
|
|
@ -4,16 +4,15 @@ import java.util.HashSet;
|
|||
import java.util.Set;
|
||||
|
||||
import net.minecraftforge.common.ForgeDirection;
|
||||
import resonantinduction.api.mechanical.IMechanical;
|
||||
import resonantinduction.api.mechanical.IMechanicalNetwork;
|
||||
import universalelectricity.api.vector.Vector3;
|
||||
import resonantinduction.mechanical.energy.network.IMechanicalNodeProvider;
|
||||
import resonantinduction.mechanical.energy.network.MechanicalNode;
|
||||
import codechicken.multipart.PartMap;
|
||||
import codechicken.multipart.TMultiPart;
|
||||
import codechicken.multipart.TileMultipart;
|
||||
|
||||
public class TraitMechanical extends TileMultipart implements IMechanical
|
||||
public class TraitMechanical extends TileMultipart implements IMechanicalNodeProvider
|
||||
{
|
||||
public Set<IMechanical> mechanicalInterfaces = new HashSet<IMechanical>();
|
||||
public Set<IMechanicalNodeProvider> mechanicalInterfaces = new HashSet<IMechanicalNodeProvider>();
|
||||
|
||||
@Override
|
||||
public void copyFrom(TileMultipart that)
|
||||
|
@ -31,9 +30,9 @@ public class TraitMechanical extends TileMultipart implements IMechanical
|
|||
{
|
||||
super.bindPart(part);
|
||||
|
||||
if (part instanceof IMechanical)
|
||||
if (part instanceof IMechanicalNodeProvider)
|
||||
{
|
||||
this.mechanicalInterfaces.add((IMechanical) part);
|
||||
this.mechanicalInterfaces.add((IMechanicalNodeProvider) part);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -42,7 +41,7 @@ public class TraitMechanical extends TileMultipart implements IMechanical
|
|||
{
|
||||
super.partRemoved(part, p);
|
||||
|
||||
if (part instanceof IMechanical)
|
||||
if (part instanceof IMechanicalNodeProvider)
|
||||
{
|
||||
this.mechanicalInterfaces.remove(part);
|
||||
}
|
||||
|
@ -56,19 +55,7 @@ public class TraitMechanical extends TileMultipart implements IMechanical
|
|||
}
|
||||
|
||||
@Override
|
||||
public Object[] getConnections()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IMechanicalNetwork getNetwork()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public IMechanical getInstance(ForgeDirection from)
|
||||
public MechanicalNode getNode(ForgeDirection from)
|
||||
{
|
||||
TMultiPart part = this.partMap(from.ordinal());
|
||||
|
||||
|
@ -79,67 +66,13 @@ public class TraitMechanical extends TileMultipart implements IMechanical
|
|||
|
||||
if (part != null)
|
||||
{
|
||||
if (part instanceof IMechanical)
|
||||
if (part instanceof IMechanicalNodeProvider)
|
||||
{
|
||||
return ((IMechanical) part).getInstance(from);
|
||||
return ((IMechanicalNodeProvider) part).getNode(from);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setNetwork(IMechanicalNetwork network)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getAngularVelocity()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setAngularVelocity(float velocity)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getTorque()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTorque(long torque)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public float getRatio(ForgeDirection dir, Object source)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canConnect(ForgeDirection from, Object source)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Vector3 getPosition()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean inverseRotation(ForgeDirection dir, IMechanical with)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,5 +4,5 @@ import net.minecraftforge.common.ForgeDirection;
|
|||
|
||||
public interface INodeProvider<N extends INode>
|
||||
{
|
||||
public N getNode(ForgeDirection dir);
|
||||
public N getNode(ForgeDirection from);
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package resonantinduction.core.grid;
|
||||
|
||||
import resonantinduction.mechanical.energy.network.PartMechanical;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
|
||||
public abstract class Node<G extends IGrid> implements INode<G>
|
||||
|
@ -35,6 +36,11 @@ public abstract class Node<G extends IGrid> implements INode<G>
|
|||
|
||||
}
|
||||
|
||||
public void split()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void load(NBTTagCompound nbt)
|
||||
{
|
||||
|
||||
|
|
Loading…
Reference in a new issue