diff --git a/mechanical/src/main/java/resonantinduction/mechanical/belt/BlockConveyorBelt.java b/mechanical/src/main/java/resonantinduction/mechanical/belt/BlockConveyorBelt.java index 46aee17c..0fd43141 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/belt/BlockConveyorBelt.java +++ b/mechanical/src/main/java/resonantinduction/mechanical/belt/BlockConveyorBelt.java @@ -43,7 +43,7 @@ public class BlockConveyorBelt extends BlockTile if (t != null && t instanceof TileConveyorBelt) { TileConveyorBelt tileEntity = (TileConveyorBelt) t; - tileEntity.refresh(); + tileEntity.getNetwork().reconstruct(); } } @@ -55,7 +55,7 @@ public class BlockConveyorBelt extends BlockTile if (t != null && t instanceof TileConveyorBelt) { TileConveyorBelt tileEntity = (TileConveyorBelt) t; - tileEntity.refresh(); + tileEntity.getNetwork().reconstruct(); } } diff --git a/mechanical/src/main/java/resonantinduction/mechanical/belt/TileConveyorBelt.java b/mechanical/src/main/java/resonantinduction/mechanical/belt/TileConveyorBelt.java index 1eb330ec..3d800787 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/belt/TileConveyorBelt.java +++ b/mechanical/src/main/java/resonantinduction/mechanical/belt/TileConveyorBelt.java @@ -132,8 +132,7 @@ public class TileConveyorBelt extends TileMechanical implements IBelt, IRotatabl if (id == PACKET_SLANT) this.slantType = SlantType.values()[data.readInt()]; else if (id == PACKET_REFRESH) - refresh(); - + getNetwork().reconstruct(); } public SlantType getSlant() @@ -149,7 +148,7 @@ public class TileConveyorBelt extends TileMechanical implements IBelt, IRotatabl } this.slantType = slantType; - refresh(); + getNetwork().reconstruct(); this.worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); } @@ -208,8 +207,9 @@ public class TileConveyorBelt extends TileMechanical implements IBelt, IRotatabl } @Override - public void refresh() + public Object[] getConnections() { + Object[] connections = new Object[6]; boolean didRefresh = false; for (int i = 2; i < 6; i++) @@ -248,7 +248,6 @@ public class TileConveyorBelt extends TileMechanical implements IBelt, IRotatabl if (tile instanceof IBelt) { connections[dir.ordinal()] = tile; - getNetwork().merge(((IBelt) tile).getNetwork()); didRefresh = true; } } @@ -259,7 +258,6 @@ public class TileConveyorBelt extends TileMechanical implements IBelt, IRotatabl if (mechanical != null) { connections[dir.ordinal()] = mechanical; - getNetwork().merge(mechanical.getNetwork()); } } } @@ -271,6 +269,8 @@ public class TileConveyorBelt extends TileMechanical implements IBelt, IRotatabl markRefresh = true; } } + + return connections; } @Override diff --git a/mechanical/src/main/java/resonantinduction/mechanical/energy/gear/PartGear.java b/mechanical/src/main/java/resonantinduction/mechanical/energy/gear/PartGear.java index 8d1cfe02..63162a6b 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/energy/gear/PartGear.java +++ b/mechanical/src/main/java/resonantinduction/mechanical/energy/gear/PartGear.java @@ -1,6 +1,5 @@ package resonantinduction.mechanical.energy.gear; -import java.lang.ref.WeakReference; import java.util.Arrays; import java.util.HashSet; import java.util.Set; @@ -117,15 +116,10 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock @Override public boolean activate(EntityPlayer player, MovingObjectPosition hit, ItemStack itemStack) { + if (!world().isRemote) + System.out.println(getNetwork()); + if (itemStack != null && itemStack.getItem() instanceof ItemHandCrank) - { - getMultiBlock().get().manualCrankTime = 10; - world().playSoundEffect(x() + 0.5, y() + 0.5, z() + 0.5, Reference.PREFIX + "gearCrank", 0.5f, 0.9f + world().rand.nextFloat() * 0.2f); - player.addExhaustion(0.01f); - return true; - } - - if (WrenchUtility.isWrench(itemStack)) { if (player.isSneaking()) { @@ -134,21 +128,20 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock getMultiBlock().get().angularVelocity = -getMultiBlock().get().angularVelocity; player.addChatMessage("Flipped gear to rotate " + (angularVelocity > 0 ? "clockwise" : "anticlockwise") + "."); } + + return true; } - else - { - getMultiBlock().toggleConstruct(); - } - + + getMultiBlock().get().manualCrankTime = 10; + world().playSoundEffect(x() + 0.5, y() + 0.5, z() + 0.5, Reference.PREFIX + "gearCrank", 0.5f, 0.9f + world().rand.nextFloat() * 0.2f); + player.addExhaustion(0.01f); return true; } - else if (player.isSneaking()) + + if (WrenchUtility.isWrench(itemStack)) { - if (!world().isRemote) - { - getMultiBlock().get().angularVelocity = -getMultiBlock().get().angularVelocity; - player.addChatMessage("Flipped gear to rotate " + (angularVelocity > 0 ? "clockwise" : "anticlockwise") + "."); - } + getMultiBlock().toggleConstruct(); + return true; } return super.activate(player, hit, itemStack); @@ -165,16 +158,16 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock * Refresh should be called sparingly. */ @Override - public void refresh() + public Object[] getConnections() { - connections = new WeakReference[6]; + Object[] connections = new Object[6]; /** * Only call refresh if this is the main block of a multiblock gear or a single gear block. */ - if (!getMultiBlock().isPrimary()) + if (!getMultiBlock().isPrimary() || world() == null) { - return; + return connections; } /** Look for gears that are back-to-back with this gear. Equate torque. */ @@ -186,10 +179,8 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock if (instance != null && instance != this && !(instance instanceof PartGearShaft) && instance.canConnect(placementSide.getOpposite(), this)) { - connections[placementSide.ordinal()] = new WeakReference(instance); - getNetwork().merge(instance.getNetwork()); + connections[placementSide.ordinal()] = instance; } - } /** @@ -217,8 +208,7 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock if (connections[checkDir.ordinal()] == null && instance != this && checkDir != placementSide && instance != null && instance.canConnect(checkDir.getOpposite(), this)) { - connections[checkDir.ordinal()] = new WeakReference(instance); - getNetwork().merge(instance.getNetwork()); + connections[checkDir.ordinal()] = instance; } } } @@ -242,13 +232,12 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock if (instance != null && instance != this && instance.canConnect(checkDir.getOpposite(), this) && !(instance instanceof PartGearShaft)) { - connections[checkDir.ordinal()] = new WeakReference(instance); - getNetwork().merge(instance.getNetwork()); + connections[checkDir.ordinal()] = instance; } } } - getNetwork().reconstruct(); + return connections; } /** @@ -284,17 +273,6 @@ public class PartGear extends PartMechanical implements IMechanical, IMultiBlock return false; } - @Override - public Object[] getConnections() - { - if (!getMultiBlock().isPrimary()) - { - return new Object[6]; - } - - return super.getConnections(); - } - @Override protected ItemStack getItem() { diff --git a/mechanical/src/main/java/resonantinduction/mechanical/energy/gear/PartGearShaft.java b/mechanical/src/main/java/resonantinduction/mechanical/energy/gear/PartGearShaft.java index 52a01078..d2a05d58 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/energy/gear/PartGearShaft.java +++ b/mechanical/src/main/java/resonantinduction/mechanical/energy/gear/PartGearShaft.java @@ -1,6 +1,5 @@ package resonantinduction.mechanical.energy.gear; -import java.lang.ref.WeakReference; import java.util.Collection; import java.util.HashSet; import java.util.Set; @@ -78,9 +77,9 @@ public class PartGearShaft extends PartMechanical * Refresh should be called sparingly. */ @Override - public void refresh() + public Object[] getConnections() { - connections = new WeakReference[6]; + Object[] connections = new Object[6]; /** Check for internal connections, the FRONT and BACK. */ for (int i = 0; i < 6; i++) @@ -93,8 +92,7 @@ public class PartGearShaft extends PartMechanical if (instance != null && instance != this && instance.canConnect(checkDir.getOpposite(), this)) { - connections[checkDir.ordinal()] = new WeakReference(instance); - getNetwork().merge(instance.getNetwork()); + connections[checkDir.ordinal()] = instance; } } } @@ -115,14 +113,13 @@ public class PartGearShaft extends PartMechanical // Only connect to shafts outside of this block space. if (instance != null && instance != this && instance instanceof PartGearShaft && instance.canConnect(checkDir.getOpposite(), this)) { - connections[checkDir.ordinal()] = new WeakReference(instance); - getNetwork().merge(instance.getNetwork()); + connections[checkDir.ordinal()] = instance; } } } } - getNetwork().reconstruct(); + return connections; } @Override diff --git a/mechanical/src/main/java/resonantinduction/mechanical/energy/network/MechanicalNetwork.java b/mechanical/src/main/java/resonantinduction/mechanical/energy/network/MechanicalNetwork.java index 9dd1b65d..93456d89 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/energy/network/MechanicalNetwork.java +++ b/mechanical/src/main/java/resonantinduction/mechanical/energy/network/MechanicalNetwork.java @@ -1,15 +1,15 @@ package resonantinduction.mechanical.energy.network; -import java.util.EnumSet; -import java.util.HashMap; +import java.lang.ref.WeakReference; import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; +import java.util.WeakHashMap; +import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; import resonantinduction.api.mechanical.IMechanical; import resonantinduction.api.mechanical.IMechanicalNetwork; import universalelectricity.api.net.IUpdate; +import universalelectricity.api.vector.Vector3; import universalelectricity.core.net.Network; import universalelectricity.core.net.NetworkTickHandler; @@ -32,16 +32,16 @@ import universalelectricity.core.net.NetworkTickHandler; public class MechanicalNetwork extends Network implements IMechanicalNetwork, IUpdate { public static final float ACCELERATION = 0.2f; - + /** The current rotation of the network */ private float rotation = 0; - + private long lastRotateTime; /** * The cached connections of the mechanical network. */ - private final HashMap> connectionMap = new LinkedHashMap>(); + private final WeakHashMap connectionCache = new WeakHashMap(); private boolean markUpdateRotation = true; @@ -62,42 +62,50 @@ public class MechanicalNetwork extends Network @Override public void update() { - /** - * Update all mechanical nodes. - */ - Iterator it = new LinkedHashSet(getConnectors()).iterator(); - - while (it.hasNext()) + synchronized (getConnectors()) { - IMechanical mechanical = it.next(); - Object[] connections = mechanical.getConnections(); + /** + * Update all mechanical nodes. + */ + Iterator it = getConnectors().iterator(); - for (int i = 0; i < connections.length; i++) + while (it.hasNext()) { - ForgeDirection dir = ForgeDirection.getOrientation(i); - Object adjacent = connections[i]; + IMechanical mechanical = it.next(); + WeakReference[] connections = connectionCache.get(mechanical); - if (adjacent instanceof IMechanical) + if (connections != null) { - IMechanical adjacentMech = ((IMechanical) adjacent).getInstance(dir.getOpposite()); - - if (adjacentMech != null && adjacent != mechanical) + for (int i = 0; i < connections.length; i++) { - // System.out.println("UPDATING: " + mechanical + " with " + adjacentMech); - float ratio = adjacentMech.getRatio(dir.getOpposite(), mechanical) / mechanical.getRatio(dir, adjacentMech); - long torque = mechanical.getTorque(); + if (connections[i] != null) + { + ForgeDirection dir = ForgeDirection.getOrientation(i); + Object adjacent = connections[i].get(); - boolean inverseRotation = mechanical.inverseRotation(dir, adjacentMech) && adjacentMech.inverseRotation(dir.getOpposite(), mechanical); + if (adjacent instanceof IMechanical) + { + IMechanical adjacentMech = ((IMechanical) adjacent).getInstance(dir.getOpposite()); - int inversion = inverseRotation ? -1 : 1; + if (adjacentMech != null && adjacent != mechanical) + { + float ratio = adjacentMech.getRatio(dir.getOpposite(), mechanical) / mechanical.getRatio(dir, adjacentMech); + long torque = mechanical.getTorque(); - if (Math.abs(torque + inversion * (adjacentMech.getTorque() / ratio * ACCELERATION)) < Math.abs(adjacentMech.getTorque() / ratio)) - mechanical.setTorque((long) (torque + inversion * ((adjacentMech.getTorque() / ratio * ACCELERATION)))); + boolean inverseRotation = mechanical.inverseRotation(dir, adjacentMech) && adjacentMech.inverseRotation(dir.getOpposite(), mechanical); - float velocity = mechanical.getAngularVelocity(); + int inversion = inverseRotation ? -1 : 1; - if (Math.abs(velocity + inversion * (adjacentMech.getAngularVelocity() * ratio * ACCELERATION)) < Math.abs(adjacentMech.getAngularVelocity() * ratio)) - mechanical.setAngularVelocity(velocity + (inversion * adjacentMech.getAngularVelocity() * ratio * ACCELERATION)); + if (Math.abs(torque + inversion * (adjacentMech.getTorque() / ratio * ACCELERATION)) < Math.abs(adjacentMech.getTorque() / ratio)) + mechanical.setTorque((long) (torque + inversion * ((adjacentMech.getTorque() / ratio * ACCELERATION)))); + + float velocity = mechanical.getAngularVelocity(); + + if (Math.abs(velocity + inversion * (adjacentMech.getAngularVelocity() * ratio * ACCELERATION)) < Math.abs(adjacentMech.getAngularVelocity() * ratio)) + mechanical.setAngularVelocity(velocity + (inversion * adjacentMech.getAngularVelocity() * ratio * ACCELERATION)); + } + } + } } } } @@ -117,18 +125,75 @@ public class MechanicalNetwork extends Network } @Override - public void reconstruct() + protected void reconstructConnector(IMechanical node) { - super.reconstruct(); + node.setNetwork(this); - if (canUpdate()) - NetworkTickHandler.addNetwork(this); + /** + * Cache connections. + */ + Object[] conn = node.getConnections(); + + if (conn == null && node instanceof TileEntity) + { + /** + * Default connection implementation + */ + conn = new Object[6]; + + for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) + { + TileEntity tile = new Vector3((TileEntity) node).translate(dir).getTileEntity(((TileEntity) node).worldObj); + + if (tile instanceof IMechanical) + { + IMechanical mech = ((IMechanical) tile).getInstance(dir.getOpposite()); + + if (mech != null && node.canConnect(dir, mech) && mech.canConnect(dir.getOpposite(), node)) + { + conn[dir.ordinal()] = mech; + } + } + } + } + + WeakReference[] connections = new WeakReference[conn.length]; + + for (int i = 0; i < connections.length; i++) + { + if (conn[i] != null) + { + if (conn[i] instanceof IMechanical) + { + IMechanical connected = ((IMechanical) conn[i]); + + if (connected.getNetwork() != this) + { + connected.getNetwork().getConnectors().clear(); + connected.setNetwork(this); + addConnector(connected); + reconstructConnector(connected); + } + } + + connections[i] = new WeakReference(conn[i]); + } + } + + connectionCache.put(node, connections); } @Override - protected void reconstructConnector(IMechanical connector) + public Object[] getConnectionsFor(IMechanical connector) { - connector.setNetwork(this); + Object[] conn = new Object[6]; + WeakReference[] connections = connectionCache.get(connector); + + for (int i = 0; i < connections.length; i++) + if (connections[i] != null) + conn[i] = connections[i].get(); + + return conn; } @Override diff --git a/mechanical/src/main/java/resonantinduction/mechanical/energy/network/PartMechanical.java b/mechanical/src/main/java/resonantinduction/mechanical/energy/network/PartMechanical.java index 5e842415..472bc0b3 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/energy/network/PartMechanical.java +++ b/mechanical/src/main/java/resonantinduction/mechanical/energy/network/PartMechanical.java @@ -28,11 +28,7 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu { private IMechanicalNetwork network; - /** The mechanical connections this connector has made */ - protected WeakReference[] connections = new WeakReference[6]; - protected float prevAngularVelocity, angularVelocity; - protected long torque; /** @@ -55,23 +51,6 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu this.tier = itemDamage; } - @Override - public boolean activate(EntityPlayer player, MovingObjectPosition hit, ItemStack item) - { - if (!world().isRemote) - { - int i = 0; - for (Object obj : connections) - if (obj != null) - i++; - - System.out.println("Connected with: " + i + ":" + getNetwork()); - // refresh(); - } - - return false; - } - @Override public void update() { @@ -102,33 +81,19 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu @Override public void onWorldJoin() { - refresh(); + getNetwork().reconstruct(); } @Override public void onNeighborChanged() { - refresh(); + getNetwork().reconstruct(); } @Override public void onPartChanged(TMultiPart part) { - refresh(); - } - - protected abstract void refresh(); - - @Override - public Object[] getConnections() - { - Object[] actualConnections = new Object[6]; - - for (int i = 0; i < connections.length; i++) - if (connections[i] != null) - actualConnections[i] = connections[i].get(); - - return actualConnections; + getNetwork().reconstruct(); } @Override diff --git a/mechanical/src/main/java/resonantinduction/mechanical/energy/network/TileMechanical.java b/mechanical/src/main/java/resonantinduction/mechanical/energy/network/TileMechanical.java index 19aad58d..d5046ab6 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/energy/network/TileMechanical.java +++ b/mechanical/src/main/java/resonantinduction/mechanical/energy/network/TileMechanical.java @@ -20,8 +20,6 @@ public abstract class TileMechanical extends TileAdvanced implements IMechanical { protected static final int PACKET_VELOCITY = Mechanical.contentRegistry.getNextPacketID(); - /** The mechanical connections this connector has made */ - protected Object[] connections = new Object[6]; private IMechanicalNetwork network; protected float angularVelocity; protected long torque; @@ -36,7 +34,7 @@ public abstract class TileMechanical extends TileAdvanced implements IMechanical @Override public void initiate() { - refresh(); + getNetwork().reconstruct(); } @Override @@ -105,14 +103,6 @@ public abstract class TileMechanical extends TileAdvanced implements IMechanical super.invalidate(); } - /** - * Refreshes all the connections of this block. - */ - public void refresh() - { - - } - protected float getLoad() { return 0.95f; @@ -121,26 +111,7 @@ public abstract class TileMechanical extends TileAdvanced implements IMechanical @Override public Object[] getConnections() { - connections = new Object[6]; - - for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) - { - TileEntity tile = new Vector3(this).translate(dir).getTileEntity(worldObj); - - if (tile instanceof IMechanical) - { - IMechanical mech = ((IMechanical) tile).getInstance(dir.getOpposite()); - - // Don't connect with shafts - if (mech != null && !(mech instanceof PartGearShaft) && canConnect(dir, this) && mech.canConnect(dir.getOpposite(), this)) - { - connections[dir.ordinal()] = mech; - getNetwork().merge(mech.getNetwork()); - } - } - } - - return connections; + return null; } @Override diff --git a/mechanical/src/main/java/resonantinduction/mechanical/energy/turbine/TileMechanicalTurbine.java b/mechanical/src/main/java/resonantinduction/mechanical/energy/turbine/TileMechanicalTurbine.java index f0a3b65c..59e191dd 100644 --- a/mechanical/src/main/java/resonantinduction/mechanical/energy/turbine/TileMechanicalTurbine.java +++ b/mechanical/src/main/java/resonantinduction/mechanical/energy/turbine/TileMechanicalTurbine.java @@ -17,36 +17,6 @@ public class TileMechanicalTurbine extends TileTurbine implements IMechanical energy = new EnergyStorageHandler(0); } - /** - * Mechanical Methods - * - * @return The connections. - */ - @Override - public Object[] getConnections() - { - Object[] connections = new Object[6]; - - for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) - { - TileEntity tile = new Vector3(this).translate(dir).getTileEntity(worldObj); - - if (tile instanceof IMechanical) - { - IMechanical mech = ((IMechanical) tile).getInstance(dir.getOpposite()); - - // Don't connect with shafts - if (mech != null && canConnect(dir, this) && mech.canConnect(dir.getOpposite(), this)) - { - connections[dir.ordinal()] = mech; - getNetwork().merge(mech.getNetwork()); - } - } - } - - return connections; - } - private IMechanicalNetwork network; @Override @@ -120,4 +90,10 @@ public class TileMechanicalTurbine extends TileTurbine implements IMechanical } return false; } + + @Override + public Object[] getConnections() + { + return null; + } } diff --git a/src/main/java/resonantinduction/core/prefab/fluid/FluidNetwork.java b/src/main/java/resonantinduction/core/prefab/fluid/FluidNetwork.java index 3c344f53..47bf964f 100644 --- a/src/main/java/resonantinduction/core/prefab/fluid/FluidNetwork.java +++ b/src/main/java/resonantinduction/core/prefab/fluid/FluidNetwork.java @@ -58,15 +58,7 @@ public abstract class FluidNetwork extends NodeNetwork(getConnectors())) - { - if (connector.getNetwork() instanceof IFluidNetwork) - { - connector.setNetwork(this); - } - - this.reconstructConnector(connector); - } + super.reconstruct(); this.reconstructTankInfo(); this.distributeConnectors(); @@ -75,6 +67,9 @@ public abstract class FluidNetwork extends NodeNetwork