cache itemstacks more aggressively
This commit is contained in:
@@ -19,9 +19,11 @@
|
||||
package appeng.parts.automation;
|
||||
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
|
||||
import com.google.common.primitives.Ints;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
@@ -278,11 +280,27 @@ public class PartExportBus extends PartSharedItemBus implements ICraftingRequest
|
||||
|
||||
if( energy.extractAEPower( power, mode, PowerMultiplier.CONFIG ) > power - 0.01 )
|
||||
{
|
||||
if( mode == Actionable.MODULATE )
|
||||
ItemStack inputStack = items.getCachedItemStack( items.getStackSize() );
|
||||
|
||||
ItemStack remaining;
|
||||
|
||||
remaining = mode == Actionable.SIMULATE ? d.simulateAdd( inputStack ) : d.addItems( inputStack );
|
||||
|
||||
if( !remaining.isEmpty() )
|
||||
{
|
||||
return AEItemStack.fromItemStack( d.addItems( items.createItemStack() ) );
|
||||
items.setCachedItemStack( remaining );
|
||||
}
|
||||
return AEItemStack.fromItemStack( d.simulateAdd( items.createItemStack() ) );
|
||||
else
|
||||
{
|
||||
items.setCachedItemStack( inputStack );
|
||||
}
|
||||
|
||||
if( remaining == inputStack )
|
||||
{
|
||||
return items;
|
||||
}
|
||||
|
||||
return AEItemStack.fromItemStack( remaining );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -318,11 +336,13 @@ public class PartExportBus extends PartSharedItemBus implements ICraftingRequest
|
||||
|
||||
private void pushItemIntoTarget( final InventoryAdaptor d, final IEnergyGrid energy, final IMEInventory<IAEItemStack> inv, IAEItemStack ais )
|
||||
{
|
||||
final ItemStack is = ais.createItemStack();
|
||||
is.setCount( (int) this.itemToSend );
|
||||
ItemStack inputStack = ais.createItemStack();
|
||||
|
||||
final ItemStack o = d.simulateAdd( is );
|
||||
final long canFit = o.isEmpty() ? this.itemToSend : this.itemToSend - o.getCount();
|
||||
ItemStack toAdd = inputStack;
|
||||
|
||||
final ItemStack remaining = d.simulateAdd( inputStack );
|
||||
|
||||
final long canFit = remaining.isEmpty() ? this.itemToSend : this.itemToSend - remaining.getCount();
|
||||
|
||||
if( canFit > 0 )
|
||||
{
|
||||
@@ -334,7 +354,13 @@ public class PartExportBus extends PartSharedItemBus implements ICraftingRequest
|
||||
{
|
||||
this.itemToSend -= itemsToAdd.getStackSize();
|
||||
|
||||
final ItemStack failed = d.addItems( itemsToAdd.createItemStack() );
|
||||
if( !remaining.isEmpty() )
|
||||
{
|
||||
toAdd = remaining;
|
||||
}
|
||||
toAdd.setCount( Ints.saturatedCast( canFit ) );
|
||||
|
||||
final ItemStack failed = d.addItems( toAdd );
|
||||
if( !failed.isEmpty() )
|
||||
{
|
||||
ais.setStackSize( failed.getCount() );
|
||||
|
||||
@@ -62,8 +62,6 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
||||
private StorageFilter mode;
|
||||
private AccessRestriction access;
|
||||
|
||||
private ItemStack stackCache = null;
|
||||
|
||||
ItemHandlerAdapter( IItemHandler itemHandler, IGridProxyable proxy )
|
||||
{
|
||||
this.itemHandler = itemHandler;
|
||||
@@ -82,39 +80,28 @@ class ItemHandlerAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAE
|
||||
public IAEItemStack injectItems( IAEItemStack iox, Actionable type, IActionSource src )
|
||||
{
|
||||
// Try to reuse the cached stack
|
||||
@Nullable ItemStack currentCached = stackCache;
|
||||
stackCache = null;
|
||||
ItemStack inputStack = iox.getCachedItemStack( iox.getStackSize() );
|
||||
|
||||
ItemStack remaining = inputStack;
|
||||
|
||||
ItemStack orgInput;
|
||||
int slotCount = this.itemHandler.getSlots();
|
||||
|
||||
if( currentCached != null && iox.isSameType( currentCached ) )
|
||||
{
|
||||
// Cache is suitable, just update the count
|
||||
orgInput = currentCached;
|
||||
currentCached.setCount( Ints.saturatedCast( iox.getStackSize() ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
// We need a new stack :-(
|
||||
orgInput = iox.createItemStack();
|
||||
}
|
||||
|
||||
ItemStack remaining = orgInput;
|
||||
|
||||
for( int i = 0; i < slotCount && !remaining.isEmpty(); i++ )
|
||||
{
|
||||
remaining = this.itemHandler.insertItem( i, remaining, type == Actionable.SIMULATE );
|
||||
}
|
||||
|
||||
// Store the stack in the cache for next time.
|
||||
if( !remaining.isEmpty() && remaining != orgInput )
|
||||
if( !remaining.isEmpty() )
|
||||
{
|
||||
stackCache = remaining;
|
||||
iox.setCachedItemStack( remaining );
|
||||
}
|
||||
else
|
||||
{
|
||||
iox.setCachedItemStack( inputStack );
|
||||
}
|
||||
|
||||
// At this point, we still have some items left...
|
||||
if( remaining == orgInput )
|
||||
if( remaining == inputStack )
|
||||
{
|
||||
// The stack remained unmodified, target inventory is full
|
||||
return iox;
|
||||
|
||||
@@ -42,8 +42,6 @@ class ItemRepositoryAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<
|
||||
private final InventoryCache cache;
|
||||
private AccessRestriction access;
|
||||
|
||||
private ItemStack stackCache;
|
||||
|
||||
ItemRepositoryAdapter( IItemRepository itemRepository, IGridProxyable proxy )
|
||||
{
|
||||
this.itemRepository = itemRepository;
|
||||
@@ -61,31 +59,24 @@ class ItemRepositoryAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<
|
||||
public IAEItemStack injectItems( IAEItemStack iox, Actionable type, IActionSource src )
|
||||
{
|
||||
// Try to reuse the cached stack
|
||||
@Nullable ItemStack currentCached = stackCache;
|
||||
stackCache = null;
|
||||
ItemStack inputStack = iox.getCachedItemStack( iox.getStackSize() );
|
||||
|
||||
ItemStack orgInput;
|
||||
if( currentCached != null && iox.isSameType( currentCached ) )
|
||||
ItemStack remaining;
|
||||
|
||||
remaining = this.itemRepository.insertItem( inputStack, type == Actionable.SIMULATE );
|
||||
|
||||
// Store the stack in the cache for next time.
|
||||
if( !remaining.isEmpty() )
|
||||
{
|
||||
// Cache is suitable, just update the count
|
||||
orgInput = currentCached;
|
||||
currentCached.setCount( Ints.saturatedCast( iox.getStackSize() ) );
|
||||
iox.setCachedItemStack( remaining );
|
||||
}
|
||||
else
|
||||
{
|
||||
// We need a new stack :-(
|
||||
orgInput = iox.createItemStack();
|
||||
}
|
||||
ItemStack remaining = this.itemRepository.insertItem( orgInput, type == Actionable.SIMULATE );
|
||||
|
||||
// Store the stack in the cache for next time.
|
||||
if( !remaining.isEmpty() && remaining != orgInput )
|
||||
{
|
||||
stackCache = remaining;
|
||||
iox.setCachedItemStack( inputStack );
|
||||
}
|
||||
|
||||
// At this point, we still have some items left...
|
||||
if( remaining == orgInput )
|
||||
if( remaining == inputStack )
|
||||
{
|
||||
// The stack remained unmodified, target inventory is full
|
||||
return iox;
|
||||
|
||||
Reference in New Issue
Block a user