diff --git a/patches/api/0368-Furnace-RecipesUsed-API.patch b/patches/api/0368-Furnace-RecipesUsed-API.patch new file mode 100644 index 000000000..7fed82db2 --- /dev/null +++ b/patches/api/0368-Furnace-RecipesUsed-API.patch @@ -0,0 +1,51 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jake Potrebic +Date: Thu, 13 Jan 2022 15:21:08 -0800 +Subject: [PATCH] Furnace RecipesUsed API + + +diff --git a/src/main/java/org/bukkit/block/Furnace.java b/src/main/java/org/bukkit/block/Furnace.java +index dbdf3dbe9517b09a7965cf9d65cae1edd87af67d..8745e5aeaa81cd42d6625f415c623daa28776647 100644 +--- a/src/main/java/org/bukkit/block/Furnace.java ++++ b/src/main/java/org/bukkit/block/Furnace.java +@@ -92,6 +92,40 @@ public interface Furnace extends Container { + * @throws IllegalArgumentException if value is more than 200 + */ + public void setCookSpeedMultiplier(double multiplier); ++ ++ /** ++ * Gets the number of times a recipe has been used since the ++ * last player removed items from the result slot. This is used ++ * to calculate experience rewards when withdrawing items from furnaces. ++ * ++ * @param furnaceRecipe the recipe to query the count for ++ * @return the count or 0 if none found ++ */ ++ int getRecipeUsedCount(@NotNull org.bukkit.NamespacedKey furnaceRecipe); ++ ++ /** ++ * Checks if the recipe has a used count present on this furnace. ++ * ++ * @param furnaceRecipe the recipe to check if a count exists for ++ * @return true if there is a positive count, else false ++ */ ++ boolean hasRecipeUsedCount(@NotNull org.bukkit.NamespacedKey furnaceRecipe); ++ ++ /** ++ * Sets the number of times a recipe has been used. This is used ++ * to calculate experience rewards when withdrawing items from furnaces. ++ * ++ * @param furnaceRecipe the recipe to set the count for ++ * @param count the count, a non-positive number will remove the recipe ++ */ ++ void setRecipeUsedCount(@NotNull org.bukkit.inventory.CookingRecipe furnaceRecipe, int count); ++ ++ /** ++ * Sets all recipes used by this furnace. ++ * ++ * @param recipesUsed the recipes used ++ */ ++ void setRecipesUsed(@NotNull Map, Integer> recipesUsed); + // Paper end + + @NotNull diff --git a/patches/server/0871-Furnace-RecipesUsed-API.patch b/patches/server/0871-Furnace-RecipesUsed-API.patch new file mode 100644 index 000000000..2e6cf1c2f --- /dev/null +++ b/patches/server/0871-Furnace-RecipesUsed-API.patch @@ -0,0 +1,48 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Jake Potrebic +Date: Thu, 13 Jan 2022 15:20:47 -0800 +Subject: [PATCH] Furnace RecipesUsed API + + +diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftFurnace.java b/src/main/java/org/bukkit/craftbukkit/block/CraftFurnace.java +index 3da4616c904d47bbecae0d4cb6970496fbec9a8b..f49bb90e6c30dd928b352c867819b687e4557893 100644 +--- a/src/main/java/org/bukkit/craftbukkit/block/CraftFurnace.java ++++ b/src/main/java/org/bukkit/craftbukkit/block/CraftFurnace.java +@@ -93,5 +93,37 @@ public abstract class CraftFurnace extends + snapshot.cookSpeedMultiplier = multiplier; + snapshot.cookingTotalTime = AbstractFurnaceBlockEntity.getTotalCookTime(this.isPlaced() ? this.world.getHandle() : null, snapshot.recipeType, snapshot, snapshot.cookSpeedMultiplier); // Update the snapshot's current total cook time to scale with the newly set multiplier + } ++ ++ @Override ++ public int getRecipeUsedCount(org.bukkit.NamespacedKey furnaceRecipe) { ++ return this.getSnapshot().getRecipesUsed().getInt(org.bukkit.craftbukkit.util.CraftNamespacedKey.toMinecraft(furnaceRecipe)); ++ } ++ ++ @Override ++ public boolean hasRecipeUsedCount(org.bukkit.NamespacedKey furnaceRecipe) { ++ return this.getSnapshot().getRecipesUsed().containsKey(org.bukkit.craftbukkit.util.CraftNamespacedKey.toMinecraft(furnaceRecipe)); ++ } ++ ++ @Override ++ public void setRecipeUsedCount(org.bukkit.inventory.CookingRecipe furnaceRecipe, int count) { ++ final net.minecraft.resources.ResourceLocation location = org.bukkit.craftbukkit.util.CraftNamespacedKey.toMinecraft(furnaceRecipe.getKey()); ++ java.util.Optional> nmsRecipe = (this.isPlaced() ? this.world.getHandle().getRecipeManager() : net.minecraft.server.MinecraftServer.getServer().getRecipeManager()).byKey(location); ++ com.google.common.base.Preconditions.checkArgument(nmsRecipe.isPresent() && nmsRecipe.get() instanceof net.minecraft.world.item.crafting.AbstractCookingRecipe, furnaceRecipe.getKey() + " is not recognized as a valid and registered furnace recipe"); ++ if (count > 0) { ++ this.getSnapshot().getRecipesUsed().put(location, count); ++ } else { ++ this.getSnapshot().getRecipesUsed().removeInt(location); ++ } ++ } ++ ++ @Override ++ public void setRecipesUsed(java.util.Map, Integer> recipesUsed) { ++ this.getSnapshot().getRecipesUsed().clear(); ++ recipesUsed.forEach((recipe, integer) -> { ++ if (integer != null) { ++ this.setRecipeUsedCount(recipe, integer); ++ } ++ }); ++ } + // Paper end + }