diff --git a/src/main/java/appeng/core/AEConfig.java b/src/main/java/appeng/core/AEConfig.java index 5f79f37fd..941675f6f 100644 --- a/src/main/java/appeng/core/AEConfig.java +++ b/src/main/java/appeng/core/AEConfig.java @@ -87,6 +87,7 @@ public final class AEConfig extends Configuration implements IConfigurableObject "gregtech:shape.extruder.ingot", "gregtech:shape.extruder.wire", "gregtech:shape.extruder.pipe.tiny", "gregtech:shape.extruder.pipe.small", + "gregtech:shape.extruder.pipe.medium", "gregtech:shape.extruder.pipe.normal", "gregtech:shape.extruder.pipe.large", "gregtech:shape.extruder.pipe.huge", diff --git a/src/main/java/appeng/helpers/DualityInterface.java b/src/main/java/appeng/helpers/DualityInterface.java index e019996ff..f0824e6b6 100644 --- a/src/main/java/appeng/helpers/DualityInterface.java +++ b/src/main/java/appeng/helpers/DualityInterface.java @@ -1329,7 +1329,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn continue; } - if( !ad.simulateAdd( is.copy() ).isEmpty() ) + if( !ad.simulateAdd( is ).isEmpty() ) { return false; } diff --git a/src/main/java/appeng/helpers/NonBlockingItems.java b/src/main/java/appeng/helpers/NonBlockingItems.java index 576b0cb02..30563ce16 100644 --- a/src/main/java/appeng/helpers/NonBlockingItems.java +++ b/src/main/java/appeng/helpers/NonBlockingItems.java @@ -1,86 +1,113 @@ package appeng.helpers; -import appeng.api.AEApi; -import appeng.api.storage.channels.IItemStorageChannel; -import appeng.api.storage.data.IAEItemStack; -import appeng.api.storage.data.IItemList; import appeng.core.AEConfig; import appeng.core.AELog; -import appeng.util.item.AEItemStack; import gregtech.api.items.metaitem.MetaItem; +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; +import it.unimi.dsi.fastutil.ints.IntSet; +import it.unimi.dsi.fastutil.objects.*; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.registry.GameRegistry; +import net.minecraftforge.oredict.OreDictionary; import java.util.*; public class NonBlockingItems { - public static Map> NON_BLOCKING_MAP = new HashMap<>(); + public static Map> NON_BLOCKING_MAP = new HashMap<>(); public static NonBlockingItems INSTANCE = new NonBlockingItems(); private NonBlockingItems() { String[] strings = AEConfig.instance().getNonBlockingItems(); - String modid = ""; + String[] modids = new String[0]; if( strings.length > 0 ) { for( String s : strings ) { if( s.startsWith( "[" ) && s.endsWith( "]" ) ) { - modid = s.substring( 1, s.length() - 1 ); + modids = s.substring( 1, s.length() - 1 ).split( "\\|" ); } else { - if( !Loader.isModLoaded( modid ) ) + for( String modid : modids ) { - continue; - } - NON_BLOCKING_MAP.putIfAbsent( modid, AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ).createList() ); - String[] ModItemMeta = s.split( ":" ); - - if( ModItemMeta.length < 2 || ModItemMeta.length > 3 ) - { - AELog.error( "Invalid non blocking item entry: " + s ); - continue; - } - - if( ModItemMeta[0].equals( "gregtech" ) ) - { - for( MetaItem metaItem : MetaItem.getMetaItems() ) + if( !Loader.isModLoaded( modid ) ) { - MetaItem.MetaValueItem metaItem2 = metaItem.getItem( ModItemMeta[1] ); - if( metaItem.getItem( ModItemMeta[1] ) != null ) + continue; + } + NON_BLOCKING_MAP.putIfAbsent( modid, new Object2ObjectOpenHashMap<>() ); + + String[] ModItemMeta = s.split( ":" ); + + if( ModItemMeta.length < 2 || ModItemMeta.length > 3 ) + { + AELog.error( "Invalid non blocking item entry: " + s ); + continue; + } + + if( ModItemMeta[0].equals( "gregtech" ) ) + { + for( MetaItem metaItem : MetaItem.getMetaItems() ) { - NON_BLOCKING_MAP.get( modid ).add( AEItemStack.fromItemStack( metaItem2.getStackForm() ) ); - } - else - { - ItemStack itemStack = GameRegistry.makeItemStack( ModItemMeta[0] + ":" + ModItemMeta[1], ModItemMeta.length == 3 ? Integer.parseInt( ModItemMeta[2] ) : 0, 1, null ); - if( !itemStack.isEmpty() ) + MetaItem.MetaValueItem metaItem2 = metaItem.getItem( ModItemMeta[1] ); + if( metaItem.getItem( ModItemMeta[1] ) != null ) { - NON_BLOCKING_MAP.get( modid ).add( AEItemStack.fromItemStack( itemStack ) ); + ItemStack itemStack = metaItem2.getStackForm(); + NON_BLOCKING_MAP.get( modid ).putIfAbsent( itemStack.getItem(), new IntOpenHashSet() ); + NON_BLOCKING_MAP.get( modid ).computeIfPresent( itemStack.getItem(), ( item, intSet ) -> { + intSet.add( itemStack.getItemDamage() ); + return intSet; + } ); } else { - AELog.error( "Item not found on nonBlocking config: " + s ); + ItemStack itemStack = GameRegistry.makeItemStack( ModItemMeta[0] + ":" + ModItemMeta[1], ModItemMeta.length == 3 ? Integer.parseInt( ModItemMeta[2] ) : 0, 1, null ); + if( !itemStack.isEmpty() ) + { + NON_BLOCKING_MAP.get( modid ).putIfAbsent( itemStack.getItem(), new IntOpenHashSet() ); + NON_BLOCKING_MAP.get( modid ).computeIfPresent( itemStack.getItem(), ( item, intSet ) -> { + intSet.add( itemStack.getItemDamage() ); + return intSet; + } ); + } + else + { + AELog.error( "Item not found on nonBlocking config: " + s ); + } } + break; } - break; } - } - else - { - ItemStack itemStack = GameRegistry.makeItemStack( ModItemMeta[0] + ":" + ModItemMeta[1], ModItemMeta.length == 3 ? Integer.parseInt( ModItemMeta[2] ) : 0, 1, null ); - if( !itemStack.isEmpty() ) + else if( ModItemMeta[0].equals( "ore" ) ) { - NON_BLOCKING_MAP.get( modid ).add( AEItemStack.fromItemStack( itemStack ) ); + OreDictionary.getOres( ModItemMeta[1] ).forEach( itemStack -> { + NON_BLOCKING_MAP.get( modid ).putIfAbsent( itemStack.getItem(), new IntOpenHashSet() ); + NON_BLOCKING_MAP.get( modid ).computeIfPresent( itemStack.getItem(), ( item, intSet ) -> { + intSet.add( itemStack.getItemDamage() ); + return intSet; + } ); + } ); } else { - AELog.error( "Item not found on nonBlocking config: " + s ); + ItemStack itemStack = GameRegistry.makeItemStack( ModItemMeta[0] + ":" + ModItemMeta[1], ModItemMeta.length == 3 ? Integer.parseInt( ModItemMeta[2] ) : 0, 1, null ); + if( !itemStack.isEmpty() ) + { + NON_BLOCKING_MAP.get( modid ).putIfAbsent( itemStack.getItem(), new IntOpenHashSet() ); + NON_BLOCKING_MAP.get( modid ).computeIfPresent( itemStack.getItem(), ( item, intSet ) -> { + intSet.add( itemStack.getItemDamage() ); + return intSet; + } ); + } + else + { + AELog.error( "Item not found on nonBlocking config: " + s ); + } } } } @@ -88,7 +115,7 @@ public class NonBlockingItems } } - public Map> getMap() + public Map> getMap() { return NON_BLOCKING_MAP; } diff --git a/src/main/java/appeng/parts/automation/PartExportBus.java b/src/main/java/appeng/parts/automation/PartExportBus.java index 4d87fb3ac..c53b054bb 100644 --- a/src/main/java/appeng/parts/automation/PartExportBus.java +++ b/src/main/java/appeng/parts/automation/PartExportBus.java @@ -300,24 +300,17 @@ public class PartExportBus extends PartSharedItemBus implements ICraftingRequest if( mode == Actionable.SIMULATE ) { remaining = d.simulateAdd( inputStack ); - } - else - { - remaining = d.addItems( inputStack ); - } - - // Store the stack in the cache for next time. - if( mode == Actionable.SIMULATE ) - { items.setCachedItemStack( inputStack ); } else { + remaining = d.addItems( inputStack ); if( !remaining.isEmpty() ) { items.setCachedItemStack( remaining ); } } + if( remaining == inputStack ) { return items; diff --git a/src/main/java/appeng/util/inv/BlockingItemHandler.java b/src/main/java/appeng/util/inv/BlockingItemHandler.java index 41c089d71..f1a65209b 100644 --- a/src/main/java/appeng/util/inv/BlockingItemHandler.java +++ b/src/main/java/appeng/util/inv/BlockingItemHandler.java @@ -7,6 +7,10 @@ import appeng.helpers.NonBlockingItems; import appeng.util.Platform; import appeng.util.item.AEItemStack; import gregtech.common.items.MetaTool; +import it.unimi.dsi.fastutil.ints.IntSet; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.items.IItemHandler; @@ -27,17 +31,12 @@ public class BlockingItemHandler extends BlockingInventoryAdaptor boolean isBlockableItem( ItemStack stack ) { - IItemList itemList = NonBlockingItems.INSTANCE.getMap().get( domain ); - if( stack.getItem().isDamageable() || ( Platform.isModLoaded( "gregtech" ) && stack.getItem() instanceof MetaTool ) ) + Object2ObjectOpenHashMap map = NonBlockingItems.INSTANCE.getMap().get( domain ); + if( map.get( stack.getItem() ) != null ) { - Collection item = itemList.findFuzzy( AEItemStack.fromItemStack( stack ), FuzzyMode.IGNORE_ALL ); - return item.isEmpty(); - } - else - { - IAEItemStack item = itemList.findPrecise( AEItemStack.fromItemStack( stack ) ); - return item == null; + return !map.get( stack.getItem() ).contains( stack.getItemDamage() ); } + return true; } @Override