diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorageMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorageMonitor.java index 5c17caba3..40ce294b6 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorageMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeStorageMonitor.java @@ -2,6 +2,7 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.node; import com.raoulvdberge.refinedstorage.RSUtils; import com.raoulvdberge.refinedstorage.api.util.IComparer; +import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerBasic; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerFluid; import com.raoulvdberge.refinedstorage.inventory.ItemHandlerListenerNetworkNode; @@ -9,12 +10,20 @@ import com.raoulvdberge.refinedstorage.tile.TileStorageMonitor; import com.raoulvdberge.refinedstorage.tile.config.IComparable; import com.raoulvdberge.refinedstorage.tile.config.IType; import com.raoulvdberge.refinedstorage.tile.config.RedstoneMode; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.items.IItemHandler; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.HashMap; +import java.util.Map; public class NetworkNodeStorageMonitor extends NetworkNode implements IComparable, IType { + public static final int DEPOSIT_ALL_MAX_DELAY = 500; + public static final String ID = "storage_monitor"; private static final String NBT_COMPARE = "Compare"; @@ -38,6 +47,8 @@ public class NetworkNodeStorageMonitor extends NetworkNode implements IComparabl } }; + private Map> deposits = new HashMap<>(); + private int compare = IComparer.COMPARE_NBT | IComparer.COMPARE_DAMAGE; private int type = IType.ITEMS; @@ -62,6 +73,49 @@ public class NetworkNodeStorageMonitor extends NetworkNode implements IComparabl } } + public boolean depositAll(EntityPlayer player) { + if (type != IType.ITEMS || network == null) { + return false; + } + + Pair deposit = deposits.get(player.getGameProfile().getName()); + + if (deposit == null) { + return false; + } + + ItemStack inserted = deposit.getKey(); + long insertedAt = deposit.getValue(); + + if (Minecraft.getSystemTime() - insertedAt < DEPOSIT_ALL_MAX_DELAY) { + for (int i = 0; i < player.inventory.getSizeInventory(); ++i) { + ItemStack toInsert = player.inventory.getStackInSlot(i); + + if (API.instance().getComparer().isEqual(inserted, toInsert, compare)) { + player.inventory.setInventorySlotContents(i, RSUtils.transformNullToEmpty(network.insertItemTracked(toInsert, toInsert.getCount()))); + } + } + } + + return true; + } + + public boolean deposit(EntityPlayer player, ItemStack toInsert) { + if (type != IType.ITEMS) { + return false; + } + + ItemStack filter = itemFilter.getStackInSlot(0); + + if (network != null && !filter.isEmpty() && API.instance().getComparer().isEqual(filter, toInsert, compare)) { + player.inventory.setInventorySlotContents(player.inventory.currentItem, RSUtils.transformNullToEmpty(network.insertItemTracked(toInsert, toInsert.getCount()))); + + deposits.put(player.getGameProfile().getName(), Pair.of(toInsert, Minecraft.getSystemTime())); + } + + return true; + } + @Override public int getEnergyUsage() { return 0; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockStorageMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockStorageMonitor.java index bd1f563c8..703f45e8a 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockStorageMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockStorageMonitor.java @@ -1,8 +1,6 @@ package com.raoulvdberge.refinedstorage.block; import com.raoulvdberge.refinedstorage.RSGui; -import com.raoulvdberge.refinedstorage.RSUtils; -import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNodeStorageMonitor; import com.raoulvdberge.refinedstorage.tile.TileStorageMonitor; import com.raoulvdberge.refinedstorage.tile.config.IType; @@ -29,21 +27,17 @@ public class BlockStorageMonitor extends BlockNode { @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { if (!world.isRemote) { - ItemStack holding = player.inventory.getCurrentItem(); + ItemStack held = player.inventory.getCurrentItem(); if (player.isSneaking()) { tryOpenNetworkGui(RSGui.STORAGE_MONITOR, player, world, pos, side); - } else if (!holding.isEmpty()) { + } else { NetworkNodeStorageMonitor storageMonitor = ((TileStorageMonitor) world.getTileEntity(pos)).getNode(); - if (storageMonitor.getType() != IType.ITEMS) { - return false; - } - - ItemStack displaying = storageMonitor.getItemFilter().getStackInSlot(0); - - if (storageMonitor.getNetwork() != null && !displaying.isEmpty() && API.instance().getComparer().isEqual(displaying, holding, storageMonitor.getCompare())) { - player.inventory.setInventorySlotContents(player.inventory.currentItem, RSUtils.transformNullToEmpty(storageMonitor.getNetwork().insertItemTracked(holding, holding.getCount()))); + if (!held.isEmpty()) { + return storageMonitor.deposit(player, held); + } else { + return storageMonitor.depositAll(player); } } }