diff --git a/src/main/java/resonantinduction/electrical/generator/TileGenerator.java b/src/main/java/resonantinduction/electrical/generator/TileGenerator.java index 8bf6bd98..60731402 100644 --- a/src/main/java/resonantinduction/electrical/generator/TileGenerator.java +++ b/src/main/java/resonantinduction/electrical/generator/TileGenerator.java @@ -69,7 +69,7 @@ public class TileGenerator extends TileElectrical implements IMechanical, IRotat { float angularVelocity = extract / torqueRatio; long torque = (long) (extract / angularVelocity); - energy.extractEnergy(((IMechanical) mechanical).getNetwork().onReceiveEnergy(((IMechanical) mechanical), torque, angularVelocity), true); + energy.extractEnergy(((IMechanical) mechanical).getNetwork(outputDir.getOpposite()).onReceiveEnergy(((IMechanical) mechanical), torque, angularVelocity), true); } } } @@ -153,6 +153,12 @@ public class TileGenerator extends TileElectrical implements IMechanical, IRotat return this.network; } + @Override + public IMechanicalNetwork getNetwork(ForgeDirection from) + { + return getNetwork(); + } + @Override public void setNetwork(IMechanicalNetwork network) { @@ -177,4 +183,9 @@ public class TileGenerator extends TileElectrical implements IMechanical, IRotat return false; } + @Override + public IMechanical getInstance(ForgeDirection from) + { + return this; + } } diff --git a/src/main/java/resonantinduction/mechanical/belt/TileConveyorBelt.java b/src/main/java/resonantinduction/mechanical/belt/TileConveyorBelt.java index 49e3a4e1..60b982ce 100644 --- a/src/main/java/resonantinduction/mechanical/belt/TileConveyorBelt.java +++ b/src/main/java/resonantinduction/mechanical/belt/TileConveyorBelt.java @@ -15,6 +15,7 @@ import resonantinduction.api.IBelt; import resonantinduction.core.ResonantInduction; import resonantinduction.mechanical.Mechanical; import resonantinduction.mechanical.network.IMechanical; +import resonantinduction.mechanical.network.IMechanicalNetwork; import resonantinduction.mechanical.network.TileMechanical; import universalelectricity.api.vector.Vector3; import calclavia.lib.network.IPacketReceiverWithID; @@ -296,4 +297,12 @@ public class TileConveyorBelt extends TileMechanical implements IBelt, IRotatabl return 0.5f; } + @Override + public IMechanicalNetwork getNetwork(ForgeDirection from) + { + if (from != this.getDirection() && from != this.getDirection().getOpposite()) + return getNetwork(); + return null; + } + } diff --git a/src/main/java/resonantinduction/mechanical/gear/PartGear.java b/src/main/java/resonantinduction/mechanical/gear/PartGear.java index 6908824b..fb2f87d1 100644 --- a/src/main/java/resonantinduction/mechanical/gear/PartGear.java +++ b/src/main/java/resonantinduction/mechanical/gear/PartGear.java @@ -3,8 +3,10 @@ package resonantinduction.mechanical.gear; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.MovingObjectPosition; +import net.minecraftforge.common.ForgeDirection; import resonantinduction.mechanical.Mechanical; import resonantinduction.mechanical.network.IMechanical; +import resonantinduction.mechanical.network.IMechanicalNetwork; import resonantinduction.mechanical.network.PartMechanical; import codechicken.lib.vec.Vector3; import cpw.mods.fml.relauncher.Side; @@ -27,7 +29,7 @@ public class PartGear extends PartMechanical implements IMechanical { if (manualCrankTime > 0) { - + getNetwork().onReceiveEnergy(this, 20, 0.2f); manualCrankTime--; } } @@ -38,16 +40,16 @@ public class PartGear extends PartMechanical implements IMechanical @Override public float getResistance() { - return 0.5f; + return 0.1f; } @Override public boolean activate(EntityPlayer player, MovingObjectPosition hit, ItemStack item) { System.out.println(world().isRemote + ": " + getNetwork()); + if (player.isSneaking()) { - getNetwork().onReceiveEnergy(this, 20, 0.3f); this.manualCrankTime = 20; } @@ -81,4 +83,11 @@ public class PartGear extends PartMechanical implements IMechanical { 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/network/IMechanical.java b/src/main/java/resonantinduction/mechanical/network/IMechanical.java index de808589..d55be065 100644 --- a/src/main/java/resonantinduction/mechanical/network/IMechanical.java +++ b/src/main/java/resonantinduction/mechanical/network/IMechanical.java @@ -27,9 +27,16 @@ public interface IMechanical extends IConnector public void setClockwise(boolean isClockwise); /** - * * - * * @return Return true if the mechanical block should have its rotation set inveresed. */ public boolean isRotationInversed(); + + public IMechanicalNetwork getNetwork(ForgeDirection from); + + /** + * Gets the instance of this mechanical through ForgeMultipart + * + * @return + */ + public IMechanical getInstance(ForgeDirection from); } diff --git a/src/main/java/resonantinduction/mechanical/network/MechanicalNetwork.java b/src/main/java/resonantinduction/mechanical/network/MechanicalNetwork.java index 0ed27075..9772b52d 100644 --- a/src/main/java/resonantinduction/mechanical/network/MechanicalNetwork.java +++ b/src/main/java/resonantinduction/mechanical/network/MechanicalNetwork.java @@ -107,8 +107,8 @@ public class MechanicalNetwork extends Network prevTorque = torque; prevAngularVelocity = angularVelocity; - torque *= 0.5; - angularVelocity *= 0.5; + torque = 0; + angularVelocity = 0; } @Override diff --git a/src/main/java/resonantinduction/mechanical/network/PartMechanical.java b/src/main/java/resonantinduction/mechanical/network/PartMechanical.java index 89995db7..9288695d 100644 --- a/src/main/java/resonantinduction/mechanical/network/PartMechanical.java +++ b/src/main/java/resonantinduction/mechanical/network/PartMechanical.java @@ -65,25 +65,6 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu this.placementSide = ForgeDirection.getOrientation((byte) (side ^ 1)); } - // TODO: We don't need to tick. - @Override - public void update() - { - if (this.world().isRemote) - { - /** - * Update angle rotation. - */ - if (getNetwork().getPower() > 0) - { - if (isClockwise) - angle += getNetwork().getAngularVelocity() / 20f; - else - angle -= getNetwork().getAngularVelocity() / 20f; - } - } - } - @Override public void onAdded() { @@ -127,23 +108,16 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu TileEntity tile = vec.getTileEntity(world()); - if (tile instanceof TileMultipart) + if (tile instanceof IMechanical) { - TMultiPart neighbor = ((TileMultipart) tile).partMap(this.placementSide.getOpposite().ordinal()); + IMechanicalNetwork networkToMerge = ((IMechanical) tile).getNetwork(this.placementSide.getOpposite()); - if (neighbor instanceof IMechanical) + if (networkToMerge != null) { - connections[this.placementSide.getOpposite().ordinal()] = neighbor; - getNetwork().merge(((IMechanical) neighbor).getNetwork()); - } - } - else if (tile instanceof IMechanical) - { - connections[this.placementSide.getOpposite().ordinal()] = tile; - if (tile instanceof IMechanical) - { - getNetwork().merge(((IMechanical) tile).getNetwork()); + connections[this.placementSide.getOpposite().ordinal()] = ((IMechanical) tile).getInstance(this.placementSide.getOpposite()); + getNetwork().merge(networkToMerge); } + } /** Look for gears outside this block space, the relative UP, DOWN, LEFT, RIGHT */ @@ -153,14 +127,15 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu universalelectricity.api.vector.Vector3 checkVec = new universalelectricity.api.vector.Vector3(tile()).translate(checkDir); TileEntity checkTile = checkVec.getTileEntity(world()); - if (checkTile instanceof TileMultipart) - { - TMultiPart neighbor = ((TileMultipart) checkTile).partMap(this.placementSide.ordinal()); - if (neighbor != this && neighbor instanceof IMechanical) + if (checkTile instanceof IMechanical) + { + IMechanicalNetwork networkToMerge = ((IMechanical) checkTile).getNetwork(this.placementSide); + + if (networkToMerge != null) { - connections[checkDir.ordinal()] = neighbor; - getNetwork().merge(((IMechanical) neighbor).getNetwork()); + connections[checkDir.ordinal()] = ((IMechanical) checkTile).getInstance(this.placementSide); + getNetwork().merge(networkToMerge); } } } @@ -169,12 +144,12 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu for (int i = 0; i < 6; i++) { ForgeDirection checkDir = ForgeDirection.getOrientation(i); - TMultiPart neighbor = tile().partMap(this.placementSide.getRotation(checkDir).ordinal()); + IMechanicalNetwork networkToMerge = ((IMechanical) tile()).getNetwork(checkDir); - if (neighbor != this && neighbor instanceof IMechanical) + if (networkToMerge != null) { - connections[checkDir.ordinal()] = neighbor; - getNetwork().merge(((IMechanical) neighbor).getNetwork()); + connections[checkDir.ordinal()] = ((IMechanical) tile()).getInstance(checkDir); + getNetwork().merge(networkToMerge); } } @@ -186,6 +161,12 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu } } + @Override + public IMechanicalNetwork getNetwork(ForgeDirection from) + { + return getNetwork(); + } + @Override public Object[] getConnections() { @@ -203,7 +184,7 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu @Override public boolean sendNetworkPacket(long torque, float angularVelocity) { - if (!world().isRemote && tile() != null) + if (world() != null && !world().isRemote && tile() != null) { tile().getWriteStream(this).writeByte(0).writeLong(torque).writeFloat(angularVelocity).writeBoolean(isClockwise); } @@ -213,7 +194,7 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu public void sendRefreshPacket() { - if (tile() != null) + if (world() != null && !world().isRemote && tile() != null) { tile().getWriteStream(this).writeByte(1); } diff --git a/src/main/java/resonantinduction/mechanical/network/PathfinderRotationManager.java b/src/main/java/resonantinduction/mechanical/network/PathfinderRotationManager.java index 15dfb830..e9d7d7c1 100644 --- a/src/main/java/resonantinduction/mechanical/network/PathfinderRotationManager.java +++ b/src/main/java/resonantinduction/mechanical/network/PathfinderRotationManager.java @@ -36,7 +36,6 @@ public class PathfinderRotationManager extends ConnectionPathfinder this.closedSet.add(currentNode); currentNode.setClockwise(currentIsClockwise); - currentIsClockwise = !currentNode.isClockwise(); for (IMechanical node : this.getConnectedNodes(currentNode)) { @@ -48,8 +47,8 @@ public class PathfinderRotationManager extends ConnectionPathfinder currentNode.getNetwork().setPower(0, 0); } + currentIsClockwise = (node.isRotationInversed()) ? !currentNode.isClockwise() : currentNode.isClockwise(); findNodes(node); - currentIsClockwise = node.isRotationInversed() ? !currentNode.isClockwise() : currentNode.isClockwise(); } } diff --git a/src/main/java/resonantinduction/mechanical/network/TileMechanical.java b/src/main/java/resonantinduction/mechanical/network/TileMechanical.java index 3570fc02..00b12d57 100644 --- a/src/main/java/resonantinduction/mechanical/network/TileMechanical.java +++ b/src/main/java/resonantinduction/mechanical/network/TileMechanical.java @@ -3,7 +3,7 @@ package resonantinduction.mechanical.network; import net.minecraftforge.common.ForgeDirection; import calclavia.lib.prefab.tile.TileAdvanced; -public class TileMechanical extends TileAdvanced implements IMechanical +public abstract class TileMechanical extends TileAdvanced implements IMechanical { /** The mechanical connections this connector has made */ protected Object[] connections = new Object[6]; @@ -70,4 +70,10 @@ public class TileMechanical extends TileAdvanced implements IMechanical { return false; } + + @Override + public IMechanical getInstance(ForgeDirection from) + { + return this; + } } diff --git a/src/main/java/resonantinduction/mechanical/process/TileGrinderWheel.java b/src/main/java/resonantinduction/mechanical/process/TileGrinderWheel.java index 1b0479aa..876a4094 100644 --- a/src/main/java/resonantinduction/mechanical/process/TileGrinderWheel.java +++ b/src/main/java/resonantinduction/mechanical/process/TileGrinderWheel.java @@ -12,6 +12,7 @@ import resonantinduction.api.recipe.RecipeUtils.ItemStackResource; import resonantinduction.api.recipe.RecipeUtils.Resource; import resonantinduction.core.Reference; import resonantinduction.core.ResonantInduction; +import resonantinduction.mechanical.network.IMechanicalNetwork; import resonantinduction.mechanical.network.TileMechanical; import universalelectricity.api.vector.Vector3; import calclavia.lib.prefab.tile.IRotatable; @@ -160,17 +161,6 @@ public class TileGrinderWheel extends TileMechanical implements IRotatable return clientTimer; } - @Override - public boolean isClockwise() - { - if (worldObj != null) - { - return !(getBlockMetadata() % 2 == 0); - } - - return false; - } - @Override public ForgeDirection getDirection() { @@ -187,4 +177,12 @@ public class TileGrinderWheel extends TileMechanical implements IRotatable { worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, direction.ordinal(), 3); } + + @Override + public IMechanicalNetwork getNetwork(ForgeDirection from) + { + if (from != this.getDirection() && from != this.getDirection().getOpposite()) + return getNetwork(); + return null; + } } diff --git a/src/main/java/resonantinduction/mechanical/trait/TraitMechanical.java b/src/main/java/resonantinduction/mechanical/trait/TraitMechanical.java index 2277c026..96d0569b 100644 --- a/src/main/java/resonantinduction/mechanical/trait/TraitMechanical.java +++ b/src/main/java/resonantinduction/mechanical/trait/TraitMechanical.java @@ -54,13 +54,15 @@ public class TraitMechanical extends TileMultipart implements IMechanical } @Override - public boolean canConnect(ForgeDirection direction) + public boolean canConnect(ForgeDirection from) { - for (IMechanical connector : this.mechanicalInterfaces) + TMultiPart part = this.partMap(from.ordinal()); + + if (part != null) { - if (connector.canConnect(direction.getOpposite())) + if (this.mechanicalInterfaces.contains(part)) { - return true; + return ((IMechanical) part).canConnect(from); } } @@ -85,6 +87,38 @@ public class TraitMechanical extends TileMultipart implements IMechanical return null; } + @Override + public IMechanicalNetwork getNetwork(ForgeDirection from) + { + TMultiPart part = this.partMap(from.ordinal()); + + if (part != null) + { + if (part instanceof IMechanical) + { + return ((IMechanical) part).getNetwork(); + } + } + + return null; + } + + @Override + public IMechanical getInstance(ForgeDirection from) + { + TMultiPart part = this.partMap(from.ordinal()); + + if (part != null) + { + if (part instanceof IMechanical) + { + return (IMechanical) part; + } + } + + return null; + } + @Override public IMechanicalNetwork getNetwork() {