Skip to content

Commit

Permalink
Add Inventory Scripts. Currently only for chest inventories,. Example…
Browse files Browse the repository at this point in the history
  • Loading branch information
Morphan1 committed Sep 1, 2013
1 parent dc4faec commit 241dda7
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 43 deletions.
60 changes: 26 additions & 34 deletions src/main/java/net/aufdemrand/denizen/objects/dInventory.java
Expand Up @@ -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;

Expand Down Expand Up @@ -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;

}
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -647,6 +635,10 @@ public void setContents(ItemStack[] contents) {
public String getType() {
return "Inventory";
}

public boolean isUnique() {
return true;
}

public String getPrefix() {
return prefix;
Expand All @@ -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) {
Expand Down
Expand Up @@ -2,17 +2,21 @@

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;
import net.aufdemrand.denizen.objects.dPlayer;
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 {

Expand Down Expand Up @@ -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) {
Expand Down
Expand Up @@ -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) {
Expand All @@ -32,7 +31,7 @@ public ItemScriptContainer(ConfigurationSection configurationSection, String scr
if (contains("RECIPE")) {
List<dItem> materials = new ArrayList<dItem>();
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));
Expand Down Expand Up @@ -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;
}

Expand Down

0 comments on commit 241dda7

Please sign in to comment.