From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jake Potrebic Date: Sat, 21 Aug 2021 17:25:54 -0700 Subject: [PATCH] API for updating recipes on clients diff --git a/src/main/java/org/bukkit/Bukkit.java b/src/main/java/org/bukkit/Bukkit.java index 010d7e8a831b32060a471ef877ac43ce237a7258..0865830a8d9f29dee47c34a192e26e4c1304a12c 100644 --- a/src/main/java/org/bukkit/Bukkit.java +++ b/src/main/java/org/bukkit/Bukkit.java @@ -990,6 +990,26 @@ public final class Bukkit { server.reloadData(); } + // Paper start - update reloadable data + /** + * Updates all advancement, tag, and recipe data for all connected clients. + * Useful for updating clients to new advancements/recipes/tags. + * @see #updateRecipes() + */ + public static void updateResources() { + server.updateResources(); + } + + /** + * Updates recipe data and the recipe book for all connected clients. Useful for + * updating clients to new recipes. + * @see #updateResources() + */ + public static void updateRecipes() { + server.updateRecipes(); + } + // Paper end - update reloadable data + /** * Returns the primary logger associated with this server instance. * @@ -1050,6 +1070,20 @@ public final class Bukkit { return server.addRecipe(recipe); } + // Paper start - method to send recipes immediately + /** + * Adds a recipe to the crafting manager. + * + * @param recipe the recipe to add + * @param resendRecipes true to update the client with the full set of recipes + * @return true if the recipe was added, false if it wasn't for some reason + */ + @Contract("null, _ -> false") + public static boolean addRecipe(@Nullable Recipe recipe, boolean resendRecipes) { + return server.addRecipe(recipe, resendRecipes); + } + // Paper end - method to send recipes immediately + /** * Get a list of all recipes for a given item. The stack size is ignored * in comparisons. If the durability is -1, it will match any data value. @@ -1241,6 +1275,24 @@ public final class Bukkit { return server.removeRecipe(key); } + // Paper start - method to resend recipes + /** + * Remove a recipe from the server. + *

+ * Note that removing a recipe may cause permanent loss of data + * associated with that recipe (eg whether it has been discovered by + * players). + * + * @param key NamespacedKey of recipe to remove. + * @param resendRecipes true to update all clients on the new recipe list. + * Will only update if a recipe was actually removed + * @return True if recipe was removed + */ + public static boolean removeRecipe(@NotNull NamespacedKey key, boolean resendRecipes) { + return server.removeRecipe(key, resendRecipes); + } + // Paper end - method to resend recipes + /** * Gets a list of command aliases defined in the server properties. * diff --git a/src/main/java/org/bukkit/Server.java b/src/main/java/org/bukkit/Server.java index 627913905269739e91c5007e372856e321cb9312..bc55bf7361fb41a91766fcb2f1e4620e3db64781 100644 --- a/src/main/java/org/bukkit/Server.java +++ b/src/main/java/org/bukkit/Server.java @@ -836,6 +836,22 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi */ public void reloadData(); + // Paper start - update reloadable data + /** + * Updates all advancement, tag, and recipe data to all connected clients. + * Useful for updating clients to new advancements/recipes/tags. + * @see #updateRecipes() + */ + void updateResources(); + + /** + * Updates recipe data and the recipe book to each player. Useful for + * updating clients to new recipes. + * @see #updateResources() + */ + void updateRecipes(); + // Paper end - update reloadable data + /** * Returns the primary logger associated with this server instance. * @@ -877,15 +893,34 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi public boolean dispatchCommand(@NotNull CommandSender sender, @NotNull String commandLine) throws CommandException; /** - * Adds a recipe to the crafting manager. + * Adds a recipe to the crafting manager. Recipes added with + * this method won't be sent to the client automatically. Use + * {@link #updateRecipes()} or {@link #updateResources()} to + * update clients to new recipes added. + *

+ * Player's still have to discover recipes via {@link Player#discoverRecipe(NamespacedKey)} + * before seeing them in their recipe book. * * @param recipe the recipe to add * @return true if the recipe was added, false if it wasn't for some * reason + * @see #addRecipe(Recipe, boolean) */ @Contract("null -> false") public boolean addRecipe(@Nullable Recipe recipe); + // Paper start - method to send recipes immediately + /** + * Adds a recipe to the crafting manager. + * + * @param recipe the recipe to add + * @param resendRecipes true to update the client with the full set of recipes + * @return true if the recipe was added, false if it wasn't for some reason + */ + @Contract("null, _ -> false") + boolean addRecipe(@Nullable Recipe recipe, boolean resendRecipes); + // Paper end - method to send recipes immediately + /** * Get a list of all recipes for a given item. The stack size is ignored * in comparisons. If the durability is -1, it will match any data value. @@ -1054,6 +1089,22 @@ public interface Server extends PluginMessageRecipient, net.kyori.adventure.audi */ public boolean removeRecipe(@NotNull NamespacedKey key); + // Paper start - method to resend recipes + /** + * Remove a recipe from the server. + *

+ * Note that removing a recipe may cause permanent loss of data + * associated with that recipe (eg whether it has been discovered by + * players). + * + * @param key NamespacedKey of recipe to remove. + * @param resendRecipes true to update all clients on the new recipe list. + * Will only update if a recipe was actually removed + * @return True if recipe was removed + */ + boolean removeRecipe(@NotNull NamespacedKey key, boolean resendRecipes); + // Paper end - method to resend recipes + /** * Gets a list of command aliases defined in the server properties. *