--- a/net/minecraft/world/item/crafting/RecipeMap.java +++ b/net/minecraft/world/item/crafting/RecipeMap.java @@ -10,13 +10,22 @@ 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; +import java.util.Iterator; +import java.util.LinkedHashMap; +// CraftBukkit end + public class RecipeMap { - public static final RecipeMap EMPTY = new RecipeMap(ImmutableMultimap.of(), Map.of()); + // CraftBukkit start - ordered + public static final RecipeMap EMPTY = new RecipeMap(ImmutableMultimap.of(), Maps.newLinkedHashMap()); public final Multimap, RecipeHolder> byType; - private final Map>, RecipeHolder> byKey; + private final LinkedHashMap>, RecipeHolder> byKey; - private RecipeMap(Multimap, RecipeHolder> multimap, Map>, RecipeHolder> map) { + private RecipeMap(Multimap, RecipeHolder> multimap, LinkedHashMap>, RecipeHolder> map) { + // CraftBukkit end this.byType = multimap; this.byKey = map; } @@ -30,11 +39,39 @@ immutablemap_builder.put(recipeholder.id(), recipeholder); } - return new RecipeMap(immutablemultimap_builder.build(), immutablemap_builder.build()); + // CraftBukkit start - mutable, ordered + return new RecipeMap(LinkedHashMultimap.create(immutablemultimap_builder.build()), Maps.newLinkedHashMap(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.putFirst(irecipe.id(), irecipe); // CraftBukkit - ordered + } + } + + 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() {