diff --git a/src/api/java/appeng/api/networking/energy/IAEPowerStorage.java b/src/api/java/appeng/api/networking/energy/IAEPowerStorage.java index 177cd6998..e571e3c4e 100644 --- a/src/api/java/appeng/api/networking/energy/IAEPowerStorage.java +++ b/src/api/java/appeng/api/networking/energy/IAEPowerStorage.java @@ -71,4 +71,18 @@ public interface IAEPowerStorage extends IEnergySource { */ @Nonnull AccessRestriction getPowerFlow(); -} \ No newline at end of file + + /** + * The priority to use this energy storage. + * + * A higher value means it is more likely to be extracted from first, and less + * likely to be inserted into first. + * + * This should never use {@link Integer#MIN_VALUE} or {@link Integer#MAX_VALUE}. + * + * @return the priority for this storage + */ + default int getPriority() { + return 0; + } +} diff --git a/src/main/java/appeng/me/cache/EnergyGridCache.java b/src/main/java/appeng/me/cache/EnergyGridCache.java index b8bb25800..abc983454 100644 --- a/src/main/java/appeng/me/cache/EnergyGridCache.java +++ b/src/main/java/appeng/me/cache/EnergyGridCache.java @@ -23,16 +23,18 @@ import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import java.util.LinkedHashSet; import java.util.NavigableSet; import java.util.PriorityQueue; import java.util.Queue; import java.util.Set; +import java.util.SortedSet; import com.google.common.collect.HashMultiset; import com.google.common.collect.Multiset; import com.google.common.collect.Sets; +import it.unimi.dsi.fastutil.objects.ObjectRBTreeSet; + import appeng.api.config.AccessRestriction; import appeng.api.config.Actionable; import appeng.api.config.PowerMultiplier; @@ -72,10 +74,15 @@ public class EnergyGridCache implements IEnergyGrid { return Double.compare(percent1, percent2); }; + private static final Comparator COMPARATOR_HIGHEST_PRIORITY_FIRST = (o1, o2) -> Integer + .compare(o2.getPriority(), o1.getPriority()); + private static final Comparator COMPARATOR_LOWEST_PRIORITY_FIRST = (o1, o2) -> Integer + .compare(o1.getPriority(), o2.getPriority()); + private final NavigableSet interests = Sets.newTreeSet(); private final double averageLength = 40.0; - private final Set providers = new LinkedHashSet<>(); - private final Set requesters = new LinkedHashSet<>(); + private final SortedSet providers = new ObjectRBTreeSet<>(COMPARATOR_HIGHEST_PRIORITY_FIRST); + private final SortedSet requesters = new ObjectRBTreeSet<>(COMPARATOR_LOWEST_PRIORITY_FIRST); private final Multiset energyGridProviders = HashMultiset.create(); private final IGrid myGrid; private final HashMap watchers = new HashMap<>(); @@ -572,6 +579,12 @@ public class EnergyGridCache implements IEnergyGrid { return this.stored; } + @Override + public int getPriority() { + // MIN_VALUE to push it to the back + return Integer.MIN_VALUE; + } + private void addCurrentAEPower(double amount) { this.stored += amount; diff --git a/src/main/java/appeng/tile/networking/CreativeEnergyCellTileEntity.java b/src/main/java/appeng/tile/networking/CreativeEnergyCellTileEntity.java index 4d37ecdae..333b0f4e6 100644 --- a/src/main/java/appeng/tile/networking/CreativeEnergyCellTileEntity.java +++ b/src/main/java/appeng/tile/networking/CreativeEnergyCellTileEntity.java @@ -69,4 +69,10 @@ public class CreativeEnergyCellTileEntity extends AENetworkTileEntity implements public double extractAEPower(final double amt, final Actionable mode, final PowerMultiplier pm) { return amt; } + + @Override + public int getPriority() { + // MAX_VALUE to move creative cells to the front. + return Integer.MAX_VALUE; + } } diff --git a/src/main/java/appeng/tile/networking/DenseEnergyCellTileEntity.java b/src/main/java/appeng/tile/networking/DenseEnergyCellTileEntity.java index d935ecf67..5cf1da261 100644 --- a/src/main/java/appeng/tile/networking/DenseEnergyCellTileEntity.java +++ b/src/main/java/appeng/tile/networking/DenseEnergyCellTileEntity.java @@ -22,9 +22,16 @@ import net.minecraft.tileentity.TileEntityType; public class DenseEnergyCellTileEntity extends EnergyCellTileEntity { + private final static double MAX_STORED = 200000 * 8; + public DenseEnergyCellTileEntity(TileEntityType tileEntityTypeIn) { super(tileEntityTypeIn); - this.setInternalMaxPower(200000 * 8); + this.setInternalMaxPower(MAX_STORED); + } + + @Override + public int getPriority() { + return 1600; } } diff --git a/src/main/java/appeng/tile/networking/EnergyCellTileEntity.java b/src/main/java/appeng/tile/networking/EnergyCellTileEntity.java index 56673f07f..7f0b5aeee 100644 --- a/src/main/java/appeng/tile/networking/EnergyCellTileEntity.java +++ b/src/main/java/appeng/tile/networking/EnergyCellTileEntity.java @@ -36,8 +36,10 @@ import appeng.util.SettingsFrom; public class EnergyCellTileEntity extends AENetworkTileEntity implements IAEPowerStorage { + private static final double MAX_STORED = 200000.0; + private double internalCurrentPower = 0.0; - private double internalMaxPower = 200000.0; + private double internalMaxPower = MAX_STORED; private byte currentMeta = -1; @@ -179,6 +181,11 @@ public class EnergyCellTileEntity extends AENetworkTileEntity implements IAEPowe return pm.divide(this.extractAEPower(pm.multiply(amt), mode)); } + @Override + public int getPriority() { + return 200; + } + private double extractAEPower(double amt, final Actionable mode) { if (mode == Actionable.SIMULATE) { if (this.internalCurrentPower > amt) { @@ -218,4 +225,5 @@ public class EnergyCellTileEntity extends AENetworkTileEntity implements IAEPowe void setInternalMaxPower(final double internalMaxPower) { this.internalMaxPower = internalMaxPower; } + }