diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerSmithsItemScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerSmithsItemScriptEvent.java index ff9f899249..7a1c2f25c5 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerSmithsItemScriptEvent.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerSmithsItemScriptEvent.java @@ -24,6 +24,8 @@ public class PlayerSmithsItemScriptEvent extends BukkitScriptEvent implements Li // // @Group Player // + // @Cancellable true + // // @Triggers when a player upgrades an item on a smithing table. // // @Context diff --git a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java index 582e163635..4792c9be80 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java +++ b/plugin/src/main/java/com/denizenscript/denizen/nms/interfaces/ItemHelper.java @@ -63,6 +63,10 @@ public void registerStonecuttingRecipe(String keyName, String group, ItemStack r public abstract PotionEffect getPotionEffect(PotionEffectType type, int duration, int amplifier, boolean ambient, boolean particles, Color color, boolean icon); + public void registerSmithingRecipe(String keyName, ItemStack result, ItemStack[] baseItem, boolean baseExact, ItemStack[] upgradeItem, boolean upgradeExact) { + throw new UnsupportedOperationException(); + } + public void setInventoryItem(Inventory inventory, ItemStack item, int slot) { inventory.setItem(slot, item); } 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 ab2b6bd74e..ac6aa005fe 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 @@ -168,6 +168,11 @@ public class ItemScriptContainer extends ScriptContainer { // # | Only some recipes should have this key. // experience: 5 // input: ItemTag + // 6: + // # Smithing recipes take one base item and one upgrade item. + // type: smithing + // base: ItemTag + // upgrade: ItemTag // // # 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 6a5cd245f1..dd96fe07bf 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 @@ -231,6 +231,28 @@ public void registerStonecuttingRecipe(ItemScriptContainer container, ItemStack NMSHandler.getItemHelper().registerStonecuttingRecipe(internalId, group, item, items, exact); } + public void registerSmithingRecipe(ItemScriptContainer container, ItemStack item, String baseItemString, String upgradeItemString, String internalId) { + boolean baseExact = true; + if (baseItemString.startsWith("material:")) { + baseExact = false; + baseItemString = baseItemString.substring("material:".length()); + } + ItemStack[] baseItems = textToItemArray(container, baseItemString, baseExact); + if (baseItems == null) { + return; + } + boolean upgradeExact = true; + if (upgradeItemString.startsWith("material:")) { + upgradeExact = false; + upgradeItemString = upgradeItemString.substring("material:".length()); + } + ItemStack[] upgradeItems = textToItemArray(container, upgradeItemString, upgradeExact); + if (upgradeItems == null) { + return; + } + NMSHandler.getItemHelper().registerSmithingRecipe(internalId, item, baseItems, baseExact, upgradeItems, upgradeExact); + } + public void rebuildRecipes() { for (ItemScriptContainer container : item_scripts.values()) { try { @@ -271,6 +293,9 @@ public void rebuildRecipes() { } registerFurnaceRecipe(container, item, subSection.getString("input"), exp, cookTime, type, internalId, group); break; + case "smithing": + registerSmithingRecipe(container, item, subSection.getString("base"), subSection.getString("upgrade"), internalId); + break; } } } diff --git a/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/helpers/ItemHelperImpl.java b/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/helpers/ItemHelperImpl.java index e977733fd3..b3ae300a00 100644 --- a/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/helpers/ItemHelperImpl.java +++ b/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/helpers/ItemHelperImpl.java @@ -148,6 +148,15 @@ public void registerStonecuttingRecipe(String keyName, String group, ItemStack r ((CraftServer) Bukkit.getServer()).getServer().getCraftingManager().addRecipe(recipe); } + @Override + public void registerSmithingRecipe(String keyName, ItemStack result, ItemStack[] baseItem, boolean baseExact, ItemStack[] upgradeItem, boolean upgradeExact) { + MinecraftKey key = new MinecraftKey("denizen", keyName); + RecipeItemStack baseItemRecipe = itemArrayToRecipe(baseItem, baseExact); + RecipeItemStack upgradeItemRecipe = itemArrayToRecipe(upgradeItem, upgradeExact); + RecipeSmithing recipe = new RecipeSmithing(key, baseItemRecipe, upgradeItemRecipe, CraftItemStack.asNMSCopy(result)); + ((CraftServer) Bukkit.getServer()).getServer().getCraftingManager().addRecipe(recipe); + } + @Override public void registerShapelessRecipe(String keyName, String group, ItemStack result, List ingredients, boolean[] exact) { MinecraftKey key = new MinecraftKey("denizen", keyName); diff --git a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/ItemHelperImpl.java b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/ItemHelperImpl.java index 5857995b43..8346551a0c 100644 --- a/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/ItemHelperImpl.java +++ b/v1_17/src/main/java/com/denizenscript/denizen/nms/v1_17/helpers/ItemHelperImpl.java @@ -155,6 +155,15 @@ public void registerStonecuttingRecipe(String keyName, String group, ItemStack r ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager().addRecipe(recipe); } + @Override + public void registerSmithingRecipe(String keyName, ItemStack result, ItemStack[] baseItem, boolean baseExact, ItemStack[] upgradeItem, boolean upgradeExact) { + ResourceLocation key = new ResourceLocation("denizen", keyName); + Ingredient baseItemRecipe = itemArrayToRecipe(baseItem, baseExact); + Ingredient upgradeItemRecipe = itemArrayToRecipe(upgradeItem, upgradeExact); + UpgradeRecipe recipe = new UpgradeRecipe(key, baseItemRecipe, upgradeItemRecipe, CraftItemStack.asNMSCopy(result)); + ((CraftServer) Bukkit.getServer()).getServer().getRecipeManager().addRecipe(recipe); + } + @Override public void registerShapelessRecipe(String keyName, String group, ItemStack result, List ingredients, boolean[] exact) { ResourceLocation key = new ResourceLocation("denizen", keyName);