diff --git a/src/main/java/mekanism/api/transmitters/DynamicNetwork.java b/src/main/java/mekanism/api/transmitters/DynamicNetwork.java index e364cf81e..abdb5f4e3 100644 --- a/src/main/java/mekanism/api/transmitters/DynamicNetwork.java +++ b/src/main/java/mekanism/api/transmitters/DynamicNetwork.java @@ -62,30 +62,39 @@ public abstract class DynamicNetwork> implemen { if(transmitter.isValid()) { - if(worldObj == null) worldObj = transmitter.world(); + if(worldObj == null) + { + worldObj = transmitter.world(); + } + Coord4D coord = transmitter.coord(); + for(ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { A acceptor = transmitter.getAcceptor(side); + if(acceptor != null) { Coord4D acceptorCoord = coord.getFromSide(side); possibleAcceptors.put(acceptorCoord, acceptor); EnumSet directions = acceptorDirections.get(acceptorCoord); + if(directions != null) { directions.add(side.getOpposite()); - } else - { + } + else { acceptorDirections.put(acceptorCoord, EnumSet.of(side.getOpposite())); } } } + transmitter.setTransmitterNetwork((N)this); absorbBuffer(transmitter); transmitters.add(transmitter); } } + updateCapacity(); clampBuffer(); queueClientUpdate(new ArrayList<>(transmittersToAdd)); @@ -104,22 +113,24 @@ public abstract class DynamicNetwork> implemen A acceptor = transmitter.getAcceptor(side); Coord4D acceptorCoord = transmitter.coord().getFromSide(side); EnumSet directions = acceptorDirections.get(acceptorCoord); + if(acceptor != null) { possibleAcceptors.put(acceptorCoord, acceptor); + if(directions != null) { directions.add(side.getOpposite()); - } else - { + } + else { acceptorDirections.put(acceptorCoord, EnumSet.of(side.getOpposite())); } } - else - { + else { if(directions != null) { directions.remove(side.getOpposite()); + if(directions.isEmpty()) { possibleAcceptors.remove(acceptorCoord); @@ -129,6 +140,7 @@ public abstract class DynamicNetwork> implemen } } } + changedAcceptors.clear(); } } @@ -143,6 +155,7 @@ public abstract class DynamicNetwork> implemen { invalidateTransmitter(transmitter); } + transmitters.clear(); deregister(); } @@ -160,13 +173,15 @@ public abstract class DynamicNetwork> implemen public void acceptorChanged(IGridTransmitter transmitter, ForgeDirection side) { EnumSet directions = changedAcceptors.get(transmitter); + if(directions != null) { directions.add(side); - } else - { + } + else { changedAcceptors.put(transmitter, EnumSet.of(side)); } + TransmitterNetworkRegistry.registerChangedNetwork(this); } @@ -178,16 +193,18 @@ public abstract class DynamicNetwork> implemen transmitters.add(transmitter); transmittersAdded.add(transmitter); } + possibleAcceptors.putAll(net.possibleAcceptors); + for(Entry> entry : net.acceptorDirections.entrySet()) { Coord4D coord = entry.getKey(); + if(acceptorDirections.containsKey(coord)) { acceptorDirections.get(coord).addAll(entry.getValue()); } - else - { + else { acceptorDirections.put(coord, entry.getValue()); } } @@ -315,8 +332,7 @@ public abstract class DynamicNetwork> implemen { Iterator i = updateQueue.iterator(); - try - { + try { while(i.hasNext()) { DelayQueue q = i.next(); @@ -324,16 +340,14 @@ public abstract class DynamicNetwork> implemen if(q.delay > 0) { q.delay--; - } else - { + } + else { transmittersAdded.addAll(transmitters); updateDelay = 1; i.remove(); } } - } catch(Exception e) - { - } + } catch(Exception e) {} if(updateDelay > 0) { diff --git a/src/main/java/mekanism/api/transmitters/TransmitterNetworkRegistry.java b/src/main/java/mekanism/api/transmitters/TransmitterNetworkRegistry.java index 1b9735a39..e292896e6 100644 --- a/src/main/java/mekanism/api/transmitters/TransmitterNetworkRegistry.java +++ b/src/main/java/mekanism/api/transmitters/TransmitterNetworkRegistry.java @@ -127,12 +127,14 @@ public class TransmitterNetworkRegistry for(IGridTransmitter orphanTransmitter : orphanTransmitters.values()) { DynamicNetwork network = getNetworkFromOrphan(orphanTransmitter); + if(network != null) { networksToChange.add(network); network.register(); } } + orphanTransmitters.clear(); } @@ -143,6 +145,7 @@ public class TransmitterNetworkRegistry OrphanPathFinder finder = new OrphanPathFinder<>(startOrphan); finder.start(); N network; + switch(finder.networksFound.size()) { case 0: @@ -157,9 +160,12 @@ public class TransmitterNetworkRegistry Mekanism.logger.debug("Merging " + finder.networksFound.size() + " networks"); network = startOrphan.mergeNetworks(finder.networksFound); } + network.addNewTransmitters(finder.connectedTransmitters); + return network; } + return null; } @@ -169,6 +175,7 @@ public class TransmitterNetworkRegistry { network.commit(); } + networksToChange.clear(); } @@ -185,8 +192,7 @@ public class TransmitterNetworkRegistry for(DynamicNetwork network : networks) { - strings[i] = network.toString(); - ++i; + strings[i++] = network.toString(); } return strings; @@ -214,21 +220,27 @@ public class TransmitterNetworkRegistry public void iterate(Coord4D from, ForgeDirection fromDirection) { if(iterated.contains(from)) + { return; + } iterated.add(from); + if(orphanTransmitters.containsKey(from)) { IGridTransmitter transmitter = orphanTransmitters.get(from); + if(transmitter.isValid() && transmitter.isOrphan()) { connectedTransmitters.add(transmitter); transmitter.setOrphan(false); + for(ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) { if(direction != fromDirection) { Coord4D directionCoord = transmitter.getAdjacentConnectableTransmitterCoord(direction); + if(!(directionCoord == null || iterated.contains(directionCoord))) { iterate(directionCoord, direction.getOpposite()); @@ -236,8 +248,8 @@ public class TransmitterNetworkRegistry } } } - } else - { + } + else { addNetworkToIterated(from); } } diff --git a/src/main/java/mekanism/common/multipart/MultipartTransmitter.java b/src/main/java/mekanism/common/multipart/MultipartTransmitter.java index f454098ea..a6d200b44 100644 --- a/src/main/java/mekanism/common/multipart/MultipartTransmitter.java +++ b/src/main/java/mekanism/common/multipart/MultipartTransmitter.java @@ -61,6 +61,7 @@ public class MultipartTransmitter> extends Tran return sideCoord; } } + return null; } @@ -86,14 +87,17 @@ public class MultipartTransmitter> extends Tran public N getExternalNetwork(Coord4D from) { TileEntity tile = from.getTileEntity(world()); + if(tile instanceof ITransmitterTile) { IGridTransmitter transmitter = ((ITransmitterTile)tile).getTransmitter(); + if(TransmissionType.checkTransmissionType(transmitter, getTransmissionType())); { return ((IGridTransmitter)transmitter).getTransmitterNetwork(); } } + return null; } diff --git a/src/main/java/mekanism/common/multipart/PartPressurizedTube.java b/src/main/java/mekanism/common/multipart/PartPressurizedTube.java index 49c895c5d..8e45a17f9 100644 --- a/src/main/java/mekanism/common/multipart/PartPressurizedTube.java +++ b/src/main/java/mekanism/common/multipart/PartPressurizedTube.java @@ -295,5 +295,4 @@ public class PartPressurizedTube extends PartTransmitter> extends public void onWorldJoin() { super.onWorldJoin(); + if(!world().isRemote) { TransmitterNetworkRegistry.registerOrphanTransmitter(getTransmitter()); } - else - { + else { MinecraftForge.EVENT_BUS.post(new NetworkClientRequest(tile())); } } @@ -47,13 +47,13 @@ public abstract class PartTransmitter> extends public void onChunkUnload() { super.onChunkUnload(); + if(!world().isRemote) { getTransmitter().takeShare(); TransmitterNetworkRegistry.invalidateTransmitter(getTransmitter()); } - else - { + else { getTransmitter().setTransmitterNetwork(null); } } @@ -65,10 +65,10 @@ public abstract class PartTransmitter> extends { TransmitterNetworkRegistry.invalidateTransmitter(getTransmitter()); } - else - { + else { getTransmitter().setTransmitterNetwork(null); } + super.preRemove(); } @@ -82,9 +82,10 @@ public abstract class PartTransmitter> extends public void markDirtyTransmitters() { super.markDirtyTransmitters(); + if(getTransmitter().hasTransmitterNetwork()) { - TransmitterNetworkRegistry.invalidateTransmitter(getTransmitter()); + TransmitterNetworkRegistry.invalidateTransmitter(getTransmitter()); } } @@ -92,6 +93,7 @@ public abstract class PartTransmitter> extends public void markDirtyAcceptor(ForgeDirection side) { super.markDirtyAcceptor(side); + if(getTransmitter().hasTransmitterNetwork()) { getTransmitter().getTransmitterNetwork().acceptorChanged(getTransmitter(), side); @@ -101,10 +103,12 @@ public abstract class PartTransmitter> extends public A getCachedAcceptor(ForgeDirection side) { ConnectionType type = connectionTypes[side.ordinal()]; + if(type == ConnectionType.PULL || type == ConnectionType.NONE) { return null; } + return connectionMapContainsSide(currentAcceptorConnections, side) ? (A)cachedAcceptors[side.ordinal()] : null; }