Work on Universal Cable split logistics, I think I got this @unpairedbracket

This commit is contained in:
Aidan Brady 2013-12-16 17:54:27 -05:00
parent 5272d169c4
commit 6598295e3e
6 changed files with 76 additions and 45 deletions

View file

@ -120,7 +120,7 @@ public abstract class DynamicNetwork<A, N extends DynamicNetwork<A, N>> implemen
{ {
if(!fixed) if(!fixed)
{ {
++ticksSinceCreate; ticksSinceCreate++;
if(ticksSinceCreate > 1200) if(ticksSinceCreate > 1200)
{ {
@ -187,7 +187,7 @@ public abstract class DynamicNetwork<A, N extends DynamicNetwork<A, N>> implemen
TileEntity[] connectedBlocks = new TileEntity[6]; TileEntity[] connectedBlocks = new TileEntity[6];
boolean[] dealtWith = {false, false, false, false, false, false}; boolean[] dealtWith = {false, false, false, false, false, false};
List<NetworkFinder> newNetworks = new ArrayList<NetworkFinder>(); List<ITransmitterNetwork<A, N>> newNetworks = new ArrayList<ITransmitterNetwork<A, N>>();
for(ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) for(ForgeDirection side : ForgeDirection.VALID_DIRECTIONS)
{ {
@ -226,16 +226,6 @@ public abstract class DynamicNetwork<A, N extends DynamicNetwork<A, N>> implemen
} }
} }
newNetworks.add(finder);
}
}
if(newNetworks.size() > 0)
{
Object[] metaArray = getMetaArray(newNetworks);
for(NetworkFinder finder : newNetworks)
{
Set<ITransmitter<N>> newNetCables = new HashSet<ITransmitter<N>>(); Set<ITransmitter<N>> newNetCables = new HashSet<ITransmitter<N>>();
for(Object3D node : finder.iterated) for(Object3D node : finder.iterated)
@ -251,9 +241,17 @@ public abstract class DynamicNetwork<A, N extends DynamicNetwork<A, N>> implemen
} }
} }
ITransmitterNetwork<A, N> newNetwork = create(newNetCables); newNetworks.add(create(newNetCables));
newNetwork.onNewFromSplit(newNetworks.indexOf(finder), metaArray); }
newNetwork.refresh(); }
if(newNetworks.size() > 0)
{
onNetworksCreated((List<N>)newNetworks);
for(ITransmitterNetwork<A, N> network : newNetworks)
{
network.refresh();
} }
} }
@ -262,13 +260,7 @@ public abstract class DynamicNetwork<A, N extends DynamicNetwork<A, N>> implemen
} }
@Override @Override
public Object[] getMetaArray(List<NetworkFinder> networks) public void onNetworksCreated(List<N> networks) {}
{
return null;
}
@Override
public void onNewFromSplit(int netIndex, Object[] metaArray) {}
@Override @Override
public void setFixed(boolean value) public void setFixed(boolean value)

View file

@ -43,14 +43,5 @@ public interface ITransmitterNetwork<A, N extends DynamicNetwork<A, N>>
* @param size - the amount of new networks that are being created * @param size - the amount of new networks that are being created
* @return meta obj * @return meta obj
*/ */
public Object[] getMetaArray(List<NetworkFinder> networks); public void onNetworksCreated(List<N> 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);
} }

View file

