minecraft-src/net/minecraft/world/item/crafting/RecipeMap.java
2025-07-04 02:00:41 +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<?>> multimap, Map<ResourceKey<Recipe<?>>, RecipeHolder<?>> map) {
this.byType = multimap;
this.byKey = map;
}
public static RecipeMap create(Iterable<RecipeHolder<?>> iterable) {
Builder<RecipeType<?>, RecipeHolder<?>> builder = ImmutableMultimap.builder();
com.google.common.collect.ImmutableMap.Builder<ResourceKey<Recipe<?>>, RecipeHolder<?>> builder2 = ImmutableMap.builder();
for (RecipeHolder<?> recipeHolder : iterable) {
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> recipeType) {
return (Collection<RecipeHolder<T>>)this.byType.get(recipeType);
}
public Collection<RecipeHolder<?>> values() {
return this.byKey.values();
}
@Nullable
public RecipeHolder<?> byKey(ResourceKey<Recipe<?>> resourceKey) {
return (RecipeHolder<?>)this.byKey.get(resourceKey);
}
public <I extends RecipeInput, T extends Recipe<I>> Stream<RecipeHolder<T>> getRecipesFor(RecipeType<T> recipeType, I recipeInput, Level level) {
return recipeInput.isEmpty() ? Stream.empty() : this.byType(recipeType).stream().filter(recipeHolder -> recipeHolder.value().matches(recipeInput, level));
}
}