--- a/net/minecraft/world/item/crafting/RecipeMap.java +++ b/net/minecraft/world/item/crafting/RecipeMap.java @@ -12,6 +12,11 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.World; +// CraftBukkit start +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Maps; +// CraftBukkit end + public class RecipeMap { public static final RecipeMap EMPTY = new RecipeMap(ImmutableMultimap.of(), Map.of()); @@ -35,11 +40,39 @@ com_google_common_collect_immutablemap_builder.put(recipeholder.id(), recipeholder); } - return new RecipeMap(builder.build(), com_google_common_collect_immutablemap_builder.build()); + // CraftBukkit start - mutable + return new RecipeMap(LinkedHashMultimap.create(builder.build()), Maps.newHashMap(com_google_common_collect_immutablemap_builder.build())); + } + + public void addRecipe(RecipeHolder irecipe) { + Collection> map = this.byType.get(irecipe.value().getType()); + + if (byKey.containsKey(irecipe.id())) { + throw new IllegalStateException("Duplicate recipe ignored with ID " + irecipe.id()); + } else { + map.add(irecipe); + byKey.put(irecipe.id(), irecipe); + } } + public boolean removeRecipe(ResourceKey> mcKey) { + boolean removed = false; + Iterator> iter = byType.values().iterator(); + while (iter.hasNext()) { + RecipeHolder recipe = iter.next(); + if (recipe.id().equals(mcKey)) { + iter.remove(); + removed = true; + } + } + removed |= byKey.remove(mcKey) != null; + + return removed; + } + // CraftBukkit end + public > Collection> byType(Recipes recipes) { - return this.byType.get(recipes); + return (Collection) this.byType.get(recipes); // CraftBukkit - decompile error } public Collection> values() {