diff --git a/src/main/java/resonantinduction/archaic/engineering/BlockEngineeringTable.java b/src/main/java/resonantinduction/archaic/engineering/BlockEngineeringTable.java index 8af540e8..1821db4e 100644 --- a/src/main/java/resonantinduction/archaic/engineering/BlockEngineeringTable.java +++ b/src/main/java/resonantinduction/archaic/engineering/BlockEngineeringTable.java @@ -236,4 +236,17 @@ public class BlockEngineeringTable extends BlockRIRotatable { return new TileEngineeringTable(); } + + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public boolean isOpaqueCube() + { + return false; + } + } diff --git a/src/main/java/resonantinduction/electrical/generator/TileGenerator.java b/src/main/java/resonantinduction/electrical/generator/TileGenerator.java index 54a2467f..bf287efc 100644 --- a/src/main/java/resonantinduction/electrical/generator/TileGenerator.java +++ b/src/main/java/resonantinduction/electrical/generator/TileGenerator.java @@ -18,58 +18,62 @@ import calclavia.lib.prefab.tile.TileElectrical; * * @author Calclavia */ -public class TileGenerator extends TileElectrical implements IMechanical, IRotatable +public class TileGenerator extends TileElectrical implements IRotatable { private IMechanicalNetwork network; /** Generator turns KE -> EE. Inverted one will turn EE -> KE. */ public boolean isInversed = false; - - private float torqueRatio = 8000; + private int torqueRatio = 8000; public TileGenerator() { energy = new EnergyStorageHandler(10000); - this.ioMap = 728; } public float toggleRatio() { - return torqueRatio = (torqueRatio + 1000) % energy.getMaxExtract() + 1000; + return torqueRatio = (int) ((torqueRatio + 1000) % energy.getMaxExtract() + 1000); } @Override public void updateEntity() { - if (this.isFunctioning()) + + if (!isInversed) { - if (!isInversed) - { - energy.receiveEnergy(getNetwork().getPower(), true); - produce(); - } - else - { - produceMechanical(this.getDirection()); - produceMechanical(this.getDirection().getOpposite()); - } + // energy.receiveEnergy(getNetwork().getPower(), true); + produce(); } + else + { + produceMechanical(this.getDirection()); + produceMechanical(this.getDirection().getOpposite()); + } + } public void produceMechanical(ForgeDirection outputDir) { Vector3 outputVector = new Vector3(this).translate(outputDir); - TileEntity mechanical = outputVector.getTileEntity(worldObj); + TileEntity tile = outputVector.getTileEntity(worldObj); - if (mechanical instanceof IMechanical) + if (tile instanceof IMechanical) { + IMechanical mech = ((IMechanical) tile).getInstance(outputDir.getOpposite()); long extract = energy.extractEnergy(false); if (extract > 0) { - float angularVelocity = extract / torqueRatio; - long torque = (long) (extract / angularVelocity); - energy.extractEnergy(((IMechanical) mechanical).getInstance(outputDir.getOpposite()).getNetwork().onReceiveEnergy(((IMechanical) mechanical), torque, angularVelocity), true); + final float maxAngularVelocity = energy.getEnergyCapacity() / (float) torqueRatio; + final long maxTorque = (long) ((double) energy.getEnergyCapacity() / maxAngularVelocity); + float addAngularVelocity = extract / (float) torqueRatio; + long addTorque = (long) (((double) extract) / addAngularVelocity); + long setTorque = Math.min(mech.getTorque() + addTorque, maxTorque); + float setAngularVelocity = Math.min(mech.getAngularVelocity() + addAngularVelocity, maxAngularVelocity); + mech.setTorque(setTorque); + mech.setAngularVelocity(setAngularVelocity); + energy.extractEnergy((long) (setTorque * setAngularVelocity), true); } } } @@ -77,7 +81,7 @@ public class TileGenerator extends TileElectrical implements IMechanical, IRotat @Override public EnumSet getInputDirections() { - return this.getOutputDirections(); + return getOutputDirections(); } @Override @@ -101,17 +105,12 @@ public class TileGenerator extends TileElectrical implements IMechanical, IRotat this.worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, dir.ordinal(), 3); } - private boolean isFunctioning() - { - return true; - } - @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); isInversed = nbt.getBoolean("isInversed"); - torqueRatio = nbt.getFloat("torqueRatio"); + torqueRatio = nbt.getInteger("torqueRatio"); } @Override @@ -119,67 +118,6 @@ public class TileGenerator extends TileElectrical implements IMechanical, IRotat { super.writeToNBT(nbt); nbt.setBoolean("isInversed", isInversed); - nbt.setFloat("torqueRatio", torqueRatio); - } - - @Override - public boolean isClockwise() - { - return false; - } - - @Override - public void setClockwise(boolean isClockwise) - { - - } - - @Override - public Object[] getConnections() - { - Object[] connections = new Object[6]; - connections[getDirection().ordinal()] = new Vector3(this).translate(getDirection()).getTileEntity(worldObj); - return connections; - } - - @Override - public IMechanicalNetwork getNetwork() - { - if (this.network == null) - { - this.network = new MechanicalNetwork(); - this.network.addConnector(this); - } - return this.network; - } - - @Override - public void setNetwork(IMechanicalNetwork network) - { - this.network = network; - } - - @Override - public int[] getLocation() - { - return new int[] { xCoord, yCoord, zCoord, 0 }; - } - - @Override - public float getResistance() - { - return 0; - } - - @Override - public boolean isRotationInversed() - { - return false; - } - - @Override - public IMechanical getInstance(ForgeDirection from) - { - return this; + nbt.setInteger("torqueRatio", torqueRatio); } } diff --git a/src/main/java/resonantinduction/mechanical/belt/TileConveyorBelt.java b/src/main/java/resonantinduction/mechanical/belt/TileConveyorBelt.java index 3e67a540..2686b483 100644 --- a/src/main/java/resonantinduction/mechanical/belt/TileConveyorBelt.java +++ b/src/main/java/resonantinduction/mechanical/belt/TileConveyorBelt.java @@ -295,10 +295,4 @@ public class TileConveyorBelt extends TileMechanical implements IBelt, IRotatabl { return Math.max(getNetwork().getAngularVelocity(), getNetwork().getPrevAngularVelocity()); } - - @Override - public float getResistance() - { - return 0.5f; - } } diff --git a/src/main/java/resonantinduction/mechanical/gear/PartGear.java b/src/main/java/resonantinduction/mechanical/gear/PartGear.java index f4675d9d..c1136e8d 100644 --- a/src/main/java/resonantinduction/mechanical/gear/PartGear.java +++ b/src/main/java/resonantinduction/mechanical/gear/PartGear.java @@ -30,33 +30,31 @@ public class PartGear extends PartMechanical implements IMechanical { if (manualCrankTime > 0) { - getNetwork().onReceiveEnergy(this, 20, 0.4f); + if (angularVelocity > 0) + angularVelocity += 0.1f; + else + angularVelocity -= 0.1f; + manualCrankTime--; } + + angularVelocity *= 0.9f; } super.update(); } - @Override - public float getResistance() - { - return 0.1f; - } - @Override public boolean activate(EntityPlayer player, MovingObjectPosition hit, ItemStack item) { - //System.out.println(world().isRemote + ": " + getNetwork()); - - if (BlockAdvanced.isUsableWrench(player, player.getCurrentEquippedItem(), tile().xCoord, tile().yCoord, tile().zCoord)) + if (BlockAdvanced.isUsableWrench(player, player.getCurrentEquippedItem(), x(), y(), z())) { if (player.isSneaking()) { if (!world().isRemote) { - setClockwise(!isClockwise()); - player.addChatMessage("Flipped gear to rotate " + (isClockwise() ? "clockwise" : "anticlockwise") + "."); + angularVelocity = -angularVelocity; + player.addChatMessage("Flipped gear to rotate " + (angularVelocity > 0 ? "clockwise" : "anticlockwise") + "."); } } else @@ -64,6 +62,9 @@ public class PartGear extends PartMechanical implements IMechanical this.manualCrankTime = 10; } + + BlockAdvanced.damageWrench(player, player.getCurrentEquippedItem(), x(), y(), z()); + return true; } return false; @@ -85,22 +86,9 @@ public class PartGear extends PartMechanical implements IMechanical } } - @Override - public boolean isRotationInversed() - { - return true; - } - @Override public String getType() { return "resonant_induction_gear"; } - - @Override - public IMechanical getInstance(ForgeDirection from) - { - return this; - } - } \ No newline at end of file diff --git a/src/main/java/resonantinduction/mechanical/gear/RenderGear.java b/src/main/java/resonantinduction/mechanical/gear/RenderGear.java index d31ff079..9a0ccaf7 100644 --- a/src/main/java/resonantinduction/mechanical/gear/RenderGear.java +++ b/src/main/java/resonantinduction/mechanical/gear/RenderGear.java @@ -37,7 +37,7 @@ public class RenderGear RenderUtility.rotateFaceBlockToSide(part.placementSide); - GL11.glRotatef((float) Math.toDegrees(part.isClockwise() ? part.getNetwork().getRotation() : -part.getNetwork().getRotation()), 0, 1, 0); + GL11.glRotatef((float) Math.toDegrees(part.angle), 0, 1, 0); FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE); MODEL.renderAll(); diff --git a/src/main/java/resonantinduction/mechanical/network/IMechanical.java b/src/main/java/resonantinduction/mechanical/network/IMechanical.java index 69d961d3..2c84ffee 100644 --- a/src/main/java/resonantinduction/mechanical/network/IMechanical.java +++ b/src/main/java/resonantinduction/mechanical/network/IMechanical.java @@ -6,27 +6,19 @@ import universalelectricity.api.net.IConnector; public interface IMechanical extends IConnector { /** - * The percentage of resistance caused by this connector. + * The angular velocity. * - * @return A small value, most likely less than one. + * @return Can be negative. */ - public float getResistance(); + public float getAngularVelocity(); - /** - * - * @return int[4]: x,y,z,direction - */ - public int[] getLocation(); + public void setAngularVelocity(float velocity); - /** - * @return Is the mechanical machine going clockwise currently? - */ - public boolean isClockwise(); + public long getTorque(); - public void setClockwise(boolean isClockwise); + public void setTorque(long torque); + + public float getRatio(); - /** - * @return Return true if the mechanical block should have its rotation set inveresed. - */ - public boolean isRotationInversed(); + public IMechanical getInstance(ForgeDirection dir); } diff --git a/src/main/java/resonantinduction/mechanical/network/MechanicalNetwork.java b/src/main/java/resonantinduction/mechanical/network/MechanicalNetwork.java index e491f45c..7be8ad72 100644 --- a/src/main/java/resonantinduction/mechanical/network/MechanicalNetwork.java +++ b/src/main/java/resonantinduction/mechanical/network/MechanicalNetwork.java @@ -2,22 +2,16 @@ package resonantinduction.mechanical.network; import java.util.EnumSet; import java.util.HashMap; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Set; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; -import resonantinduction.mechanical.Mechanical; +import resonantinduction.mechanical.gear.PartGear; import universalelectricity.api.net.IUpdate; import universalelectricity.core.net.Network; import universalelectricity.core.net.NetworkTickHandler; -import calclavia.lib.network.IPacketReceiver; - -import com.google.common.io.ByteArrayDataInput; - -import cpw.mods.fml.common.network.PacketDispatcher; /** * A mechanical network for translate speed and force using mechanical rotations. @@ -35,7 +29,7 @@ import cpw.mods.fml.common.network.PacketDispatcher; * * @author Calclavia */ -public class MechanicalNetwork extends Network implements IMechanicalNetwork, IPacketReceiver, IUpdate +public class MechanicalNetwork extends Network implements IMechanicalNetwork, IUpdate { private long prevTorque = 0; private float prevAngularVelocity = 0; @@ -59,6 +53,9 @@ public class MechanicalNetwork extends Network private boolean markUpdateRotation = true; + /** + * Only add the exact instance of the connector into the network. Multipart tiles allowed! + */ @Override public void addConnector(IMechanical connector) { @@ -74,50 +71,45 @@ public class MechanicalNetwork extends Network public void update() { /** - * Calculation rotations of all generators. + * Update all mechanical nodes. */ - if (markUpdateRotation || (!(prevGenerators.equals(generators)) && generators.size() > 0)) + Iterator it = new LinkedHashSet(getConnectors()).iterator(); + + while (it.hasNext()) { - Set closedSet = new LinkedHashSet(); + IMechanical mechanical = it.next(); + Object[] connections = mechanical.getConnections(); - for (IMechanical generatorNode : generators) + for (int i = 0; i < connections.length; i++) { - if (generatorNode != null) + ForgeDirection dir = ForgeDirection.getOrientation(i); + Object adacent = connections[i]; + + if (adacent instanceof IMechanical) { - PathfinderUpdateRotation rotationPathfinder = new PathfinderUpdateRotation(generatorNode, this, closedSet); - rotationPathfinder.findNodes(generatorNode); - closedSet.addAll(rotationPathfinder.closedSet); - sendRotationUpdatePacket(generatorNode); + IMechanical adjacentMech = ((IMechanical) adacent).getInstance(dir); + + if (adjacentMech != null) + { + float ratio = adjacentMech.getRatio() / mechanical.getRatio(); + float acceleration = 0.5f; + long torque = mechanical.getTorque(); + + if (Math.abs(torque - adjacentMech.getTorque() / ratio * acceleration) < Math.abs(adjacentMech.getTorque() / ratio)) + { + mechanical.setTorque((long) (torque - (adjacentMech.getTorque() / ratio * acceleration))); + } + + float velocity = mechanical.getAngularVelocity(); + + if (Math.abs(velocity - adjacentMech.getAngularVelocity() * ratio * acceleration) < Math.abs(adjacentMech.getAngularVelocity() * ratio)) + { + mechanical.setAngularVelocity(velocity - (adjacentMech.getAngularVelocity() * ratio * acceleration)); + } + } } } - - markUpdateRotation = false; - prevGenerators = new LinkedHashSet(generators); } - - generators.clear(); - - /** - * Calculate load - */ - if (load > 0) - { - torque /= load / 2; - angularVelocity /= load / 2; - } - - /** - * Update all connectors - */ - if (getPrevTorque() != getTorque() || getPrevAngularVelocity() != getAngularVelocity()) - { - sendNetworkPacket(); - } - - prevTorque = torque; - prevAngularVelocity = angularVelocity; - torque = 0; - angularVelocity = 0; } @Override @@ -132,58 +124,6 @@ public class MechanicalNetwork extends Network return canUpdate(); } - /** - * Send network update packet for connectors. - */ - public void sendNetworkPacket() - { - for (IMechanical connector : this.getConnectors()) - { - int[] location = connector.getLocation(); - - if (location != null) - { - PacketDispatcher.sendPacketToAllPlayers(Mechanical.PACKET_NETWORK.getPacket(location[0], location[1], location[2], location[3], (byte) 0, torque, angularVelocity)); - break; - } - } - } - - public void sendRotationUpdatePacket(IMechanical connector) - { - int[] location = connector.getLocation(); - - if (location != null) - { - System.out.println("UPDATING!" + location[0] + "," + location[1] + "," + location[2]); - PacketDispatcher.sendPacketToAllPlayers(Mechanical.PACKET_NETWORK.getPacket(location[0], location[1], location[2], location[3], (byte) 1, connector.isClockwise())); - } - } - - @Override - public void onReceivePacket(ByteArrayDataInput data, EntityPlayer player, Object... extra) - { - try - { - switch (data.readByte()) - { - case 0: - setPower(data.readLong(), data.readFloat()); - break; - case 1: - IMechanical updateNode = (IMechanical) extra[0]; - updateNode.setClockwise(data.readBoolean()); - PathfinderUpdateRotation rotationPathfinder = new PathfinderUpdateRotation(updateNode, this, null); - rotationPathfinder.findNodes(updateNode); - break; - } - } - catch (Exception e) - { - e.printStackTrace(); - } - } - /** * Applies energy to the mechanical network this tick. * Note: Server side only. @@ -247,13 +187,13 @@ public class MechanicalNetwork extends Network load = 1; super.reconstruct(); + NetworkTickHandler.addNetwork(this); } @Override protected void reconstructConnector(IMechanical connector) { connector.setNetwork(this); - load += connector.getResistance(); } /** Segmented out call so overriding can be done when machines are reconstructed. */ diff --git a/src/main/java/resonantinduction/mechanical/network/PartMechanical.java b/src/main/java/resonantinduction/mechanical/network/PartMechanical.java index 840b5af8..4570404e 100644 --- a/src/main/java/resonantinduction/mechanical/network/PartMechanical.java +++ b/src/main/java/resonantinduction/mechanical/network/PartMechanical.java @@ -48,15 +48,14 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu /** The mechanical connections this connector has made */ protected Object[] connections = new Object[6]; + protected float angularVelocity; + + protected long torque; + /** Side of the block this is placed on */ public ForgeDirection placementSide = ForgeDirection.UNKNOWN; - /** The size of the gear */ - private float radius = 0.5f; - - public boolean isClockwise = true; - - /** The current angle the gear is on. In radians per second. */ + /** The current angle the gear is on. In radians. */ public float angle = 0; public void preparePlacement(int side, int itemDamage) @@ -64,6 +63,19 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu this.placementSide = ForgeDirection.getOrientation((byte) (side ^ 1)); } + @Override + public void update() + { + angle += angularVelocity / 20; + + if (!world().isRemote) + { + sendRotationPacket(); + } + + super.update(); + } + @Override public void onAdded() { @@ -102,6 +114,8 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu */ public void refresh() { + connections = new Object[6]; + /** 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()); @@ -116,6 +130,18 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu } } + /** Look for gears that are internal and adjacent to this gear. (The 4 sides) */ + for (int i = 0; i < 6; i++) + { + ForgeDirection checkDir = ForgeDirection.getOrientation(i); + IMechanical instance = (IMechanical) ((IMechanical) tile()).getInstance(checkDir); + + if (connections[checkDir.ordinal()] == null && checkDir != placementSide && checkDir != placementSide.getOpposite() && instance != null && instance.canConnect(checkDir.getOpposite())) + { + connections[checkDir.ordinal()] = instance; + getNetwork().merge(instance.getNetwork()); + } + } /** Look for gears outside this block space, the relative UP, DOWN, LEFT, RIGHT */ for (int i = 0; i < 4; i++) @@ -123,7 +149,7 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu ForgeDirection checkDir = ForgeDirection.getOrientation(Rotation.rotateSide(this.placementSide.ordinal(), i)); TileEntity checkTile = new universalelectricity.api.vector.Vector3(tile()).translate(checkDir).getTileEntity(world()); - if (checkTile instanceof IMechanical) + if (connections[checkDir.ordinal()] == null && checkTile instanceof IMechanical) { IMechanical instance = (IMechanical) ((IMechanical) checkTile).getInstance(placementSide); @@ -135,24 +161,7 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu } } - /** Look for gears that are internal and adjacent to this gear. (The 2 sides) */ - for (int i = 0; i < 6; i++) - { - ForgeDirection checkDir = ForgeDirection.getOrientation(i); - IMechanical instance = (IMechanical) ((IMechanical) tile()).getInstance(checkDir); - - if (instance != null && instance.canConnect(checkDir.getOpposite())) - { - connections[checkDir.ordinal()] = instance; - getNetwork().merge(instance.getNetwork()); - } - } getNetwork().reconstruct(); - - if (!world().isRemote) - { - sendRotationPacket(); - } } @Override @@ -172,7 +181,7 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu { if (world() != null && !world().isRemote && tile() != null) { - tile().getWriteStream(this).writeByte(0).writeBoolean(isClockwise); + tile().getWriteStream(this).writeByte(0).writeFloat(angularVelocity); } } @@ -180,58 +189,10 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu { if (packetID == 0) { - refresh(); - isClockwise = packet.readBoolean(); + angularVelocity = packet.readFloat(); } } - /** - * Network Methods - */ - @Override - public IMechanicalNetwork getNetwork() - { - if (this.network == null) - { - this.network = new MechanicalNetwork(); - this.network.addConnector(this); - } - return this.network; - } - - @Override - public void setNetwork(IMechanicalNetwork network) - { - this.network = network; - } - - @Override - public boolean canConnect(ForgeDirection direction) - { - return true; - } - - @Override - public boolean isClockwise() - { - return isClockwise; - } - - @Override - public void setClockwise(boolean isClockwise) - { - if (this.isClockwise != isClockwise) - { - if (getNetwork().getPower() > 0) - { - getNetwork().setPower(0, 0); - } - - } - - this.isClockwise = isClockwise; - } - /** Packet Code. */ @Override public void readDesc(MCDataInput packet) @@ -315,11 +276,65 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu return getItem(); } + /** + * Mechanical implementations + */ @Override - public int[] getLocation() + public IMechanicalNetwork getNetwork() { - if (tile() != null) - return new int[] { x(), y(), z(), placementSide.ordinal() }; - return null; + if (this.network == null) + { + this.network = new MechanicalNetwork(); + this.network.addConnector(this); + } + return this.network; + } + + @Override + public void setNetwork(IMechanicalNetwork network) + { + this.network = network; + } + + @Override + public boolean canConnect(ForgeDirection direction) + { + return true; + } + + @Override + public float getAngularVelocity() + { + return angularVelocity; + } + + @Override + public void setAngularVelocity(float velocity) + { + this.angularVelocity = velocity; + } + + @Override + public long getTorque() + { + return torque; + } + + @Override + public void setTorque(long torque) + { + this.torque = torque; + } + + @Override + public float getRatio() + { + return 0.5f; + } + + @Override + public IMechanical getInstance(ForgeDirection from) + { + return this; } } \ No newline at end of file diff --git a/src/main/java/resonantinduction/mechanical/network/PathfinderUpdateRotation.java b/src/main/java/resonantinduction/mechanical/network/PathfinderUpdateRotation.java deleted file mode 100644 index 87251b3d..00000000 --- a/src/main/java/resonantinduction/mechanical/network/PathfinderUpdateRotation.java +++ /dev/null @@ -1,60 +0,0 @@ -package resonantinduction.mechanical.network; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; - -import universalelectricity.api.net.IConnector; -import universalelectricity.core.net.ConnectionPathfinder; - -/** - * Sets proper rotations on all connected units in the mechanical network. - * - * The pathfinder will find the first point and rotate all adjacent blocks next to it to be the - * opposite of the original. - * - * @author Calclavia - * - */ -public class PathfinderUpdateRotation extends ConnectionPathfinder -{ - private boolean currentRotationFlag = true; - private Set prevClosedSet; - private IMechanicalNetwork network; - - public PathfinderUpdateRotation(IMechanical first, IMechanicalNetwork network, Set prevClosedSet) - { - super(IMechanical.class, first); - this.currentRotationFlag = first.isClockwise(); - this.prevClosedSet = prevClosedSet; - this.network = network; - } - - public boolean findNodes(IMechanical currentNode) - { - this.closedSet.add(currentNode); - - currentNode.setClockwise(currentRotationFlag); - - for (IMechanical node : this.getConnectedNodes(currentNode)) - { - if (!this.closedSet.contains(node)) - { - currentRotationFlag = (node.isRotationInversed() && currentNode.isRotationInversed()) ? !currentNode.isClockwise() : currentNode.isClockwise(); - - if ((prevClosedSet != null && prevClosedSet.contains(node)) && (node.isClockwise() != currentRotationFlag)) - { - // We have conflicting rotations. Network is now stuck. - network.setDisabled(); - } - - findNodes(node); - } - } - - return false; - } -} diff --git a/src/main/java/resonantinduction/mechanical/network/TileMechanical.java b/src/main/java/resonantinduction/mechanical/network/TileMechanical.java index f17bd5c7..fdceff7e 100644 --- a/src/main/java/resonantinduction/mechanical/network/TileMechanical.java +++ b/src/main/java/resonantinduction/mechanical/network/TileMechanical.java @@ -9,10 +9,31 @@ public abstract class TileMechanical extends TileAdvanced implements IMechanical { /** The mechanical connections this connector has made */ protected Object[] connections = new Object[6]; - private IMechanicalNetwork network; + protected float angularVelocity; + protected long torque; + public float angle = 0; - private boolean isClockwise = false; + @Override + public void updateEntity() + { + super.updateEntity(); + angle += angularVelocity / 20; + torque *= getLoad(); + angularVelocity *= getLoad(); + } + + protected float getLoad() + { + return 0.5f; + } + + @Override + public void invalidate() + { + getNetwork().split(this); + super.invalidate(); + } @Override public Object[] getConnections() @@ -56,33 +77,33 @@ public abstract class TileMechanical extends TileAdvanced implements IMechanical } @Override - public int[] getLocation() + public float getAngularVelocity() { - return new int[] { xCoord, yCoord, zCoord, 0 }; + return angularVelocity; } @Override - public float getResistance() + public void setAngularVelocity(float velocity) { - return 0; + this.angularVelocity = velocity; } @Override - public boolean isClockwise() + public long getTorque() { - return isClockwise; + return torque; } @Override - public void setClockwise(boolean isClockwise) + public void setTorque(long torque) { - this.isClockwise = isClockwise; + this.torque = torque; } @Override - public boolean isRotationInversed() + public float getRatio() { - return true; + return 0.5f; } @Override diff --git a/src/main/java/resonantinduction/mechanical/process/BlockGrinderWheel.java b/src/main/java/resonantinduction/mechanical/process/BlockGrinderWheel.java index 0d072120..bfbcd80a 100644 --- a/src/main/java/resonantinduction/mechanical/process/BlockGrinderWheel.java +++ b/src/main/java/resonantinduction/mechanical/process/BlockGrinderWheel.java @@ -75,9 +75,8 @@ public class BlockGrinderWheel extends BlockRIRotatable implements ITileEntityPr // Move entity based on the direction of the block. ForgeDirection dir = this.getDirection(world, x, y, z); dir = ForgeDirection.getOrientation(!(dir.ordinal() % 2 == 0) ? dir.ordinal() - 1 : dir.ordinal()); - int inversion = tile.isClockwise() ? -1 : 1; - float speed = tile.getNetwork().getAngularVelocity() / 20; - entity.addVelocity(inversion * dir.offsetX * speed, Math.random() * speed, inversion * dir.offsetZ * speed); + float speed = tile.getAngularVelocity() / 20; + entity.addVelocity(dir.offsetX * speed, Math.random() * speed, dir.offsetZ * speed); } } } diff --git a/src/main/java/resonantinduction/mechanical/process/RenderGrinderWheel.java b/src/main/java/resonantinduction/mechanical/process/RenderGrinderWheel.java index 60ea5542..2769e5cd 100644 --- a/src/main/java/resonantinduction/mechanical/process/RenderGrinderWheel.java +++ b/src/main/java/resonantinduction/mechanical/process/RenderGrinderWheel.java @@ -36,7 +36,7 @@ public class RenderGrinderWheel extends TileEntitySpecialRenderer glTranslatef((float) x + 0.5F, (float) y + 0.5f, (float) z + 0.5F); glScalef(0.51f, 0.51f, 0.51f); RenderUtility.rotateBlockBasedOnDirection(tile.getDirection()); - glRotatef((float) Math.toDegrees(tile.getNetwork().getRotation() * (tile.isClockwise() ? 1 : -1)), 0, 0, 1); + glRotatef((float) Math.toDegrees(tile.angle), 0, 0, 1); FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE); MODEL.renderAll(); glPopMatrix(); diff --git a/src/main/java/resonantinduction/mechanical/process/TileGrinderWheel.java b/src/main/java/resonantinduction/mechanical/process/TileGrinderWheel.java index cf2f004e..0782c8d9 100644 --- a/src/main/java/resonantinduction/mechanical/process/TileGrinderWheel.java +++ b/src/main/java/resonantinduction/mechanical/process/TileGrinderWheel.java @@ -40,6 +40,7 @@ public class TileGrinderWheel extends TileMechanical implements IRotatable public void updateEntity() { super.updateEntity(); + counter = Math.max(counter + torque, 0); doWork(); } @@ -50,7 +51,7 @@ public class TileGrinderWheel extends TileMechanical implements IRotatable */ public boolean canWork() { - return (counter = Math.max(counter + getNetwork().getTorque(), 0)) > requiredTorque; + return counter > requiredTorque; } public void doWork()