@ -15,6 +15,7 @@ import mekanism.api.transmitters.DynamicNetwork;
import mekanism.api.transmitters.ITransmitter; import mekanism.api.transmitters.ITransmitter;
import mekanism.api.transmitters.TransmissionType; import mekanism.api.transmitters.TransmissionType;
import mekanism.common.util.CableUtils; import mekanism.common.util.CableUtils;
import mekanism.common.util.ListUtils;
import mekanism.common.util.MekanismUtils; import mekanism.common.util.MekanismUtils;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.ForgeDirection;
@ -66,6 +67,8 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
lastPowerScale = net.lastPowerScale; lastPowerScale = net.lastPowerScale;
} }
electricityStored += net.electricityStored;
addAllTransmitters(net.transmitters); addAllTransmitters(net.transmitters);
net.deregister(); net.deregister();
} }
@ -81,12 +84,36 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
//Use the harmonic mean. Because we're mean. //Use the harmonic mean. Because we're mean.
int numCables = transmitters.size(); int numCables = transmitters.size();
double reciprocalSum = 0; double reciprocalSum = 0;
for(ITransmitter<EnergyNetwork> cable : transmitters) for(ITransmitter<EnergyNetwork> cable : transmitters)
{ {
reciprocalSum += 1.0/(double)cable.getCapacity(); reciprocalSum += 1.0/(double)cable.getCapacity();
} }
return (double)numCables / reciprocalSum; return (double)numCables / reciprocalSum;
} }
@Override
public void onNetworksCreated(List<EnergyNetwork> 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() public synchronized double getEnergyNeeded()
{ {
@ -427,6 +454,7 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
network.joulesLastTick = joulesLastTick; network.joulesLastTick = joulesLastTick;
network.joulesTransmitted = joulesTransmitted; network.joulesTransmitted = joulesTransmitted;
network.lastPowerScale = lastPowerScale; network.lastPowerScale = lastPowerScale;
network.electricityStored += electricityStored;
return network; return network;
} }
@ -438,23 +466,14 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
network.joulesLastTick = joulesLastTick; network.joulesLastTick = joulesLastTick;
network.joulesTransmitted = joulesTransmitted; network.joulesTransmitted = joulesTransmitted;
network.lastPowerScale = lastPowerScale; network.lastPowerScale = lastPowerScale;
network.electricityStored += electricityStored;
return network; return network;
} }
@Override @Override
protected EnergyNetwork create(Set<EnergyNetwork> networks) protected EnergyNetwork create(Set<EnergyNetwork> networks)
{ {
EnergyNetwork network = new EnergyNetwork(networks); return new EnergyNetwork(networks);
if(joulesLastTick > network.joulesLastTick || clientEnergyScale > network.clientEnergyScale)
{
network.clientEnergyScale = clientEnergyScale;
network.joulesLastTick = joulesLastTick;
network.joulesTransmitted = joulesTransmitted;
network.lastPowerScale = lastPowerScale;
}
return network;
} }
@Override @Override
@ -472,6 +491,7 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
@Override @Override
public String getFlow() public String getFlow()
{ {
return MekanismUtils.getPowerDisplay(20*electricityStored); return "" + electricityStored;
//TODO return MekanismUtils.getPowerDisplay(20*electricityStored);
} }
} }

View file

@ -187,8 +187,11 @@ public abstract class PartTransmitter<N extends DynamicNetwork<?, N>> extends Pa
} }
else if(connectedNets.size() == 1) else if(connectedNets.size() == 1)
{ {
theNetwork = connectedNets.iterator().next(); N network = connectedNets.iterator().next();
preSingleMerge(network);
theNetwork = network;
theNetwork.transmitters.add((ITransmitter<N>)tile()); theNetwork.transmitters.add((ITransmitter<N>)tile());
theNetwork.refresh();
} }
else { else {
theNetwork = createNetworkByMergingSet(connectedNets); theNetwork = createNetworkByMergingSet(connectedNets);
@ -199,6 +202,8 @@ public abstract class PartTransmitter<N extends DynamicNetwork<?, N>> extends Pa
return theNetwork; return theNetwork;
} }
public void preSingleMerge(N network) {}
@Override @Override
public void removeFromTransmitterNetwork() public void removeFromTransmitterNetwork()
{ {

View file

@ -52,6 +52,7 @@ public class PartUniversalCable extends PartTransmitter<EnergyNetwork> implement
if(cacheEnergy > 0) if(cacheEnergy > 0)
{ {
getTransmitterNetwork().electricityStored += cacheEnergy; getTransmitterNetwork().electricityStored += cacheEnergy;
cacheEnergy = 0;
} }
} }
@ -91,6 +92,13 @@ public class PartUniversalCable extends PartTransmitter<EnergyNetwork> implement
cableIcons.registerCenterIcons(register, new String[] {"UniversalCable"}); cableIcons.registerCenterIcons(register, new String[] {"UniversalCable"});
cableIcons.registerSideIcon(register, "TransmitterSideSmall"); cableIcons.registerSideIcon(register, "TransmitterSideSmall");
} }
@Override
public void preSingleMerge(EnergyNetwork network)
{
network.electricityStored += cacheEnergy;
cacheEnergy = 0;
}
@Override @Override
public Icon getCenterIcon() public Icon getCenterIcon()

View file

@ -187,6 +187,21 @@ public class ListUtils
return split; 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) public static int[] splitInt(int size, int num)
{ {
int[] split = new int[size]; int[] split = new int[size];