@@ -92,25 +92,31 @@ public void tick(ItemStack module, PipeBlockEntity tile) {
92
92
}
93
93
network .endProfile ();
94
94
} 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
+ }
109
115
}
110
116
}
111
117
}
118
+ network .endProfile ();
112
119
}
113
- network .endProfile ();
114
120
}
115
121
}
116
122
}
@@ -167,6 +173,7 @@ public Pair<ItemStack, Collection<ActiveCraft>> craft(ItemStack module, PipeBloc
167
173
var craftableCrafts = Mth .ceil (craftableAmount / (float ) resultAmount );
168
174
var toCraft = Math .min (craftableCrafts , requiredCrafts );
169
175
176
+ var leftOfRequest = stack .getCount ();
170
177
var allCrafts = new ArrayList <ActiveCraft >();
171
178
// if we're ensuring item order, all items for a single recipe should be sent in order first before starting on the next one!
172
179
for (var c = contents .ensureItemOrder ? toCraft : 1 ; c > 0 ; c --) {
@@ -185,10 +192,11 @@ public Pair<ItemStack, Collection<ActiveCraft>> craft(ItemStack module, PipeBloc
185
192
locks .addAll (ret .getLeft ());
186
193
allCrafts .addAll (ret .getRight ());
187
194
}
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 )) );
190
197
tile .getActiveCrafts ().add (activeCraft );
191
198
allCrafts .add (activeCraft );
199
+ leftOfRequest -= crafted ;
192
200
}
193
201
194
202
var remain = stack .copy ();
0 commit comments