Skip to content

Commit fb59109

Browse files
committedDec 3, 2024·
fixed crafting requests always returning the full crafted items, rather than the requested amount
1 parent 21f2727 commit fb59109

File tree

1 file changed

+25
-17
lines changed

1 file changed

+25
-17
lines changed
 

‎src/main/java/de/ellpeck/prettypipes/pipe/modules/craft/CraftingModuleItem.java

+25-17
Original file line numberDiff line numberDiff line change
@@ -92,25 +92,31 @@ public void tick(ItemStack module, PipeBlockEntity tile) {
9292
}
9393
network.endProfile();
9494
} else if (craft.travelingIngredients.isEmpty()) {
95-
// pull requested crafting results from the network once they are stored
96-
network.startProfile("crafting_results");
97-
var items = network.getOrderedNetworkItems(tile.getBlockPos());
98-
var equalityTypes = ItemFilter.getEqualityTypes(tile);
99-
var destPipe = network.getPipe(craft.resultDestPipe);
100-
if (destPipe != null) {
101-
var dest = destPipe.getAvailableDestinationOrConnectable(craft.resultStackRemain, true, true);
102-
if (dest != null) {
103-
for (var item : items) {
104-
var requestRemain = network.requestExistingItem(item, craft.resultDestPipe, dest.getLeft(), null, dest.getRight(), equalityTypes);
105-
craft.resultStackRemain.shrink(dest.getRight().getCount() - requestRemain.getCount());
106-
if (craft.resultStackRemain.isEmpty()) {
107-
crafts.remove(craft);
108-
break;
95+
if (craft.resultStackRemain.isEmpty()) {
96+
// the result stack is empty from the start if this was a partial craft whose results shouldn't be delivered anywhere
97+
// (ie someone requested 3 sticks with ensureItemOrder, but the recipe always makes 4, so the 4th recipe has no destination)
98+
crafts.remove(craft);
99+
} else {
100+
// pull requested crafting results from the network once they are stored
101+
network.startProfile("crafting_results");
102+
var items = network.getOrderedNetworkItems(tile.getBlockPos());
103+
var equalityTypes = ItemFilter.getEqualityTypes(tile);
104+
var destPipe = network.getPipe(craft.resultDestPipe);
105+
if (destPipe != null) {
106+
var dest = destPipe.getAvailableDestinationOrConnectable(craft.resultStackRemain, true, true);
107+
if (dest != null) {
108+
for (var item : items) {
109+
var requestRemain = network.requestExistingItem(item, craft.resultDestPipe, dest.getLeft(), null, dest.getRight(), equalityTypes);
110+
craft.resultStackRemain.shrink(dest.getRight().getCount() - requestRemain.getCount());
111+
if (craft.resultStackRemain.isEmpty()) {
112+
crafts.remove(craft);
113+
break;
114+
}
109115
}
110116
}
111117
}
118+
network.endProfile();
112119
}
113-
network.endProfile();
114120
}
115121
}
116122
}
@@ -167,6 +173,7 @@ public Pair<ItemStack, Collection<ActiveCraft>> craft(ItemStack module, PipeBloc
167173
var craftableCrafts = Mth.ceil(craftableAmount / (float) resultAmount);
168174
var toCraft = Math.min(craftableCrafts, requiredCrafts);
169175

176+
var leftOfRequest = stack.getCount();
170177
var allCrafts = new ArrayList<ActiveCraft>();
171178
// if we're ensuring item order, all items for a single recipe should be sent in order first before starting on the next one!
172179
for (var c = contents.ensureItemOrder ? toCraft : 1; c > 0; c--) {
@@ -185,10 +192,11 @@ public Pair<ItemStack, Collection<ActiveCraft>> craft(ItemStack module, PipeBloc
185192
locks.addAll(ret.getLeft());
186193
allCrafts.addAll(ret.getRight());
187194
}
188-
var result = stack.copyWithCount(contents.ensureItemOrder ? resultAmount : resultAmount * toCraft);
189-
var activeCraft = new ActiveCraft(tile.getBlockPos(), slot, locks, destPipe, result);
195+
var crafted = contents.ensureItemOrder ? resultAmount : resultAmount * toCraft;
196+
var activeCraft = new ActiveCraft(tile.getBlockPos(), slot, locks, destPipe, stack.copyWithCount(Math.min(crafted, leftOfRequest)));
190197
tile.getActiveCrafts().add(activeCraft);
191198
allCrafts.add(activeCraft);
199+
leftOfRequest -= crafted;
192200
}
193201

194202
var remain = stack.copy();

0 commit comments

Comments
 (0)
Please sign in to comment.