diff --git a/me/cache/EnergyGridCache.java b/me/cache/EnergyGridCache.java index f9db257f7..e140842cc 100644 --- a/me/cache/EnergyGridCache.java +++ b/me/cache/EnergyGridCache.java @@ -166,7 +166,17 @@ public class EnergyGridCache implements IEnergyGrid @Override public double getEnergyDemand(double maxRequired) { + localSeen.clear(); + return getEnergyDemand( maxRequired, localSeen ); + } + + public double getEnergyDemand(double maxRequired, Set seen) + { + if ( !seen.add( this ) ) + return 0; + double required = buffer() - extra; + Iterator it = requesters.iterator(); while (required < maxRequired && it.hasNext()) { @@ -174,54 +184,88 @@ public class EnergyGridCache implements IEnergyGrid if ( node.getPowerFlow() != AccessRestriction.READ ) required += Math.max( 0.0, node.getAEMaxPower() - node.getAECurrentPower() ); } + + Iterator ix = gproviders.iterator(); + while (required < maxRequired && ix.hasNext()) + { + IEnergyGridProvider node = ix.next(); + required += node.getEnergyDemand( maxRequired - required, seen ); + } + return required; } @Override - public double injectPower(double i, Actionable mode) + public double injectPower(double amt, Actionable mode) { + localSeen.clear(); + return injectAEPower( amt, mode, localSeen ); + } + + public double injectAEPower(double amt, Actionable mode, Set seen) + { + if ( !seen.add( this ) ) + return 0; + double ignore = extra; - i += extra; + amt += extra; if ( mode == Actionable.SIMULATE ) { Iterator it = requesters.iterator(); - while (i > 0 && it.hasNext()) + while (amt > 0 && it.hasNext()) { IAEPowerStorage node = it.next(); - i = node.injectAEPower( i, Actionable.SIMULATE ); + amt = node.injectAEPower( amt, Actionable.SIMULATE ); } + + Iterator i = gproviders.iterator(); + while (amt > 0 && i.hasNext()) + amt = i.next().injectAEPower( amt, mode, seen ); } else { - tickInjectionPerTick += i - ignore; + tickInjectionPerTick += amt - ignore; // totalInjectionPastTicks[0] += i; - while (i > 0 && !requesters.isEmpty()) + while (amt > 0 && !requesters.isEmpty()) { IAEPowerStorage node = getFirstRequestor(); - i = node.injectAEPower( i, Actionable.MODULATE ); - if ( i > 0 ) + amt = node.injectAEPower( amt, Actionable.MODULATE ); + if ( amt > 0 ) { requesters.remove( node ); lastRequestor = null; } } - extra = i; + Iterator i = gproviders.iterator(); + while (amt > 0 && i.hasNext()) + { + IEnergyGridProvider what = i.next(); + Set listCopy = new HashSet(); + listCopy.addAll( seen ); + + double cannotHold = what.injectAEPower( amt, Actionable.SIMULATE, listCopy ); + what.injectAEPower( amt - cannotHold, mode, seen ); + + amt = cannotHold; + } + + extra = amt; } - return Math.max( 0.0, i - buffer() ); + return Math.max( 0.0, amt - buffer() ); } - Set seen = new HashSet(); + Set localSeen = new HashSet(); @Override public double extractAEPower(double amt, Actionable mode, PowerMultiplier pm) { - seen.clear(); - return pm.divide( extractAEPower( pm.multiply( amt ), mode, seen ) ); + localSeen.clear(); + return pm.divide( extractAEPower( pm.multiply( amt ), mode, localSeen ) ); } @Override diff --git a/parts/networking/PartQuartzFiber.java b/parts/networking/PartQuartzFiber.java index 6bd5e3e75..1570cb390 100644 --- a/parts/networking/PartQuartzFiber.java +++ b/parts/networking/PartQuartzFiber.java @@ -152,10 +152,67 @@ public class PartQuartzFiber extends AEBasePart implements IEnergyGridProvider return aquiredPower; } + @Override + public double injectAEPower(double amt, Actionable mode, Set seen) + { + + try + { + IEnergyGrid eg = proxy.getEnergy(); + if ( !seen.contains( eg ) ) + return eg.injectAEPower( amt, mode, seen ); + } + catch (GridAccessException e) + { + // :P + } + + try + { + IEnergyGrid eg = outerProxy.getEnergy(); + if ( !seen.contains( eg ) ) + return eg.injectAEPower( amt, mode, seen ); + } + catch (GridAccessException e) + { + // :P + } + + return amt; + } + @Override public int cableConnectionRenderTo() { return 16; } + @Override + public double getEnergyDemand(double amt, Set seen) + { + double demand = 0; + + try + { + IEnergyGrid eg = proxy.getEnergy(); + demand += eg.getEnergyDemand( amt - demand, seen ); + } + catch (GridAccessException e) + { + // :P + } + + try + { + IEnergyGrid eg = outerProxy.getEnergy(); + demand += eg.getEnergyDemand( amt - demand, seen ); + } + catch (GridAccessException e) + { + // :P + } + + return demand; + } + }