From 241dda7649e7e458fd379be4c377ae65f03f597c Mon Sep 17 00:00:00 2001 From: MorphanOne Date: Sun, 1 Sep 2013 02:22:11 -0400 Subject: [PATCH] Add Inventory Scripts. Currently only for chest inventories,. Example script: http://www.hastebin.com/benudejico.sm --- .../denizen/objects/dInventory.java | 60 ++++++++----------- .../core/InventoryScriptContainer.java | 37 ++++++++++-- .../containers/core/ItemScriptContainer.java | 7 +-- 3 files changed, 61 insertions(+), 43 deletions(-) diff --git a/src/main/java/net/aufdemrand/denizen/objects/dInventory.java b/src/main/java/net/aufdemrand/denizen/objects/dInventory.java index cdbc75aeda..55fe6e109c 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/dInventory.java +++ b/src/main/java/net/aufdemrand/denizen/objects/dInventory.java @@ -21,60 +21,42 @@ import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.meta.BookMeta; -import net.aufdemrand.denizen.objects.notable.Notable; -import net.aufdemrand.denizen.objects.notable.NotableManager; -import net.aufdemrand.denizen.objects.notable.Note; +import net.aufdemrand.denizen.scripts.ScriptRegistry; +import net.aufdemrand.denizen.scripts.containers.core.InventoryScriptContainer; import net.aufdemrand.denizen.tags.Attribute; import net.aufdemrand.denizen.utilities.debugging.dB; import net.citizensnpcs.api.CitizensAPI; -public class dInventory implements dObject, Notable { - - /////////////////// - // NOTABLE METHODS - //////////////// - - public boolean isUnique() { - return (NotableManager.isSaved(this)); - } - - @Note("inventory") - public String getSaveString() { - return identify(); - } - - public void makeUnique(String id) { - NotableManager.saveAs(this, id); - } - - public void forget() { - NotableManager.remove(this); - } +public class dInventory implements dObject { ///////////////////// // PATTERNS ///////////////// final static Pattern inventory_by_type = Pattern.compile("(in@)(npc|player|entity|location|equipment)(\\[)(.+?)(\\])", Pattern.CASE_INSENSITIVE); - final static Pattern inventory_by_saved = Pattern.compile("(in@)(.+)"); + final static Pattern inventory_by_script = Pattern.compile("(in@)(.+)"); ////////////////// // OBJECT FETCHER //////////////// + public static dInventory valueOf(String string) { + return valueOf(string, null, null); + } + /** * * Gets a dInventory from a string format. * * @param string - * The inventory in string form. (in@player[playerName], in@notableName, etc.) + * The inventory in string form. (in@player[playerName], in@scriptName, etc.) * @return * The dInventory value. If the string is incorrectly formatted or * the specified inventory is invalid, this is null. * */ @ObjectFetcher("in") - public static dInventory valueOf(String string) { + public static dInventory valueOf(String string, dPlayer player, dNPC npc) { if (string == null) return null; @@ -137,15 +119,15 @@ else if (dEntity.matches(h) && dEntity.valueOf(h).isLivingEntity() } - // Match in@notableName for Notable dInventories - m = inventory_by_saved.matcher(string); + // Match in@scriptName for Inventory Scripts + m = inventory_by_script.matcher(string); if (m.matches()) { - if (NotableManager.isType(m.group(2), dInventory.class)) - return (dInventory) NotableManager.getSavedObject(m.group(2)); + if (ScriptRegistry.containsScript(m.group(2), InventoryScriptContainer.class)) + return ScriptRegistry.getScriptContainerAs(m.group(2), InventoryScriptContainer.class).getInventoryFrom(player, npc); - dB.echoError("Value of dInventory returning null. Invalid notable specified: " + m.group(2)); + dB.echoError("Value of dInventory returning null. Invalid script specified: " + m.group(2)); return null; } @@ -244,6 +226,12 @@ public dInventory(InventoryType type, String id, String identifier) { holderIdentifier = identifier; } + public dInventory(int size, String id, String identifier) { + inventory = Bukkit.getServer().createInventory(null, size); + holderType = id; + holderIdentifier = identifier; + } + public dInventory(InventoryHolder holder) { if (!(holder instanceof LivingEntity)) { if (holder instanceof DoubleChest) @@ -647,6 +635,10 @@ public void setContents(ItemStack[] contents) { public String getType() { return "Inventory"; } + + public boolean isUnique() { + return true; + } public String getPrefix() { return prefix; @@ -662,7 +654,7 @@ public String debug() { } public String identify() { - return "in@" + (holderType.equals("notable") ? holderIdentifier : (holderType + "[" + holderIdentifier + "]")); + return "in@" + (holderType.equals("script") ? holderIdentifier : (holderType + "[" + holderIdentifier + "]")); } public String getAttribute(Attribute attribute) { diff --git a/src/main/java/net/aufdemrand/denizen/scripts/containers/core/InventoryScriptContainer.java b/src/main/java/net/aufdemrand/denizen/scripts/containers/core/InventoryScriptContainer.java index 2085fdcd48..308bcf68a9 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/containers/core/InventoryScriptContainer.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/containers/core/InventoryScriptContainer.java @@ -2,7 +2,10 @@ import java.util.HashMap; import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import net.aufdemrand.denizen.objects.aH; import net.aufdemrand.denizen.objects.dInventory; import net.aufdemrand.denizen.objects.dItem; import net.aufdemrand.denizen.objects.dNPC; @@ -10,9 +13,10 @@ import net.aufdemrand.denizen.scripts.containers.ScriptContainer; import net.aufdemrand.denizen.tags.TagManager; import net.aufdemrand.denizen.utilities.debugging.dB; - +import org.bukkit.Material; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.ItemStack; public class InventoryScriptContainer extends ScriptContainer { @@ -55,15 +59,38 @@ public dInventory getInventoryFrom(dPlayer player, dNPC npc) { dInventory inventory = null; try { - if (contains("DEFINITIONS")) { - // TODO: Figure out when to load definitions + if (contains("SIZE")) { + inventory = new dInventory(aH.getIntegerFrom(getString("SIZE")), "script", getName()); } - if (contains("SLOTS")) { + ItemStack[] finalItems = new ItemStack[getSize()]; + int itemsAdded = 0; for (String items : getStringList("SLOTS")) { items = TagManager.tag(player, npc, items); - // TODO: Find a possible format for this + String[] itemsInLine = items.split(" "); + for (String item : itemsInLine) { + Matcher m = Pattern.compile("(\\[)(.*)(\\])").matcher(item); + if (!m.matches()) { + dB.echoError("Inventory script \"" + getName() + "\" has an invalid slot item."); + return null; + } + if (contains("DEFINITIONS." + m.group(2)) && dItem.matches(getString("DEFINITIONS." + m.group(2)))) { + finalItems[itemsAdded] = dItem.valueOf(getString("DEFINITIONS." + m.group(2))).getItemStack(); + } + else if (dItem.matches(m.group(2))) { + finalItems[itemsAdded] = dItem.valueOf(m.group(2)).getItemStack(); + } + else { + finalItems[itemsAdded] = new ItemStack(Material.AIR); + if (!m.group(2).trim().isEmpty()) { + dB.echoError("Inventory script \"" + getName() + "\" has an invalid slot item: [" + m.group(2) + + "]... Ignoring it and assuming \"AIR\""); + } + } + itemsAdded++; + } } + inventory.setContents(finalItems); } } catch (Exception e) { 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 fb5b0341e6..a95e3686a3 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 @@ -15,14 +15,13 @@ import org.bukkit.Bukkit; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.Player; import org.bukkit.inventory.ShapedRecipe; import org.bukkit.inventory.meta.ItemMeta; public class ItemScriptContainer extends ScriptContainer { dNPC npc = null; - Player player = null; + dPlayer player = null; public Boolean bound = false; public ItemScriptContainer(ConfigurationSection configurationSection, String scriptContainerName) { @@ -32,7 +31,7 @@ public ItemScriptContainer(ConfigurationSection configurationSection, String scr if (contains("RECIPE")) { List materials = new ArrayList(); for (String recipeRow : getStringList("RECIPE")) { - recipeRow = TagManager.tag(new dPlayer(player), npc, recipeRow); + recipeRow = TagManager.tag(player, npc, recipeRow); String[] row = recipeRow.split("\\|", 3); for (String material : row) { materials.add(materials.size(), dItem.valueOf(material)); @@ -149,7 +148,7 @@ public void setNPC(dNPC npc) { this.npc = npc; } - public void setPlayer(Player player) { + public void setPlayer(dPlayer player) { this.player = player; }