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

52 lines
2 KiB
Java

package net.minecraft.world.item.crafting;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.Multimap;
import com.google.common.collect.ImmutableMultimap.Builder;
import java.util.Collection;
import java.util.Map;
import java.util.stream.Stream;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.Nullable;
public class RecipeMap {
public static final RecipeMap EMPTY = new RecipeMap(ImmutableMultimap.of(), Map.of());
private final Multimap<RecipeType<?>, RecipeHolder<?>> byType;
private final Map<ResourceKey<Recipe<?>>, RecipeHolder<?>> byKey;
private RecipeMap(Multimap<RecipeType<?>, RecipeHolder<?>> byType, Map<ResourceKey<Recipe<?>>, RecipeHolder<?>> byKey) {
this.byType = byType;
this.byKey = byKey;
}
public static RecipeMap create(Iterable<RecipeHolder<?>> recipes) {
Builder<RecipeType<?>, RecipeHolder<?>> builder = ImmutableMultimap.builder();
com.google.common.collect.ImmutableMap.Builder<ResourceKey<Recipe<?>>, RecipeHolder<?>> builder2 = ImmutableMap.builder();
for (RecipeHolder<?> recipeHolder : recipes) {
builder.put(recipeHolder.value().getType(), recipeHolder);
builder2.put(recipeHolder.id(), recipeHolder);
}
return new RecipeMap(builder.build(), builder2.build());
}
public <I extends RecipeInput, T extends Recipe<I>> Collection<RecipeHolder<T>> byType(RecipeType<T> type) {
return (Collection<RecipeHolder<T>>)this.byType.get(type);
}
public Collection<RecipeHolder<?>> values() {
return this.byKey.values();
}
@Nullable
public RecipeHolder<?> byKey(ResourceKey<Recipe<?>> key) {
return (RecipeHolder<?>)this.byKey.get(key);
}
public <I extends RecipeInput, T extends Recipe<I>> Stream<RecipeHolder<T>> getRecipesFor(RecipeType<T> type, I input, Level level) {
return input.isEmpty() ? Stream.empty() : this.byType(type).stream().filter(recipeHolder -> recipeHolder.value().matches(input, level));
}
}