diff --git a/src/main/java/appeng/helpers/DualityInterface.java b/src/main/java/appeng/helpers/DualityInterface.java index f057413e1..97060c152 100644 --- a/src/main/java/appeng/helpers/DualityInterface.java +++ b/src/main/java/appeng/helpers/DualityInterface.java @@ -24,6 +24,7 @@ import java.util.stream.Collectors; import javax.annotation.Nullable; +import appeng.integration.modules.gregtech.GTCEInventoryAdaptor; import appeng.util.*; import appeng.util.inv.*; import com.google.common.collect.ImmutableSet; @@ -137,6 +138,7 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn private final Accessor accessor = new Accessor(); private EnumSet visitedFaces = EnumSet.noneOf( EnumFacing.class ); private EnumMap> waitingToSendFacing = new EnumMap<>(EnumFacing.class); + private GTCEInventoryAdaptor GTad; public DualityInterface( final AENetworkProxy networkProxy, final IInterfaceHost ih ) { @@ -1020,20 +1022,12 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn private boolean invIsBlocked( InventoryAdaptor inv ) { - final Iterator i = this.craftingList.iterator(); - ICraftingPatternDetails patt = i.next(); - for ( ItemSlot itemSlot : inv) - { - if (itemSlot.getItemStack().isEmpty()){ - continue; - } - for ( IAEItemStack iaeItemStack : patt.getCondensedInputs()){ - if (iaeItemStack.isSameType( itemSlot.getItemStack() )){ - return true; - } - } - } - return false; + return (inv.containsItems()); + } + + private static boolean invIsBlockedGTCE( GTCEInventoryAdaptor inv ) + { + return ( !inv.canRemoveAllExceptCircuits() ); } @Override @@ -1091,7 +1085,16 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn boolean isDrawer = te.getBlockType().getRegistryName().getResourceDomain().equals( "storagedrawers" ); if( this.isBlocking() ) { - if( invIsBlocked( ad ) ) + if( te.getBlockType().getRegistryName().getResourceDomain().equals( "gregtech" ) ) + { + GTad = GTCEInventoryAdaptor.getAdaptor( te, s.getOpposite() ); + if( invIsBlockedGTCE( GTad ) ) + { + visitedFaces.remove( s ); + continue; + } + } + else if ( invIsBlocked( ad ) ) { visitedFaces.remove( s ); continue; @@ -1143,7 +1146,16 @@ public class DualityInterface implements IGridTickable, IStorageMonitorable, IIn final InventoryAdaptor ad = InventoryAdaptor.getAdaptor( te, s.getOpposite() ); if( ad != null ) { - if( !invIsBlocked( ad ) ) + if( te.getBlockType().getRegistryName().getResourceDomain().equals( "gregtech" ) ) + { + GTad = GTCEInventoryAdaptor.getAdaptor( te, s.getOpposite() ); + if( !invIsBlockedGTCE( GTad ) ) + { + allAreBusy = false; + break; + } + } + else if( !invIsBlocked( ad ) ) { allAreBusy = false; break; diff --git a/src/main/java/appeng/integration/modules/gregtech/GTCEInventoryAdaptor.java b/src/main/java/appeng/integration/modules/gregtech/GTCEInventoryAdaptor.java new file mode 100644 index 000000000..bbc15bebf --- /dev/null +++ b/src/main/java/appeng/integration/modules/gregtech/GTCEInventoryAdaptor.java @@ -0,0 +1,26 @@ +package appeng.integration.modules.gregtech; + +import appeng.util.inv.ItemSlot; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; + +public abstract class GTCEInventoryAdaptor implements Iterable +{ + public static GTCEInventoryAdaptor getAdaptor(final TileEntity te, final EnumFacing d) + { + if (te != null && te.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, d)) + { + // Attempt getting an IItemHandler for the given side via caps + IItemHandler itemHandler = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, d); + if (itemHandler != null) + { + return new GTCEItemHandler(itemHandler); + } + } + return null; + } + + public abstract boolean canRemoveAllExceptCircuits(); +} \ No newline at end of file diff --git a/src/main/java/appeng/integration/modules/gregtech/GTCEItemHandler.java b/src/main/java/appeng/integration/modules/gregtech/GTCEItemHandler.java new file mode 100644 index 000000000..e553f12e3 --- /dev/null +++ b/src/main/java/appeng/integration/modules/gregtech/GTCEItemHandler.java @@ -0,0 +1,58 @@ +package appeng.integration.modules.gregtech; + +import appeng.util.inv.ItemHandlerIterator; +import appeng.util.inv.ItemSlot; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.items.IItemHandler; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; + +public class GTCEItemHandler extends GTCEInventoryAdaptor +{ + ArrayList GTCElenses = new ArrayList<>(Arrays.asList(15085,15214,15092,15111,15113,15219,15218,15243,15244,15209,15117,15206,15216,15331,15212,15213,15154,15122,15157,15190,15247)); + ArrayList GTCEmolds = new ArrayList<>(Arrays.asList(32301,32303,32304,32305,32306,32307,32308,32309,32313,32314,32315,32317,32350,32351,32352,32353,32354,32355,32356,32358,32359,32360,32361,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373)); + Item smallGearExtruderShape = Item.getByNameOrId("contenttweaker:smallgearextrudershape"); + Item creativePortableTankMold = Item.getByNameOrId("contenttweaker:creativeportabletankmold"); + + protected final IItemHandler itemHandler; + + public GTCEItemHandler(IItemHandler itemHandler) + { + this.itemHandler = itemHandler; + } + + boolean isBlockableItem(ItemStack stack) + { + if ( stack.getItem() == Item.getByNameOrId("gregtech:meta_item_1") ) { + int metadata = stack.getItemDamage(); + if ( metadata == 32766 || GTCElenses.contains(metadata) || GTCEmolds.contains(metadata)) { + return false; + } + } + if ( stack.getItem() == smallGearExtruderShape ) return false; + if ( stack.getItem() == creativePortableTankMold) return false; + return true; + } + + @Override + public boolean canRemoveAllExceptCircuits() + { + int slots = this.itemHandler.getSlots(); + for ( int slot = 0; slot < slots; slot++ ) { + ItemStack is = this.itemHandler.getStackInSlot(slot); + if ( is.isEmpty() || !isBlockableItem(is) ) continue; + + return false; + } + return true; + } + + @Override + public Iterator iterator() + { + return new ItemHandlerIterator( this.itemHandler ); + } +} \ No newline at end of file diff --git a/src/main/java/appeng/util/inv/ItemHandlerIterator.java b/src/main/java/appeng/util/inv/ItemHandlerIterator.java index 7b4f6acf1..8447f63ad 100644 --- a/src/main/java/appeng/util/inv/ItemHandlerIterator.java +++ b/src/main/java/appeng/util/inv/ItemHandlerIterator.java @@ -25,7 +25,7 @@ import java.util.NoSuchElementException; import net.minecraftforge.items.IItemHandler; -class ItemHandlerIterator implements Iterator +public class ItemHandlerIterator implements Iterator { private final IItemHandler itemHandler; @@ -34,7 +34,7 @@ class ItemHandlerIterator implements Iterator private int slot = 0; - ItemHandlerIterator( IItemHandler itemHandler ) + public ItemHandlerIterator( IItemHandler itemHandler ) { this.itemHandler = itemHandler; }