From 27954a9765969e91e316de01a2e9d1e47a4b137a Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Thu, 15 Oct 2020 01:56:42 +0200 Subject: [PATCH] some more fixes and cleanup --- .../prettypipes/network/PipeNetwork.java | 22 ++++++++++++++----- .../modules/craft/CraftingModuleItem.java | 22 +++++-------------- .../terminal/CraftingTerminalTileEntity.java | 2 +- .../terminal/ItemTerminalTileEntity.java | 2 +- 4 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/main/java/de/ellpeck/prettypipes/network/PipeNetwork.java b/src/main/java/de/ellpeck/prettypipes/network/PipeNetwork.java index 133e743..18ec101 100644 --- a/src/main/java/de/ellpeck/prettypipes/network/PipeNetwork.java +++ b/src/main/java/de/ellpeck/prettypipes/network/PipeNetwork.java @@ -213,15 +213,27 @@ public class PipeNetwork implements ICapabilitySerializable, GraphL public ItemStack requestExistingItem(NetworkLocation location, BlockPos destPipe, BlockPos destInventory, ItemStack stack, ItemEqualityType... equalityTypes) { if (location.getPos().equals(destInventory)) return stack; + // make sure we don't pull any locked items + int amount = location.getItemAmount(this.world, stack, equalityTypes); + if (amount <= 0) + return stack; + // we ignore locks on the destination inventory, since we're probably the ones trying to solve those locks + amount -= this.getLockedAmount(location.getPos(), stack, destInventory, equalityTypes); + if (amount <= 0) + return stack; ItemStack remain = stack.copy(); + // make sure we only extract less than or equal to the requested amount + if (remain.getCount() < amount) + amount = remain.getCount(); + remain.shrink(amount); for (int slot : location.getStackSlots(this.world, stack, equalityTypes)) { // try to extract from that location's inventory and send the item IItemHandler handler = location.getItemHandler(this.world); - ItemStack extracted = handler.extractItem(slot, remain.getCount(), true); + ItemStack extracted = handler.extractItem(slot, amount, true); if (this.routeItemToLocation(location.pipePos, location.getPos(), destPipe, destInventory, extracted, speed -> new PipeItem(extracted, speed))) { handler.extractItem(slot, extracted.getCount(), false); - remain.shrink(extracted.getCount()); - if (remain.isEmpty()) + amount -= extracted.getCount(); + if (amount <= 0) break; } } @@ -295,9 +307,9 @@ public class PipeNetwork implements ICapabilitySerializable, GraphL return this.networkLocks.get(pos); } - public int getLockedAmount(BlockPos pos, ItemStack stack, ItemEqualityType... equalityTypes) { + public int getLockedAmount(BlockPos pos, ItemStack stack, BlockPos ignoredLock, ItemEqualityType... equalityTypes) { return this.getNetworkLocks(pos).stream() - .filter(l -> ItemEqualityType.compareItems(l.stack, stack, equalityTypes)) + .filter(l -> ItemEqualityType.compareItems(l.stack, stack, equalityTypes) && (ignoredLock == null || !ignoredLock.equals(l.location.getPos()))) .mapToInt(l -> l.stack.getCount()).sum(); } diff --git a/src/main/java/de/ellpeck/prettypipes/pipe/modules/craft/CraftingModuleItem.java b/src/main/java/de/ellpeck/prettypipes/pipe/modules/craft/CraftingModuleItem.java index b305850..2297e32 100644 --- a/src/main/java/de/ellpeck/prettypipes/pipe/modules/craft/CraftingModuleItem.java +++ b/src/main/java/de/ellpeck/prettypipes/pipe/modules/craft/CraftingModuleItem.java @@ -100,23 +100,13 @@ public class CraftingModuleItem extends ModuleItem { List items = network.getOrderedNetworkItems(tile.getPos()); ItemEqualityType[] equalityTypes = ItemFilter.getEqualityTypes(tile); for (Triple request : tile.craftResultRequests) { - ItemStack reqItem = request.getRight(); + ItemStack remain = request.getRight().copy(); for (NetworkLocation item : items) { - int amount = item.getItemAmount(tile.getWorld(), reqItem, equalityTypes); - amount -= network.getLockedAmount(item.getPos(), reqItem, equalityTypes); - if (amount <= 0) - continue; - ItemStack remain = reqItem.copy(); - if (remain.getCount() < amount) - amount = remain.getCount(); - remain.shrink(amount); - while (amount > 0) { - ItemStack copy = reqItem.copy(); - copy.setCount(Math.min(reqItem.getMaxStackSize(), amount)); - // we don't need to do any checks here because we just calculated the max amount we can definitely extract - network.requestExistingItem(item, request.getLeft(), request.getMiddle(), copy, equalityTypes); - amount -= copy.getCount(); - } + remain = network.requestExistingItem(item, request.getLeft(), request.getMiddle(), remain, equalityTypes); + if (remain.isEmpty()) + break; + } + if (remain.getCount() != request.getRight().getCount()) { tile.craftResultRequests.remove(request); // if we couldn't pull everything, log a new request if (!remain.isEmpty()) diff --git a/src/main/java/de/ellpeck/prettypipes/terminal/CraftingTerminalTileEntity.java b/src/main/java/de/ellpeck/prettypipes/terminal/CraftingTerminalTileEntity.java index fb6886b..e3286dd 100644 --- a/src/main/java/de/ellpeck/prettypipes/terminal/CraftingTerminalTileEntity.java +++ b/src/main/java/de/ellpeck/prettypipes/terminal/CraftingTerminalTileEntity.java @@ -173,7 +173,7 @@ public class CraftingTerminalTileEntity extends ItemTerminalTileEntity { int amount = location.getItemAmount(world, stack.stack, equalityTypes); if (amount <= 0) continue; - amount -= network.getLockedAmount(location.getPos(), stack.stack, equalityTypes); + amount -= network.getLockedAmount(location.getPos(), stack.stack, null, equalityTypes); available += amount; } // divide the total by the amount required to get the amount that diff --git a/src/main/java/de/ellpeck/prettypipes/terminal/ItemTerminalTileEntity.java b/src/main/java/de/ellpeck/prettypipes/terminal/ItemTerminalTileEntity.java index e4b7d1b..ec219ea 100644 --- a/src/main/java/de/ellpeck/prettypipes/terminal/ItemTerminalTileEntity.java +++ b/src/main/java/de/ellpeck/prettypipes/terminal/ItemTerminalTileEntity.java @@ -221,7 +221,7 @@ public class ItemTerminalTileEntity extends TileEntity implements INamedContaine int amount = location.getItemAmount(world, stack, ItemEqualityType.NBT); if (amount <= 0) continue; - amount -= network.getLockedAmount(location.getPos(), stack, ItemEqualityType.NBT); + amount -= network.getLockedAmount(location.getPos(), stack, destInventory, ItemEqualityType.NBT); if (amount > 0) { if (remain.getCount() < amount) amount = remain.getCount();