58 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.world.item.crafting;
 | |
| 
 | |
| import java.util.List;
 | |
| import java.util.Optional;
 | |
| import net.minecraft.network.RegistryFriendlyByteBuf;
 | |
| import net.minecraft.network.codec.ByteBufCodecs;
 | |
| import net.minecraft.network.codec.StreamCodec;
 | |
| import net.minecraft.world.item.ItemStack;
 | |
| import net.minecraft.world.item.crafting.display.SlotDisplay;
 | |
| 
 | |
| public record SelectableRecipe<T extends Recipe<?>>(SlotDisplay optionDisplay, Optional<RecipeHolder<T>> recipe) {
 | |
| 	public static <T extends Recipe<?>> StreamCodec<RegistryFriendlyByteBuf, SelectableRecipe<T>> noRecipeCodec() {
 | |
| 		return StreamCodec.composite(SlotDisplay.STREAM_CODEC, SelectableRecipe::optionDisplay, slotDisplay -> new SelectableRecipe(slotDisplay, Optional.empty()));
 | |
| 	}
 | |
| 
 | |
| 	public record SingleInputEntry<T extends Recipe<?>>(Ingredient input, SelectableRecipe<T> recipe) {
 | |
| 
 | |
| 		public static <T extends Recipe<?>> StreamCodec<RegistryFriendlyByteBuf, SelectableRecipe.SingleInputEntry<T>> noRecipeCodec() {
 | |
| 			return StreamCodec.composite(
 | |
| 				Ingredient.CONTENTS_STREAM_CODEC,
 | |
| 				SelectableRecipe.SingleInputEntry::input,
 | |
| 				SelectableRecipe.noRecipeCodec(),
 | |
| 				SelectableRecipe.SingleInputEntry::recipe,
 | |
| 				SelectableRecipe.SingleInputEntry::new
 | |
| 			);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public record SingleInputSet<T extends Recipe<?>>(List<SelectableRecipe.SingleInputEntry<T>> entries) {
 | |
| 		public static <T extends Recipe<?>> SelectableRecipe.SingleInputSet<T> empty() {
 | |
| 			return new SelectableRecipe.SingleInputSet<>(List.of());
 | |
| 		}
 | |
| 
 | |
| 		public static <T extends Recipe<?>> StreamCodec<RegistryFriendlyByteBuf, SelectableRecipe.SingleInputSet<T>> noRecipeCodec() {
 | |
| 			return StreamCodec.composite(
 | |
| 				SelectableRecipe.SingleInputEntry.noRecipeCodec().apply(ByteBufCodecs.list()),
 | |
| 				SelectableRecipe.SingleInputSet::entries,
 | |
| 				SelectableRecipe.SingleInputSet::new
 | |
| 			);
 | |
| 		}
 | |
| 
 | |
| 		public boolean acceptsInput(ItemStack stack) {
 | |
| 			return this.entries.stream().anyMatch(singleInputEntry -> singleInputEntry.input.test(stack));
 | |
| 		}
 | |
| 
 | |
| 		public SelectableRecipe.SingleInputSet<T> selectByInput(ItemStack stack) {
 | |
| 			return new SelectableRecipe.SingleInputSet<>(this.entries.stream().filter(singleInputEntry -> singleInputEntry.input.test(stack)).toList());
 | |
| 		}
 | |
| 
 | |
| 		public boolean isEmpty() {
 | |
| 			return this.entries.isEmpty();
 | |
| 		}
 | |
| 
 | |
| 		public int size() {
 | |
| 			return this.entries.size();
 | |
| 		}
 | |
| 	}
 | |
| }
 |