diff --git a/common/mekanism/api/transmitters/DynamicNetwork.java b/common/mekanism/api/transmitters/DynamicNetwork.java index 76fbc5ef7..0282ffa30 100644 --- a/common/mekanism/api/transmitters/DynamicNetwork.java +++ b/common/mekanism/api/transmitters/DynamicNetwork.java @@ -120,7 +120,7 @@ public abstract class DynamicNetwork> implemen { if(!fixed) { - ++ticksSinceCreate; + ticksSinceCreate++; if(ticksSinceCreate > 1200) { @@ -187,7 +187,7 @@ public abstract class DynamicNetwork> implemen TileEntity[] connectedBlocks = new TileEntity[6]; boolean[] dealtWith = {false, false, false, false, false, false}; - List newNetworks = new ArrayList(); + List> newNetworks = new ArrayList>(); for(ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { @@ -226,16 +226,6 @@ public abstract class DynamicNetwork> implemen } } - newNetworks.add(finder); - } - } - - if(newNetworks.size() > 0) - { - Object[] metaArray = getMetaArray(newNetworks); - - for(NetworkFinder finder : newNetworks) - { Set> newNetCables = new HashSet>(); for(Object3D node : finder.iterated) @@ -251,9 +241,17 @@ public abstract class DynamicNetwork> implemen } } - ITransmitterNetwork newNetwork = create(newNetCables); - newNetwork.onNewFromSplit(newNetworks.indexOf(finder), metaArray); - newNetwork.refresh(); + newNetworks.add(create(newNetCables)); + } + } + + if(newNetworks.size() > 0) + { + onNetworksCreated((List)newNetworks); + + for(ITransmitterNetwork network : newNetworks) + { + network.refresh(); } } @@ -262,13 +260,7 @@ public abstract class DynamicNetwork> implemen } @Override - public Object[] getMetaArray(List networks) - { - return null; - } - - @Override - public void onNewFromSplit(int netIndex, Object[] metaArray) {} + public void onNetworksCreated(List networks) {} @Override public void setFixed(boolean value) diff --git a/common/mekanism/api/transmitters/ITransmitterNetwork.java b/common/mekanism/api/transmitters/ITransmitterNetwork.java index 4d463d513..8b4a58e89 100644 --- a/common/mekanism/api/transmitters/ITransmitterNetwork.java +++ b/common/mekanism/api/transmitters/ITransmitterNetwork.java @@ -43,14 +43,5 @@ public interface ITransmitterNetwork> * @param size - the amount of new networks that are being created * @return meta obj */ - public Object[] getMetaArray(List networks); - - /** - * Called right after a new network is created after being split, before it is refreshed. Passes in it's index - * in the amount of networks being created, as well as the meta value that was retrieved on the original network - * by getMetaObj(). - * @param netIndex - the index of the network being created - * @param meta - meta obj - */ - public void onNewFromSplit(int netIndex, Object[] metaArray); + public void onNetworksCreated(List networks); } diff --git a/common/mekanism/common/EnergyNetwork.java b/common/mekanism/common/EnergyNetwork.java index 07aea0fdb..d6502552d 100644 --- a/common/mekanism/common/EnergyNetwork.java +++ b/common/mekanism/common/EnergyNetwork.java @@ -15,6 +15,7 @@ import mekanism.api.transmitters.DynamicNetwork; import mekanism.api.transmitters.ITransmitter; import mekanism.api.transmitters.TransmissionType; import mekanism.common.util.CableUtils; +import mekanism.common.util.ListUtils; import mekanism.common.util.MekanismUtils; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; @@ -66,6 +67,8 @@ public class EnergyNetwork extends DynamicNetwork lastPowerScale = net.lastPowerScale; } + electricityStored += net.electricityStored; + addAllTransmitters(net.transmitters); net.deregister(); } @@ -81,12 +84,36 @@ public class EnergyNetwork extends DynamicNetwork //Use the harmonic mean. Because we're mean. int numCables = transmitters.size(); double reciprocalSum = 0; + for(ITransmitter cable : transmitters) { reciprocalSum += 1.0/(double)cable.getCapacity(); } + return (double)numCables / reciprocalSum; } + + @Override + public void onNetworksCreated(List networks) + { + double[] caps = new double[networks.size()]; + double cap = 0; + + for(EnergyNetwork network : networks) + { + caps[networks.indexOf(network)] = network.getCapacity(); + cap += network.getCapacity(); + } + + electricityStored = Math.min(cap, electricityStored); + + double[] percent = ListUtils.percent(caps); + + for(EnergyNetwork network : networks) + { + network.electricityStored = percent[networks.indexOf(network)]*electricityStored; + } + } public synchronized double getEnergyNeeded() { @@ -427,6 +454,7 @@ public class EnergyNetwork extends DynamicNetwork network.joulesLastTick = joulesLastTick; network.joulesTransmitted = joulesTransmitted; network.lastPowerScale = lastPowerScale; + network.electricityStored += electricityStored; return network; } @@ -438,23 +466,14 @@ public class EnergyNetwork extends DynamicNetwork network.joulesLastTick = joulesLastTick; network.joulesTransmitted = joulesTransmitted; network.lastPowerScale = lastPowerScale; + network.electricityStored += electricityStored; return network; } @Override protected EnergyNetwork create(Set networks) { - EnergyNetwork network = new EnergyNetwork(networks); - - if(joulesLastTick > network.joulesLastTick || clientEnergyScale > network.clientEnergyScale) - { - network.clientEnergyScale = clientEnergyScale; - network.joulesLastTick = joulesLastTick; - network.joulesTransmitted = joulesTransmitted; - network.lastPowerScale = lastPowerScale; - } - - return network; + return new EnergyNetwork(networks); } @Override @@ -472,6 +491,7 @@ public class EnergyNetwork extends DynamicNetwork @Override public String getFlow() { - return MekanismUtils.getPowerDisplay(20*electricityStored); + return "" + electricityStored; + //TODO return MekanismUtils.getPowerDisplay(20*electricityStored); } } diff --git a/common/mekanism/common/multipart/PartTransmitter.java b/common/mekanism/common/multipart/PartTransmitter.java index bbe75aa66..5ddef1123 100644 --- a/common/mekanism/common/multipart/PartTransmitter.java +++ b/common/mekanism/common/multipart/PartTransmitter.java @@ -187,8 +187,11 @@ public abstract class PartTransmitter> extends Pa } else if(connectedNets.size() == 1) { - theNetwork = connectedNets.iterator().next(); + N network = connectedNets.iterator().next(); + preSingleMerge(network); + theNetwork = network; theNetwork.transmitters.add((ITransmitter)tile()); + theNetwork.refresh(); } else { theNetwork = createNetworkByMergingSet(connectedNets); @@ -199,6 +202,8 @@ public abstract class PartTransmitter> extends Pa return theNetwork; } + public void preSingleMerge(N network) {} + @Override public void removeFromTransmitterNetwork() { diff --git a/common/mekanism/common/multipart/PartUniversalCable.java b/common/mekanism/common/multipart/PartUniversalCable.java index 6cc3ee7a0..af096d240 100644 --- a/common/mekanism/common/multipart/PartUniversalCable.java +++ b/common/mekanism/common/multipart/PartUniversalCable.java @@ -52,6 +52,7 @@ public class PartUniversalCable extends PartTransmitter implement if(cacheEnergy > 0) { getTransmitterNetwork().electricityStored += cacheEnergy; + cacheEnergy = 0; } } @@ -91,6 +92,13 @@ public class PartUniversalCable extends PartTransmitter implement cableIcons.registerCenterIcons(register, new String[] {"UniversalCable"}); cableIcons.registerSideIcon(register, "TransmitterSideSmall"); } + + @Override + public void preSingleMerge(EnergyNetwork network) + { + network.electricityStored += cacheEnergy; + cacheEnergy = 0; + } @Override public Icon getCenterIcon() diff --git a/common/mekanism/common/util/ListUtils.java b/common/mekanism/common/util/ListUtils.java index c8e003572..ab1a0e001 100644 --- a/common/mekanism/common/util/ListUtils.java +++ b/common/mekanism/common/util/ListUtils.java @@ -187,6 +187,21 @@ public class ListUtils return split; } + public static double[] percent(double[] values) + { + double[] ret = new double[values.length]; + double total = 0; + + for(double d : values) total += d; + + for(int i = 0; i < values.length; i++) + { + ret[i] = values[i]/total; + } + + return ret; + } + public static int[] splitInt(int size, int num) { int[] split = new int[size];