diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c580b2ee..b6477911b 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ### 1.5.3 - Fixed Solderer crashing (raoulvdberge) +- Fixed Interface extracting from itself when trying to keep items in stock (raoulvdberge) - The Portable Grid now exposes an inventory for interaction with other mods or vanilla (raoulvdberge) - The Relay now reacts instantly to a redstone signal again, removed throttling for it (raoulvdberge) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetwork.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetwork.java index a6201af4c..006b02fda 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetwork.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetwork.java @@ -6,6 +6,7 @@ import com.raoulvdberge.refinedstorage.api.network.grid.IItemGridHandler; import com.raoulvdberge.refinedstorage.api.network.item.INetworkItemHandler; import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterChannel; import com.raoulvdberge.refinedstorage.api.network.security.ISecurityManager; +import com.raoulvdberge.refinedstorage.api.storage.IStorage; import com.raoulvdberge.refinedstorage.api.storage.IStorageCache; import com.raoulvdberge.refinedstorage.api.util.IComparer; import net.minecraft.entity.player.EntityPlayerMP; @@ -16,6 +17,7 @@ import net.minecraftforge.fluids.FluidStack; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.function.Predicate; /** * Represents a network, usually is a controller. @@ -200,10 +202,24 @@ public interface INetwork { * @param size the amount of that prototype that has to be extracted * @param flags the flags to compare on, see {@link IComparer} * @param simulate true if we are simulating, false otherwise + * @param filter a filter for the storage * @return null if we didn't extract anything, or a stack with the result */ @Nullable - ItemStack extractItem(@Nonnull ItemStack stack, int size, int flags, boolean simulate); + ItemStack extractItem(@Nonnull ItemStack stack, int size, int flags, boolean simulate, Predicate filter); + + /** + * Extracts an item from this network. + * + * @param stack the prototype of the stack to extract, do NOT modify + * @param size the amount of that prototype that has to be extracted + * @param flags the flags to compare on, see {@link IComparer} + * @param simulate true if we are simulating, false otherwise + * @return null if we didn't extract anything, or a stack with the result + */ + default ItemStack extractItem(@Nonnull ItemStack stack, int size, int flags, boolean simulate) { + return extractItem(stack, size, flags, simulate, s -> true); + } /** * Extracts an item from this network. diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeInterface.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeInterface.java index ee2cafa19..1a5edbb4f 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeInterface.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeInterface.java @@ -4,6 +4,7 @@ import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.apiimpl.API; +import com.raoulvdberge.refinedstorage.apiimpl.network.node.externalstorage.StorageItemItemHandler; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBase; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerListenerNetworkNode; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerProxy; @@ -88,7 +89,7 @@ public class NetworkNodeInterface extends NetworkNode implements IComparable { int delta = got.isEmpty() ? wanted.getCount() : (wanted.getCount() - got.getCount()); if (delta > 0) { - ItemStack result = network.extractItem(wanted, delta, compare, false); + ItemStack result = network.extractItem(wanted, delta, compare, false, s -> !(s instanceof StorageItemItemHandler) || !((StorageItemItemHandler) s).isConnectedToInterface()); if (result != null) { if (exportItems.getStackInSlot(i).isEmpty()) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemItemHandler.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemItemHandler.java index 94a0816b3..4a8124a02 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemItemHandler.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/externalstorage/StorageItemItemHandler.java @@ -3,6 +3,7 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.node.externalstorage; import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.api.storage.AccessType; import com.raoulvdberge.refinedstorage.apiimpl.API; +import com.raoulvdberge.refinedstorage.tile.TileInterface; import com.raoulvdberge.refinedstorage.tile.config.IFilterable; import net.minecraft.item.ItemStack; import net.minecraftforge.items.IItemHandler; @@ -18,15 +19,16 @@ import java.util.function.Supplier; public class StorageItemItemHandler extends StorageItemExternal { private NetworkNodeExternalStorage externalStorage; private Supplier handlerSupplier; - private AccessType lockedAccessType = AccessType.INSERT_EXTRACT; + private boolean connectedToInterface; public StorageItemItemHandler(NetworkNodeExternalStorage externalStorage, Supplier handlerSupplier) { this.externalStorage = externalStorage; this.handlerSupplier = handlerSupplier; + this.connectedToInterface = externalStorage.getFacingTile() instanceof TileInterface; + } - if (externalStorage.getFacingTile().getBlockType().getUnlocalizedName().equals("tile.ExtraUtils2:TrashCan")) { - lockedAccessType = AccessType.INSERT; - } + public boolean isConnectedToInterface() { + return connectedToInterface; } @Override @@ -127,6 +129,6 @@ public class StorageItemItemHandler extends StorageItemExternal { @Override public AccessType getAccessType() { - return ((lockedAccessType != AccessType.INSERT_EXTRACT) ? lockedAccessType : externalStorage.getAccessType()); + return externalStorage.getAccessType(); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java index 508be9cea..64121675e 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java @@ -66,6 +66,7 @@ import net.minecraftforge.items.ItemHandlerHelper; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.*; +import java.util.function.Predicate; public class TileController extends TileBase implements ITickable, INetwork, IRedstoneConfigurable, INetworkNode, INetworkNodeProxy { public static final TileDataParameter REDSTONE_MODE = RedstoneMode.createParameter(); @@ -453,7 +454,7 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe } @Override - public ItemStack extractItem(@Nonnull ItemStack stack, int size, int flags, boolean simulate) { + public ItemStack extractItem(@Nonnull ItemStack stack, int size, int flags, boolean simulate, Predicate filter) { int requested = size; int received = 0; @@ -464,7 +465,7 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe for (IStorage storage : this.itemStorage.getStorages()) { ItemStack took = null; - if (storage.getAccessType() != AccessType.INSERT) { + if (filter.test(storage) && storage.getAccessType() != AccessType.INSERT) { took = storage.extract(stack, requested - received, flags, simulate); }