Special Handlers are now properly wrapped in IMEMonitors for Storage Bus to function properly.

This commit is contained in:
AlgorithmX2 2014-05-03 19:21:33 -05:00
parent 21e40a5fb3
commit e1c6b18399
11 changed files with 234 additions and 22 deletions

View file

@ -8,6 +8,7 @@ import appeng.api.storage.IExternalStorageHandler;
import appeng.api.storage.IMEInventory;
import appeng.api.storage.StorageChannel;
import appeng.me.storage.MEMonitorIInventory;
import appeng.util.InventoryAdaptor;
public class ExternalIInv implements IExternalStorageHandler
{
@ -22,7 +23,7 @@ public class ExternalIInv implements IExternalStorageHandler
public IMEInventory getInventory(TileEntity te, ForgeDirection d, StorageChannel channel, BaseActionSource src)
{
if ( channel == StorageChannel.ITEMS && te instanceof IInventory )
return new MEMonitorIInventory( (IInventory) te, d );
return new MEMonitorIInventory( InventoryAdaptor.getAdaptor( (IInventory) te, d ) );
return null;
}

View file

@ -205,7 +205,7 @@ public class DualityInterface implements IGridTickable, ISegmentedInventory, ISt
{
public InterfaceInventory(DualityInterface tileInterface) {
super( tileInterface.storage, ForgeDirection.UP );
super( InventoryAdaptor.getAdaptor( tileInterface.storage, ForgeDirection.UP ) );
mySource = new MachineSource( iHost );
}

View file

@ -7,6 +7,8 @@ import appeng.api.storage.IExternalStorageHandler;
import appeng.api.storage.IMEInventory;
import appeng.api.storage.StorageChannel;
import appeng.integration.modules.FZ;
import appeng.me.storage.MEMonitorIInventory;
import appeng.util.inv.IMEAdaptor;
public class FactorizationHandler implements IExternalStorageHandler
{
@ -21,7 +23,7 @@ public class FactorizationHandler implements IExternalStorageHandler
public IMEInventory getInventory(TileEntity te, ForgeDirection d, StorageChannel chan, BaseActionSource src)
{
if ( chan == StorageChannel.ITEMS )
return FZ.instance.getFactorizationBarrel( te );
return new MEMonitorIInventory( new IMEAdaptor( FZ.instance.getFactorizationBarrel( te ), src ) );
return null;
}

View file

@ -7,6 +7,8 @@ import appeng.api.storage.IExternalStorageHandler;
import appeng.api.storage.IMEInventory;
import appeng.api.storage.StorageChannel;
import appeng.integration.modules.DSU;
import appeng.me.storage.MEMonitorIInventory;
import appeng.util.inv.IMEAdaptor;
public class MFRDSUHandler implements IExternalStorageHandler
{
@ -21,8 +23,7 @@ public class MFRDSUHandler implements IExternalStorageHandler
public IMEInventory getInventory(TileEntity te, ForgeDirection d, StorageChannel chan, BaseActionSource src)
{
if ( chan == StorageChannel.ITEMS )
return DSU.instance.getDSU( te );
return new MEMonitorIInventory( new IMEAdaptor( DSU.instance.getDSU( te ), src ) );
return null;
}
}

View file

@ -7,6 +7,8 @@ import appeng.api.storage.IExternalStorageHandler;
import appeng.api.storage.IMEInventory;
import appeng.api.storage.StorageChannel;
import appeng.integration.modules.GT;
import appeng.me.storage.MEMonitorIInventory;
import appeng.util.inv.IMEAdaptor;
public class GregTechHandler implements IExternalStorageHandler
{
@ -21,7 +23,7 @@ public class GregTechHandler implements IExternalStorageHandler
public IMEInventory getInventory(TileEntity te, ForgeDirection d, StorageChannel channel, BaseActionSource src)
{
if ( channel == StorageChannel.ITEMS )
return GT.instance.getQuantumChest( te );
return new MEMonitorIInventory( new IMEAdaptor( GT.instance.getQuantumChest( te ) ) );
return null;
}

View file

@ -5,9 +5,7 @@ import java.util.Iterator;
import java.util.Map.Entry;
import java.util.TreeMap;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.util.ForgeDirection;
import appeng.api.AEApi;
import appeng.api.config.AccessRestriction;
import appeng.api.config.Actionable;
@ -22,7 +20,6 @@ import appeng.api.storage.data.IItemList;
import appeng.util.InventoryAdaptor;
import appeng.util.Platform;
import appeng.util.inv.ItemSlot;
import appeng.util.item.AEItemStack;
public class MEMonitorIInventory implements IMEInventory<IAEItemStack>, IMEMonitor<IAEItemStack>
{
@ -47,8 +44,6 @@ public class MEMonitorIInventory implements IMEInventory<IAEItemStack>, IMEMonit
final IAEItemStack aeStack;
};
final IInventory internal;
final ForgeDirection side;
final InventoryAdaptor adaptor;
final TreeMap<Integer, CachedItemStack> memory;
@ -69,11 +64,9 @@ public class MEMonitorIInventory implements IMEInventory<IAEItemStack>, IMEMonit
listeners.remove( l );
}
public MEMonitorIInventory(IInventory inv, ForgeDirection dir) {
adaptor = InventoryAdaptor.getAdaptor( inv, dir );
public MEMonitorIInventory(InventoryAdaptor adaptor) {
this.adaptor = adaptor;
memory = new TreeMap();
internal = inv;
side = dir;
}
@Override
@ -135,7 +128,7 @@ public class MEMonitorIInventory implements IMEInventory<IAEItemStack>, IMEMonit
public IItemList<IAEItemStack> getAvailableItems(IItemList out)
{
for (ItemSlot is : adaptor)
out.addStorage( AEItemStack.create( is.itemStack ) );
out.addStorage( is.getAEItemStack() );
return out;
}
@ -167,12 +160,12 @@ public class MEMonitorIInventory implements IMEInventory<IAEItemStack>, IMEMonit
for (ItemSlot is : adaptor)
{
CachedItemStack old = memory.get( is.slot );
ItemStack newIS = is == null ? null : is.itemStack;
ItemStack newIS = is == null ? null : is.getItemStack();
ItemStack oldIS = old == null ? null : old.itemStack;
if ( isDiffrent( newIS, oldIS ) )
{
CachedItemStack cis = new CachedItemStack( is.itemStack );
CachedItemStack cis = new CachedItemStack( is.getItemStack() );
memory.put( is.slot, cis );
if ( old != null && old.aeStack != null )
@ -203,7 +196,7 @@ public class MEMonitorIInventory implements IMEInventory<IAEItemStack>, IMEMonit
if ( diff != 0 && stack != null )
{
CachedItemStack cis = new CachedItemStack( is.itemStack );
CachedItemStack cis = new CachedItemStack( is.getItemStack() );
memory.put( is.slot, cis );
IAEItemStack a = stack.copy();

View file

@ -342,7 +342,7 @@ public class AdaptorIInventory extends InventoryAdaptor
public ItemSlot next()
{
is.slot = x;
is.itemStack = i.getStackInSlot( x++ );
is.setItemStack( i.getStackInSlot( x++ ) );
return is;
}

147
util/inv/IMEAdaptor.java Normal file
View file

@ -0,0 +1,147 @@
package appeng.util.inv;
import java.util.Iterator;
import net.minecraft.item.ItemStack;
import appeng.api.AEApi;
import appeng.api.config.Actionable;
import appeng.api.config.FuzzyMode;
import appeng.api.networking.security.BaseActionSource;
import appeng.api.storage.IMEInventory;
import appeng.api.storage.data.IAEItemStack;
import appeng.api.storage.data.IItemList;
import appeng.util.InventoryAdaptor;
import appeng.util.item.AEItemStack;
public class IMEAdaptor extends InventoryAdaptor
{
IMEInventory<IAEItemStack> target;
BaseActionSource src;
public IMEAdaptor(IMEInventory<IAEItemStack> input, BaseActionSource src) {
target = input;
this.src = src;
}
IItemList<IAEItemStack> getList()
{
return target.getAvailableItems( AEApi.instance().storage().createItemList() );
}
@Override
public Iterator<ItemSlot> iterator()
{
return new IMEAdaptorIterator( getList() );
}
public ItemStack doRemoveItemsFuzzy(int how_many, ItemStack Filter, IInventoryDestination destination, Actionable type, FuzzyMode fuzzyMode)
{
IAEItemStack reqFilter = AEItemStack.create( Filter );
if ( reqFilter == null )
return null;
IAEItemStack out = null;
for (IAEItemStack req : getList().findFuzzy( reqFilter, fuzzyMode ))
{
if ( req != null )
{
req.setStackSize( how_many );
out = target.extractItems( req, type, src );
if ( out != null )
return out.getItemStack();
}
}
return null;
}
public ItemStack doRemoveItems(int how_many, ItemStack Filter, IInventoryDestination destination, Actionable type)
{
IAEItemStack req = null;
if ( Filter == null )
{
IItemList<IAEItemStack> list = getList();
if ( !list.isEmpty() )
req = list.getFirstItem();
}
else
req = AEItemStack.create( Filter );
IAEItemStack out = null;
if ( req != null )
{
req.setStackSize( how_many );
out = target.extractItems( req, type, src );
}
if ( out != null )
return out.getItemStack();
return null;
}
@Override
public ItemStack removeItems(int how_many, ItemStack Filter, IInventoryDestination destination)
{
return doRemoveItems( how_many, Filter, destination, Actionable.MODULATE );
}
@Override
public ItemStack simulateRemove(int how_many, ItemStack Filter, IInventoryDestination destination)
{
return doRemoveItems( how_many, Filter, destination, Actionable.SIMULATE );
}
@Override
public ItemStack removeSimilarItems(int how_many, ItemStack filter, FuzzyMode fuzzyMode, IInventoryDestination destination)
{
if ( filter == null )
return doRemoveItems( how_many, null, destination, Actionable.MODULATE );
return doRemoveItemsFuzzy( how_many, filter, destination, Actionable.MODULATE, fuzzyMode );
}
@Override
public ItemStack simulateSimilarRemove(int how_many, ItemStack filter, FuzzyMode fuzzyMode, IInventoryDestination destination)
{
if ( filter == null )
return doRemoveItems( how_many, null, destination, Actionable.SIMULATE );
return doRemoveItemsFuzzy( how_many, filter, destination, Actionable.SIMULATE, fuzzyMode );
}
@Override
public ItemStack addItems(ItemStack A)
{
IAEItemStack in = AEItemStack.create( A );
if ( in != null )
{
IAEItemStack out = target.injectItems( in, Actionable.MODULATE, src );
if ( out != null )
return out.getItemStack();
}
return null;
}
@Override
public ItemStack simulateAdd(ItemStack A)
{
IAEItemStack in = AEItemStack.create( A );
if ( in != null )
{
IAEItemStack out = target.injectItems( in, Actionable.SIMULATE, src );
if ( out != null )
return out.getItemStack();
}
return null;
}
@Override
public boolean containsItems()
{
return !getList().isEmpty();
}
}

View file

@ -0,0 +1,39 @@
package appeng.util.inv;
import java.util.Iterator;
import appeng.api.storage.data.IAEItemStack;
import appeng.api.storage.data.IItemList;
public class IMEAdaptorIterator implements Iterator<ItemSlot>
{
Iterator<IAEItemStack> stack;
ItemSlot slot = new ItemSlot();
int offset = 0;
public IMEAdaptorIterator(IItemList<IAEItemStack> availableItems) {
stack = availableItems.iterator();
}
@Override
public boolean hasNext()
{
return stack.hasNext();
}
@Override
public ItemSlot next()
{
IAEItemStack item = stack.next();
slot.setAEItemStack( item );
slot.slot = offset++;
return slot;
}
@Override
public void remove()
{
throw new RuntimeException( "Not Implemented!" );
}
}

View file

@ -1,11 +1,38 @@
package appeng.util.inv;
import net.minecraft.item.ItemStack;
import appeng.api.storage.data.IAEItemStack;
import appeng.util.item.AEItemStack;
public class ItemSlot
{
public int slot;
public ItemStack itemStack;
// one or the other..
private IAEItemStack aeitemstack;
private ItemStack itemStack;
public void setItemStack(ItemStack is)
{
aeitemstack = null;
itemStack = is;
}
public void setAEItemStack(IAEItemStack is)
{
aeitemstack = is;
itemStack = null;
}
public ItemStack getItemStack()
{
return itemStack == null ? (aeitemstack == null ? null : (itemStack = aeitemstack.getItemStack())) : itemStack;
}
public IAEItemStack getAEItemStack()
{
return aeitemstack == null ? (itemStack == null ? null : (aeitemstack = AEItemStack.create( itemStack ))) : aeitemstack;
}
}

View file

@ -26,7 +26,7 @@ public class StackToSlotIterator implements Iterator<ItemSlot>
public ItemSlot next()
{
iss.slot = x++;
iss.itemStack = is.next();
iss.setItemStack( is.next() );
return iss;
}