fix IItemRepository insert and extraction

This commit is contained in:
Salomão
2021-02-21 02:24:50 -03:00
parent 92b48f01a2
commit d25a8a53a2
2 changed files with 69 additions and 39 deletions
@@ -38,7 +38,7 @@ import javax.annotation.Nonnull;
* Used by the Storage Bus * Used by the Storage Bus
*/ */
class ItemRepositoryAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAEItemStack>, ITickingMonitor, IItemRepository class ItemRepositoryAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<IAEItemStack>, ITickingMonitor
{ {
private final Map<IMEMonitorHandlerReceiver<IAEItemStack>, Object> listeners = new HashMap<>(); private final Map<IMEMonitorHandlerReceiver<IAEItemStack>, Object> listeners = new HashMap<>();
private IActionSource mySource; private IActionSource mySource;
@@ -192,30 +192,6 @@ class ItemRepositoryAdapter implements IMEInventory<IAEItemStack>, IBaseMonitor<
this.mySource = mySource; this.mySource = mySource;
} }
@Nonnull
@Override
public NonNullList<ItemRecord> getAllItems()
{
//not a provider
return null;
}
@Nonnull
@Override
public ItemStack insertItem( @Nonnull ItemStack stack, boolean simulate, Predicate<ItemStack> predicate )
{
//not a provider
return null;
}
@Nonnull
@Override
public ItemStack extractItem( @Nonnull ItemStack stack, int amount, boolean simulate, Predicate<ItemStack> predicate )
{
//not a provider
return null;
}
private static class InventoryCache private static class InventoryCache
{ {
private IAEItemStack[] cachedAeStacks = new IAEItemStack[0]; private IAEItemStack[] cachedAeStacks = new IAEItemStack[0];
@@ -23,8 +23,23 @@ public class AdaptorItemRepository extends InventoryAdaptor
public ItemStack removeItems( int amount, ItemStack filter, IInventoryDestination destination ) public ItemStack removeItems( int amount, ItemStack filter, IInventoryDestination destination )
{ {
ItemStack rv = ItemStack.EMPTY; ItemStack rv = ItemStack.EMPTY;
ItemStack extracted = ItemStack.EMPTY;
ItemStack extracted = this.itemRepository.extractItem( filter, amount, true ); if( !filter.isEmpty() )
{
extracted = this.itemRepository.extractItem( filter, amount, true );
}
else
{
for( IItemRepository.ItemRecord record : this.itemRepository.getAllItems() )
{
extracted = this.itemRepository.extractItem( record.itemPrototype, amount, true );
if( !extracted.isEmpty() )
{
break;
}
}
}
if( destination != null ) if( destination != null )
{ {
@@ -37,6 +52,7 @@ public class AdaptorItemRepository extends InventoryAdaptor
} }
extracted = this.itemRepository.extractItem( filter, amount, false ); extracted = this.itemRepository.extractItem( filter, amount, false );
return extracted; return extracted;
} }
@@ -44,15 +60,32 @@ public class AdaptorItemRepository extends InventoryAdaptor
public ItemStack simulateRemove( int amount, ItemStack filter, IInventoryDestination destination ) public ItemStack simulateRemove( int amount, ItemStack filter, IInventoryDestination destination )
{ {
ItemStack rv = ItemStack.EMPTY; ItemStack rv = ItemStack.EMPTY;
ItemStack extracted = ItemStack.EMPTY;
ItemStack extracted = this.itemRepository.extractItem( filter, amount, true ); if( !filter.isEmpty() )
{
extracted = this.itemRepository.extractItem( filter, amount, true );
}
else
{
for( IItemRepository.ItemRecord record : this.itemRepository.getAllItems() )
{
extracted = this.itemRepository.extractItem( record.itemPrototype, amount, true );
if( !extracted.isEmpty() )
{
break;
}
}
}
if( destination != null ) if( destination != null )
{ {
if( extracted.isEmpty() || !destination.canInsert( extracted ) ) if( extracted.isEmpty() || !destination.canInsert( extracted ) )
{ {
return rv; return rv;
} }
} }
return extracted; return extracted;
@@ -61,46 +94,67 @@ public class AdaptorItemRepository extends InventoryAdaptor
@Override @Override
public ItemStack removeSimilarItems( int amount, ItemStack filter, FuzzyMode fuzzyMode, IInventoryDestination destination ) public ItemStack removeSimilarItems( int amount, ItemStack filter, FuzzyMode fuzzyMode, IInventoryDestination destination )
{ {
ItemStack rv = ItemStack.EMPTY;
ItemStack extracted = ItemStack.EMPTY; ItemStack extracted = ItemStack.EMPTY;
ItemStack simulated = this.itemRepository.extractItem( filter, amount, true ); for( IItemRepository.ItemRecord record : this.itemRepository.getAllItems() )
{
if( Platform.itemComparisons().isFuzzyEqualItem( record.itemPrototype, filter, fuzzyMode ) )
{
extracted = this.itemRepository.extractItem( record.itemPrototype, amount, true );
}
if (simulated.isEmpty() && !filter.isEmpty()) { if( !extracted.isEmpty() )
simulated = this.itemRepository.extractItem( filter, amount, true, s -> Platform.itemComparisons().isFuzzyEqualItem( s, filter, fuzzyMode ) ); {
break;
}
} }
if( destination != null ) if( destination != null )
{ {
if( simulated.isEmpty() || !destination.canInsert( simulated ) )
if( extracted.isEmpty() || !destination.canInsert( extracted ) )
{ {
return extracted; return rv;
} }
} }
extracted = this.itemRepository.extractItem( simulated, amount, false ); extracted = this.itemRepository.extractItem( extracted, amount, false );
return extracted; return extracted;
} }
@Override @Override
public ItemStack simulateSimilarRemove( int amount, ItemStack filter, FuzzyMode fuzzyMode, IInventoryDestination destination ) public ItemStack simulateSimilarRemove( int amount, ItemStack filter, FuzzyMode fuzzyMode, IInventoryDestination destination )
{ {
ItemStack rv = ItemStack.EMPTY;
ItemStack extracted = ItemStack.EMPTY; ItemStack extracted = ItemStack.EMPTY;
ItemStack simulated = this.itemRepository.extractItem( filter, amount, true ); for( IItemRepository.ItemRecord record : this.itemRepository.getAllItems() )
{
if( Platform.itemComparisons().isFuzzyEqualItem( record.itemPrototype, filter, fuzzyMode ) )
{
extracted = this.itemRepository.extractItem( record.itemPrototype, amount, true );
}
if (simulated.isEmpty() && !filter.isEmpty()) { if( !extracted.isEmpty() )
simulated = this.itemRepository.extractItem( filter, amount, true, s -> Platform.itemComparisons().isFuzzyEqualItem( s, filter, fuzzyMode ) ); {
break;
}
} }
if( destination != null ) if( destination != null )
{ {
if( simulated.isEmpty() || !destination.canInsert( simulated ) )
if( extracted.isEmpty() || !destination.canInsert( extracted ) )
{ {
return extracted; return rv;
} }
} }
return simulated; return extracted;
} }
@Override @Override