Merge pull request #1257 from markwhi/miner_chargepad_fixes

DynamicNetwork capcity optimizations and two small bugfixes.
This commit is contained in:
Aidan 2014-03-26 09:15:52 -04:00
commit 42903c9dfe
6 changed files with 102 additions and 55 deletions

View file

@ -44,12 +44,14 @@ public class GasNetwork extends DynamicNetwork<IGasHandler, GasNetwork>
public GasNetwork(IGridTransmitter<GasNetwork>... varPipes)
{
transmitters.addAll(Arrays.asList(varPipes));
updateCapacity();
register();
}
public GasNetwork(Collection<IGridTransmitter<GasNetwork>> collection)
{
transmitters.addAll(collection);
updateCapacity();
register();
}
@ -94,6 +96,7 @@ public class GasNetwork extends DynamicNetwork<IGasHandler, GasNetwork>
gasScale = getScale();
updateCapacity();
refresh();
register();
}
@ -300,6 +303,7 @@ public class GasNetwork extends DynamicNetwork<IGasHandler, GasNetwork>
{
Set<IGridTransmitter<GasNetwork>> iterTubes = (Set<IGridTransmitter<GasNetwork>>)transmitters.clone();
Iterator<IGridTransmitter<GasNetwork>> it = iterTubes.iterator();
boolean networkChanged = false;
possibleAcceptors.clear();
acceptorDirections.clear();
@ -311,6 +315,7 @@ public class GasNetwork extends DynamicNetwork<IGasHandler, GasNetwork>
if(conductor == null || ((TileEntity)conductor).isInvalid())
{
it.remove();
networkChanged = true;
transmitters.remove(conductor);
}
else {
@ -333,6 +338,10 @@ public class GasNetwork extends DynamicNetwork<IGasHandler, GasNetwork>
}
}
}
if (networkChanged) {
updateCapacity();
}
}
@Override

View file

