|
45 | 45 | import net.minecraft.world.entity.player.Player;
|
46 | 46 | import net.minecraft.world.item.ItemStack;
|
47 | 47 | import net.minecraft.world.item.component.ItemContainerContents;
|
| 48 | +import net.minecraft.world.item.crafting.CraftingInput; |
| 49 | +import net.minecraft.world.item.crafting.CraftingRecipe; |
48 | 50 | import net.minecraft.world.item.crafting.Ingredient;
|
49 | 51 | import net.minecraft.world.level.block.Blocks;
|
50 | 52 | import net.minecraft.world.phys.BlockHitResult;
|
@@ -125,6 +127,7 @@ public void register(IGamePhase game, EventRegistrar events) throws GameExceptio
|
125 | 127 | events.listen(GamePhaseEvents.DESTROY, () -> timerBars.values().forEach(b -> b.bar().close()));
|
126 | 128 | events.listen(GamePhaseEvents.STOP, reason -> timerBars.values().forEach(b -> b.bar().close()));
|
127 | 129 |
|
| 130 | + events.listen(GamePlayerEvents.CRAFT_RESULT, this::modifyCraftResult); |
128 | 131 | events.listen(GamePlayerEvents.CRAFT, this::onCraft);
|
129 | 132 | events.listen(GamePlayerEvents.USE_BLOCK, this::useBlock);
|
130 | 133 |
|
@@ -197,25 +200,27 @@ private Stream<ItemStack> singleDecomposition(Ingredient ingredient) {
|
197 | 200 | return Stream.of(ingredient.getItems()[0]);
|
198 | 201 | }
|
199 | 202 |
|
| 203 | + private ItemStack modifyCraftResult(ServerPlayer player, ItemStack result, CraftingInput craftingInput, CraftingRecipe recipe) { |
| 204 | + ItemContainerContents usedItems = ItemContainerContents.fromItems(craftingInput.items().stream() |
| 205 | + .filter(stack -> !stack.isEmpty()) |
| 206 | + .map(stack -> stack.copyWithCount(1)) |
| 207 | + // .peek(s -> s.remove(CraftingBee.CRAFTED_USING)) // TODO - should we keep this? |
| 208 | + .sorted(Comparator.comparing(s -> s.getItemHolder().getRegisteredName())) |
| 209 | + .toList()); |
| 210 | + result.set(CraftingBee.CRAFTED_USING, new CraftedUsing( |
| 211 | + result.getCount(), |
| 212 | + usedItems |
| 213 | + )); |
| 214 | + return result; |
| 215 | + } |
| 216 | + |
200 | 217 | private void onCraft(Player player, ItemStack crafted, Container container) {
|
201 | 218 | var team = teams.getTeamForPlayer(player);
|
202 | 219 | if (team == null || done) return;
|
203 | 220 |
|
204 | 221 | var teamTasks = tasks.get(team);
|
205 | 222 | var task = teamTasks.stream().filter(c -> ItemStack.isSameItemSameComponents(crafted, c.output)).findFirst().orElse(null);
|
206 | 223 |
|
207 |
| - ItemContainerContents usedItems = ItemContainerContents.fromItems(IntStream.range(0, container.getContainerSize()) |
208 |
| - .mapToObj(container::getItem) |
209 |
| - .filter(Predicate.not(ItemStack::isEmpty)) |
210 |
| - .map(s -> s.copyWithCount(1)) |
211 |
| - // .peek(s -> s.remove(CraftingBee.CRAFTED_USING)) // TODO - should we keep this? |
212 |
| - .sorted(Comparator.comparing(s -> s.getItemHolder().getRegisteredName())) |
213 |
| - .toList()); |
214 |
| - crafted.set(CraftingBee.CRAFTED_USING, new CraftedUsing( |
215 |
| - crafted.getCount(), |
216 |
| - usedItems |
217 |
| - )); |
218 |
| - |
219 | 224 | if (task == null || task.done) return;
|
220 | 225 |
|
221 | 226 | task.done = true;
|
|
0 commit comments