From 920804bd957e35dbc14c0b43b208d01ceae2af8c Mon Sep 17 00:00:00 2001 From: aPunch Date: Sun, 5 Feb 2012 01:18:40 -0600 Subject: [PATCH] added inventory-related API --- lib/CitizensAPI.jar | Bin 23429 -> 23482 bytes src/net/citizensnpcs/Citizens.java | 3 +- src/net/citizensnpcs/npc/CitizensNPC.java | 15 +++ src/net/citizensnpcs/trait/Inventory.java | 112 ++++++++++++++++++++++ 4 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 src/net/citizensnpcs/trait/Inventory.java diff --git a/lib/CitizensAPI.jar b/lib/CitizensAPI.jar index 7f4734eea0b1b95b14e62fd41730c1c609344692..cc7cd37b961ed28423f7861b89f96c33da7b7a1a 100644 GIT binary patch delta 4916 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 delta 4860 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 defaultTraits = Lists.newArrayList(Owner.class, Spawned.class, - LookClose.class, SpawnLocation.class); + LookClose.class, SpawnLocation.class, Inventory.class); private volatile CitizensNPCManager npcManager; private final InstanceFactory characterManager = new DefaultInstanceFactory(); diff --git a/src/net/citizensnpcs/npc/CitizensNPC.java b/src/net/citizensnpcs/npc/CitizensNPC.java index b5d41c657..758d87092 100644 --- a/src/net/citizensnpcs/npc/CitizensNPC.java +++ b/src/net/citizensnpcs/npc/CitizensNPC.java @@ -7,11 +7,14 @@ import net.citizensnpcs.api.npc.trait.trait.SpawnLocation; import net.citizensnpcs.api.npc.trait.trait.Spawned; import net.citizensnpcs.npc.ai.CitizensAI; import net.citizensnpcs.util.Messaging; + import net.minecraft.server.EntityLiving; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.inventory.PlayerInventory; public abstract class CitizensNPC extends AbstractNPC { protected final CitizensNPCManager manager; @@ -88,6 +91,18 @@ public abstract class CitizensNPC extends AbstractNPC { return true; } + @Override + public PlayerInventory getInventory() { + throw new UnsupportedOperationException("not implemented yet"); + } + + @Override + public boolean openInventory(Player player) { + if (!isSpawned()) + return false; + throw new UnsupportedOperationException("not implemented yet"); + } + public void update() { ai.update(); } diff --git a/src/net/citizensnpcs/trait/Inventory.java b/src/net/citizensnpcs/trait/Inventory.java new file mode 100644 index 000000000..0c6e4325e --- /dev/null +++ b/src/net/citizensnpcs/trait/Inventory.java @@ -0,0 +1,112 @@ +package net.citizensnpcs.trait; + +import java.util.HashMap; +import java.util.Map; + +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; + +import net.citizensnpcs.api.DataKey; +import net.citizensnpcs.api.exception.NPCLoadException; +import net.citizensnpcs.api.npc.trait.SaveId; +import net.citizensnpcs.api.npc.trait.Trait; + +@SaveId("inventory") +public class Inventory implements Trait { + private ItemStack[] contents; + private ItemStack helmet; + private ItemStack chestplate; + private ItemStack leggings; + private ItemStack boots; + + public Inventory() { + } + + public Inventory(org.bukkit.inventory.PlayerInventory inventory) { + contents = inventory.getContents(); + helmet = inventory.getHelmet(); + chestplate = inventory.getChestplate(); + leggings = inventory.getLeggings(); + boots = inventory.getBoots(); + } + + public ItemStack[] getContents() { + return contents; + } + + public ItemStack[] getArmorContents() { + ItemStack[] armor = new ItemStack[4]; + armor[0] = helmet; + armor[1] = chestplate; + armor[2] = leggings; + armor[3] = boots; + return armor; + } + + @Override + public void load(DataKey key) throws NPCLoadException { + contents = parseContents(key); + // Armor + helmet = getItemStack(key.getRelative("armor.helmet")); + chestplate = getItemStack(key.getRelative("armor.chestplate")); + leggings = getItemStack(key.getRelative("armor.leggings")); + boots = getItemStack(key.getRelative("armor.boots")); + } + + @Override + public void save(DataKey key) { + int index = 0; + for (ItemStack item : contents) + saveItem(item, key.getRelative(String.valueOf(index++))); + + DataKey armorKey = key.getRelative("armor"); + saveItem(helmet, armorKey.getRelative("helmet")); + saveItem(chestplate, armorKey.getRelative("chestplate")); + saveItem(leggings, armorKey.getRelative("leggings")); + saveItem(boots, armorKey.getRelative("boots")); + } + + private ItemStack[] parseContents(DataKey key) throws NPCLoadException { + ItemStack[] contents = new ItemStack[36]; + for (DataKey slotKey : key.getIntegerSubKeys()) { + contents[Integer.parseInt(slotKey.name())] = getItemStack(slotKey); + } + return contents; + } + + private ItemStack getItemStack(DataKey key) throws NPCLoadException { + try { + ItemStack item = new ItemStack(Material.getMaterial(key.getString("name")), key.getInt("amount"), + (short) key.getLong("data")); + if (key.keyExists("enchantments")) { + Map enchantments = new HashMap(); + for (DataKey subKey : key.getRelative("enchantments").getSubKeys()) { + Enchantment enchantment = Enchantment.getByName(subKey.name().toUpperCase().replace('-', '_')); + if (enchantment != null) + enchantments.put(enchantment, subKey.getInt("")); + } + item.addEnchantments(enchantments); + } + return item; + } catch (Exception ex) { + throw new NPCLoadException("Invalid item."); + } + } + + private void saveItem(ItemStack item, DataKey key) { + key.setString("name", item.getType().toString()); + key.setInt("amount", item.getAmount()); + key.setLong("data", item.getDurability()); + + for (Enchantment enchantment : item.getEnchantments().keySet()) + key.getRelative("enchantments").setInt(enchantment.getName().toLowerCase().replace('_', '-'), + item.getEnchantmentLevel(enchantment)); + } + + @Override + public String toString() { + return "Inventory{contents:" + contents + "; helmet:" + helmet + "; chestplate:" + chestplate + "; leggings:" + + leggings + "; boots:" + boots + "}"; + } +} \ No newline at end of file