diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java index fac837bc0d..f7daad564f 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java +++ b/plugin/src/main/java/com/denizenscript/denizen/events/ScriptEventRegistry.java @@ -145,6 +145,7 @@ public static void registerMainEvents() { ScriptEvent.registerScriptEvent(new PlayerPlacesHangingScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerPreLoginScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerPreparesAnvilCraftScriptEvent()); + ScriptEvent.registerScriptEvent(new PlayerPreparesEnchantScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerQuitsScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerReceivesCommandsScriptEvent()); ScriptEvent.registerScriptEvent(new PlayerReceivesMessageScriptEvent()); diff --git a/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerPreparesEnchantScriptEvent.java b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerPreparesEnchantScriptEvent.java new file mode 100644 index 0000000000..fd74a07c16 --- /dev/null +++ b/plugin/src/main/java/com/denizenscript/denizen/events/player/PlayerPreparesEnchantScriptEvent.java @@ -0,0 +1,137 @@ +package com.denizenscript.denizen.events.player; + +import com.denizenscript.denizen.events.BukkitScriptEvent; +import com.denizenscript.denizen.objects.*; +import com.denizenscript.denizen.utilities.Utilities; +import com.denizenscript.denizen.utilities.debugging.Debug; +import com.denizenscript.denizen.utilities.implementation.BukkitScriptEntryData; +import com.denizenscript.denizencore.objects.ObjectTag; +import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.objects.core.ListTag; +import com.denizenscript.denizencore.objects.core.MapTag; +import com.denizenscript.denizencore.scripts.ScriptEntryData; +import com.denizenscript.denizencore.utilities.CoreUtilities; +import org.bukkit.enchantments.EnchantmentOffer; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.enchantment.PrepareItemEnchantEvent; + +public class PlayerPreparesEnchantScriptEvent extends BukkitScriptEvent implements Listener { + + // <--[event] + // @Events + // player prepares item enchant + // player prepares enchant + // + // @Regex ^on player prepares [^\s]+ enchant$ + // + // @Group Player + // + // @Triggers when a player prepares to enchant an item. + // + // @Context + // returns the LocationTag of the enchanting block. + // returns the ItemTag to be enchanted. + // returns an ElementTag(Number) of the enchanting bonus available (number of bookshelves). + // returns a ListTag of the available enchanting offers, each as a MapTag with keys 'cost', 'enchantment', and 'level'. + // + // @Determine + // "OFFERS:" + ListTag of MapTags to set the offers available. Cannot be a different size list than the size of context.offers. + // + // @Player Always. + // + // --> + + public PlayerPreparesEnchantScriptEvent() { + instance = this; + } + + public static PlayerPreparesEnchantScriptEvent instance; + public PrepareItemEnchantEvent event; + + @Override + public boolean couldMatch(ScriptPath path) { + if (!path.eventLower.startsWith("player prepares") || !path.eventArgLowerAt(3).equals("enchant")) { + return false; + } + if (!couldMatchItem(path.eventArgLowerAt(2))) { + return false; + } + return true; + } + + @Override + public boolean matches(ScriptPath path) { + String eItem = path.eventArgLowerAt(2); + if (!tryItem(new ItemTag(event.getItem()), eItem)) { + return false; + } + return super.matches(path); + } + + @Override + public String getName() { + return "PlayerPreparesEnchant"; + } + + @Override + public boolean applyDetermination(ScriptPath path, ObjectTag determinationObj) { + if (determinationObj instanceof ElementTag) { + String determineLow = CoreUtilities.toLowerCase(determinationObj.toString()); + if (determineLow.startsWith("offers:")) { + ListTag offers = ListTag.valueOf(determineLow.substring("offers:".length()), getTagContext(path)); + if (offers.size() != event.getOffers().length) { + Debug.echoError("Offer list size incorrect."); + return false; + } + for (int i = 0; i < offers.size(); i++) { + MapTag map = MapTag.getMapFor(offers.getObject(i), getTagContext(path)); + event.getOffers()[i].setCost(new ElementTag(map.getObject("cost").toString()).asInt()); + event.getOffers()[i].setEnchantment(Utilities.getEnchantmentByName(map.getObject("enchantment").toString())); + event.getOffers()[i].setEnchantmentLevel(new ElementTag(map.getObject("level").toString()).asInt()); + } + return true; + } + } + return super.applyDetermination(path, determinationObj); + } + + @Override + public ScriptEntryData getScriptEntryData() { + return new BukkitScriptEntryData(new PlayerTag(event.getEnchanter()), null); + } + + @Override + public ObjectTag getContext(String name) { + if (name.equals("item")) { + return new ItemTag(event.getItem()); + } + else if (name.equals("location")) { + return new LocationTag(event.getEnchantBlock().getLocation()); + } + else if (name.equals("bonus")) { + return new ElementTag(event.getEnchantmentBonus()); + } + else if (name.equals("offers")) { + ListTag output = new ListTag(); + for (EnchantmentOffer offer : event.getOffers()) { + MapTag map = new MapTag(); + map.putObject("cost", new ElementTag(offer.getCost())); + map.putObject("enchantment", new ElementTag(offer.getEnchantment().getKey().getKey())); + map.putObject("level", new ElementTag(offer.getEnchantmentLevel())); + output.addObject(map); + } + return output; + } + return super.getContext(name); + } + + @EventHandler + public void onEnchantItem(PrepareItemEnchantEvent event) { + if (event.getInventory().getViewers().isEmpty()) { + return; + } + this.event = event; + fire(event); + } +} diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/inventory/InventoryContents.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/inventory/InventoryContents.java index 21dc024720..6b1bfa09f5 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/inventory/InventoryContents.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/inventory/InventoryContents.java @@ -8,7 +8,6 @@ import com.denizenscript.denizencore.objects.core.MapTag; import com.denizenscript.denizencore.objects.properties.Property; import com.denizenscript.denizencore.objects.properties.PropertyParser; -import com.denizenscript.denizencore.utilities.text.StringHolder; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; @@ -136,7 +135,7 @@ public static void registerTags() { if (items[i] == null || items[i].getType() == Material.AIR) { continue; } - map.map.put(new StringHolder(String.valueOf(i + 1)), new ItemTag(items[i])); + map.putObject(String.valueOf(i + 1), new ItemTag(items[i])); } return map; }); diff --git a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRawNBT.java b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRawNBT.java index b48779022e..4ae9e558db 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRawNBT.java +++ b/plugin/src/main/java/com/denizenscript/denizen/objects/properties/item/ItemRawNBT.java @@ -208,7 +208,7 @@ public static ObjectTag jnbtTagToObject(Tag tag) { if (tag instanceof CompoundTag) { MapTag result = new MapTag(); for (Map.Entry entry : ((CompoundTag) tag).getValue().entrySet()) { - result.map.put(new StringHolder(entry.getKey()), jnbtTagToObject(entry.getValue())); + result.putObject(entry.getKey(), jnbtTagToObject(entry.getValue())); } return result; } diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java index a12a21175f..bd34739252 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/Utilities.java @@ -64,7 +64,7 @@ else if ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || c == '_') { public static Enchantment getEnchantmentByName(String name) { Enchantment ench; - NamespacedKey key = Utilities.parseNamespacedKey(name); + NamespacedKey key = parseNamespacedKey(name); ench = Enchantment.getByKey(key); if (ench == null) { ench = Enchantment.getByName(name.toUpperCase());