diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/energy/grid/MechanicalNode.java b/mechanical/src/main/scala/resonantinduction/mechanical/energy/grid/MechanicalNode.java
index 633c2a45..b28063c4 100644
--- a/mechanical/src/main/scala/resonantinduction/mechanical/energy/grid/MechanicalNode.java
+++ b/mechanical/src/main/scala/resonantinduction/mechanical/energy/grid/MechanicalNode.java
@@ -15,7 +15,8 @@ import universalelectricity.api.vector.Vector3;
import java.util.Iterator;
import java.util.Map.Entry;
-/** A mechanical node for mechanical energy.
+/**
+ * A mechanical node for mechanical energy.
*
* Useful Formula:
*
@@ -24,262 +25,283 @@ import java.util.Map.Entry;
*
* Torque = r (Radius) * F (Force) * sin0 (Direction/Angle of the force applied. 90 degrees if
* optimal.)
- *
- * @author Calclavia */
-public class MechanicalNode extends Node implements IMechanicalNode
+ *
+ * @author Calclavia
+ */
+public class MechanicalNode extends Node
+ implements IMechanicalNode
{
- public double torque = 0;
- public double prevAngularVelocity, angularVelocity = 0;
- public float acceleration = 2f;
+ public double torque = 0;
+ public double prevAngularVelocity, angularVelocity = 0;
+ public float acceleration = 2f;
- /** The current rotation of the mechanical node. */
- public double angle = 0;
- public double prev_angle = 0;
- protected double maxDeltaAngle = Math.toRadians(180);
+ /**
+ * The current rotation of the mechanical node.
+ */
+ public double angle = 0;
+ public double prev_angle = 0;
+ protected double maxDeltaAngle = Math.toRadians(180);
- protected double load = 2;
- protected byte connectionMap = Byte.parseByte("111111", 2);
+ protected double load = 2;
+ protected byte connectionMap = Byte.parseByte("111111", 2);
- private double power = 0;
+ private double power = 0;
- public MechanicalNode(INodeProvider parent)
- {
- super(parent);
- }
+ public MechanicalNode(INodeProvider parent)
+ {
+ super(parent);
+ }
- @Override
- public MechanicalNode setLoad(double load)
- {
- this.load = load;
- return this;
- }
+ @Override
+ public MechanicalNode setLoad(double load)
+ {
+ this.load = load;
+ return this;
+ }
- public MechanicalNode setConnection(byte connectionMap)
- {
- this.connectionMap = connectionMap;
- return this;
- }
+ public MechanicalNode setConnection(byte connectionMap)
+ {
+ this.connectionMap = connectionMap;
+ return this;
+ }
- @Override
- public void update(float deltaTime)
- {
- prevAngularVelocity = angularVelocity;
+ @Override
+ public void update(float deltaTime)
+ {
+ prevAngularVelocity = angularVelocity;
- if (!ResonantInduction.proxy.isPaused())
- {
- if (angularVelocity >= 0)
- angle += Math.min(angularVelocity, this.maxDeltaAngle) * deltaTime;
- else
- angle += Math.max(angularVelocity, -this.maxDeltaAngle) * deltaTime;
- }
+ if (!ResonantInduction.proxy.isPaused())
+ {
+ if (angularVelocity >= 0)
+ {
+ angle += Math.min(angularVelocity, this.maxDeltaAngle) * deltaTime;
+ }
+ else
+ {
+ angle += Math.max(angularVelocity, -this.maxDeltaAngle) * deltaTime;
+ }
+ }
- if (angle % (Math.PI * 2) != angle)
- {
- revolve();
- angle = angle % (Math.PI * 2);
- }
+ if (angle % (Math.PI * 2) != angle)
+ {
+ revolve();
+ angle = angle % (Math.PI * 2);
+ }
- if (world() != null && !world().isRemote)
- {
- double acceleration = this.acceleration * deltaTime;
+ if (world() != null && !world().isRemote)
+ {
+ final double acceleration = this.acceleration * deltaTime;
- /** Energy loss */
- double torqueLoss = Math.min(Math.abs(getTorque()), (Math.abs(getTorque() * getTorqueLoad()) + getTorqueLoad() / 10) * deltaTime);
+ /** Energy loss */
+ double torqueLoss = Math.min(Math.abs(getTorque()), (Math.abs(getTorque() * getTorqueLoad()) + getTorqueLoad() / 10) * deltaTime);
- if (torque > 0)
- {
- torque -= torqueLoss;
- }
- else
- {
- torque += torqueLoss;
- }
+ if (torque > 0)
+ {
+ torque -= torqueLoss;
+ }
+ else
+ {
+ torque += torqueLoss;
+ }
- double velocityLoss = Math.min(Math.abs(getAngularVelocity()), (Math.abs(getAngularVelocity() * getAngularVelocityLoad()) + getAngularVelocityLoad() / 10) * deltaTime);
+ double velocityLoss = Math.min(Math.abs(getAngularVelocity()), (Math.abs(getAngularVelocity() * getAngularVelocityLoad()) + getAngularVelocityLoad() / 10) * deltaTime);
- if (angularVelocity > 0)
- {
- angularVelocity -= velocityLoss;
- }
- else
- {
- angularVelocity += velocityLoss;
- }
+ if (angularVelocity > 0)
+ {
+ angularVelocity -= velocityLoss;
+ }
+ else
+ {
+ angularVelocity += velocityLoss;
+ }
- power = getEnergy() / deltaTime;
+ if (getEnergy() <= 0)
+ {
+ angularVelocity = torque = 0;
+ }
- synchronized (connections)
- {
- Iterator> it = connections.entrySet().iterator();
+ power = getEnergy() / deltaTime;
- while (it.hasNext())
- {
- Entry entry = it.next();
+ synchronized (connections)
+ {
+ Iterator> it = connections.entrySet().iterator();
- ForgeDirection dir = entry.getValue();
- MechanicalNode adjacentMech = entry.getKey();
+ while (it.hasNext())
+ {
+ Entry 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);
- double applyTorque = inversion * adjacentMech.getTorque() / ratio * acceleration;
+ int inversion = inverseRotation ? -1 : 1;
- if (Math.abs(torque + applyTorque) < Math.abs(adjacentMech.getTorque() / ratio))
- {
- torque += applyTorque;
- }
- else
- {
- torque -= applyTorque;
- }
+ double targetTorque = inversion * adjacentMech.getTorque() / ratio;
+ double applyTorque = targetTorque * acceleration;
- double applyVelocity = inversion * adjacentMech.getAngularVelocity() * ratio * acceleration;
+ if (Math.abs(torque + applyTorque) < Math.abs(targetTorque))
+ {
+ torque += applyTorque;
+ }
+ else if (Math.abs(torque - applyTorque) > Math.abs(targetTorque))
+ {
+ torque -= applyTorque;
+ }
- if (Math.abs(angularVelocity + applyVelocity) < Math.abs(adjacentMech.getAngularVelocity() * ratio))
- {
- angularVelocity += applyVelocity;
- }
- else
- {
- angularVelocity -= applyVelocity;
- }
+ double targetVelocity = inversion * adjacentMech.getAngularVelocity() * ratio;
+ double applyVelocity = targetVelocity * acceleration;
- /** Set all current rotations */
- // adjacentMech.angle = Math.abs(angle) * (adjacentMech.angle >= 0 ? 1 : -1);
- }
- }
- }
+ if (Math.abs(angularVelocity + applyVelocity) < Math.abs(targetVelocity))
+ {
+ angularVelocity += applyVelocity;
+ }
+ else if (Math.abs(angularVelocity - applyVelocity) > Math.abs(targetVelocity))
+ {
+ angularVelocity -= applyVelocity;
+ }
- onUpdate();
- prev_angle = angle;
- }
+ /** Set all current rotations */
+ // adjacentMech.angle = Math.abs(angle) * (adjacentMech.angle >= 0 ? 1 : -1);
+ }
+ }
+ }
- protected void onUpdate()
- {
+ onUpdate();
+ prev_angle = angle;
+ }
- }
+ protected void onUpdate()
+ {
- /** Called when one revolution is made. */
- protected void revolve()
- {
+ }
- }
+ /**
+ * Called when one revolution is made.
+ */
+ protected void revolve()
+ {
- @Override
- public void apply(Object source, double torque, double angularVelocity)
- {
- this.torque += torque;
- this.angularVelocity += angularVelocity;
- }
+ }
- @Override
- public double getTorque()
- {
- return angularVelocity != 0 ? torque : 0;
- }
+ @Override
+ public void apply(Object source, double torque, double angularVelocity)
+ {
+ this.torque += torque;
+ this.angularVelocity += angularVelocity;
+ }
- @Override
- public double getAngularVelocity()
- {
- return torque != 0 ? angularVelocity : 0;
- }
+ @Override
+ public double getTorque()
+ {
+ return angularVelocity != 0 ? torque : 0;
+ }
- @Override
- public float getRatio(ForgeDirection dir, IMechanicalNode with)
- {
- return 0.5f;
- }
+ @Override
+ public double getAngularVelocity()
+ {
+ return torque != 0 ? angularVelocity : 0;
+ }
- @Override
- public boolean inverseRotation(ForgeDirection dir, IMechanicalNode with)
- {
- return true;
- }
+ @Override
+ public float getRatio(ForgeDirection dir, IMechanicalNode with)
+ {
+ return 0.5f;
+ }
- /** The energy percentage loss due to resistance in seconds. */
- public double getTorqueLoad()
- {
- return load;
- }
+ @Override
+ public boolean inverseRotation(ForgeDirection dir, IMechanicalNode with)
+ {
+ return true;
+ }
- public double getAngularVelocityLoad()
- {
- return load;
- }
+ /**
+ * The energy percentage loss due to resistance in seconds.
+ */
+ public double getTorqueLoad()
+ {
+ return load;
+ }
- /** Recache the connections. This is the default connection implementation. */
- @Override
- public void doRecache()
- {
- connections.clear();
+ public double getAngularVelocityLoad()
+ {
+ return load;
+ }
- for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
- {
- TileEntity tile = position().translate(dir).getTileEntity(world());
+ /**
+ * Recache the connections. This is the default connection implementation.
+ */
+ @Override
+ public void doRecache()
+ {
+ connections.clear();
- if (tile instanceof INodeProvider)
- {
- MechanicalNode check = ((INodeProvider) tile).getNode(MechanicalNode.class, dir.getOpposite());
+ for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS)
+ {
+ TileEntity tile = position().translate(dir).getTileEntity(world());
- if (check != null && canConnect(dir, check) && check.canConnect(dir.getOpposite(), this))
- {
- connections.put(check, dir);
- }
- }
- }
- }
+ if (tile instanceof INodeProvider)
+ {
+ MechanicalNode check = ((INodeProvider) tile).getNode(MechanicalNode.class, dir.getOpposite());
- public World world()
- {
- return parent instanceof TMultiPart ? ((TMultiPart) parent).world() : parent instanceof TileEntity ? ((TileEntity) parent).getWorldObj() : null;
- }
+ if (check != null && canConnect(dir, check) && check.canConnect(dir.getOpposite(), this))
+ {
+ connections.put(check, dir);
+ }
+ }
+ }
+ }
- public Vector3 position()
- {
- return parent instanceof TMultiPart ? new Vector3(((TMultiPart) parent).x(), ((TMultiPart) parent).y(), ((TMultiPart) parent).z()) : parent instanceof TileEntity ? new Vector3((TileEntity) parent) : null;
- }
+ public World world()
+ {
+ return parent instanceof TMultiPart ? ((TMultiPart) parent).world() : parent instanceof TileEntity ? ((TileEntity) parent).getWorldObj() : null;
+ }
- @Override
- public boolean canConnect(ForgeDirection from, Object source)
- {
- return (source instanceof MechanicalNode) && (connectionMap & (1 << from.ordinal())) != 0;
- }
+ public Vector3 position()
+ {
+ return parent instanceof TMultiPart ? new Vector3(((TMultiPart) parent).x(), ((TMultiPart) parent).y(), ((TMultiPart) parent).z()) : parent instanceof TileEntity ? new Vector3((TileEntity) parent) : null;
+ }
- @Override
- public double getEnergy()
- {
- return getTorque() * getAngularVelocity();
- }
+ @Override
+ public boolean canConnect(ForgeDirection from, Object source)
+ {
+ return (source instanceof MechanicalNode) && (connectionMap & (1 << from.ordinal())) != 0;
+ }
- @Override
- public double getPower()
- {
- return power;
- }
+ @Override
+ public double getEnergy()
+ {
+ return getTorque() * getAngularVelocity();
+ }
- @Override
- public TickingGrid newGrid()
- {
- return new TickingGrid(this, MechanicalNode.class);
- }
+ @Override
+ public double getPower()
+ {
+ return power;
+ }
- @Override
- public void load(NBTTagCompound nbt)
- {
- super.load(nbt);
- torque = nbt.getDouble("torque");
- angularVelocity = nbt.getDouble("angularVelocity");
- }
+ @Override
+ public TickingGrid newGrid()
+ {
+ return new TickingGrid(this, MechanicalNode.class);
+ }
- @Override
- public void save(NBTTagCompound nbt)
- {
- super.save(nbt);
- nbt.setDouble("torque", torque);
- nbt.setDouble("angularVelocity", angularVelocity);
- }
+ @Override
+ public void load(NBTTagCompound nbt)
+ {
+ super.load(nbt);
+ torque = nbt.getDouble("torque");
+ angularVelocity = nbt.getDouble("angularVelocity");
+ }
+
+ @Override
+ public void save(NBTTagCompound nbt)
+ {
+ super.save(nbt);
+ nbt.setDouble("torque", torque);
+ nbt.setDouble("angularVelocity", angularVelocity);
+ }
}