@ -30,7 +30,10 @@ public abstract class DynamicNetwork<A, N extends DynamicNetwork<A, N>> implemen
private List<DelayQueue> updateQueue = new ArrayList<DelayQueue>();
protected int ticksSinceCreate = 0;
protected int capacity = 0;
protected double meanCapacity = 0;
protected boolean fixed = false;
protected boolean needsUpdate = false;
@ -44,6 +47,7 @@ public abstract class DynamicNetwork<A, N extends DynamicNetwork<A, N>> implemen
public void addAllTransmitters(Set<IGridTransmitter<N>> newTransmitters)
{
transmitters.addAll(newTransmitters);
updateCapacity();
}
public boolean isFirst(IGridTransmitter<N> transmitter)
@ -55,7 +59,8 @@ public abstract class DynamicNetwork<A, N extends DynamicNetwork<A, N>> implemen
public void removeTransmitter(IGridTransmitter<N> transmitter)
{
transmitters.remove(transmitter);
updateCapacity();
if(transmitters.size() == 0)
{
deregister();
@ -107,20 +112,33 @@ public abstract class DynamicNetwork<A, N extends DynamicNetwork<A, N>> implemen
return possibleAcceptors.size();
}
public int getCapacity()
{
return (int)getMeanCapacity() * transmitters.size();
protected synchronized void updateCapacity() {
updateMeanCapacity();
capacity = (int)meanCapacity * transmitters.size();
}
/**
* Override this if things can have variable capacity along the network.
* @return An 'average' value of capacity. Calculate it how you will.
*/
public double getMeanCapacity()
{
return transmitters.size() > 0 ? transmitters.iterator().next().getCapacity() : 0;
/**
* Override this if things can have variable capacity along the network.
* @return An 'average' value of capacity. Calculate it how you will.
*/
protected synchronized void updateMeanCapacity() {
if (transmitters.size() > 0) {
meanCapacity = transmitters.iterator().next().getCapacity();
} else {
meanCapacity = 0;
}
}
public int getCapacity()
{
return capacity;
}
public double getMeanCapacity()
{
return meanCapacity;
}
@Override
public void tick()
{

View file

@ -41,12 +41,14 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
public EnergyNetwork(IGridTransmitter<EnergyNetwork>... varCables)
{
transmitters.addAll(Arrays.asList(varCables));
updateCapacity();
register();
}
public EnergyNetwork(Collection<IGridTransmitter<EnergyNetwork>> collection)
{
transmitters.addAll(collection);
updateCapacity();
register();
}
@ -80,46 +82,46 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
register();
}
@Override
public double getMeanCapacity()
@Override
protected synchronized void updateMeanCapacity()
{
//Use the harmonic mean. Because we're mean.
int numCables = transmitters.size();
double reciprocalSum = 0;
int numCables = transmitters.size();
double reciprocalSum = 0;
for(IGridTransmitter<EnergyNetwork> cable : transmitters)
{
reciprocalSum += 1.0/(double)cable.getCapacity();
}
for(IGridTransmitter<EnergyNetwork> cable : transmitters)
{
reciprocalSum += 1.0/(double)cable.getCapacity();
}
return (double)numCables / reciprocalSum;
meanCapacity = (double)numCables / reciprocalSum;
}
@Override
public void onNetworksCreated(List<EnergyNetwork> networks)
{
if(FMLCommonHandler.instance().getEffectiveSide().isServer())
{
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 = round(percent[networks.indexOf(network)]*electricityStored);
}
}
}
@Override
public void onNetworksCreated(List<EnergyNetwork> networks)
{
if(FMLCommonHandler.instance().getEffectiveSide().isServer())
{
double[] caps = new double[networks.size()];
double cap = 0;
for(EnergyNetwork network : networks)
{
double networkCapacity = network.getCapacity();
caps[networks.indexOf(network)] = networkCapacity;
cap += networkCapacity;
}
electricityStored = Math.min(cap, electricityStored);
double[] percent = ListUtils.percent(caps);
for(EnergyNetwork network : networks)
{
network.electricityStored = round(percent[networks.indexOf(network)]*electricityStored);
}
}
}
public synchronized double getEnergyNeeded()
{
if(FMLCommonHandler.instance().getEffectiveSide().isClient())
@ -312,7 +314,8 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
{
Set<IGridTransmitter<EnergyNetwork>> iterCables = (Set<IGridTransmitter<EnergyNetwork>>)transmitters.clone();
Iterator<IGridTransmitter<EnergyNetwork>> it = iterCables.iterator();
boolean networkChanged = false;
possibleAcceptors.clear();
acceptorDirections.clear();
@ -324,6 +327,7 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
{
it.remove();
transmitters.remove(conductor);
networkChanged = true;
}
else {
conductor.setTransmitterNetwork(this);
@ -346,6 +350,10 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
}
}
if (networkChanged) {
this.updateCapacity();
}
needsUpdate = true;
}
@ -448,6 +456,7 @@ public class EnergyNetwork extends DynamicNetwork<TileEntity, EnergyNetwork>
network.joulesTransmitted = joulesTransmitted;
network.lastPowerScale = lastPowerScale;
network.electricityStored += electricityStored;
network.updateCapacity();
return network;
}

View file

@ -42,12 +42,14 @@ public class FluidNetwork extends DynamicNetwork<IFluidHandler, FluidNetwork>
public FluidNetwork(IGridTransmitter<FluidNetwork>... varPipes)
{
transmitters.addAll(Arrays.asList(varPipes));
updateCapacity();
register();
}
public FluidNetwork(Collection<IGridTransmitter<FluidNetwork>> collection)
{
transmitters.addAll(collection);
updateCapacity();
register();
}
@ -92,6 +94,8 @@ public class FluidNetwork extends DynamicNetwork<IFluidHandler, FluidNetwork>
fluidScale = getScale();
updateCapacity();
refresh();
register();
}
@ -298,7 +302,8 @@ public class FluidNetwork extends DynamicNetwork<IFluidHandler, FluidNetwork>
{
Set<IGridTransmitter<FluidNetwork>> iterPipes = (Set<IGridTransmitter<FluidNetwork>>)transmitters.clone();
Iterator it = iterPipes.iterator();
boolean networkChanged = false;
possibleAcceptors.clear();
acceptorDirections.clear();
@ -309,6 +314,7 @@ public class FluidNetwork extends DynamicNetwork<IFluidHandler, FluidNetwork>
if(conductor == null || ((TileEntity)conductor).isInvalid())
{
it.remove();
networkChanged = true;
transmitters.remove(conductor);
}
else {
@ -331,6 +337,10 @@ public class FluidNetwork extends DynamicNetwork<IFluidHandler, FluidNetwork>
}
}
}
if(networkChanged) {
updateCapacity();
}
}
@Override

View file

@ -11,6 +11,7 @@ import mekanism.common.tile.TileEntityDigitalMiner;
import mekanism.common.util.MekanismUtils;
import net.minecraft.block.Block;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
public class ThreadMinerSearch extends Thread
{
@ -66,7 +67,8 @@ public class ThreadMinerSearch extends Thread
continue;
}
if(tileEntity.worldObj.getBlockTileEntity(x, y, z) instanceof IBoundingBlock)
TileEntity bte;
if ((bte = tileEntity.worldObj.getBlockTileEntity(x, y, z)) != null && bte instanceof IBoundingBlock)
{
continue;
}

View file

@ -53,9 +53,8 @@ public class TileEntityChargepad extends TileEntityElectricBlock implements IAct
if(!worldObj.isRemote)
{
isActive = false;
List<EntityLiving> entities = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord+1, yCoord+0.2, zCoord+1));
List<EntityLivingBase> entities = worldObj.getEntitiesWithinAABB(EntityLivingBase.class, AxisAlignedBB.getBoundingBox(xCoord, yCoord, zCoord, xCoord+1, yCoord+0.2, zCoord+1));
for(EntityLivingBase entity : entities)
{
if(entity instanceof EntityPlayer || entity instanceof EntityRobit)