Add deposit all to storage monitor

This commit is contained in:
raoulvdberge
2017-02-19 15:28:52 +01:00
parent 06549c8eca
commit 2e4ba3a11e
2 changed files with 60 additions and 12 deletions

View File

@@ -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<String, Pair<ItemStack, Long>> 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<ItemStack, Long> 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;

View File

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