Fixed Interface extracting from itself when trying to keep items in stock, fixes #1313

This commit is contained in:
raoulvdberge
2017-06-21 21:55:24 +02:00
parent 7d6c43815a
commit 8e85fdbf7b
5 changed files with 30 additions and 9 deletions

View File

@@ -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)

View File

@@ -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<IStorage> 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.

View File

@@ -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()) {

View File

@@ -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<IItemHandler> handlerSupplier;
private AccessType lockedAccessType = AccessType.INSERT_EXTRACT;
private boolean connectedToInterface;
public StorageItemItemHandler(NetworkNodeExternalStorage externalStorage, Supplier<IItemHandler> handlerSupplier) {
this.externalStorage = externalStorage;
this.handlerSupplier = handlerSupplier;
if (externalStorage.getFacingTile().getBlockType().getUnlocalizedName().equals("tile.ExtraUtils2:TrashCan")) {
lockedAccessType = AccessType.INSERT;
this.connectedToInterface = externalStorage.getFacingTile() instanceof TileInterface;
}
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();
}
}

View File

@@ -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<TileController> {
public static final TileDataParameter<Integer> 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<IStorage> filter) {
int requested = size;
int received = 0;
@@ -464,7 +465,7 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe
for (IStorage<ItemStack> 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);
}