diff --git a/src/main/java/resonantinduction/api/IBelt.java b/src/main/java/resonantinduction/api/IBelt.java index bf1f3191..cf6592a9 100644 --- a/src/main/java/resonantinduction/api/IBelt.java +++ b/src/main/java/resonantinduction/api/IBelt.java @@ -3,14 +3,14 @@ package resonantinduction.api; import java.util.List; import net.minecraft.entity.Entity; -import resonantinduction.mechanical.network.IMechanicalConnector; +import resonantinduction.mechanical.network.IMechanical; /** * An interface applied to the tile entity of a conveyor belt * * @Author DarkGuardsman */ -public interface IBelt extends IMechanicalConnector +public interface IBelt extends IMechanical { /** * Used to get a list of entities the belt exerts an effect upon. diff --git a/src/main/java/resonantinduction/electrical/battery/RenderBattery.java b/src/main/java/resonantinduction/electrical/battery/RenderBattery.java index 18780b2a..c9dbbe68 100644 --- a/src/main/java/resonantinduction/electrical/battery/RenderBattery.java +++ b/src/main/java/resonantinduction/electrical/battery/RenderBattery.java @@ -45,11 +45,11 @@ public class RenderBattery extends TileEntitySpecialRenderer GL11.glRotatef(90 * i, 0, 1, 0); ForgeDirection dir = ForgeDirection.getOrientation(i); - FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE_LEVELS); - MODEL.renderPart("Battery"); - if (t.worldObj != null) { + FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE_LEVELS); + MODEL.renderPart("Battery"); + // Render top and bottom //if (!(new Vector3(t).translate(dir).getTileEntity(t.worldObj) instanceof TileBattery)) { @@ -81,6 +81,10 @@ public class RenderBattery extends TileEntitySpecialRenderer if (new Vector3(t).translate(ForgeDirection.UP).getTileEntity(t.worldObj) instanceof TileBattery) MODEL.renderPart("VertConnector"); + }else + { + FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE_CAP); + MODEL.renderAll(); } glPopMatrix(); diff --git a/src/main/java/resonantinduction/electrical/generator/TileGenerator.java b/src/main/java/resonantinduction/electrical/generator/TileGenerator.java index 85c81058..8bf6bd98 100644 --- a/src/main/java/resonantinduction/electrical/generator/TileGenerator.java +++ b/src/main/java/resonantinduction/electrical/generator/TileGenerator.java @@ -6,6 +6,8 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; import resonantinduction.mechanical.network.IMechanical; +import resonantinduction.mechanical.network.IMechanicalNetwork; +import resonantinduction.mechanical.network.MechanicalNetwork; import universalelectricity.api.energy.EnergyStorageHandler; import universalelectricity.api.vector.Vector3; import calclavia.lib.prefab.tile.IRotatable; @@ -18,6 +20,8 @@ import calclavia.lib.prefab.tile.TileElectrical; */ public class TileGenerator extends TileElectrical implements IMechanical, IRotatable { + private IMechanicalNetwork network; + /** Generator turns KE -> EE. Inverted one will turn EE -> KE. */ public boolean isInversed = false; @@ -41,6 +45,7 @@ public class TileGenerator extends TileElectrical implements IMechanical, IRotat { if (!isInversed) { + energy.receiveEnergy(getNetwork().getPower(), true); produce(); } else @@ -53,7 +58,7 @@ public class TileGenerator extends TileElectrical implements IMechanical, IRotat public void produceMechanical(ForgeDirection outputDir) { - Vector3 outputVector = new Vector3(this).modifyPositionFromSide(outputDir); + Vector3 outputVector = new Vector3(this).translate(outputDir); TileEntity mechanical = outputVector.getTileEntity(worldObj); if (mechanical instanceof IMechanical) @@ -64,7 +69,7 @@ public class TileGenerator extends TileElectrical implements IMechanical, IRotat { float angularVelocity = extract / torqueRatio; long torque = (long) (extract / angularVelocity); - energy.extractEnergy(((IMechanical) mechanical).onReceiveEnergy(outputDir.getOpposite(), torque, angularVelocity, true), true); + energy.extractEnergy(((IMechanical) mechanical).getNetwork().onReceiveEnergy(((IMechanical) mechanical), torque, angularVelocity), true); } } } @@ -94,7 +99,6 @@ public class TileGenerator extends TileElectrical implements IMechanical, IRotat public void setDirection(ForgeDirection dir) { this.worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, dir.ordinal(), 3); - } private boolean isFunctioning() @@ -102,16 +106,6 @@ public class TileGenerator extends TileElectrical implements IMechanical, IRotat return true; } - @Override - public long onReceiveEnergy(ForgeDirection from, long torque, float angularVelocity, boolean doReceive) - { - if (!this.isInversed) - { - return energy.receiveEnergy((long) (torque * angularVelocity), doReceive); - } - return 0; - } - @Override public void readFromNBT(NBTTagCompound nbt) { @@ -140,4 +134,47 @@ public class TileGenerator extends TileElectrical implements IMechanical, IRotat } + @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 boolean sendNetworkPacket(long torque, float angularVelocity) + { + return false; + } + + @Override + public float getResistance() + { + return 0; + } + + @Override + public boolean isRotationInversed() + { + return false; + } + } diff --git a/src/main/java/resonantinduction/mechanical/MultipartMechanical.java b/src/main/java/resonantinduction/mechanical/MultipartMechanical.java index 64f8417c..ee034177 100644 --- a/src/main/java/resonantinduction/mechanical/MultipartMechanical.java +++ b/src/main/java/resonantinduction/mechanical/MultipartMechanical.java @@ -18,7 +18,6 @@ public class MultipartMechanical implements IPartFactory MultiPartRegistry.registerParts(this, PART_TYPES); MultipartGenerator.registerPassThroughInterface("resonantinduction.api.fluid.IFluidPipe"); MultipartGenerator.registerTrait("resonantinduction.mechanical.network.IMechanical", "resonantinduction.mechanical.trait.TraitMechanical"); - MultipartGenerator.registerTrait("resonantinduction.mechanical.network.IMechanicalConnector", "resonantinduction.mechanical.trait.TraitMechanicalConnector"); } @Override diff --git a/src/main/java/resonantinduction/mechanical/belt/TileConveyorBelt.java b/src/main/java/resonantinduction/mechanical/belt/TileConveyorBelt.java index a020863e..49e3a4e1 100644 --- a/src/main/java/resonantinduction/mechanical/belt/TileConveyorBelt.java +++ b/src/main/java/resonantinduction/mechanical/belt/TileConveyorBelt.java @@ -15,7 +15,6 @@ import resonantinduction.api.IBelt; import resonantinduction.core.ResonantInduction; import resonantinduction.mechanical.Mechanical; import resonantinduction.mechanical.network.IMechanical; -import resonantinduction.mechanical.network.IMechanicalConnector; import resonantinduction.mechanical.network.TileMechanical; import universalelectricity.api.vector.Vector3; import calclavia.lib.network.IPacketReceiverWithID; @@ -30,7 +29,7 @@ import cpw.mods.fml.common.network.PacketDispatcher; * * @author DarkGuardsman */ -public class TileConveyorBelt extends TileMechanical implements IMechanicalConnector, IBelt, IRotatable, IPacketReceiverWithID +public class TileConveyorBelt extends TileMechanical implements IBelt, IRotatable, IPacketReceiverWithID { public enum SlantType { diff --git a/src/main/java/resonantinduction/mechanical/gear/PartGear.java b/src/main/java/resonantinduction/mechanical/gear/PartGear.java index 440a0cce..6908824b 100644 --- a/src/main/java/resonantinduction/mechanical/gear/PartGear.java +++ b/src/main/java/resonantinduction/mechanical/gear/PartGear.java @@ -4,7 +4,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.MovingObjectPosition; import resonantinduction.mechanical.Mechanical; -import resonantinduction.mechanical.network.IMechanicalConnector; +import resonantinduction.mechanical.network.IMechanical; import resonantinduction.mechanical.network.PartMechanical; import codechicken.lib.vec.Vector3; import cpw.mods.fml.relauncher.Side; @@ -16,7 +16,7 @@ import cpw.mods.fml.relauncher.SideOnly; * @author Calclavia * */ -public class PartGear extends PartMechanical implements IMechanicalConnector +public class PartGear extends PartMechanical implements IMechanical { private int manualCrankTime = 0; @@ -27,7 +27,7 @@ public class PartGear extends PartMechanical implements IMechanicalConnector { if (manualCrankTime > 0) { - onReceiveEnergy(null, 20, 0.2f, true); + manualCrankTime--; } } @@ -38,15 +38,16 @@ public class PartGear extends PartMechanical implements IMechanicalConnector @Override public float getResistance() { - return 0.1f; + return 0.5f; } @Override public boolean activate(EntityPlayer player, MovingObjectPosition hit, ItemStack item) { - // System.out.println(world().isRemote + ": " + getNetwork()); + System.out.println(world().isRemote + ": " + getNetwork()); if (player.isSneaking()) { + getNetwork().onReceiveEnergy(this, 20, 0.3f); this.manualCrankTime = 20; } @@ -65,10 +66,16 @@ public class PartGear extends PartMechanical implements IMechanicalConnector { if (pass == 0) { - RenderGear.INSTANCE.renderDynamic(this, pos.x, pos.y, pos.z); + RenderGear.INSTANCE.renderDynamic(this, pos.x, pos.y, pos.z, frame); } } + @Override + public boolean isRotationInversed() + { + return true; + } + @Override public String getType() { diff --git a/src/main/java/resonantinduction/mechanical/gear/RenderGear.java b/src/main/java/resonantinduction/mechanical/gear/RenderGear.java index 4114c427..80a5aa7f 100644 --- a/src/main/java/resonantinduction/mechanical/gear/RenderGear.java +++ b/src/main/java/resonantinduction/mechanical/gear/RenderGear.java @@ -29,7 +29,7 @@ public class RenderGear GL11.glPopMatrix(); } - public void renderDynamic(PartGear part, double x, double y, double z) + public void renderDynamic(PartGear part, double x, double y, double z, float frame) { GL11.glPushMatrix(); // Center the model first. @@ -63,7 +63,7 @@ public class RenderGear break; } - GL11.glRotatef((float) Math.toDegrees(part.angle), 0, 1, 0); + GL11.glRotatef((float) Math.toDegrees(part.isClockwise() ? part.getNetwork().getRotation() : -part.getNetwork().getRotation()), 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 88c60226..de808589 100644 --- a/src/main/java/resonantinduction/mechanical/network/IMechanical.java +++ b/src/main/java/resonantinduction/mechanical/network/IMechanical.java @@ -1,20 +1,23 @@ package resonantinduction.mechanical.network; import net.minecraftforge.common.ForgeDirection; -import universalelectricity.api.net.IConnectable; +import universalelectricity.api.net.IConnector; -public interface IMechanical extends IConnectable +public interface IMechanical extends IConnector { /** - * Adds energy to a block. Returns the quantity of energy that was accepted. This should always - * return 0 if the block cannot be externally charged. + * Uses this connector to send a packet to the client for the network. * - * @param from Orientation the energy is sent in from. - * @param receive Maximum amount of energy (joules) to be sent into the block. - * @param doReceive If false, the charge will only be simulated. - * @return Amount of energy that was accepted by the block. + * @return True if the packet was successfully sent. */ - public long onReceiveEnergy(ForgeDirection from, long torque, float angularVelocity, boolean doReceive); + public boolean sendNetworkPacket(long torque, float angularVelocity); + + /** + * The percentage of resistance caused by this connector. + * + * @return A small value, most likely less than one. + */ + public float getResistance(); /** * @return Is the mechanical machine going clockwise currently? @@ -22,4 +25,11 @@ public interface IMechanical extends IConnectable public boolean isClockwise(); public void setClockwise(boolean isClockwise); + + /** + * * + * + * @return Return true if the mechanical block should have its rotation set inveresed. + */ + public boolean isRotationInversed(); } diff --git a/src/main/java/resonantinduction/mechanical/network/IMechanicalConnector.java b/src/main/java/resonantinduction/mechanical/network/IMechanicalConnector.java deleted file mode 100644 index dbd78da7..00000000 --- a/src/main/java/resonantinduction/mechanical/network/IMechanicalConnector.java +++ /dev/null @@ -1,25 +0,0 @@ -package resonantinduction.mechanical.network; - -import universalelectricity.api.net.IConnector; - -/** - * Applied to connectors in a mechanical network - * - * @author Calclavia - */ -public interface IMechanicalConnector extends IMechanical, IConnector -{ - /** - * Uses this connector to send a packet to the client for the network. - * - * @return True if the packet was successfully sent. - */ - public boolean sendNetworkPacket(long torque, float angularVelocity); - - /** - * The percentage of resistance caused by this connector. - * - * @return A small value, most likely less than one. - */ - public float getResistance(); -} diff --git a/src/main/java/resonantinduction/mechanical/network/IMechanicalNetwork.java b/src/main/java/resonantinduction/mechanical/network/IMechanicalNetwork.java index 8fbd912e..10468ced 100644 --- a/src/main/java/resonantinduction/mechanical/network/IMechanicalNetwork.java +++ b/src/main/java/resonantinduction/mechanical/network/IMechanicalNetwork.java @@ -1,13 +1,13 @@ package resonantinduction.mechanical.network; -import universalelectricity.api.net.INodeNetwork; +import universalelectricity.api.net.INetwork; /** * Mechanical network in interface form for interaction or extension * * @author DarkGuardsman */ -public interface IMechanicalNetwork extends INodeNetwork +public interface IMechanicalNetwork extends INetwork { /** * Gets the power of the network. @@ -32,11 +32,7 @@ public interface IMechanicalNetwork extends INodeNetwork implements IMechanicalNetwork, IUpdate +public class MechanicalNetwork extends Network implements IMechanicalNetwork, IUpdate { private long prevTorque = 0; private float prevAngularVelocity = 0; @@ -35,7 +37,7 @@ public class MechanicalNetwork extends NodeNetwork> handlerDirectionMap = new LinkedHashMap>(); + private Set prevGenerators = new LinkedHashSet(); + private Set generators = new LinkedHashSet(); + @Override - public void addConnector(IMechanicalConnector connector) + public void addConnector(IMechanical connector) { this.markPacketUpdate = true; super.addConnector(connector); @@ -58,26 +63,29 @@ public class MechanicalNetwork extends NodeNetwork closedSet = new LinkedHashSet(); + + for (IMechanical generatorNode : generators) + { + PathfinderRotationManager rotationPathfinder = new PathfinderRotationManager(generatorNode, closedSet); + rotationPathfinder.findNodes(generatorNode); + closedSet.addAll(rotationPathfinder.closedSet); + } + + generators.clear(); + /** * Calculate load */ - if (getPower() > 0) + if (load > 0) { - float division = connectorResistance; - - 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; - } + torque /= load / 2; + angularVelocity /= load / 2; } /** @@ -88,7 +96,7 @@ public class MechanicalNetwork extends NodeNetwork 0) - { - for (IMechanical node : this.getNodes()) - { - for (ForgeDirection dir : handlerDirectionMap.get(node)) - { - node.onReceiveEnergy(dir, torque, angularVelocity, true); - } - } - } - prevTorque = torque; prevAngularVelocity = angularVelocity; - torque = 0; - angularVelocity = 0; + torque *= 0.5; + angularVelocity *= 0.5; + } + + @Override + public boolean canUpdate() + { + return true; + } + + @Override + public boolean continueUpdate() + { + return canUpdate(); } /** @@ -122,10 +128,11 @@ public class MechanicalNetwork extends NodeNetwork 0) - { - // Reset all values related to wires - this.getNodes().clear(); - - // Iterate threw list of wires - Iterator it = this.getConnectors().iterator(); - - while (it.hasNext()) - { - IMechanicalConnector connector = it.next(); - - if (connector != null) - { - reconstructConnector(connector); - } - else - { - it.remove(); - } - } - } + super.reconstruct(); } - /** Segmented out call so overriding can be done when conductors are reconstructed. */ - protected void reconstructConnector(IMechanicalConnector connector) + @Override + protected void reconstructConnector(IMechanical connector) { connector.setNetwork(this); - - for (int i = 0; i < connector.getConnections().length; i++) - { - reconstructHandler(connector.getConnections()[i], ForgeDirection.getOrientation(i).getOpposite()); - } - - connectorResistance += connector.getResistance(); + load += connector.getResistance(); } /** Segmented out call so overriding can be done when machines are reconstructed. */ protected void reconstructHandler(Object obj, ForgeDirection side) { - if (obj != null && !(obj instanceof IMechanicalConnector)) + if (obj != null && !(obj instanceof IMechanical)) { if (obj instanceof IMechanical) { @@ -238,7 +206,7 @@ public class MechanicalNetwork extends NodeNetwork 1) { - rotation = (float) (((angularVelocity) * (deltaTime / 1000f) + rotation) % Math.PI); + rotation = (float) (((angularVelocity) * (deltaTime / 1000f) + rotation) % (2 * Math.PI)); lastRotateTime = System.currentTimeMillis(); } @@ -268,6 +236,6 @@ public class MechanicalNetwork extends NodeNetwork { - /** A list of nodes that the pathfinder already went through. */ - public final Set closedSet = new LinkedHashSet(); + private boolean currentIsClockwise = true; + private Set prevClosedSet; - /** The resulted path found by the pathfinder. Could be null if no path was found. */ - public final Set results = new LinkedHashSet(); - - private final IConnector targetConnector; - private final List ignoreConnector; - - public PathfinderRotationManager(IConnector targetConnector, IConnector... ignoreConnector) + public PathfinderRotationManager(IMechanical first, Set prevClosedSet) { - this.targetConnector = targetConnector; - if (ignoreConnector != null) - { - this.ignoreConnector = Arrays.asList(ignoreConnector); - } - else - { - this.ignoreConnector = new ArrayList(); - } + super(first); + this.currentIsClockwise = first.isClockwise(); + this.prevClosedSet = prevClosedSet; } - /** - * A recursive function to find all connectors. - * - * @return True on success finding, false on failure. - */ - public boolean findNodes(IConnector currentNode) + public boolean findNodes(IMechanical currentNode) { this.closedSet.add(currentNode); - if (this.onSearch(currentNode)) - { - return false; - } + currentNode.setClockwise(currentIsClockwise); + currentIsClockwise = !currentNode.isClockwise(); - for (IConnector node : this.getConnectedNodes(currentNode)) + for (IMechanical node : this.getConnectedNodes(currentNode)) { if (!this.closedSet.contains(node)) { - if (this.findNodes(node)) + if (prevClosedSet.contains(node) && node.isClockwise() != currentNode.isClockwise()) { - return true; + // We have conflicting gears. Network is now equal. + currentNode.getNetwork().setPower(0, 0); } + + findNodes(node); + currentIsClockwise = node.isRotationInversed() ? !currentNode.isClockwise() : currentNode.isClockwise(); } } return false; } - - public Set getConnectedNodes(IConnector currentNode) - { - Set connectedNodes = new HashSet(); - - if (currentNode != null) - { - for (int i = 0; i < currentNode.getConnections().length; i++) - { - Object obj = currentNode.getConnections()[i]; - - if (obj instanceof IConnector && !this.ignoreConnector.contains(obj)) - { - connectedNodes.add((IConnector) obj); - } - } - } - - return connectedNodes; - } - - public boolean onSearch(IConnector node) - { - if (node == this.targetConnector) - { - this.results.add(node); - return true; - } - - return false; - } - - public void reset() - { - this.results.clear(); - this.closedSet.clear(); - } } diff --git a/src/main/java/resonantinduction/mechanical/network/TileMechanical.java b/src/main/java/resonantinduction/mechanical/network/TileMechanical.java index 6d6730ef..3570fc02 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 IMechanicalConnector +public class TileMechanical extends TileAdvanced implements IMechanical { /** The mechanical connections this connector has made */ protected Object[] connections = new Object[6]; @@ -12,12 +12,6 @@ public class TileMechanical extends TileAdvanced implements IMechanicalConnector private boolean isClockwise = false; - @Override - public long onReceiveEnergy(ForgeDirection from, long torque, float angularVelocity, boolean doReceive) - { - return this.getNetwork().onReceiveEnergy(torque, angularVelocity); - } - @Override public boolean canConnect(ForgeDirection direction) { @@ -70,4 +64,10 @@ public class TileMechanical extends TileAdvanced implements IMechanicalConnector { this.isClockwise = isClockwise; } + + @Override + public boolean isRotationInversed() + { + return false; + } } diff --git a/src/main/java/resonantinduction/mechanical/trait/TraitMechanical.java b/src/main/java/resonantinduction/mechanical/trait/TraitMechanical.java index d69099a0..2277c026 100644 --- a/src/main/java/resonantinduction/mechanical/trait/TraitMechanical.java +++ b/src/main/java/resonantinduction/mechanical/trait/TraitMechanical.java @@ -5,6 +5,7 @@ import java.util.Set; import net.minecraftforge.common.ForgeDirection; import resonantinduction.mechanical.network.IMechanical; +import resonantinduction.mechanical.network.IMechanicalNetwork; import codechicken.multipart.TMultiPart; import codechicken.multipart.TileMultipart; @@ -66,22 +67,6 @@ public class TraitMechanical extends TileMultipart implements IMechanical return false; } - @Override - public long onReceiveEnergy(ForgeDirection from, long torque, float angularVelocity, boolean doReceive) - { - TMultiPart part = this.partMap(from.ordinal()); - - if (part != null) - { - if (this.mechanicalInterfaces.contains(part)) - { - return ((IMechanical) part).onReceiveEnergy(from, torque, angularVelocity, doReceive); - } - } - - return 0; - } - @Override public boolean isClockwise() { @@ -93,4 +78,40 @@ public class TraitMechanical extends TileMultipart implements IMechanical { } + + @Override + public Object[] getConnections() + { + return null; + } + + @Override + public IMechanicalNetwork getNetwork() + { + return null; + } + + @Override + public void setNetwork(IMechanicalNetwork network) + { + + } + + @Override + public boolean sendNetworkPacket(long torque, float angularVelocity) + { + return false; + } + + @Override + public float getResistance() + { + return 0; + } + + @Override + public boolean isRotationInversed() + { + return false; + } } diff --git a/src/main/java/resonantinduction/mechanical/trait/TraitMechanicalConnector.java b/src/main/java/resonantinduction/mechanical/trait/TraitMechanicalConnector.java deleted file mode 100644 index b5cdbd4f..00000000 --- a/src/main/java/resonantinduction/mechanical/trait/TraitMechanicalConnector.java +++ /dev/null @@ -1,127 +0,0 @@ -package resonantinduction.mechanical.trait; - -import java.util.HashSet; -import java.util.Set; - -import net.minecraftforge.common.ForgeDirection; -import resonantinduction.mechanical.network.IMechanicalConnector; -import resonantinduction.mechanical.network.IMechanicalNetwork; -import codechicken.multipart.TMultiPart; -import codechicken.multipart.TileMultipart; - -public class TraitMechanicalConnector extends TileMultipart implements IMechanicalConnector -{ - public Set mechanicalConnectorInterfaces = new HashSet(); - - @Override - public void copyFrom(TileMultipart that) - { - super.copyFrom(that); - - if (that instanceof TraitMechanicalConnector) - { - this.mechanicalConnectorInterfaces = ((TraitMechanicalConnector) that).mechanicalConnectorInterfaces; - } - } - - @Override - public void bindPart(TMultiPart part) - { - super.bindPart(part); - - if (part instanceof IMechanicalConnector) - { - this.mechanicalConnectorInterfaces.add((IMechanicalConnector) part); - } - } - - @Override - public void partRemoved(TMultiPart part, int p) - { - super.partRemoved(part, p); - - if (part instanceof IMechanicalConnector) - { - this.mechanicalConnectorInterfaces.remove(part); - } - } - - @Override - public void clearParts() - { - super.clearParts(); - this.mechanicalConnectorInterfaces.clear(); - } - - @Override - public boolean canConnect(ForgeDirection direction) - { - for (IMechanicalConnector connector : this.mechanicalConnectorInterfaces) - { - if (connector.canConnect(direction.getOpposite())) - { - return true; - } - } - - return false; - } - - @Override - public long onReceiveEnergy(ForgeDirection from, long torque, float angularVelocity, boolean doReceive) - { - TMultiPart part = this.partMap(from.ordinal()); - - if (part != null) - { - if (this.mechanicalConnectorInterfaces.contains(part)) - { - return ((IMechanicalConnector) part).onReceiveEnergy(from, torque, angularVelocity, doReceive); - } - } - - return 0; - } - - @Override - public Object[] getConnections() - { - return null; - } - - @Override - public IMechanicalNetwork getNetwork() - { - return null; - } - - @Override - public void setNetwork(IMechanicalNetwork network) - { - - } - - @Override - public boolean sendNetworkPacket(long torque, float angularVelocity) - { - return false; - } - - @Override - public float getResistance() - { - return 0; - } - - @Override - public boolean isClockwise() - { - return false; - } - - @Override - public void setClockwise(boolean isClockwise) - { - - } -}