From dd793619fd672ee9c3070406e93b430f87eb3f1a Mon Sep 17 00:00:00 2001 From: Lildirt Date: Wed, 3 Jul 2024 18:16:19 -0400 Subject: [PATCH] add item_pre_anvil event (#1384) --- .../abstraction/MCAnvilInventory.java | 18 +++++ .../bukkit/BukkitMCAnvilInventory.java | 80 ++++++++++++++++++ .../bukkit/events/BukkitInventoryEvents.java | 28 +++++++ .../drivers/BukkitInventoryListener.java | 8 ++ .../events/MCPrepareAnvilEvent.java | 10 +++ .../com/laytonsmith/core/events/Driver.java | 1 + .../core/events/drivers/InventoryEvents.java | 81 +++++++++++++++++++ 7 files changed, 226 insertions(+) create mode 100644 src/main/java/com/laytonsmith/abstraction/MCAnvilInventory.java create mode 100644 src/main/java/com/laytonsmith/abstraction/bukkit/BukkitMCAnvilInventory.java create mode 100644 src/main/java/com/laytonsmith/abstraction/events/MCPrepareAnvilEvent.java diff --git a/src/main/java/com/laytonsmith/abstraction/MCAnvilInventory.java b/src/main/java/com/laytonsmith/abstraction/MCAnvilInventory.java new file mode 100644 index 0000000000..b708798505 --- /dev/null +++ b/src/main/java/com/laytonsmith/abstraction/MCAnvilInventory.java @@ -0,0 +1,18 @@ +package com.laytonsmith.abstraction; + +public interface MCAnvilInventory extends MCInventory { + MCItemStack getFirstItem(); + MCItemStack getSecondItem(); + MCItemStack getResult(); + int getMaximumRepairCost(); + int getRepairCost(); + int getRepairCostAmount(); + String getRenameText(); + + void setFirstItem(MCItemStack stack); + void setSecondItem(MCItemStack stack); + void setResult(MCItemStack stack); + void setMaximumRepairCost(int levels); + void setRepairCost(int levels); + void setRepairCostAmount(int levels); +} diff --git a/src/main/java/com/laytonsmith/abstraction/bukkit/BukkitMCAnvilInventory.java b/src/main/java/com/laytonsmith/abstraction/bukkit/BukkitMCAnvilInventory.java new file mode 100644 index 0000000000..9961fad70d --- /dev/null +++ b/src/main/java/com/laytonsmith/abstraction/bukkit/BukkitMCAnvilInventory.java @@ -0,0 +1,80 @@ +package com.laytonsmith.abstraction.bukkit; + +import com.laytonsmith.abstraction.MCAnvilInventory; +import com.laytonsmith.abstraction.MCItemStack; +import org.bukkit.inventory.AnvilInventory; + +public class BukkitMCAnvilInventory extends BukkitMCInventory implements MCAnvilInventory { + + AnvilInventory ai; + + public BukkitMCAnvilInventory(AnvilInventory inventory) { + super(inventory); + ai = inventory; + } + + @Override + public MCItemStack getFirstItem() { + return new BukkitMCItemStack(ai.getItem(0)); + } + + @Override + public MCItemStack getSecondItem() { + return new BukkitMCItemStack(ai.getItem(1)); + } + + @Override + public MCItemStack getResult() { + return new BukkitMCItemStack(ai.getItem(2)); + } + + @Override + public int getMaximumRepairCost() { + return ai.getMaximumRepairCost(); + } + + @Override + public int getRepairCost() { + return ai.getRepairCost(); + } + + @Override + public int getRepairCostAmount() { + return ai.getRepairCostAmount(); + } + + @Override + public String getRenameText() { + return ai.getRenameText(); + } + + @Override + public void setFirstItem(MCItemStack stack) { + ai.setItem(0, ((BukkitMCItemStack) stack).asItemStack()); + } + + @Override + public void setSecondItem(MCItemStack stack) { + ai.setItem(1, ((BukkitMCItemStack) stack).asItemStack()); + } + + @Override + public void setResult(MCItemStack stack) { + ai.setItem(2, ((BukkitMCItemStack) stack).asItemStack()); + } + + @Override + public void setMaximumRepairCost(int levels) { + ai.setMaximumRepairCost(levels); + } + + @Override + public void setRepairCost(int levels) { + ai.setRepairCost(levels); + } + + @Override + public void setRepairCostAmount(int levels) { + ai.setRepairCostAmount(levels); + } +} diff --git a/src/main/java/com/laytonsmith/abstraction/bukkit/events/BukkitInventoryEvents.java b/src/main/java/com/laytonsmith/abstraction/bukkit/events/BukkitInventoryEvents.java index 2c5dbc178d..b1fb907c37 100644 --- a/src/main/java/com/laytonsmith/abstraction/bukkit/events/BukkitInventoryEvents.java +++ b/src/main/java/com/laytonsmith/abstraction/bukkit/events/BukkitInventoryEvents.java @@ -1,5 +1,6 @@ package com.laytonsmith.abstraction.bukkit.events; +import com.laytonsmith.abstraction.MCAnvilInventory; import com.laytonsmith.abstraction.MCCraftingInventory; import com.laytonsmith.abstraction.MCEnchantmentOffer; import com.laytonsmith.abstraction.MCHumanEntity; @@ -10,6 +11,7 @@ import com.laytonsmith.abstraction.MCRecipe; import com.laytonsmith.abstraction.blocks.MCBlock; import com.laytonsmith.abstraction.bukkit.BukkitConvertor; +import com.laytonsmith.abstraction.bukkit.BukkitMCAnvilInventory; import com.laytonsmith.abstraction.bukkit.BukkitMCCraftingInventory; import com.laytonsmith.abstraction.bukkit.BukkitMCEnchantmentOffer; import com.laytonsmith.abstraction.bukkit.BukkitMCInventory; @@ -37,6 +39,7 @@ import com.laytonsmith.abstraction.events.MCInventoryOpenEvent; import com.laytonsmith.abstraction.events.MCItemHeldEvent; import com.laytonsmith.abstraction.events.MCItemSwapEvent; +import com.laytonsmith.abstraction.events.MCPrepareAnvilEvent; import com.laytonsmith.abstraction.events.MCPrepareItemCraftEvent; import com.laytonsmith.abstraction.events.MCPrepareItemEnchantEvent; import org.bukkit.enchantments.Enchantment; @@ -52,6 +55,7 @@ import org.bukkit.event.inventory.InventoryEvent; import org.bukkit.event.inventory.InventoryInteractEvent; import org.bukkit.event.inventory.InventoryOpenEvent; +import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.event.inventory.PrepareItemCraftEvent; import org.bukkit.event.player.PlayerItemHeldEvent; import org.bukkit.event.player.PlayerSwapHandItemsEvent; @@ -544,4 +548,28 @@ public MCCraftingInventory getInventory() { return new BukkitMCCraftingInventory(e.getInventory()); } } + + public static class BukkitMCPrepareAnvilEvent extends BukkitMCInventoryEvent implements MCPrepareAnvilEvent { + PrepareAnvilEvent e; + + public BukkitMCPrepareAnvilEvent(PrepareAnvilEvent event) { + super(event); + e = event; + } + + @Override + public void setResult(MCItemStack i) { + e.setResult(((BukkitMCItemStack) i).asItemStack()); + } + + @Override + public MCPlayer getPlayer() { + return new BukkitMCPlayer(e.getViewers().get(0)); + } + + @Override + public MCAnvilInventory getInventory() { + return new BukkitMCAnvilInventory(e.getInventory()); + } + } } diff --git a/src/main/java/com/laytonsmith/abstraction/bukkit/events/drivers/BukkitInventoryListener.java b/src/main/java/com/laytonsmith/abstraction/bukkit/events/drivers/BukkitInventoryListener.java index 4fdd8bc164..c63f742497 100644 --- a/src/main/java/com/laytonsmith/abstraction/bukkit/events/drivers/BukkitInventoryListener.java +++ b/src/main/java/com/laytonsmith/abstraction/bukkit/events/drivers/BukkitInventoryListener.java @@ -8,6 +8,7 @@ import com.laytonsmith.abstraction.bukkit.events.BukkitInventoryEvents.BukkitMCInventoryOpenEvent; import com.laytonsmith.abstraction.bukkit.events.BukkitInventoryEvents.BukkitMCItemHeldEvent; import com.laytonsmith.abstraction.bukkit.events.BukkitInventoryEvents.BukkitMCItemSwapEvent; +import com.laytonsmith.abstraction.bukkit.events.BukkitInventoryEvents.BukkitMCPrepareAnvilEvent; import com.laytonsmith.abstraction.bukkit.events.BukkitInventoryEvents.BukkitMCPrepareItemCraftEvent; import com.laytonsmith.abstraction.bukkit.events.BukkitInventoryEvents.BukkitMCPrepareItemEnchantEvent; import com.laytonsmith.core.events.Driver; @@ -21,6 +22,7 @@ import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryDragEvent; import org.bukkit.event.inventory.InventoryOpenEvent; +import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.event.inventory.PrepareItemCraftEvent; import org.bukkit.event.player.PlayerItemHeldEvent; import org.bukkit.event.player.PlayerSwapHandItemsEvent; @@ -80,4 +82,10 @@ public void onPreCraft(PrepareItemCraftEvent event) { BukkitMCPrepareItemCraftEvent pc = new BukkitInventoryEvents.BukkitMCPrepareItemCraftEvent(event); EventUtils.TriggerListener(Driver.ITEM_PRE_CRAFT, "item_pre_craft", pc); } + + @EventHandler(priority = EventPriority.LOWEST) + public void onPreAnvil(PrepareAnvilEvent event) { + BukkitMCPrepareAnvilEvent pa = new BukkitInventoryEvents.BukkitMCPrepareAnvilEvent(event); + EventUtils.TriggerListener(Driver.ITEM_PRE_ANVIL, "item_pre_anvil", pa); + } } diff --git a/src/main/java/com/laytonsmith/abstraction/events/MCPrepareAnvilEvent.java b/src/main/java/com/laytonsmith/abstraction/events/MCPrepareAnvilEvent.java new file mode 100644 index 0000000000..eabe8e993f --- /dev/null +++ b/src/main/java/com/laytonsmith/abstraction/events/MCPrepareAnvilEvent.java @@ -0,0 +1,10 @@ +package com.laytonsmith.abstraction.events; + +import com.laytonsmith.abstraction.MCPlayer; +import com.laytonsmith.abstraction.MCItemStack; + +public interface MCPrepareAnvilEvent extends MCInventoryEvent { + MCPlayer getPlayer(); + + void setResult(MCItemStack i); +} diff --git a/src/main/java/com/laytonsmith/core/events/Driver.java b/src/main/java/com/laytonsmith/core/events/Driver.java index bd9f5d63dd..95973a0620 100644 --- a/src/main/java/com/laytonsmith/core/events/Driver.java +++ b/src/main/java/com/laytonsmith/core/events/Driver.java @@ -67,6 +67,7 @@ public enum Driver { ITEM_SWAP, ITEM_PRE_CRAFT, ITEM_PRE_ENCHANT, + ITEM_PRE_ANVIL, /** * Player events */ diff --git a/src/main/java/com/laytonsmith/core/events/drivers/InventoryEvents.java b/src/main/java/com/laytonsmith/core/events/drivers/InventoryEvents.java index 0b2d53283f..e107352c93 100644 --- a/src/main/java/com/laytonsmith/core/events/drivers/InventoryEvents.java +++ b/src/main/java/com/laytonsmith/core/events/drivers/InventoryEvents.java @@ -2,6 +2,7 @@ import com.laytonsmith.PureUtilities.Common.StringUtils; import com.laytonsmith.PureUtilities.Version; +import com.laytonsmith.abstraction.MCAnvilInventory; import com.laytonsmith.abstraction.MCEnchantmentOffer; import com.laytonsmith.abstraction.MCHumanEntity; import com.laytonsmith.abstraction.MCInventory; @@ -19,6 +20,7 @@ import com.laytonsmith.abstraction.events.MCInventoryOpenEvent; import com.laytonsmith.abstraction.events.MCItemHeldEvent; import com.laytonsmith.abstraction.events.MCItemSwapEvent; +import com.laytonsmith.abstraction.events.MCPrepareAnvilEvent; import com.laytonsmith.abstraction.events.MCPrepareItemCraftEvent; import com.laytonsmith.abstraction.events.MCPrepareItemEnchantEvent; import com.laytonsmith.annotations.api; @@ -987,4 +989,83 @@ public Version since() { return MSVersion.V3_3_1; } } + + @api + public static class item_pre_anvil extends AbstractEvent { + + @Override + public String getName() { + return "item_pre_anvil"; + } + + @Override + public String docs() { + return "{}" + + " Fires when a recipe is formed in an anvil, but the result has not yet been clicked." + + " { player: the player using the anvil." + + " | first_item: the first item being used in the recipe." + + " | second_item: the second item being used in the recipe." + + " | result: the result of the recipe." + + " | max_repair_cost: the maximum possible cost of this repair." + + " | level_repair_cost: how many levels are needed to perform this repair." + + " | item_repair_cost: how many items are needed to perform this repair. }" + + " { result: the result of the anvil }" + + " {}"; + } + + @Override + public boolean matches(Map prefilter, BindableEvent event) throws PrefilterNonMatchException { + if(event instanceof MCPrepareAnvilEvent) { + return true; + } + return false; + } + + @Override + public BindableEvent convert(CArray manualObject, Target t) { + throw ConfigRuntimeException.CreateUncatchableException("Unsupported operation.", Target.UNKNOWN); + } + + @Override + public Map evaluate(BindableEvent event) throws EventException { + if(event instanceof MCPrepareAnvilEvent e) { + MCAnvilInventory anvil = (MCAnvilInventory) e.getInventory(); + Map ret = evaluate_helper(e); + + ret.put("player", new CString(e.getPlayer().getName(), Target.UNKNOWN)); + ret.put("first_item", ObjectGenerator.GetGenerator().item(anvil.getFirstItem(), Target.UNKNOWN)); + ret.put("second_item", ObjectGenerator.GetGenerator().item(anvil.getSecondItem(), Target.UNKNOWN)); + ret.put("result", ObjectGenerator.GetGenerator().item(anvil.getResult(), Target.UNKNOWN)); + ret.put("max_repair_cost", new CInt(anvil.getMaximumRepairCost(), Target.UNKNOWN)); + ret.put("level_repair_cost", new CInt(anvil.getRepairCost(), Target.UNKNOWN)); + ret.put("item_repair_cost", new CInt(anvil.getRepairCostAmount(), Target.UNKNOWN)); + + return ret; + } else { + throw new EventException("Event received was not an MCPrepareAnvilEvent."); + } + } + + @Override + public Driver driver() { + return Driver.ITEM_PRE_ANVIL; + } + + @Override + public boolean modifyEvent(String key, Mixed value, BindableEvent event) { + if(event instanceof MCPrepareAnvilEvent e) { + Target t = value.getTarget(); + if(key.equalsIgnoreCase("result")) { + e.setResult(ObjectGenerator.GetGenerator().item(value, t)); + return true; + } + } + return false; + } + + @Override + public Version since() { + return MSVersion.V3_3_5; + } + } }