Applied-Energistics-2-tiler.../src/main/java/appeng/crafting/MECraftingInventory.java

271 lines
6.1 KiB
Java
Raw Normal View History

2014-06-06 06:26:01 +02:00
package appeng.crafting;
import appeng.api.AEApi;
import appeng.api.config.Actionable;
import appeng.api.networking.security.BaseActionSource;
import appeng.api.storage.IMEInventory;
import appeng.api.storage.IMEMonitor;
2014-06-06 06:26:01 +02:00
import appeng.api.storage.StorageChannel;
import appeng.api.storage.data.IAEItemStack;
import appeng.api.storage.data.IItemList;
public class MECraftingInventory implements IMEInventory<IAEItemStack>
{
final MECraftingInventory par;
2014-06-06 06:26:01 +02:00
final IMEInventory<IAEItemStack> target;
final IItemList<IAEItemStack> localCache;
final boolean logExtracted;
2014-06-06 06:26:01 +02:00
final IItemList<IAEItemStack> extractedCache;
final boolean logInjections;
final IItemList<IAEItemStack> injectedCache;
final boolean logMissing;
final IItemList<IAEItemStack> missingCache;
public MECraftingInventory()
{
localCache = AEApi.instance().storage().createItemList();
extractedCache = null;
injectedCache = null;
missingCache = null;
this.logExtracted = false;
this.logInjections = false;
this.logMissing = false;
target = null;
par = null;
}
2014-09-21 02:19:55 +02:00
public MECraftingInventory(MECraftingInventory parent)
{
2014-09-21 02:19:55 +02:00
this.target = parent;
this.logExtracted = parent.logExtracted;
this.logInjections = parent.logInjections;
this.logMissing = parent.logMissing;
if ( logMissing )
missingCache = AEApi.instance().storage().createItemList();
else
missingCache = null;
if ( logExtracted )
extractedCache = AEApi.instance().storage().createItemList();
else
extractedCache = null;
if ( logInjections )
injectedCache = AEApi.instance().storage().createItemList();
else
injectedCache = null;
localCache = target.getAvailableItems( AEApi.instance().storage().createItemList() );
2014-09-21 02:19:55 +02:00
par = parent;
}
public MECraftingInventory(IMEMonitor<IAEItemStack> target, BaseActionSource src, boolean logExtracted, boolean logInjections, boolean logMissing)
{
2014-06-06 06:26:01 +02:00
this.target = target;
this.logExtracted = logExtracted;
this.logInjections = logInjections;
this.logMissing = logMissing;
if ( logMissing )
missingCache = AEApi.instance().storage().createItemList();
else
missingCache = null;
if ( logExtracted )
extractedCache = AEApi.instance().storage().createItemList();
else
extractedCache = null;
if ( logInjections )
injectedCache = AEApi.instance().storage().createItemList();
else
injectedCache = null;
localCache = AEApi.instance().storage().createItemList();
for (IAEItemStack is : target.getStorageList())
localCache.add( target.extractItems( is, Actionable.SIMULATE, src ) );
par = null;
2014-06-06 06:26:01 +02:00
}
public MECraftingInventory(IMEInventory<IAEItemStack> target, boolean logExtracted, boolean logInjections, boolean logMissing)
{
this.target = target;
this.logExtracted = logExtracted;
this.logInjections = logInjections;
this.logMissing = logMissing;
if ( logMissing )
missingCache = AEApi.instance().storage().createItemList();
else
missingCache = null;
if ( logExtracted )
extractedCache = AEApi.instance().storage().createItemList();
else
extractedCache = null;
if ( logInjections )
injectedCache = AEApi.instance().storage().createItemList();
else
injectedCache = null;
localCache = target.getAvailableItems( AEApi.instance().storage().createItemList() );
par = null;
}
2014-06-06 06:26:01 +02:00
@Override
public IAEItemStack injectItems(IAEItemStack input, Actionable mode, BaseActionSource src)
{
if ( input == null )
return null;
if ( mode == Actionable.MODULATE )
{
if ( logInjections )
injectedCache.add( input );
2014-06-06 06:26:01 +02:00
localCache.add( input );
}
2014-06-06 06:26:01 +02:00
return null;
}
@Override
public IAEItemStack extractItems(IAEItemStack request, Actionable mode, BaseActionSource src)
{
if ( request == null )
return null;
IAEItemStack list = localCache.findPrecise( request );
if ( list == null || list.getStackSize() == 0 )
return null;
if ( list.getStackSize() >= request.getStackSize() )
{
if ( mode == Actionable.MODULATE )
{
2014-06-06 06:26:01 +02:00
list.decStackSize( request.getStackSize() );
if ( logExtracted )
extractedCache.add( request );
}
2014-06-06 06:26:01 +02:00
return request;
}
IAEItemStack ret = request.copy();
ret.setStackSize( list.getStackSize() );
2014-06-06 06:26:01 +02:00
if ( mode == Actionable.MODULATE )
{
2014-06-06 06:26:01 +02:00
list.reset();
if ( logExtracted )
extractedCache.add( ret );
}
2014-06-06 06:26:01 +02:00
return ret;
}
@Override
public IItemList<IAEItemStack> getAvailableItems(IItemList<IAEItemStack> out)
{
for (IAEItemStack is : localCache)
out.add( is );
return out;
}
public IItemList<IAEItemStack> getItemList()
{
return localCache;
}
@Override
public StorageChannel getChannel()
{
return StorageChannel.ITEMS;
}
public boolean commit(BaseActionSource src)
{
IItemList<IAEItemStack> added = AEApi.instance().storage().createItemList();
IItemList<IAEItemStack> pulled = AEApi.instance().storage().createItemList();
boolean failed = false;
if ( logInjections )
{
2014-09-21 02:43:44 +02:00
for (IAEItemStack inject : injectedCache)
{
IAEItemStack result = null;
2014-09-21 02:43:44 +02:00
added.add( result = target.injectItems( inject, Actionable.MODULATE, src ) );
if ( result != null )
{
failed = true;
break;
}
}
}
if ( failed )
{
for (IAEItemStack is : added)
target.extractItems( is, Actionable.MODULATE, src );
return false;
}
if ( logExtracted )
{
for (IAEItemStack extra : extractedCache)
{
IAEItemStack result = null;
pulled.add( result = target.extractItems( extra, Actionable.MODULATE, src ) );
if ( result == null || result.getStackSize() != extra.getStackSize() )
{
failed = true;
break;
}
}
}
if ( failed )
{
for (IAEItemStack is : added)
target.extractItems( is, Actionable.MODULATE, src );
for (IAEItemStack is : pulled)
target.injectItems( is, Actionable.MODULATE, src );
return false;
}
if ( logMissing && par != null )
{
for (IAEItemStack extra : missingCache)
par.addMissing( extra );
}
return true;
}
public void addMissing(IAEItemStack extra)
{
missingCache.add( extra );
}
public void ignore(IAEItemStack what)
{
2014-06-22 09:00:38 +02:00
IAEItemStack list = localCache.findPrecise( what );
if ( list != null )
list.setStackSize( 0 );
}
2014-06-06 06:26:01 +02:00
}