From e73e785fbf55c70d7bf1fd5792b544ab566ca5ba Mon Sep 17 00:00:00 2001 From: Kam Date: Wed, 9 Jul 2025 22:43:06 -0400 Subject: [PATCH] feat: allow scripts to modify anvil cost --- .../npcs/containers/ContainerAnvilRepair.java | 21 +++++++++++++------ .../scripted/event/RecipeScriptEvent.java | 20 ++++++++++++++++++ 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/src/main/java/noppes/npcs/containers/ContainerAnvilRepair.java b/src/main/java/noppes/npcs/containers/ContainerAnvilRepair.java index 77a8a197f..49f284b12 100644 --- a/src/main/java/noppes/npcs/containers/ContainerAnvilRepair.java +++ b/src/main/java/noppes/npcs/containers/ContainerAnvilRepair.java @@ -120,6 +120,7 @@ public class ContainerAnvilRepair extends Container { ItemStack output = null; boolean canPickup = true; + RecipeScriptEvent.Pre pre = null; if (matchingRecipe != null) { if (!matchingRecipe.availability.isAvailable(player)) { return; @@ -157,20 +158,28 @@ public class ContainerAnvilRepair extends Container { int xpCost = baseXpCost * materialsUsed; calcItem.setItemDamage(currentDamage); + + ItemStack[] items = new ItemStack[]{input0, input1}; + pre = EventHooks.onRecipeScriptPre(player, matchingRecipe.getScriptHandler(), matchingRecipe, items); + int scriptXp = pre.getXpCost(); + int scriptMat = pre.getMaterialUsage(); + xpCost += scriptXp; + materialsUsed += scriptMat; + pre.setXpCost(xpCost); + pre.setMaterialUsage(materialsUsed); + canPickup = !pre.isCanceled(); + if (player.experienceTotal >= xpCost) { output = calcItem; } + repairMaterialConsumed = materialsUsed; repairCost = xpCost; + output = EventHooks.onRecipeScriptPost(player, matchingRecipe.getScriptHandler(), matchingRecipe, items, output); } else { repairCost = 0; } - if (matchingRecipe != null) { - ItemStack[] items = new ItemStack[]{input0, input1}; - RecipeScriptEvent.Pre pre = EventHooks.onRecipeScriptPre(player, matchingRecipe.getScriptHandler(), matchingRecipe, items); - canPickup = !pre.isCanceled(); - output = EventHooks.onRecipeScriptPost(player, matchingRecipe.getScriptHandler(), matchingRecipe, items, output); - } + anvilResult.setInventorySlotContents(0, output); this.resultCanPickup = canPickup; diff --git a/src/main/java/noppes/npcs/scripted/event/RecipeScriptEvent.java b/src/main/java/noppes/npcs/scripted/event/RecipeScriptEvent.java index 9241cb58c..950af113f 100644 --- a/src/main/java/noppes/npcs/scripted/event/RecipeScriptEvent.java +++ b/src/main/java/noppes/npcs/scripted/event/RecipeScriptEvent.java @@ -36,6 +36,8 @@ public class RecipeScriptEvent extends PlayerEvent { @Cancelable public static class Pre extends RecipeScriptEvent { private String message = ""; + private int xpCost = 0; + private int materialUsage = 0; public Pre(IPlayer player, Object recipe, boolean isAnvil, IItemStack[] items) { super(player, recipe, isAnvil, items); @@ -49,6 +51,24 @@ public class RecipeScriptEvent extends PlayerEvent { return message; } + public int getXpCost() { + return xpCost; + } + + public void setXpCost(int xpCost) { + if (this.isAnvil) + this.xpCost = xpCost; + } + + public int getMaterialUsage() { + return materialUsage; + } + + public void setMaterialUsage(int materialUsage) { + if (this.isAnvil) + this.materialUsage = materialUsage; + } + public String getHookName() { return RecipeScript.ScriptType.PRE.function; }