Replaced Watcher using Collection with a more fitting interface (#2693)
Replaced the watchers for energy, storage and crafting with a more fitting interface compared to a common collection. Fixes #229
This commit is contained in:
parent
e3305c1963
commit
fb79fd284d
|
@ -24,12 +24,36 @@
|
||||||
package appeng.api.networking.crafting;
|
package appeng.api.networking.crafting;
|
||||||
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
import appeng.api.storage.data.IAEStack;
|
import appeng.api.storage.data.IAEStack;
|
||||||
|
|
||||||
|
|
||||||
public interface ICraftingWatcher extends Collection<IAEStack>
|
/**
|
||||||
|
* DO NOT IMPLEMENT.
|
||||||
|
*
|
||||||
|
* Will be injected when adding an {@link ICraftingWatcherHost} to a grid.
|
||||||
|
*/
|
||||||
|
public interface ICraftingWatcher
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Add a specific {@link IAEStack} to watch.
|
||||||
|
*
|
||||||
|
* Supports multiple values, duplicate ones will not be added.
|
||||||
|
*
|
||||||
|
* @param stack
|
||||||
|
* @return true, if successfully added.
|
||||||
|
*/
|
||||||
|
boolean add( IAEStack<?> stack );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove a specific {@link IAEStack} from the watcher.
|
||||||
|
*
|
||||||
|
* @param stack
|
||||||
|
* @return true, if successfully removed.
|
||||||
|
*/
|
||||||
|
boolean remove( IAEStack<?> stack );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes all watched stacks and resets the watcher to a clean state.
|
||||||
|
*/
|
||||||
|
void reset();
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,10 +24,34 @@
|
||||||
package appeng.api.networking.energy;
|
package appeng.api.networking.energy;
|
||||||
|
|
||||||
|
|
||||||
import java.util.Collection;
|
/**
|
||||||
|
* DO NOT IMPLEMENT.
|
||||||
|
*
|
||||||
public interface IEnergyWatcher extends Collection<Double>
|
* Will be injected when adding an {@link IEnergyWatcherHost} to a grid.
|
||||||
|
*/
|
||||||
|
public interface IEnergyWatcher
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Add a specific threshold to watch.
|
||||||
|
*
|
||||||
|
* Supports multiple values, duplicate ones will not be added.
|
||||||
|
*
|
||||||
|
* @param amount
|
||||||
|
* @return true, if successfully added.
|
||||||
|
*/
|
||||||
|
boolean add( double amount );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove a specific threshold from the watcher.
|
||||||
|
*
|
||||||
|
* @param amount
|
||||||
|
* @return true, if successfully removed.
|
||||||
|
*/
|
||||||
|
boolean remove( double amount );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes all thresholds and resets the watcher to a clean state.
|
||||||
|
*/
|
||||||
|
void reset();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,12 +24,36 @@
|
||||||
package appeng.api.networking.storage;
|
package appeng.api.networking.storage;
|
||||||
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
import appeng.api.storage.data.IAEStack;
|
import appeng.api.storage.data.IAEStack;
|
||||||
|
|
||||||
|
|
||||||
public interface IStackWatcher extends Collection<IAEStack>
|
/**
|
||||||
|
* DO NOT IMPLEMENT.
|
||||||
|
*
|
||||||
|
* Will be injected when adding an {@link IStackWatcherHost} to a grid.
|
||||||
|
*/
|
||||||
|
public interface IStackWatcher
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Add a specific {@link IAEStack} to watch.
|
||||||
|
*
|
||||||
|
* Supports multiple values, duplicate ones will not be added.
|
||||||
|
*
|
||||||
|
* @param stack
|
||||||
|
* @return true, if successfully added.
|
||||||
|
*/
|
||||||
|
boolean add( IAEStack<?> stack );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove a specific {@link IAEStack} from the watcher.
|
||||||
|
*
|
||||||
|
* @param stack
|
||||||
|
* @return true, if successfully removed.
|
||||||
|
*/
|
||||||
|
boolean remove( IAEStack<?> stack );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes all watched stacks and resets the watcher to a clean state.
|
||||||
|
*/
|
||||||
|
void reset();
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,11 +19,9 @@
|
||||||
package appeng.crafting;
|
package appeng.crafting;
|
||||||
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
import java.util.Set;
|
||||||
import javax.annotation.Nonnull;
|
|
||||||
|
|
||||||
import appeng.api.networking.crafting.ICraftingWatcher;
|
import appeng.api.networking.crafting.ICraftingWatcher;
|
||||||
import appeng.api.networking.crafting.ICraftingWatcherHost;
|
import appeng.api.networking.crafting.ICraftingWatcherHost;
|
||||||
|
@ -39,7 +37,7 @@ public class CraftingWatcher implements ICraftingWatcher
|
||||||
|
|
||||||
private final CraftingGridCache gsc;
|
private final CraftingGridCache gsc;
|
||||||
private final ICraftingWatcherHost host;
|
private final ICraftingWatcherHost host;
|
||||||
private final HashSet<IAEStack> myInterests = new HashSet<IAEStack>();
|
private final Set<IAEStack> myInterests = new HashSet<IAEStack>();
|
||||||
|
|
||||||
public CraftingWatcher( final CraftingGridCache cache, final ICraftingWatcherHost host )
|
public CraftingWatcher( final CraftingGridCache cache, final ICraftingWatcherHost host )
|
||||||
{
|
{
|
||||||
|
@ -52,45 +50,6 @@ public class CraftingWatcher implements ICraftingWatcher
|
||||||
return this.host;
|
return this.host;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public int size()
|
|
||||||
{
|
|
||||||
return this.myInterests.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEmpty()
|
|
||||||
{
|
|
||||||
return this.myInterests.isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean contains( final Object o )
|
|
||||||
{
|
|
||||||
return this.myInterests.contains( o );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
@Override
|
|
||||||
public Iterator<IAEStack> iterator()
|
|
||||||
{
|
|
||||||
return new ItemWatcherIterator( this, this.myInterests.iterator() );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
@Override
|
|
||||||
public Object[] toArray()
|
|
||||||
{
|
|
||||||
return this.myInterests.toArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nonnull
|
|
||||||
@Override
|
|
||||||
public <T> T[] toArray( @Nonnull final T[] a )
|
|
||||||
{
|
|
||||||
return this.myInterests.toArray( a );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean add( final IAEStack e )
|
public boolean add( final IAEStack e )
|
||||||
{
|
{
|
||||||
|
@ -103,100 +62,20 @@ public class CraftingWatcher implements ICraftingWatcher
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean remove( final Object o )
|
public boolean remove( final IAEStack o )
|
||||||
{
|
{
|
||||||
return this.myInterests.remove( o ) && this.gsc.getInterestManager().remove( (IAEStack) o, this );
|
return this.myInterests.remove( o ) && this.gsc.getInterestManager().remove( (IAEStack) o, this );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean containsAll( @Nonnull final Collection<?> c )
|
public void reset()
|
||||||
{
|
|
||||||
return this.myInterests.containsAll( c );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean addAll( @Nonnull final Collection<? extends IAEStack> c )
|
|
||||||
{
|
|
||||||
boolean didChange = false;
|
|
||||||
|
|
||||||
for( final IAEStack o : c )
|
|
||||||
{
|
|
||||||
didChange = this.add( o ) || didChange;
|
|
||||||
}
|
|
||||||
|
|
||||||
return didChange;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean removeAll( @Nonnull final Collection<?> c )
|
|
||||||
{
|
|
||||||
boolean didSomething = false;
|
|
||||||
for( final Object o : c )
|
|
||||||
{
|
|
||||||
didSomething = this.remove( o ) || didSomething;
|
|
||||||
}
|
|
||||||
return didSomething;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean retainAll( @Nonnull final Collection<?> c )
|
|
||||||
{
|
|
||||||
boolean changed = false;
|
|
||||||
final Iterator<IAEStack> i = this.iterator();
|
|
||||||
|
|
||||||
while( i.hasNext() )
|
|
||||||
{
|
|
||||||
if( !c.contains( i.next() ) )
|
|
||||||
{
|
|
||||||
i.remove();
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return changed;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void clear()
|
|
||||||
{
|
{
|
||||||
final Iterator<IAEStack> i = this.myInterests.iterator();
|
final Iterator<IAEStack> i = this.myInterests.iterator();
|
||||||
|
|
||||||
while( i.hasNext() )
|
while( i.hasNext() )
|
||||||
{
|
{
|
||||||
this.gsc.getInterestManager().remove( i.next(), this );
|
this.gsc.getInterestManager().remove( i.next(), this );
|
||||||
i.remove();
|
i.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ItemWatcherIterator implements Iterator<IAEStack>
|
|
||||||
{
|
|
||||||
|
|
||||||
private final CraftingWatcher watcher;
|
|
||||||
private final Iterator<IAEStack> interestIterator;
|
|
||||||
private IAEStack myLast;
|
|
||||||
|
|
||||||
public ItemWatcherIterator( final CraftingWatcher parent, final Iterator<IAEStack> i )
|
|
||||||
{
|
|
||||||
this.watcher = parent;
|
|
||||||
this.interestIterator = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean hasNext()
|
|
||||||
{
|
|
||||||
return this.interestIterator.hasNext();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IAEStack next()
|
|
||||||
{
|
|
||||||
return this.myLast = this.interestIterator.next();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void remove()
|
|
||||||
{
|
|
||||||
CraftingWatcher.this.gsc.getInterestManager().remove( this.myLast, this.watcher );
|
|
||||||
this.interestIterator.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -172,7 +172,7 @@ public class CraftingGridCache implements ICraftingGrid, ICraftingProviderHelper
|
||||||
final ICraftingWatcher craftingWatcher = this.craftingWatchers.get( machine );
|
final ICraftingWatcher craftingWatcher = this.craftingWatchers.get( machine );
|
||||||
if( craftingWatcher != null )
|
if( craftingWatcher != null )
|
||||||
{
|
{
|
||||||
craftingWatcher.clear();
|
craftingWatcher.reset();
|
||||||
this.craftingWatchers.remove( machine );
|
this.craftingWatchers.remove( machine );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,11 +23,12 @@ import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.LinkedHashSet;
|
import java.util.LinkedHashSet;
|
||||||
|
import java.util.NavigableSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.TreeSet;
|
|
||||||
|
|
||||||
import com.google.common.collect.HashMultiset;
|
import com.google.common.collect.HashMultiset;
|
||||||
import com.google.common.collect.Multiset;
|
import com.google.common.collect.Multiset;
|
||||||
|
import com.google.common.collect.Sets;
|
||||||
|
|
||||||
import appeng.api.config.AccessRestriction;
|
import appeng.api.config.AccessRestriction;
|
||||||
import appeng.api.config.Actionable;
|
import appeng.api.config.Actionable;
|
||||||
|
@ -58,8 +59,8 @@ import appeng.me.energy.EnergyWatcher;
|
||||||
public class EnergyGridCache implements IEnergyGrid
|
public class EnergyGridCache implements IEnergyGrid
|
||||||
{
|
{
|
||||||
|
|
||||||
private final TreeSet<EnergyThreshold> interests = new TreeSet<EnergyThreshold>();
|
private final NavigableSet<EnergyThreshold> interests = Sets.newTreeSet();
|
||||||
private final double AvgLength = 40.0;
|
private final double averageLength = 40.0;
|
||||||
private final Set<IAEPowerStorage> providers = new LinkedHashSet<IAEPowerStorage>();
|
private final Set<IAEPowerStorage> providers = new LinkedHashSet<IAEPowerStorage>();
|
||||||
private final Set<IAEPowerStorage> requesters = new LinkedHashSet<IAEPowerStorage>();
|
private final Set<IAEPowerStorage> requesters = new LinkedHashSet<IAEPowerStorage>();
|
||||||
private final Multiset<IEnergyGridProvider> energyGridProviders = HashMultiset.create();
|
private final Multiset<IEnergyGridProvider> energyGridProviders = HashMultiset.create();
|
||||||
|
@ -150,24 +151,25 @@ public class EnergyGridCache implements IEnergyGrid
|
||||||
@Override
|
@Override
|
||||||
public void onUpdateTick()
|
public void onUpdateTick()
|
||||||
{
|
{
|
||||||
if( !this.getInterests().isEmpty() )
|
if( !this.interests.isEmpty() )
|
||||||
{
|
{
|
||||||
final double oldPower = this.lastStoredPower;
|
final double oldPower = this.lastStoredPower;
|
||||||
this.lastStoredPower = this.getStoredPower();
|
this.lastStoredPower = this.getStoredPower();
|
||||||
|
|
||||||
final EnergyThreshold low = new EnergyThreshold( Math.min( oldPower, this.lastStoredPower ), null );
|
final EnergyThreshold low = new EnergyThreshold( Math.min( oldPower, this.lastStoredPower ), Integer.MIN_VALUE );
|
||||||
final EnergyThreshold high = new EnergyThreshold( Math.max( oldPower, this.lastStoredPower ), null );
|
final EnergyThreshold high = new EnergyThreshold( Math.max( oldPower, this.lastStoredPower ), Integer.MAX_VALUE );
|
||||||
for( final EnergyThreshold th : this.getInterests().subSet( low, true, high, true ) )
|
|
||||||
|
for( final EnergyThreshold th : this.interests.subSet( low, true, high, true ) )
|
||||||
{
|
{
|
||||||
( (EnergyWatcher) th.getWatcher() ).post( this );
|
( (EnergyWatcher) th.getEnergyWatcher() ).post( this );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.avgDrainPerTick *= ( this.AvgLength - 1 ) / this.AvgLength;
|
this.avgDrainPerTick *= ( this.averageLength - 1 ) / this.averageLength;
|
||||||
this.avgInjectionPerTick *= ( this.AvgLength - 1 ) / this.AvgLength;
|
this.avgInjectionPerTick *= ( this.averageLength - 1 ) / this.averageLength;
|
||||||
|
|
||||||
this.avgDrainPerTick += this.tickDrainPerTick / this.AvgLength;
|
this.avgDrainPerTick += this.tickDrainPerTick / this.averageLength;
|
||||||
this.avgInjectionPerTick += this.tickInjectionPerTick / this.AvgLength;
|
this.avgInjectionPerTick += this.tickInjectionPerTick / this.averageLength;
|
||||||
|
|
||||||
this.tickDrainPerTick = 0;
|
this.tickDrainPerTick = 0;
|
||||||
this.tickInjectionPerTick = 0;
|
this.tickInjectionPerTick = 0;
|
||||||
|
@ -554,7 +556,7 @@ public class EnergyGridCache implements IEnergyGrid
|
||||||
final IEnergyWatcher myWatcher = this.watchers.get( machine );
|
final IEnergyWatcher myWatcher = this.watchers.get( machine );
|
||||||
if( myWatcher != null )
|
if( myWatcher != null )
|
||||||
{
|
{
|
||||||
myWatcher.clear();
|
myWatcher.reset();
|
||||||
this.watchers.remove( machine );
|
this.watchers.remove( machine );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -631,8 +633,14 @@ public class EnergyGridCache implements IEnergyGrid
|
||||||
storage.dataObject().setDouble( "extraEnergy", this.extra );
|
storage.dataObject().setDouble( "extraEnergy", this.extra );
|
||||||
}
|
}
|
||||||
|
|
||||||
public TreeSet<EnergyThreshold> getInterests()
|
public boolean registerEnergyInterest( final EnergyThreshold threshold )
|
||||||
{
|
{
|
||||||
return this.interests;
|
return this.interests.add( threshold );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean unregisterEnergyInterest( final EnergyThreshold threshold )
|
||||||
|
{
|
||||||
|
return this.interests.remove( threshold );
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -102,7 +102,7 @@ public class GridStorageCache implements IStorageGrid
|
||||||
|
|
||||||
if( myWatcher != null )
|
if( myWatcher != null )
|
||||||
{
|
{
|
||||||
myWatcher.clear();
|
myWatcher.reset();
|
||||||
this.watchers.remove( machine );
|
this.watchers.remove( machine );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,50 +20,98 @@ package appeng.me.energy;
|
||||||
|
|
||||||
|
|
||||||
import appeng.api.networking.energy.IEnergyWatcher;
|
import appeng.api.networking.energy.IEnergyWatcher;
|
||||||
import appeng.util.ItemSorters;
|
|
||||||
|
|
||||||
|
|
||||||
public class EnergyThreshold implements Comparable<EnergyThreshold>
|
public class EnergyThreshold implements Comparable<EnergyThreshold>
|
||||||
{
|
{
|
||||||
|
|
||||||
private final double Limit;
|
private final double threshold;
|
||||||
private final IEnergyWatcher watcher;
|
private final IEnergyWatcher watcher;
|
||||||
private final int hash;
|
private final int watcherHash;
|
||||||
|
|
||||||
public EnergyThreshold( final double lim, final IEnergyWatcher wat )
|
public EnergyThreshold( final double lim, final IEnergyWatcher watcher )
|
||||||
{
|
{
|
||||||
this.Limit = lim;
|
this.threshold = lim;
|
||||||
this.watcher = wat;
|
this.watcher = watcher;
|
||||||
|
this.watcherHash = watcher.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
if( this.getWatcher() != null )
|
/**
|
||||||
|
* Special constructor to allow querying a for a subset of thresholds.
|
||||||
|
*
|
||||||
|
* @param lim
|
||||||
|
* @param bound
|
||||||
|
*/
|
||||||
|
public EnergyThreshold( final double lim, final int bound )
|
||||||
|
{
|
||||||
|
this.threshold = lim;
|
||||||
|
this.watcher = null;
|
||||||
|
this.watcherHash = bound;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnergyWatcher getEnergyWatcher()
|
||||||
|
{
|
||||||
|
return watcher;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo( EnergyThreshold o )
|
||||||
|
{
|
||||||
|
int a = Double.compare( this.threshold, o.threshold );
|
||||||
|
|
||||||
|
if( a == 0 )
|
||||||
{
|
{
|
||||||
this.hash = this.getWatcher().hashCode() ^ ( (Double) lim ).hashCode();
|
return Integer.compare( this.watcherHash, o.watcherHash );
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
this.hash = ( (Double) lim ).hashCode();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode()
|
public int hashCode()
|
||||||
{
|
{
|
||||||
return this.hash;
|
final int prime = 31;
|
||||||
|
int result = 1;
|
||||||
|
long temp;
|
||||||
|
temp = Double.doubleToLongBits( threshold );
|
||||||
|
result = prime * result + (int) ( temp ^ ( temp >>> 32 ) );
|
||||||
|
result = prime * result + ( ( watcher == null ) ? 0 : watcher.hashCode() );
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int compareTo( final EnergyThreshold o )
|
public boolean equals( Object obj )
|
||||||
{
|
{
|
||||||
return ItemSorters.compareDouble( this.getLimit(), o.getLimit() );
|
if( this == obj )
|
||||||
}
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if( obj == null )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if( getClass() != obj.getClass() )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
double getLimit()
|
EnergyThreshold other = (EnergyThreshold) obj;
|
||||||
{
|
if( Double.doubleToLongBits( threshold ) != Double.doubleToLongBits( other.threshold ) )
|
||||||
return this.Limit;
|
{
|
||||||
}
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
public IEnergyWatcher getWatcher()
|
if( watcher == null )
|
||||||
{
|
{
|
||||||
return this.watcher;
|
if( other.watcher != null )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( !watcher.equals( other.watcher ) )
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,9 +19,9 @@
|
||||||
package appeng.me.energy;
|
package appeng.me.energy;
|
||||||
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import appeng.api.networking.energy.IEnergyWatcher;
|
import appeng.api.networking.energy.IEnergyWatcher;
|
||||||
import appeng.api.networking.energy.IEnergyWatcherHost;
|
import appeng.api.networking.energy.IEnergyWatcherHost;
|
||||||
|
@ -35,170 +35,57 @@ public class EnergyWatcher implements IEnergyWatcher
|
||||||
{
|
{
|
||||||
|
|
||||||
private final EnergyGridCache gsc;
|
private final EnergyGridCache gsc;
|
||||||
private final IEnergyWatcherHost myObject;
|
private final IEnergyWatcherHost watcherHost;
|
||||||
private final HashSet<EnergyThreshold> myInterests = new HashSet<EnergyThreshold>();
|
private final Set<EnergyThreshold> myInterests = new HashSet<EnergyThreshold>();
|
||||||
|
|
||||||
public EnergyWatcher( final EnergyGridCache cache, final IEnergyWatcherHost host )
|
public EnergyWatcher( final EnergyGridCache cache, final IEnergyWatcherHost host )
|
||||||
{
|
{
|
||||||
this.gsc = cache;
|
this.gsc = cache;
|
||||||
this.myObject = host;
|
this.watcherHost = host;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void post( final EnergyGridCache energyGridCache )
|
public void post( final EnergyGridCache energyGridCache )
|
||||||
{
|
{
|
||||||
this.myObject.onThresholdPass( energyGridCache );
|
this.watcherHost.onThresholdPass( energyGridCache );
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnergyWatcherHost getHost()
|
public IEnergyWatcherHost getHost()
|
||||||
{
|
{
|
||||||
return this.myObject;
|
return this.watcherHost;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int size()
|
public boolean add( final double amount )
|
||||||
{
|
{
|
||||||
return this.myInterests.size();
|
final EnergyThreshold eh = new EnergyThreshold( amount, this );
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
if( this.myInterests.contains( eh ) )
|
||||||
public boolean isEmpty()
|
|
||||||
{
|
|
||||||
return this.myInterests.isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean contains( final Object o )
|
|
||||||
{
|
|
||||||
return this.myInterests.contains( o );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Iterator<Double> iterator()
|
|
||||||
{
|
|
||||||
return new EnergyWatcherIterator( this, this.myInterests.iterator() );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object[] toArray()
|
|
||||||
{
|
|
||||||
return this.myInterests.toArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public <T> T[] toArray( final T[] a )
|
|
||||||
{
|
|
||||||
return this.myInterests.toArray( a );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean add( final Double e )
|
|
||||||
{
|
|
||||||
if( this.myInterests.contains( e ) )
|
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
final EnergyThreshold eh = new EnergyThreshold( e, this );
|
return this.gsc.registerEnergyInterest( eh ) && this.myInterests.add( eh );
|
||||||
return this.gsc.getInterests().add( eh ) && this.myInterests.add( eh );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean remove( final Object o )
|
public boolean remove( final double amount )
|
||||||
{
|
{
|
||||||
final EnergyThreshold eh = new EnergyThreshold( (Double) o, this );
|
final EnergyThreshold eh = new EnergyThreshold( amount, this );
|
||||||
return this.myInterests.remove( eh ) && this.gsc.getInterests().remove( eh );
|
|
||||||
|
return this.myInterests.remove( eh ) && this.gsc.unregisterEnergyInterest( eh );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean containsAll( final Collection<?> c )
|
public void reset()
|
||||||
{
|
{
|
||||||
return this.myInterests.containsAll( c );
|
for( Iterator<EnergyThreshold> iterator = myInterests.iterator(); iterator.hasNext(); )
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean addAll( final Collection<? extends Double> c )
|
|
||||||
{
|
|
||||||
boolean didChange = false;
|
|
||||||
|
|
||||||
for( final Double o : c )
|
|
||||||
{
|
{
|
||||||
didChange = this.add( o ) || didChange;
|
final EnergyThreshold threshold = iterator.next();
|
||||||
}
|
|
||||||
|
|
||||||
return didChange;
|
this.gsc.unregisterEnergyInterest( threshold );
|
||||||
}
|
iterator.remove();
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean removeAll( final Collection<?> c )
|
|
||||||
{
|
|
||||||
boolean didSomething = false;
|
|
||||||
for( final Object o : c )
|
|
||||||
{
|
|
||||||
didSomething = this.remove( o ) || didSomething;
|
|
||||||
}
|
|
||||||
return didSomething;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean retainAll( final Collection<?> c )
|
|
||||||
{
|
|
||||||
boolean changed = false;
|
|
||||||
final Iterator<Double> i = this.iterator();
|
|
||||||
|
|
||||||
while( i.hasNext() )
|
|
||||||
{
|
|
||||||
if( !c.contains( i.next() ) )
|
|
||||||
{
|
|
||||||
i.remove();
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return changed;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void clear()
|
|
||||||
{
|
|
||||||
final Iterator<EnergyThreshold> i = this.myInterests.iterator();
|
|
||||||
while( i.hasNext() )
|
|
||||||
{
|
|
||||||
this.gsc.getInterests().remove( i.next() );
|
|
||||||
i.remove();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class EnergyWatcherIterator implements Iterator<Double>
|
|
||||||
{
|
|
||||||
|
|
||||||
private final EnergyWatcher watcher;
|
|
||||||
private final Iterator<EnergyThreshold> interestIterator;
|
|
||||||
private EnergyThreshold myLast;
|
|
||||||
|
|
||||||
public EnergyWatcherIterator( final EnergyWatcher parent, final Iterator<EnergyThreshold> i )
|
|
||||||
{
|
|
||||||
this.watcher = parent;
|
|
||||||
this.interestIterator = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean hasNext()
|
|
||||||
{
|
|
||||||
return this.interestIterator.hasNext();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Double next()
|
|
||||||
{
|
|
||||||
this.myLast = this.interestIterator.next();
|
|
||||||
return this.myLast.getLimit();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void remove()
|
|
||||||
{
|
|
||||||
EnergyWatcher.this.gsc.getInterests().remove( this.myLast );
|
|
||||||
this.interestIterator.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,9 +19,9 @@
|
||||||
package appeng.me.storage;
|
package appeng.me.storage;
|
||||||
|
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import appeng.api.networking.storage.IStackWatcher;
|
import appeng.api.networking.storage.IStackWatcher;
|
||||||
import appeng.api.networking.storage.IStackWatcherHost;
|
import appeng.api.networking.storage.IStackWatcherHost;
|
||||||
|
@ -37,7 +37,7 @@ public class ItemWatcher implements IStackWatcher
|
||||||
|
|
||||||
private final GridStorageCache gsc;
|
private final GridStorageCache gsc;
|
||||||
private final IStackWatcherHost myObject;
|
private final IStackWatcherHost myObject;
|
||||||
private final HashSet<IAEStack> myInterests = new HashSet<IAEStack>();
|
private final Set<IAEStack> myInterests = new HashSet<IAEStack>();
|
||||||
|
|
||||||
public ItemWatcher( final GridStorageCache cache, final IStackWatcherHost host )
|
public ItemWatcher( final GridStorageCache cache, final IStackWatcherHost host )
|
||||||
{
|
{
|
||||||
|
@ -50,42 +50,6 @@ public class ItemWatcher implements IStackWatcher
|
||||||
return this.myObject;
|
return this.myObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public int size()
|
|
||||||
{
|
|
||||||
return this.myInterests.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isEmpty()
|
|
||||||
{
|
|
||||||
return this.myInterests.isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean contains( final Object o )
|
|
||||||
{
|
|
||||||
return this.myInterests.contains( o );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Iterator<IAEStack> iterator()
|
|
||||||
{
|
|
||||||
return new ItemWatcherIterator( this, this.myInterests.iterator() );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object[] toArray()
|
|
||||||
{
|
|
||||||
return this.myInterests.toArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public <T> T[] toArray( final T[] a )
|
|
||||||
{
|
|
||||||
return this.myInterests.toArray( a );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean add( final IAEStack e )
|
public boolean add( final IAEStack e )
|
||||||
{
|
{
|
||||||
|
@ -98,100 +62,20 @@ public class ItemWatcher implements IStackWatcher
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean remove( final Object o )
|
public boolean remove( final IAEStack o )
|
||||||
{
|
{
|
||||||
return this.myInterests.remove( o ) && this.gsc.getInterestManager().remove( (IAEStack) o, this );
|
return this.myInterests.remove( o ) && this.gsc.getInterestManager().remove( (IAEStack) o, this );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean containsAll( final Collection<?> c )
|
public void reset()
|
||||||
{
|
|
||||||
return this.myInterests.containsAll( c );
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean addAll( final Collection<? extends IAEStack> c )
|
|
||||||
{
|
|
||||||
boolean didChange = false;
|
|
||||||
|
|
||||||
for( final IAEStack o : c )
|
|
||||||
{
|
|
||||||
didChange = this.add( o ) || didChange;
|
|
||||||
}
|
|
||||||
|
|
||||||
return didChange;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean removeAll( final Collection<?> c )
|
|
||||||
{
|
|
||||||
boolean didSomething = false;
|
|
||||||
for( final Object o : c )
|
|
||||||
{
|
|
||||||
didSomething = this.remove( o ) || didSomething;
|
|
||||||
}
|
|
||||||
return didSomething;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean retainAll( final Collection<?> c )
|
|
||||||
{
|
|
||||||
boolean changed = false;
|
|
||||||
final Iterator<IAEStack> i = this.iterator();
|
|
||||||
|
|
||||||
while( i.hasNext() )
|
|
||||||
{
|
|
||||||
if( !c.contains( i.next() ) )
|
|
||||||
{
|
|
||||||
i.remove();
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return changed;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void clear()
|
|
||||||
{
|
{
|
||||||
final Iterator<IAEStack> i = this.myInterests.iterator();
|
final Iterator<IAEStack> i = this.myInterests.iterator();
|
||||||
|
|
||||||
while( i.hasNext() )
|
while( i.hasNext() )
|
||||||
{
|
{
|
||||||
this.gsc.getInterestManager().remove( i.next(), this );
|
this.gsc.getInterestManager().remove( i.next(), this );
|
||||||
i.remove();
|
i.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class ItemWatcherIterator implements Iterator<IAEStack>
|
|
||||||
{
|
|
||||||
|
|
||||||
private final ItemWatcher watcher;
|
|
||||||
private final Iterator<IAEStack> interestIterator;
|
|
||||||
private IAEStack myLast;
|
|
||||||
|
|
||||||
public ItemWatcherIterator( final ItemWatcher parent, final Iterator<IAEStack> i )
|
|
||||||
{
|
|
||||||
this.watcher = parent;
|
|
||||||
this.interestIterator = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean hasNext()
|
|
||||||
{
|
|
||||||
return this.interestIterator.hasNext();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IAEStack next()
|
|
||||||
{
|
|
||||||
return this.myLast = this.interestIterator.next();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void remove()
|
|
||||||
{
|
|
||||||
ItemWatcher.this.gsc.getInterestManager().remove( this.myLast, this.watcher );
|
|
||||||
this.interestIterator.remove();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -229,17 +229,17 @@ public class PartLevelEmitter extends PartUpgradeable implements IEnergyWatcherH
|
||||||
|
|
||||||
if( this.myWatcher != null )
|
if( this.myWatcher != null )
|
||||||
{
|
{
|
||||||
this.myWatcher.clear();
|
this.myWatcher.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
if( this.myEnergyWatcher != null )
|
if( this.myEnergyWatcher != null )
|
||||||
{
|
{
|
||||||
this.myEnergyWatcher.clear();
|
this.myEnergyWatcher.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
if( this.myCraftingWatcher != null )
|
if( this.myCraftingWatcher != null )
|
||||||
{
|
{
|
||||||
this.myCraftingWatcher.clear();
|
this.myCraftingWatcher.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
|
|
|
@ -190,7 +190,7 @@ public abstract class AbstractPartMonitor extends AbstractPartDisplay implements
|
||||||
{
|
{
|
||||||
if( this.myWatcher != null )
|
if( this.myWatcher != null )
|
||||||
{
|
{
|
||||||
this.myWatcher.clear();
|
this.myWatcher.reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
|
|
Loading…
Reference in a new issue