Level Emitter and Stack Watcher Implementation.

This commit is contained in:
AlgorithmX2
2014-01-05 02:49:08 -06:00
parent 09a8f82245
commit b8b37b5791
6 changed files with 663 additions and 55 deletions
+46 -15
View File
@@ -1,5 +1,6 @@
package appeng.me.cache;
import java.util.HashMap;
import java.util.HashSet;
import appeng.api.networking.IGrid;
@@ -8,6 +9,10 @@ import appeng.api.networking.IGridNode;
import appeng.api.networking.IGridStorage;
import appeng.api.networking.events.MENetworkCellArrayUpdate;
import appeng.api.networking.events.MENetworkEventSubscribe;
import appeng.api.networking.security.BaseActionSource;
import appeng.api.networking.security.MachineSource;
import appeng.api.networking.storage.IStackWatcher;
import appeng.api.networking.storage.IStackWatcherHost;
import appeng.api.networking.storage.IStorageGrid;
import appeng.api.storage.ICellContainer;
import appeng.api.storage.IMEInventoryHandler;
@@ -17,14 +22,20 @@ import appeng.api.storage.data.IAEFluidStack;
import appeng.api.storage.data.IAEItemStack;
import appeng.api.storage.data.IAEStack;
import appeng.api.storage.data.IItemList;
import appeng.me.storage.ItemWatcher;
import appeng.me.storage.NetworkInventoryHandler;
import appeng.util.item.ItemList;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.SetMultimap;
public class GridStorageCache implements IStorageGrid
{
public SetMultimap<IAEStack, ItemWatcher> interests = HashMultimap.create();
final HashSet<ICellContainer> cellContainers = new HashSet();
final IGrid myGrid;
final public IGrid myGrid;
private NetworkInventoryHandler<IAEItemStack> myItemNetwork;
private NetworkMonitor<IAEItemStack> itemMonitor = new NetworkMonitor<IAEItemStack>( this, StorageChannel.ITEMS );
@@ -32,6 +43,8 @@ public class GridStorageCache implements IStorageGrid
private NetworkInventoryHandler<IAEFluidStack> myFluidNetwork;
private NetworkMonitor<IAEFluidStack> fluidMonitor = new NetworkMonitor<IAEFluidStack>( this, StorageChannel.FLUIDS );
private HashMap<IGridNode, IStackWatcher> watchers = new HashMap<IGridNode, IStackWatcher>();
public GridStorageCache(IGrid g) {
myGrid = g;
}
@@ -51,18 +64,28 @@ public class GridStorageCache implements IStorageGrid
ICellContainer cc = (ICellContainer) machine;
cellContainers.remove( cc );
myGrid.postEvent( new MENetworkCellArrayUpdate() );
for (IMEInventoryHandler<IAEItemStack> h : cc.getCellArray( StorageChannel.ITEMS ))
{
postChanges( StorageChannel.ITEMS, -1, h.getAvailableItems( new ItemList<IAEItemStack>() ) );
postChanges( StorageChannel.ITEMS, -1, h.getAvailableItems( new ItemList<IAEItemStack>() ), new MachineSource( machine ) );
}
for (IMEInventoryHandler<IAEFluidStack> h : cc.getCellArray( StorageChannel.FLUIDS ))
{
postChanges( StorageChannel.ITEMS, -1, h.getAvailableItems( new ItemList<IAEFluidStack>() ) );
postChanges( StorageChannel.ITEMS, -1, h.getAvailableItems( new ItemList<IAEFluidStack>() ), new MachineSource( machine ) );
}
}
myGrid.postEvent( new MENetworkCellArrayUpdate() );
if ( machine instanceof IStackWatcherHost )
{
IStackWatcher myWatcher = watchers.get( machine );
if ( myWatcher != null )
{
myWatcher.clear();
watchers.remove( machine );
}
}
}
@Override
@@ -73,18 +96,26 @@ public class GridStorageCache implements IStorageGrid
ICellContainer cc = (ICellContainer) machine;
cellContainers.add( cc );
myGrid.postEvent( new MENetworkCellArrayUpdate() );
for (IMEInventoryHandler<IAEItemStack> h : cc.getCellArray( StorageChannel.ITEMS ))
{
postChanges( StorageChannel.ITEMS, 1, h.getAvailableItems( new ItemList<IAEItemStack>() ) );
postChanges( StorageChannel.ITEMS, 1, h.getAvailableItems( new ItemList<IAEItemStack>() ), new MachineSource( machine ) );
}
for (IMEInventoryHandler<IAEFluidStack> h : cc.getCellArray( StorageChannel.FLUIDS ))
{
postChanges( StorageChannel.ITEMS, 1, h.getAvailableItems( new ItemList<IAEFluidStack>() ) );
postChanges( StorageChannel.ITEMS, 1, h.getAvailableItems( new ItemList<IAEFluidStack>() ), new MachineSource( machine ) );
}
}
myGrid.postEvent( new MENetworkCellArrayUpdate() );
if ( machine instanceof IStackWatcherHost )
{
IStackWatcherHost swh = (IStackWatcherHost) machine;
ItemWatcher iw = new ItemWatcher( this, (IStackWatcherHost) swh );
watchers.put( node, iw );
swh.updateWatcher( iw );
}
}
private void buildNetworkStorage(StorageChannel chan)
@@ -111,7 +142,7 @@ public class GridStorageCache implements IStorageGrid
}
}
private void postChanges(StorageChannel chan, int up_or_down, IItemList availableItems)
private void postChanges(StorageChannel chan, int up_or_down, IItemList availableItems, BaseActionSource src)
{
switch (chan)
{
@@ -119,11 +150,11 @@ public class GridStorageCache implements IStorageGrid
for (IAEFluidStack fs : ((IItemList<IAEFluidStack>) availableItems))
{
if ( up_or_down > 0 )
fluidMonitor.postChange( fs );
fluidMonitor.postChange( fs, src );
else
{
fs.setStackSize( -fs.getStackSize() );
fluidMonitor.postChange( fs );
fluidMonitor.postChange( fs, src );
}
}
break;
@@ -131,11 +162,11 @@ public class GridStorageCache implements IStorageGrid
for (IAEItemStack fs : ((IItemList<IAEItemStack>) availableItems))
{
if ( up_or_down > 0 )
itemMonitor.postChange( fs );
itemMonitor.postChange( fs, src );
else
{
fs.setStackSize( -fs.getStackSize() );
itemMonitor.postChange( fs );
itemMonitor.postChange( fs, src );
}
}
break;
@@ -168,12 +199,12 @@ public class GridStorageCache implements IStorageGrid
}
@Override
public void postAlterationOfStoredItems(StorageChannel chan, IAEStack input)
public void postAlterationOfStoredItems(StorageChannel chan, IAEStack input, BaseActionSource src)
{
if ( chan == StorageChannel.ITEMS )
itemMonitor.postChange( (IAEItemStack) input );
itemMonitor.postChange( (IAEItemStack) input, src );
else if ( chan == StorageChannel.FLUIDS )
fluidMonitor.postChange( (IAEFluidStack) input );
fluidMonitor.postChange( (IAEFluidStack) input, src );
}
@Override
+171
View File
@@ -0,0 +1,171 @@
package appeng.me.storage;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import appeng.api.networking.storage.IStackWatcher;
import appeng.api.networking.storage.IStackWatcherHost;
import appeng.api.storage.data.IAEStack;
import appeng.me.cache.GridStorageCache;
/**
* Maintain my interests, and a global watch list, they should always be fully synchronized.
*/
public class ItemWatcher implements IStackWatcher
{
class ItemWatcherIterator implements Iterator<IAEStack>
{
final ItemWatcher watcher;
final Iterator<IAEStack> interestIterator;
IAEStack myLast;
public ItemWatcherIterator(ItemWatcher parent, Iterator<IAEStack> i) {
watcher = parent;
interestIterator = i;
}
@Override
public boolean hasNext()
{
return interestIterator.hasNext();
}
@Override
public IAEStack next()
{
return myLast = interestIterator.next();
}
@Override
public void remove()
{
gsc.interests.remove( myLast, watcher );
interestIterator.remove();
}
};
GridStorageCache gsc;
IStackWatcherHost myObject;
HashSet<IAEStack> myInterests = new HashSet();
public ItemWatcher(GridStorageCache cache, IStackWatcherHost host) {
gsc = cache;
myObject = host;
}
public IStackWatcherHost getHost()
{
return myObject;
}
@Override
public boolean add(IAEStack e)
{
if ( myInterests.contains( e ) )
return false;
return myInterests.add( e.copy() ) && gsc.interests.put( e, this );
}
@Override
public boolean addAll(Collection<? extends IAEStack> c)
{
boolean didChange = false;
for (IAEStack o : c)
didChange = add( o ) || didChange;
return didChange;
}
@Override
public void clear()
{
Iterator<IAEStack> i = myInterests.iterator();
while (i.hasNext())
{
gsc.interests.remove( i.next(), this );
i.remove();
}
}
@Override
public boolean contains(Object o)
{
return myInterests.contains( o );
}
@Override
public boolean containsAll(Collection<?> c)
{
return myInterests.containsAll( c );
}
@Override
public boolean isEmpty()
{
return myInterests.isEmpty();
}
@Override
public Iterator<IAEStack> iterator()
{
return new ItemWatcherIterator( this, myInterests.iterator() );
}
@Override
public boolean remove(Object o)
{
return myInterests.remove( o ) && gsc.interests.remove( o, this );
}
@Override
public boolean removeAll(Collection<?> c)
{
boolean didSomething = false;
for (Object o : c)
didSomething = remove( o ) || didSomething;
return didSomething;
}
@Override
public boolean retainAll(Collection<?> c)
{
boolean changed = false;
Iterator<IAEStack> i = iterator();
while (i.hasNext())
{
if ( !c.contains( i.next() ) )
{
i.remove();
changed = true;
}
}
return changed;
}
@Override
public int size()
{
return myInterests.size();
}
@Override
public Object[] toArray()
{
return myInterests.toArray();
}
@Override
public <T> T[] toArray(T[] a)
{
return myInterests.toArray( a );
}
}