minecraft-src/net/minecraft/world/item/crafting/SelectableRecipe.java
2025-07-04 02:49:36 +03:00

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();
}
}
}