From d8660f12fb7f7d0eb13da2932828bd1311b5cf17 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Sun, 6 Feb 2022 09:16:18 -0800 Subject: [PATCH] Bukkit.getRecipesFor is slow, so cache it --- .../denizenscript/denizen/objects/LocationTag.java | 1 + .../scripts/containers/core/ItemScriptHelper.java | 13 +++++++++++-- .../utilities/command/DenizenCommandHandler.java | 4 ++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java b/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java index 068517df14..b8d0f08006 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/LocationTag.java @@ -3295,6 +3295,7 @@ else if (attribute.startsWith("unexplored_structure", 2) && attribute.hasContext // <--[tag] // @attribute // @returns ElementTag(Decimal) + // @synonyms LocationTag.magnitude // @group math // @description // Returns the 3D length of the vector/location. diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptHelper.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptHelper.java index 1d00280e15..99b932faaf 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptHelper.java @@ -52,6 +52,7 @@ public ItemScriptHelper() { public static void removeDenizenRecipes() { smithingRetain.clear(); + recipeCache.clear(); recipeIdToItemScript.clear(); NMSHandler.getItemHelper().clearDenizenRecipes(); } @@ -488,12 +489,20 @@ else if (recipe instanceof CookingRecipe) { return DenyCraftReason.ALLOWED; } + public static HashMap> recipeCache = new HashMap<>(); + + public static Collection getRecipesFor(Material item) { + return recipeCache.computeIfAbsent(item, (i) -> { + return Bukkit.getRecipesFor(new ItemStack(i)); + }); + } + public static boolean hasAlternateValidRecipe(Recipe recipe, ItemStack[] items) { // Workaround for Spigot bug with the wrong recipe ID getting grabbed if (recipe instanceof ShapedRecipe) { ItemStack result = recipe.getResult(); if (isItemscript(result)) { - for (Recipe altRecipe : Bukkit.getRecipesFor(result)) { + for (Recipe altRecipe : getRecipesFor(result.getType())) { if (altRecipe instanceof ShapedRecipe) { if (shouldDenyCraft(items, altRecipe) == DenyCraftReason.ALLOWED) { return true; @@ -533,7 +542,7 @@ public void onItemCooked(BlockCookEvent event) { return; } ItemStack[] stacks = new ItemStack[] { event.getSource() }; - for (Recipe recipe : Bukkit.getRecipesFor(event.getResult())) { + for (Recipe recipe : getRecipesFor(event.getResult().getType())) { if (recipe instanceof CookingRecipe && shouldDenyCraft(stacks, recipe) == DenyCraftReason.ALLOWED) { return; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/command/DenizenCommandHandler.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/command/DenizenCommandHandler.java index 2f600ac74f..64f3ef34d2 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/command/DenizenCommandHandler.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/command/DenizenCommandHandler.java @@ -269,8 +269,8 @@ public void version(CommandContext args, CommandSender sender) throws CommandExc */ @Command( aliases = {"denizen"}, usage = "save", - desc = "Saves the current state of Denizen/saves.yml.", modifiers = {"save"}, - min = 1, max = 3, permission = "denizen.basic", flags = "s") + desc = "Saves the current Denizen save data to file as needed.", modifiers = {"save"}, + min = 1, max = 3, permission = "denizen.basic") public void save(CommandContext args, CommandSender sender) throws CommandException { DenizenCore.saveAll(); Denizen.getInstance().saveSaves(true);