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.
This commit is contained in:
@@ -25,7 +25,9 @@ package appeng.api.networking.energy;
|
|||||||
|
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Set;
|
|
||||||
|
import javax.annotation.Nonnegative;
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
import appeng.api.config.Actionable;
|
import appeng.api.config.Actionable;
|
||||||
|
|
||||||
@@ -36,32 +38,91 @@ import appeng.api.config.Actionable;
|
|||||||
public interface IEnergyGridProvider
|
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
|
* internal use only
|
||||||
*/
|
*/
|
||||||
|
@Nonnull
|
||||||
Collection<IEnergyGridProvider> providers();
|
Collection<IEnergyGridProvider> providers();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* internal use only
|
* 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<IEnergyGridProvider> 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
|
* 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<IEnergyGridProvider> seen );
|
@Nonnegative
|
||||||
|
double getProviderEnergyDemand( @Nonnegative double d );
|
||||||
/**
|
|
||||||
* internal use only
|
|
||||||
*/
|
|
||||||
double getProviderEnergyDemand( double d, Set<IEnergyGridProvider> seen );
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* internal use only
|
* 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();
|
double getProviderStoredEnergy();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* internal use only
|
* 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();
|
double getProviderMaxEnergy();
|
||||||
}
|
}
|
||||||
|
|||||||
+31
-108
@@ -106,8 +106,6 @@ public class EnergyGridCache implements IEnergyGrid
|
|||||||
private boolean hasPower = true;
|
private boolean hasPower = true;
|
||||||
private long ticksSinceHasPowerChange = 900;
|
private long ticksSinceHasPowerChange = 900;
|
||||||
|
|
||||||
private IAEPowerStorage lastProvider;
|
|
||||||
private IAEPowerStorage lastRequester;
|
|
||||||
private PathGridCache pgc;
|
private PathGridCache pgc;
|
||||||
private double lastStoredPower = -1;
|
private double lastStoredPower = -1;
|
||||||
|
|
||||||
@@ -127,7 +125,7 @@ public class EnergyGridCache implements IEnergyGrid
|
|||||||
}
|
}
|
||||||
|
|
||||||
@MENetworkEventSubscribe
|
@MENetworkEventSubscribe
|
||||||
public void EnergyNodeChanges( final MENetworkPowerIdleChange ev )
|
public void nodeIdlePowerChangeHandler( final MENetworkPowerIdleChange ev )
|
||||||
{
|
{
|
||||||
// update power usage based on event.
|
// update power usage based on event.
|
||||||
final GridNode node = (GridNode) ev.node;
|
final GridNode node = (GridNode) ev.node;
|
||||||
@@ -141,7 +139,7 @@ public class EnergyGridCache implements IEnergyGrid
|
|||||||
}
|
}
|
||||||
|
|
||||||
@MENetworkEventSubscribe
|
@MENetworkEventSubscribe
|
||||||
public void EnergyNodeChanges( final MENetworkPowerStorage ev )
|
public void storagePowerChangeHandler( final MENetworkPowerStorage ev )
|
||||||
{
|
{
|
||||||
if( ev.storage.isAEPublicPowerStorage() )
|
if( ev.storage.isAEPublicPowerStorage() )
|
||||||
{
|
{
|
||||||
@@ -247,7 +245,7 @@ public class EnergyGridCache implements IEnergyGrid
|
|||||||
final IEnergyGridProvider next = toVisit.poll();
|
final IEnergyGridProvider next = toVisit.poll();
|
||||||
visited.add( next );
|
visited.add( next );
|
||||||
|
|
||||||
extracted += next.extractProviderPower( toExtract - extracted, mode, visited );
|
extracted += next.extractProviderPower( toExtract - extracted, mode );
|
||||||
|
|
||||||
for( IEnergyGridProvider iEnergyGridProvider : next.providers() )
|
for( IEnergyGridProvider iEnergyGridProvider : next.providers() )
|
||||||
{
|
{
|
||||||
@@ -299,19 +297,24 @@ public class EnergyGridCache implements IEnergyGrid
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double extractProviderPower( final double amt, final Actionable mode, final Set<IEnergyGridProvider> seen )
|
public double extractProviderPower( final double amt, final Actionable mode )
|
||||||
{
|
{
|
||||||
double extractedPower = 0;
|
double extractedPower = 0;
|
||||||
|
|
||||||
if( mode == Actionable.SIMULATE )
|
final Iterator<IAEPowerStorage> it = this.providers.iterator();
|
||||||
{
|
|
||||||
extractedPower += this.simulateExtract( extractedPower, amt );
|
|
||||||
|
|
||||||
return extractedPower;
|
while( extractedPower < amt && it.hasNext() )
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
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?
|
// got more then we wanted?
|
||||||
@@ -331,32 +334,23 @@ public class EnergyGridCache implements IEnergyGrid
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double injectProviderPower( double amt, final Actionable mode, final Set<IEnergyGridProvider> seen )
|
public double injectProviderPower( double amt, final Actionable mode )
|
||||||
{
|
{
|
||||||
if( mode == Actionable.SIMULATE )
|
if( mode == Actionable.MODULATE )
|
||||||
{
|
|
||||||
final Iterator<IAEPowerStorage> it = this.requesters.iterator();
|
|
||||||
while( amt > 0 && it.hasNext() )
|
|
||||||
{
|
|
||||||
final IAEPowerStorage node = it.next();
|
|
||||||
amt = node.injectAEPower( amt, Actionable.SIMULATE );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
this.tickInjectionPerTick += amt;
|
this.tickInjectionPerTick += amt;
|
||||||
|
}
|
||||||
|
|
||||||
while( amt > 0 && !this.requesters.isEmpty() )
|
final Iterator<IAEPowerStorage> 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();
|
it.remove();
|
||||||
|
|
||||||
amt = node.injectAEPower( amt, Actionable.MODULATE );
|
|
||||||
if( amt > 0 )
|
|
||||||
{
|
|
||||||
this.requesters.remove( node );
|
|
||||||
this.lastRequester = null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -364,7 +358,7 @@ public class EnergyGridCache implements IEnergyGrid
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getProviderEnergyDemand( final double maxRequired, final Set<IEnergyGridProvider> seen )
|
public double getProviderEnergyDemand( final double maxRequired )
|
||||||
{
|
{
|
||||||
double required = 0;
|
double required = 0;
|
||||||
|
|
||||||
@@ -381,53 +375,6 @@ public class EnergyGridCache implements IEnergyGrid
|
|||||||
return required;
|
return required;
|
||||||
}
|
}
|
||||||
|
|
||||||
private double simulateExtract( double extractedPower, final double amt )
|
|
||||||
{
|
|
||||||
final Iterator<IAEPowerStorage> 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<IAEPowerStorage> i = this.providers.iterator();
|
|
||||||
this.lastProvider = i.hasNext() ? i.next() : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.lastProvider;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getAvgPowerUsage()
|
public double getAvgPowerUsage()
|
||||||
{
|
{
|
||||||
@@ -460,10 +407,7 @@ public class EnergyGridCache implements IEnergyGrid
|
|||||||
final IEnergyGridProvider next = toVisit.poll();
|
final IEnergyGridProvider next = toVisit.poll();
|
||||||
visited.add( next );
|
visited.add( next );
|
||||||
|
|
||||||
final double cannotHold = next.injectProviderPower( amt, Actionable.SIMULATE, visited );
|
leftover = next.injectProviderPower( leftover, mode );
|
||||||
next.injectProviderPower( leftover - cannotHold, mode, visited );
|
|
||||||
|
|
||||||
leftover = cannotHold;
|
|
||||||
|
|
||||||
for( IEnergyGridProvider iEnergyGridProvider : next.providers() )
|
for( IEnergyGridProvider iEnergyGridProvider : next.providers() )
|
||||||
{
|
{
|
||||||
@@ -477,17 +421,6 @@ public class EnergyGridCache implements IEnergyGrid
|
|||||||
return leftover;
|
return leftover;
|
||||||
}
|
}
|
||||||
|
|
||||||
private IAEPowerStorage getFirstRequester()
|
|
||||||
{
|
|
||||||
if( this.lastRequester == null )
|
|
||||||
{
|
|
||||||
final Iterator<IAEPowerStorage> i = this.requesters.iterator();
|
|
||||||
this.lastRequester = i.hasNext() ? i.next() : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.lastRequester;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getStoredPower()
|
public double getStoredPower()
|
||||||
{
|
{
|
||||||
@@ -519,7 +452,7 @@ public class EnergyGridCache implements IEnergyGrid
|
|||||||
final IEnergyGridProvider next = toVisit.poll();
|
final IEnergyGridProvider next = toVisit.poll();
|
||||||
visited.add( next );
|
visited.add( next );
|
||||||
|
|
||||||
required += next.getProviderEnergyDemand( maxRequired - required, visited );
|
required += next.getProviderEnergyDemand( maxRequired - required );
|
||||||
|
|
||||||
for( IEnergyGridProvider iEnergyGridProvider : next.providers() )
|
for( IEnergyGridProvider iEnergyGridProvider : next.providers() )
|
||||||
{
|
{
|
||||||
@@ -569,16 +502,6 @@ public class EnergyGridCache implements IEnergyGrid
|
|||||||
this.globalAvailablePower -= ps.getAECurrentPower();
|
this.globalAvailablePower -= ps.getAECurrentPower();
|
||||||
}
|
}
|
||||||
|
|
||||||
if( this.lastProvider == machine )
|
|
||||||
{
|
|
||||||
this.lastProvider = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( this.lastRequester == machine )
|
|
||||||
{
|
|
||||||
this.lastRequester = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.providers.remove( ps );
|
this.providers.remove( ps );
|
||||||
this.requesters.remove( ps );
|
this.requesters.remove( ps );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ package appeng.parts.networking;
|
|||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
@@ -135,12 +134,13 @@ public class PartQuartzFiber extends AEBasePart implements IEnergyGridProvider
|
|||||||
@Override
|
@Override
|
||||||
public Collection<IEnergyGridProvider> providers()
|
public Collection<IEnergyGridProvider> providers()
|
||||||
{
|
{
|
||||||
Collection<IEnergyGridProvider> stuff = new LinkedList<>();
|
Collection<IEnergyGridProvider> providers = new LinkedList<>();
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
final IEnergyGrid eg = this.getProxy().getEnergy();
|
final IEnergyGrid eg = this.getProxy().getEnergy();
|
||||||
stuff.add( eg );
|
|
||||||
|
providers.add( eg );
|
||||||
}
|
}
|
||||||
catch( final GridAccessException e )
|
catch( final GridAccessException e )
|
||||||
{
|
{
|
||||||
@@ -150,119 +150,33 @@ public class PartQuartzFiber extends AEBasePart implements IEnergyGridProvider
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
final IEnergyGrid eg = this.outerProxy.getEnergy();
|
final IEnergyGrid eg = this.outerProxy.getEnergy();
|
||||||
stuff.add( eg );
|
|
||||||
|
providers.add( eg );
|
||||||
}
|
}
|
||||||
catch( final GridAccessException e )
|
catch( final GridAccessException e )
|
||||||
{
|
{
|
||||||
// :P
|
// :P
|
||||||
}
|
}
|
||||||
|
|
||||||
return stuff;
|
return providers;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double extractProviderPower( final double amt, final Actionable mode, final Set<IEnergyGridProvider> seen )
|
public double extractProviderPower( final double amt, final Actionable mode )
|
||||||
{
|
{
|
||||||
double acquiredPower = 0;
|
return 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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double injectProviderPower( final double amt, final Actionable mode, final Set<IEnergyGridProvider> seen )
|
public double injectProviderPower( final double amt, final Actionable mode )
|
||||||
{
|
{
|
||||||
|
return amt;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getProviderEnergyDemand( final double amt, final Set<IEnergyGridProvider> seen )
|
public double getProviderEnergyDemand( final double amt )
|
||||||
{
|
{
|
||||||
double demand = 0;
|
return 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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user