From 2cfd22a8d3458cc55d7a69e20a2d6e843e9bfc43 Mon Sep 17 00:00:00 2001 From: Calclavia Date: Sat, 18 Jan 2014 13:22:37 +0800 Subject: [PATCH] Added load calculation mechanic --- .../electrical/generator/TileGenerator.java | 10 ++--- .../mechanical/gear/PartGear.java | 19 +++++---- .../mechanical/gear/TraitMechanical.java | 6 ++- .../mechanical/network/IMechanical.java | 2 +- .../mechanical/network/MechanicalNetwork.java | 40 +++++++++++++++++-- 5 files changed, 59 insertions(+), 18 deletions(-) diff --git a/src/main/java/resonantinduction/electrical/generator/TileGenerator.java b/src/main/java/resonantinduction/electrical/generator/TileGenerator.java index 2d701802..44735a57 100644 --- a/src/main/java/resonantinduction/electrical/generator/TileGenerator.java +++ b/src/main/java/resonantinduction/electrical/generator/TileGenerator.java @@ -19,7 +19,7 @@ public class TileGenerator extends TileElectrical implements IMechanical /** Generator turns KE -> EE. Inverted one will turn EE -> KE. */ public boolean isInversed = false; - private float torqueRatio = 500; + private float torqueRatio = 8000; public TileGenerator() { @@ -29,7 +29,7 @@ public class TileGenerator extends TileElectrical implements IMechanical public float toggleRatio() { - return torqueRatio = (torqueRatio + 100) % energy.getMaxExtract(); + return torqueRatio = (torqueRatio + 1000) % energy.getMaxExtract(); } @Override @@ -54,7 +54,7 @@ public class TileGenerator extends TileElectrical implements IMechanical { float angularVelocity = extract / torqueRatio; long torque = (long) (extract / angularVelocity); - ((IMechanical) mechanical).onReceiveEnergy(getOuputDirection().getOpposite(), torque, angularVelocity); + ((IMechanical) mechanical).onReceiveEnergy(getOuputDirection().getOpposite(), torque, angularVelocity, true); } } } @@ -93,9 +93,9 @@ public class TileGenerator extends TileElectrical implements IMechanical } @Override - public void onReceiveEnergy(ForgeDirection from, long torque, float angularVelocity) + public long onReceiveEnergy(ForgeDirection from, long torque, float angularVelocity, boolean doReceive) { - energy.receiveEnergy((long) (torque * angularVelocity), true); + return energy.receiveEnergy((long) (torque * angularVelocity), doReceive); } @Override diff --git a/src/main/java/resonantinduction/mechanical/gear/PartGear.java b/src/main/java/resonantinduction/mechanical/gear/PartGear.java index 3aa407c1..697c5313 100644 --- a/src/main/java/resonantinduction/mechanical/gear/PartGear.java +++ b/src/main/java/resonantinduction/mechanical/gear/PartGear.java @@ -90,7 +90,7 @@ public class PartGear extends JCuboidPart implements JNormalOcclusion, TFacePart { if (manualCrankTime > 0) { - onReceiveEnergy(null, 20, 0.3f); + onReceiveEnergy(null, 20, 0.3f, true); manualCrankTime--; } } @@ -99,10 +99,13 @@ public class PartGear extends JCuboidPart implements JNormalOcclusion, TFacePart /** * Update angle rotation. */ - if (isClockwise) - angle += this.getNetwork().getAngularVelocity() / 20f; - else - angle -= this.getNetwork().getAngularVelocity() / 20f; + if (getNetwork().getPower() > 0) + { + if (isClockwise) + angle += getNetwork().getAngularVelocity() / 20f; + else + angle -= getNetwork().getAngularVelocity() / 20f; + } } } @@ -295,13 +298,15 @@ public class PartGear extends JCuboidPart implements JNormalOcclusion, TFacePart return false; } - public void onReceiveEnergy(ForgeDirection from, long torque, float angularVelocity) + public long onReceiveEnergy(ForgeDirection from, long torque, float angularVelocity, boolean doReceive) { - if (!world().isRemote) + if (!world().isRemote && doReceive) { getNetwork().applyEnergy(torque, angularVelocity); markRotationUpdate = true; } + + return (long) (torque * angularVelocity); } @Override diff --git a/src/main/java/resonantinduction/mechanical/gear/TraitMechanical.java b/src/main/java/resonantinduction/mechanical/gear/TraitMechanical.java index 5ee5932f..70829b39 100644 --- a/src/main/java/resonantinduction/mechanical/gear/TraitMechanical.java +++ b/src/main/java/resonantinduction/mechanical/gear/TraitMechanical.java @@ -67,7 +67,7 @@ public class TraitMechanical extends TileMultipart implements IMechanical } @Override - public void onReceiveEnergy(ForgeDirection from, long torque, float angularVelocity) + public long onReceiveEnergy(ForgeDirection from, long torque, float angularVelocity, boolean doReceive) { TMultiPart part = this.partMap(from.ordinal()); @@ -75,8 +75,10 @@ public class TraitMechanical extends TileMultipart implements IMechanical { if (this.mechanicalInterfaces.contains(part)) { - ((IMechanical) part).onReceiveEnergy(from, torque, angularVelocity); + return ((IMechanical) part).onReceiveEnergy(from, torque, angularVelocity, doReceive); } } + + return 0; } } diff --git a/src/main/java/resonantinduction/mechanical/network/IMechanical.java b/src/main/java/resonantinduction/mechanical/network/IMechanical.java index c6d3539b..71799c35 100644 --- a/src/main/java/resonantinduction/mechanical/network/IMechanical.java +++ b/src/main/java/resonantinduction/mechanical/network/IMechanical.java @@ -14,5 +14,5 @@ public interface IMechanical extends IConnectable * @param doReceive If false, the charge will only be simulated. * @return Amount of energy that was accepted by the block. */ - public void onReceiveEnergy(ForgeDirection from, long torque, float angularVelocity); + public long onReceiveEnergy(ForgeDirection from, long torque, float angularVelocity, boolean doReceive); } diff --git a/src/main/java/resonantinduction/mechanical/network/MechanicalNetwork.java b/src/main/java/resonantinduction/mechanical/network/MechanicalNetwork.java index dc62d6c5..0f39dd65 100644 --- a/src/main/java/resonantinduction/mechanical/network/MechanicalNetwork.java +++ b/src/main/java/resonantinduction/mechanical/network/MechanicalNetwork.java @@ -44,8 +44,36 @@ public class MechanicalNetwork extends Network 0) + { + float division = 0; + + for (IMechanical node : this.getNodes()) + { + for (ForgeDirection dir : handlerDirectionMap.get(node)) + { + division += node.onReceiveEnergy(dir, torque, angularVelocity, false) / torque; + } + } + + if (division > 0) + { + torque /= division / 2; + angularVelocity /= division / 2; + } + } + + /** + * Update all connectors + */ if (getPrevTorque() != getTorque() || getPrevAngularVelocity() != getAngularVelocity()) { + /** + * Send network update packet for connectors. + */ boolean isFirst = true; for (IMechanicalConnector connector : this.getConnectors()) @@ -60,11 +88,17 @@ public class MechanicalNetwork extends Network 0) { - for (ForgeDirection dir : handlerDirectionMap.get(node)) + for (IMechanical node : this.getNodes()) { - node.onReceiveEnergy(dir, torque, angularVelocity); + for (ForgeDirection dir : handlerDirectionMap.get(node)) + { + node.onReceiveEnergy(dir, torque, angularVelocity, true); + } } }