From 1c05dd5834727b30fefcd9b4cf74cb25035d05ed Mon Sep 17 00:00:00 2001 From: yueh Date: Fri, 29 Sep 2017 20:32:20 +0200 Subject: [PATCH] Further improvments for the energygrid. (#3107) * Further improvments for the enerygrid. Simplified quartz fiber. Removed different Actionable code paths and replaced with a unified approach. Dropped lastProvider/Requester, it simply iterates over all, but still drops them when necessary. --- .../energy/IEnergyGridProvider.java | 77 +++++++++- .../java/appeng/me/cache/EnergyGridCache.java | 139 ++++-------------- .../parts/networking/PartQuartzFiber.java | 110 ++------------ 3 files changed, 112 insertions(+), 214 deletions(-) diff --git a/src/api/java/appeng/api/networking/energy/IEnergyGridProvider.java b/src/api/java/appeng/api/networking/energy/IEnergyGridProvider.java index d7e6d7822..37add40b3 100644 --- a/src/api/java/appeng/api/networking/energy/IEnergyGridProvider.java +++ b/src/api/java/appeng/api/networking/energy/IEnergyGridProvider.java @@ -25,7 +25,9 @@ package appeng.api.networking.energy; import java.util.Collection; -import java.util.Set; + +import javax.annotation.Nonnegative; +import javax.annotation.Nonnull; import appeng.api.config.Actionable; @@ -36,32 +38,91 @@ import appeng.api.config.Actionable; public interface IEnergyGridProvider { /** + * internal use only + * + * Can return a list of providers behind the current. + * + * An example would be something acting as proxy between different {@link IEnergyGrid}s. + * + * This can contain duplicate entries, AE will ensure that each provider is only visited once. + * * internal use only */ + @Nonnull Collection providers(); /** * internal use only + * + * Extracts the requested amount from the provider. + * + * This should never forward a call to another {@link IEnergyGridProvider}, instead return them via + * {@link IEnergyGridProvider#providers()} + * + * @return the used amount */ - double extractProviderPower( double amt, Actionable mode, Set seen ); + @Nonnegative + double extractProviderPower( @Nonnegative double amt, @Nonnull Actionable mode ); + + /** + * Injects the offered amount into the provider. + * + * This should never forward a call to another {@link IEnergyGridProvider}, instead return them via + * {@link IEnergyGridProvider#providers()} + * + * internal use only + * + * @return the leftover amount + */ + @Nonnegative + double injectProviderPower( @Nonnegative double amt, @Nonnull Actionable mode ); /** * internal use only + * + * Returns the current demand of an provider. + * + * This should never forward a call to another {@link IEnergyGridProvider}, instead return them via + * {@link IEnergyGridProvider#providers()} + * + * + * @param d the max amount offered, the demand should never exceed it. + * @return the total amount demanded */ - double injectProviderPower( double amt, Actionable mode, Set seen ); - - /** - * internal use only - */ - double getProviderEnergyDemand( double d, Set seen ); + @Nonnegative + double getProviderEnergyDemand( @Nonnegative double d ); /** * internal use only + * + * AE currently uses this to enqueue the next visited provider. + * + * There is no guarantee that this works on in a perfect way. + * It can be limited to the returns of the past {@link IEnergyGridProvider#providers()}, but not any future one + * discovered by visiting further providers. + * + * E.g. inject into the the lowest one first or extract from the highest one. + * + * @return the current stored amount. + * + * */ + @Nonnegative double getProviderStoredEnergy(); /** * internal use only + * + * AE currently uses this to enqueue the next visited provider. + * + * There is no guarantee that this works on in a perfect way. + * It can be limited to the returns of the past {@link IEnergyGridProvider#providers()}, but not any future one + * discovered by visiting further providers. + * + * E.g. inject into the the lowest one first or extract from the highest one. + * + * @return the maximum amount stored. */ + @Nonnegative double getProviderMaxEnergy(); } diff --git a/src/main/java/appeng/me/cache/EnergyGridCache.java b/src/main/java/appeng/me/cache/EnergyGridCache.java index e4a4abc12..2b4656623 100644 --- a/src/main/java/appeng/me/cache/EnergyGridCache.java +++ b/src/main/java/appeng/me/cache/EnergyGridCache.java @@ -106,8 +106,6 @@ public class EnergyGridCache implements IEnergyGrid private boolean hasPower = true; private long ticksSinceHasPowerChange = 900; - private IAEPowerStorage lastProvider; - private IAEPowerStorage lastRequester; private PathGridCache pgc; private double lastStoredPower = -1; @@ -127,7 +125,7 @@ public class EnergyGridCache implements IEnergyGrid } @MENetworkEventSubscribe - public void EnergyNodeChanges( final MENetworkPowerIdleChange ev ) + public void nodeIdlePowerChangeHandler( final MENetworkPowerIdleChange ev ) { // update power usage based on event. final GridNode node = (GridNode) ev.node; @@ -141,7 +139,7 @@ public class EnergyGridCache implements IEnergyGrid } @MENetworkEventSubscribe - public void EnergyNodeChanges( final MENetworkPowerStorage ev ) + public void storagePowerChangeHandler( final MENetworkPowerStorage ev ) { if( ev.storage.isAEPublicPowerStorage() ) { @@ -247,7 +245,7 @@ public class EnergyGridCache implements IEnergyGrid final IEnergyGridProvider next = toVisit.poll(); visited.add( next ); - extracted += next.extractProviderPower( toExtract - extracted, mode, visited ); + extracted += next.extractProviderPower( toExtract - extracted, mode ); for( IEnergyGridProvider iEnergyGridProvider : next.providers() ) { @@ -299,19 +297,24 @@ public class EnergyGridCache implements IEnergyGrid } @Override - public double extractProviderPower( final double amt, final Actionable mode, final Set seen ) + public double extractProviderPower( final double amt, final Actionable mode ) { double extractedPower = 0; - if( mode == Actionable.SIMULATE ) - { - extractedPower += this.simulateExtract( extractedPower, amt ); + final Iterator it = this.providers.iterator(); - return extractedPower; - } - else + while( extractedPower < amt && it.hasNext() ) { - extractedPower = this.doExtract( extractedPower, amt ); + final IAEPowerStorage node = it.next(); + + final double req = amt - extractedPower; + final double newPower = node.extractAEPower( req, mode, PowerMultiplier.ONE ); + extractedPower += newPower; + + if( newPower < req ) + { + it.remove(); + } } // got more then we wanted? @@ -331,32 +334,23 @@ public class EnergyGridCache implements IEnergyGrid } @Override - public double injectProviderPower( double amt, final Actionable mode, final Set seen ) + public double injectProviderPower( double amt, final Actionable mode ) { - if( mode == Actionable.SIMULATE ) - { - final Iterator it = this.requesters.iterator(); - while( amt > 0 && it.hasNext() ) - { - final IAEPowerStorage node = it.next(); - amt = node.injectAEPower( amt, Actionable.SIMULATE ); - } - - } - else + if( mode == Actionable.MODULATE ) { this.tickInjectionPerTick += amt; + } - while( amt > 0 && !this.requesters.isEmpty() ) + final Iterator it = this.requesters.iterator(); + + while( amt > 0 && it.hasNext() ) + { + final IAEPowerStorage node = it.next(); + amt = node.injectAEPower( amt, mode ); + + if( amt > 0 ) { - final IAEPowerStorage node = this.getFirstRequester(); - - amt = node.injectAEPower( amt, Actionable.MODULATE ); - if( amt > 0 ) - { - this.requesters.remove( node ); - this.lastRequester = null; - } + it.remove(); } } @@ -364,7 +358,7 @@ public class EnergyGridCache implements IEnergyGrid } @Override - public double getProviderEnergyDemand( final double maxRequired, final Set seen ) + public double getProviderEnergyDemand( final double maxRequired ) { double required = 0; @@ -381,53 +375,6 @@ public class EnergyGridCache implements IEnergyGrid return required; } - private double simulateExtract( double extractedPower, final double amt ) - { - final Iterator it = this.providers.iterator(); - - while( extractedPower < amt && it.hasNext() ) - { - final IAEPowerStorage node = it.next(); - - final double req = amt - extractedPower; - final double newPower = node.extractAEPower( req, Actionable.SIMULATE, PowerMultiplier.ONE ); - extractedPower += newPower; - } - - return extractedPower; - } - - private double doExtract( double extractedPower, final double amt ) - { - while( extractedPower < amt && !this.providers.isEmpty() ) - { - final IAEPowerStorage node = this.getFirstProvider(); - - final double req = amt - extractedPower; - final double newPower = node.extractAEPower( req, Actionable.MODULATE, PowerMultiplier.ONE ); - extractedPower += newPower; - - if( newPower < req ) - { - this.providers.remove( node ); - this.lastProvider = null; - } - } - - return extractedPower; - } - - private IAEPowerStorage getFirstProvider() - { - if( this.lastProvider == null ) - { - final Iterator i = this.providers.iterator(); - this.lastProvider = i.hasNext() ? i.next() : null; - } - - return this.lastProvider; - } - @Override public double getAvgPowerUsage() { @@ -460,10 +407,7 @@ public class EnergyGridCache implements IEnergyGrid final IEnergyGridProvider next = toVisit.poll(); visited.add( next ); - final double cannotHold = next.injectProviderPower( amt, Actionable.SIMULATE, visited ); - next.injectProviderPower( leftover - cannotHold, mode, visited ); - - leftover = cannotHold; + leftover = next.injectProviderPower( leftover, mode ); for( IEnergyGridProvider iEnergyGridProvider : next.providers() ) { @@ -477,17 +421,6 @@ public class EnergyGridCache implements IEnergyGrid return leftover; } - private IAEPowerStorage getFirstRequester() - { - if( this.lastRequester == null ) - { - final Iterator i = this.requesters.iterator(); - this.lastRequester = i.hasNext() ? i.next() : null; - } - - return this.lastRequester; - } - @Override public double getStoredPower() { @@ -519,7 +452,7 @@ public class EnergyGridCache implements IEnergyGrid final IEnergyGridProvider next = toVisit.poll(); visited.add( next ); - required += next.getProviderEnergyDemand( maxRequired - required, visited ); + required += next.getProviderEnergyDemand( maxRequired - required ); for( IEnergyGridProvider iEnergyGridProvider : next.providers() ) { @@ -569,16 +502,6 @@ public class EnergyGridCache implements IEnergyGrid this.globalAvailablePower -= ps.getAECurrentPower(); } - if( this.lastProvider == machine ) - { - this.lastProvider = null; - } - - if( this.lastRequester == machine ) - { - this.lastRequester = null; - } - this.providers.remove( ps ); this.requesters.remove( ps ); } diff --git a/src/main/java/appeng/parts/networking/PartQuartzFiber.java b/src/main/java/appeng/parts/networking/PartQuartzFiber.java index b7015fa8b..13af372d7 100644 --- a/src/main/java/appeng/parts/networking/PartQuartzFiber.java +++ b/src/main/java/appeng/parts/networking/PartQuartzFiber.java @@ -22,7 +22,6 @@ package appeng.parts.networking; import java.util.Collection; import java.util.EnumSet; import java.util.LinkedList; -import java.util.Set; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -135,12 +134,13 @@ public class PartQuartzFiber extends AEBasePart implements IEnergyGridProvider @Override public Collection providers() { - Collection stuff = new LinkedList<>(); + Collection providers = new LinkedList<>(); try { final IEnergyGrid eg = this.getProxy().getEnergy(); - stuff.add( eg ); + + providers.add( eg ); } catch( final GridAccessException e ) { @@ -150,119 +150,33 @@ public class PartQuartzFiber extends AEBasePart implements IEnergyGridProvider try { final IEnergyGrid eg = this.outerProxy.getEnergy(); - stuff.add( eg ); + + providers.add( eg ); } catch( final GridAccessException e ) { // :P } - return stuff; + return providers; } @Override - public double extractProviderPower( final double amt, final Actionable mode, final Set seen ) + public double extractProviderPower( final double amt, final Actionable mode ) { - double acquiredPower = 0; - - try - { - final IEnergyGrid eg = this.getProxy().getEnergy(); - - if( !seen.contains( eg ) ) - { - acquiredPower += eg.extractProviderPower( amt - acquiredPower, mode, seen ); - } - } - catch( final GridAccessException e ) - { - // :P - } - - try - { - final IEnergyGrid eg = this.outerProxy.getEnergy(); - - if( !seen.contains( eg ) ) - { - acquiredPower += eg.extractProviderPower( amt - acquiredPower, mode, seen ); - } - } - catch( final GridAccessException e ) - { - // :P - } - - return acquiredPower; + return 0; } @Override - public double injectProviderPower( final double amt, final Actionable mode, final Set seen ) + public double injectProviderPower( final double amt, final Actionable mode ) { - - double amount = amt; - - try - { - final IEnergyGrid eg = this.getProxy().getEnergy(); - if( !seen.contains( eg ) ) - { - amount = eg.injectProviderPower( amount, mode, seen ); - } - } - catch( final GridAccessException e ) - { - // :P - } - - try - { - final IEnergyGrid eg = this.outerProxy.getEnergy(); - if( !seen.contains( eg ) ) - { - amount = eg.injectProviderPower( amount, mode, seen ); - } - } - catch( final GridAccessException e ) - { - // :P - } - - return amount; + return amt; } @Override - public double getProviderEnergyDemand( final double amt, final Set seen ) + public double getProviderEnergyDemand( final double amt ) { - double demand = 0; - - try - { - final IEnergyGrid eg = this.getProxy().getEnergy(); - if( !seen.contains( eg ) ) - { - demand += eg.getProviderEnergyDemand( amt - demand, seen ); - } - } - catch( final GridAccessException e ) - { - // :P - } - - try - { - final IEnergyGrid eg = this.outerProxy.getEnergy(); - if( !seen.contains( eg ) ) - { - demand += eg.getProviderEnergyDemand( amt - demand, seen ); - } - } - catch( final GridAccessException e ) - { - // :P - } - - return demand; + return 0; } @Override