diff --git a/src/main/java/net/aufdemrand/denizen/scripts/containers/core/ItemScriptContainer.java b/src/main/java/net/aufdemrand/denizen/scripts/containers/core/ItemScriptContainer.java index 44be32b687..9d7a191efc 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/containers/core/ItemScriptContainer.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/containers/core/ItemScriptContainer.java @@ -98,8 +98,8 @@ public class ItemScriptContainer extends ScriptContainer { // --> // A map storing special recipes that use itemscripts as ingredients - public static Map> specialrecipesMap = new HashMap>(); - public static Map> shapelessRecipesMap = new HashMap>(); + public static Map> specialrecipesMap = new HashMap>(); + public static Map> shapelessRecipesMap = new HashMap>(); dNPC npc = null; dPlayer player = null; @@ -118,55 +118,13 @@ public ItemScriptContainer(YamlConfiguration configurationSection, String script // Get recipe list from item script List recipeList = getStringList("RECIPE"); - // Process all tags in list - for (int n = 0; n < recipeList.size(); n++) { - recipeList.set(n, TagManager.tag(recipeList.get(n), new BukkitTagContext(player, npc, false, null, dB.shouldDebug(this), new dScript(this)))); - } - - // Store every ingredient in a List - List ingredients = new ArrayList(); - - boolean shouldRegister = true; - recipeLoop: for (String recipeRow : recipeList) { - String[] elements = recipeRow.split("\\|", 3); - - for (String element : elements) { - dItem ingredient = dItem.valueOf(element.replaceAll("[iImM]@", "")); - if (ingredient == null) { - dB.echoError("Invalid dItem ingredient, recipe will not be registered for item script '" - + getName() + "': " + element); - shouldRegister = false; - break recipeLoop; - } - ingredients.add(ingredient); - } - } - - // Add the recipe to Denizen's item script recipe list so it - // will be checked manually inside ItemScriptHelper - if (shouldRegister) { - specialrecipesMap.put(getItemFrom(), ingredients); - } + // Process later so that any item script ingredients can be fulfilled + ItemScriptHelper.recipes_to_register.put(this, recipeList); } if (contains("SHAPELESS_RECIPE")) { - String list = TagManager.tag(getString("SHAPELESS_RECIPE"), new BukkitTagContext(player, npc, false, null, dB.shouldDebug(this), new dScript(this))); - List ingredients = new ArrayList(); - boolean shouldRegister = true; - for (String element : dList.valueOf(list)) { - dItem ingredient = dItem.valueOf(element.replaceAll("[iImM]@", "")); - if (ingredient == null) { - dB.echoError("Invalid dItem ingredient, shapeless recipe will not be registered for item script '" - + getName() + "': " + element); - shouldRegister = false; - break; - } - ingredients.add(ingredient); - } - if (shouldRegister) { - shapelessRecipesMap.put(getItemFrom(), ingredients); - } + ItemScriptHelper.shapeless_to_register.put(this, getString("SHAPELESS_RECIPE")); } if (contains("FURNACE_RECIPE")) { diff --git a/src/main/java/net/aufdemrand/denizen/scripts/containers/core/ItemScriptHelper.java b/src/main/java/net/aufdemrand/denizen/scripts/containers/core/ItemScriptHelper.java index 9effb620e1..e6a7636f8b 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/containers/core/ItemScriptHelper.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/containers/core/ItemScriptHelper.java @@ -1,14 +1,19 @@ package net.aufdemrand.denizen.scripts.containers.core; import net.aufdemrand.denizen.BukkitScriptEntryData; +import net.aufdemrand.denizen.events.bukkit.ScriptReloadEvent; import net.aufdemrand.denizen.objects.dEntity; import net.aufdemrand.denizen.objects.dInventory; import net.aufdemrand.denizen.objects.dItem; +import net.aufdemrand.denizen.objects.dPlayer; +import net.aufdemrand.denizen.tags.BukkitTagContext; import net.aufdemrand.denizen.utilities.DenizenAPI; import net.aufdemrand.denizen.utilities.debugging.dB; import net.aufdemrand.denizencore.events.OldEventManager; import net.aufdemrand.denizencore.objects.dList; import net.aufdemrand.denizencore.objects.dObject; +import net.aufdemrand.denizencore.objects.dScript; +import net.aufdemrand.denizencore.tags.TagManager; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -25,17 +30,15 @@ import java.math.BigInteger; import java.security.MessageDigest; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; public class ItemScriptHelper implements Listener { public static Map item_scripts = new ConcurrentHashMap(8, 0.9f, 1); - public static Map item_scripts_by_hash_id = new HashMap(); + public static Map> recipes_to_register = new HashMap>(); + public static Map shapeless_to_register = new HashMap(); public ItemScriptHelper() { DenizenAPI.getCurrentInstance().getServer().getPluginManager() @@ -48,6 +51,73 @@ public static void removeDenizenRecipes() { ItemScriptContainer.shapelessRecipesMap.clear(); } + @EventHandler + public void scriptReload(ScriptReloadEvent event) { + + for (Map.Entry> entry : recipes_to_register.entrySet()) { + + ItemScriptContainer container = entry.getKey(); + List recipeList = entry.getValue(); + + // Process all tags in list + for (int n = 0; n < recipeList.size(); n++) { + recipeList.set(n, TagManager.tag(recipeList.get(n), new BukkitTagContext(container.player, container.npc, + false, null, dB.shouldDebug(container), new dScript(container)))); + } + + // Store every ingredient in a List + List ingredients = new ArrayList(); + + boolean shouldRegister = true; + recipeLoop: for (String recipeRow : recipeList) { + String[] elements = recipeRow.split("\\|", 3); + + for (String element : elements) { + dItem ingredient = dItem.valueOf(element.replaceAll("[iImM]@", "")); + if (ingredient == null) { + dB.echoError("Invalid dItem ingredient, recipe will not be registered for item script '" + + container.getName() + "': " + element); + shouldRegister = false; + break recipeLoop; + } + ingredients.add(ingredient); + } + } + + // Add the recipe to Denizen's item script recipe list so it + // will be checked manually inside ItemScriptHelper + if (shouldRegister) { + ItemScriptContainer.specialrecipesMap.put(container, ingredients); + } + } + + for (Map.Entry entry : shapeless_to_register.entrySet()) { + + ItemScriptContainer container = entry.getKey(); + String string = entry.getValue(); + + String list = TagManager.tag(string, new BukkitTagContext(container.player, container.npc, + false, null, dB.shouldDebug(container), new dScript(container))); + + List ingredients = new ArrayList(); + + boolean shouldRegister = true; + for (String element : dList.valueOf(list)) { + dItem ingredient = dItem.valueOf(element.replaceAll("[iImM]@", "")); + if (ingredient == null) { + dB.echoError("Invalid dItem ingredient, shapeless recipe will not be registered for item script '" + + container.getName() + "': " + element); + shouldRegister = false; + break; + } + ingredients.add(ingredient); + } + if (shouldRegister) { + ItemScriptContainer.shapelessRecipesMap.put(container, ingredients); + } + } + } + public static boolean isBound(ItemStack item) { return (isItemscript(item) && getItemScriptContainer(item).bound); } @@ -200,7 +270,7 @@ public boolean processSpecialRecipes(final CraftingInventory inventory, final Pl // Get the result of the special recipe that this matrix matches, // if any - dItem result1 = getSpecialRecipeResult(matrix1); + dItem result1 = getSpecialRecipeResult(matrix1, player); boolean returnme = result1 != null; @@ -215,7 +285,7 @@ public void run() { // Get the result of the special recipe that this matrix matches, // if any - dItem result = getSpecialRecipeResult(matrix); + dItem result = getSpecialRecipeResult(matrix, player); // Proceed only if the result was not null if (result != null) { @@ -263,11 +333,11 @@ else if (dItem.matches(determination)) { // Check if a CraftingInventory's crafting matrix matches a special // recipe and return that recipe's dItem result if it does - public dItem getSpecialRecipeResult(ItemStack[] matrix) { + public dItem getSpecialRecipeResult(ItemStack[] matrix, Player player) { // Iterate through all the special recipes master: - for (Map.Entry> entry : + for (Map.Entry> entry : ItemScriptContainer.specialrecipesMap.entrySet()) { // Check if the two sets of items match each other @@ -292,18 +362,18 @@ else if (!valueN.getMaterial().matchesMaterialData(matrixN.getMaterial().getMate } // If all the items match, return the special recipe's dItem key - return entry.getKey(); + return entry.getKey().getItemFrom(dPlayer.mirrorBukkitPlayer(player), null); } primary: - for (Map.Entry> entry : + for (Map.Entry> entry : ItemScriptContainer.shapelessRecipesMap.entrySet()) { for (int i = 0; i < entry.getValue().size(); i++) { if (!containsAny(entry.getValue().get(i), matrix)) { continue primary; } } - return entry.getKey(); + return entry.getKey().getItemFrom(dPlayer.mirrorBukkitPlayer(player), null); } return null; @@ -329,7 +399,7 @@ public boolean emulateSpecialRecipeResultShiftClick(CraftingInventory inventory, // Get the result of the special recipe that this matrix matches, // if any - dItem result = getSpecialRecipeResult(matrix); + dItem result = getSpecialRecipeResult(matrix, player); // Proceed only if the result was not null if (result != null) {