--- a/net/minecraft/world/item/crafting/CraftingManager.java +++ b/net/minecraft/world/item/crafting/CraftingManager.java @@ -38,6 +38,11 @@ import net.minecraft.world.level.World; import org.slf4j.Logger; +// CraftBukkit start +import java.util.Collections; +import net.minecraft.server.MinecraftServer; +// CraftBukkit end + public class CraftingManager extends ResourceDataAbstract implements RecipeAccess { private static final Logger LOGGER = LogUtils.getLogger(); @@ -110,7 +115,25 @@ CraftingManager.LOGGER.info("Loaded {} recipes", recipemap.values().size()); } + // CraftBukkit start + public void addRecipe(RecipeHolder irecipe) { + this.recipes.addRecipe(irecipe); + finalizeRecipeLoading(); + } + + private FeatureFlagSet featureflagset; + + public void finalizeRecipeLoading() { + if (featureflagset != null) { + finalizeRecipeLoading(featureflagset); + + MinecraftServer.getServer().getPlayerList().reloadRecipes(); + } + } + public void finalizeRecipeLoading(FeatureFlagSet featureflagset) { + this.featureflagset = featureflagset; + // CraftBukkit end List> list = new ArrayList(); List list1 = CraftingManager.RECIPE_PROPERTY_SETS.entrySet().stream().map((entry) -> { return new CraftingManager.b((ResourceKey) entry.getKey(), (CraftingManager.c) entry.getValue()); @@ -171,7 +194,10 @@ } public > Optional> getRecipeFor(Recipes recipes, I i0, World world) { - return this.recipes.getRecipesFor(recipes, i0, world).findFirst(); + // CraftBukkit start + List> list = this.recipes.getRecipesFor(recipes, i0, world).toList(); + return (list.isEmpty()) ? Optional.empty() : Optional.of(list.getLast()); // CraftBukkit - SPIGOT-4638: last recipe gets priority + // CraftBukkit end } public Optional> byKey(ResourceKey> resourcekey) { @@ -182,7 +208,7 @@ private > RecipeHolder byKeyTyped(Recipes recipes, ResourceKey> resourcekey) { RecipeHolder recipeholder = this.recipes.byKey(resourcekey); - return recipeholder != null && recipeholder.value().getType().equals(recipes) ? recipeholder : null; + return recipeholder != null && recipeholder.value().getType().equals(recipes) ? (RecipeHolder) recipeholder : null; // CraftBukkit - decompile error } public Map, RecipePropertySet> getSynchronizedItemProperties() { @@ -230,6 +256,22 @@ return new RecipeHolder(resourcekey, irecipe); } + // CraftBukkit start + public boolean removeRecipe(ResourceKey> mcKey) { + boolean removed = this.recipes.removeRecipe(mcKey); + if (removed) { + finalizeRecipeLoading(); + } + + return removed; + } + + public void clearRecipes() { + this.recipes = RecipeMap.create(Collections.emptyList()); + finalizeRecipeLoading(); + } + // CraftBukkit end + public static > CraftingManager.a createCheck(final Recipes recipes) { return new CraftingManager.a() { @Nullable