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.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<IEnergyGridProvider> 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<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
|
||||
*
|
||||
* 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 );
|
||||
|
||||
/**
|
||||
* internal use only
|
||||
*/
|
||||
double getProviderEnergyDemand( double d, Set<IEnergyGridProvider> 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();
|
||||
}
|
||||
|
||||
+31
-108
@@ -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<IEnergyGridProvider> seen )
|
||||
public double extractProviderPower( final double amt, final Actionable mode )
|
||||
{
|
||||
double extractedPower = 0;
|
||||
|
||||
if( mode == Actionable.SIMULATE )
|
||||
{
|
||||
extractedPower += this.simulateExtract( extractedPower, amt );
|
||||
final Iterator<IAEPowerStorage> 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<IEnergyGridProvider> seen )
|
||||
public double injectProviderPower( double amt, final Actionable mode )
|
||||
{
|
||||
if( mode == Actionable.SIMULATE )
|
||||
{
|
||||
final Iterator<IAEPowerStorage> 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<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();
|
||||
|
||||
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<IEnergyGridProvider> 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<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
|
||||
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<IAEPowerStorage> 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 );
|
||||
}
|
||||
|
||||
@@ -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<IEnergyGridProvider> providers()
|
||||
{
|
||||
Collection<IEnergyGridProvider> stuff = new LinkedList<>();
|
||||
Collection<IEnergyGridProvider> 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<IEnergyGridProvider> 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<IEnergyGridProvider> 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<IEnergyGridProvider> 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
|
||||
|
||||
Reference in New Issue
Block a user