From cfa81e4a2407c3ff2eee40f45e1a4d13440edac9 Mon Sep 17 00:00:00 2001 From: Alex 'mcmonkey' Goodwin Date: Sun, 15 Sep 2019 03:24:47 -0700 Subject: [PATCH] allow multiple recipes per script, for #1851 --- .../containers/core/ItemScriptContainer.java | 33 ++++++++----- .../containers/core/ItemScriptHelper.java | 49 +++++++++++++++---- 2 files changed, 61 insertions(+), 21 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptContainer.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptContainer.java index 24ffd55240..f6476e7348 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptContainer.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/containers/core/ItemScriptContainer.java @@ -70,21 +70,30 @@ public class ItemScriptContainer extends ScriptContainer { // - ... // // # You can specify the items required to craft your item. For an empty slot, use air. - // recipe: - // - ItemTag|ItemTag|ItemTag - // - ItemTag|ItemTag|ItemTag - // - ItemTag|ItemTag|ItemTag - // - // # You can specify a material that can be smelted into your item. - // # Note: This can overwrite existing furnace recipes. - // # If no_id is specified, only the material/data pair will be validated. - // # This might misbehave with some smelting systems, as the Minecraft smelting logic may refuse - // # To continue smelting items in some cases when the script validator gets in the way. - // furnace_recipe: ItemTag + // recipes: + // 1: + // - ItemTag|ItemTag|ItemTag + // - ItemTag|ItemTag|ItemTag + // - ItemTag|ItemTag|ItemTag + // # Add more recipes if you want. + // 2: + // - ... // // # You can specify a list of materials that make up a shapeless recipe. // # Note: This can overwrite existing shapeless recipes. - // shapeless_recipe: ItemTag|... + // shapeless_recipes: + // 1: ItemTag|... + // # Add more shapeless recipes if you want. + // 2: ... + // + // # You can specify a material that can be smelted into your item. + // # Note: This can overwrite existing furnace recipes. + // furnace_recipes: + // 1: + // # The input item + // input: ItemTag + // # Add more furnace recipes if you want. + // 2: ... // // # Set to true to not store the scriptID on the item, treating it as an item dropped by any other plugin. // # NOTE: THIS IS NOT RECOMMENDED UNLESS YOU HAVE A SPECIFIC REASON TO USE IT. 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 fac46da092..2dce315eda 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 @@ -9,10 +9,13 @@ import com.denizenscript.denizen.objects.ItemTag; import com.denizenscript.denizen.objects.PlayerTag; import com.denizenscript.denizen.tags.BukkitTagContext; +import com.denizenscript.denizencore.objects.ArgumentHelper; import com.denizenscript.denizencore.objects.core.ListTag; import com.denizenscript.denizencore.objects.core.ScriptTag; import com.denizenscript.denizencore.tags.TagManager; import com.denizenscript.denizencore.utilities.CoreUtilities; +import com.denizenscript.denizencore.utilities.YamlConfiguration; +import com.denizenscript.denizencore.utilities.text.StringHolder; import org.bukkit.*; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -50,7 +53,7 @@ public static void removeDenizenRecipes() { } } - public void registerShapedRecipe(ItemScriptContainer container, List recipeList) { + public void registerShapedRecipe(ItemScriptContainer container, List recipeList, int id) { for (int n = 0; n < recipeList.size(); n++) { recipeList.set(n, TagManager.tag(recipeList.get(n), new BukkitTagContext(container.player, container.npc, new ScriptTag(container)))); } @@ -69,7 +72,7 @@ public void registerShapedRecipe(ItemScriptContainer container, List rec } } if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_13)) { - NamespacedKey key = new NamespacedKey("denizen", "item_" + CoreUtilities.toLowerCase(container.getName()) + "_shaped_recipe"); + NamespacedKey key = new NamespacedKey("denizen", "item_" + CoreUtilities.toLowerCase(container.getName()) + "_shaped_recipe_" + id); ShapedRecipe recipe = new ShapedRecipe(key, container.getCleanReference().getItemStack()).shape("ABC", "DEF", "GHI"); for (int i = 0; i < ingredients.size(); i++) { recipe.setIngredient("ABCDEFGHI".charAt(i), new RecipeChoice.ExactChoice(ingredients.get(i).getItemStack().clone())); @@ -81,7 +84,7 @@ public void registerShapedRecipe(ItemScriptContainer container, List rec } } - public void registerShapelessRecipe(ItemScriptContainer container, String shapelessString) { + public void registerShapelessRecipe(ItemScriptContainer container, String shapelessString, int id) { String list = TagManager.tag(shapelessString, new BukkitTagContext(container.player, container.npc, new ScriptTag(container))); List ingredients = new ArrayList<>(); for (String element : ListTag.valueOf(list)) { @@ -99,14 +102,14 @@ public void registerShapelessRecipe(ItemScriptContainer container, String shapel for (int i = 0; i < input.length; i++) { input[i] = ingredients.get(i).getItemStack().clone(); } - NMSHandler.getItemHelper().registerShapelessRecipe(CoreUtilities.toLowerCase(container.getName()), result, input); + NMSHandler.getItemHelper().registerShapelessRecipe(CoreUtilities.toLowerCase(container.getName()) + "_" + id, result, input); } else { shapelessRecipesMap.put(container, ingredients); } } - public void registerFurnaceRecipe(ItemScriptContainer container, String furnaceItemString, float exp, int time) { + public void registerFurnaceRecipe(ItemScriptContainer container, String furnaceItemString, float exp, int time, int id) { ItemTag furnace_item = ItemTag.valueOf(furnaceItemString, container); if (furnace_item == null) { Debug.echoError("Invalid item '" + furnaceItemString + "', furnace recipe will not be registered for item script '" + container.getName() + "'."); @@ -115,7 +118,7 @@ public void registerFurnaceRecipe(ItemScriptContainer container, String furnaceI if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_13)) { ItemStack result = container.getCleanReference().getItemStack().clone(); ItemStack input = furnace_item.getItemStack().clone(); - NMSHandler.getItemHelper().registerFurnaceRecipe(CoreUtilities.toLowerCase(container.getName()), result, input, exp, time); + NMSHandler.getItemHelper().registerFurnaceRecipe(CoreUtilities.toLowerCase(container.getName()) + "_" + id, result, input, exp, time); } else { FurnaceRecipe recipe = new FurnaceRecipe(container.getCleanReference().getItemStack(), furnace_item.getMaterial().getMaterial(), furnace_item.getItemStack().getDurability()); @@ -129,14 +132,42 @@ public void scriptReload(ScriptReloadEvent event) { currentFurnaceRecipes.clear(); for (ItemScriptContainer container : item_scripts.values()) { + if (container.contains("recipes")) { + YamlConfiguration section = container.getConfigurationSection("recipes"); + int id = 1; + for (StringHolder key : section.getKeys(false)) { + registerShapedRecipe(container, section.getStringList(key.str), id); + id++; + } + } + if (container.contains("shapeless_recipes")) { + YamlConfiguration section = container.getConfigurationSection("shapeless_recipes"); + int id = 1; + for (StringHolder key : section.getKeys(false)) { + registerShapelessRecipe(container, section.getString(key.str), id); + id++; + } + } + if (container.contains("furnace_recipes")) { + YamlConfiguration section = container.getConfigurationSection("furnace_recipes"); + int id = 1; + for (StringHolder key : section.getKeys(false)) { + YamlConfiguration subSection = section.getConfigurationSection(key.str); + float exp = 0; + int cookTime = 40; + registerFurnaceRecipe(container, subSection.getString("input"), exp, cookTime, id); + id++; + } + } + // Old script style if (container.contains("RECIPE")) { - registerShapedRecipe(container, container.getStringList("RECIPE")); + registerShapedRecipe(container, container.getStringList("RECIPE"), 0); } if (container.contains("SHAPELESS_RECIPE")) { - registerShapelessRecipe(container, container.getString("SHAPELESS_RECIPE")); + registerShapelessRecipe(container, container.getString("SHAPELESS_RECIPE"), 0); } if (container.contains("FURNACE_RECIPE")) { - registerFurnaceRecipe(container, container.getString("FURNACE_RECIPE"), 0, 40); + registerFurnaceRecipe(container, container.getString("FURNACE_RECIPE"), 0, 40, 0); } } }