package com.demigodsrpg.util; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Chest; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.BookMeta; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.util.io.BukkitObjectInputStream; import org.bukkit.util.io.BukkitObjectOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.Random; public class ItemUtil { /** * Creates a new item with the given variables. * * @param material the material that the new item will be. * @param name the name of the new item. * @param lore the lore attached to the new item. * @param enchantments the enchantments attached to the new item. * @return the ItemStack of the newly created item. */ public static ItemStack create(Material material, String name, List<String> lore, Map<Enchantment, Integer> enchantments) { // Define variables ItemStack item = new ItemStack(material); ItemMeta meta = item.getItemMeta(); // Set meta data if (name != null) meta.setDisplayName(name); if (lore != null) meta.setLore(lore); item.setItemMeta(meta); // Add enchantments if passed in if (enchantments != null) item.addUnsafeEnchantments(enchantments); return item; } /** * Creates a book with the given variables. * * @param title the title of the new book. * @param author the author of the new book. * @param pages the pages of the new book. * @param lore the lore of the new book. * @return the ItemStack of the newly created book. */ public static ItemStack createBook(String title, String author, List<String> pages, List<String> lore) { ItemStack book = new ItemStack(Material.WRITTEN_BOOK); BookMeta meta = (BookMeta) book.getItemMeta(); meta.setTitle(title); meta.setAuthor(author); meta.setPages(pages); if (lore != null) meta.setLore(lore); book.setItemMeta(meta); return book; } /** * Creates a chest at <code>location</code> filled with <code>items</code>. * * @param location the location at which to create the chest. * @param items the ArrayList of items to fill the chest with. */ public static void createChest(Location location, List<ItemStack> items) { // Create the chest location.getBlock().setType(Material.CHEST); // Get the chest's inventory Chest chest = (Chest) location.getBlock().getState(); Inventory inventory = chest.getBlockInventory(); // Add the items randomly for (ItemStack item : items) { inventory.setItem((new Random().nextInt(inventory.getSize() - 1) + 1), item); } } /** * Checks to see if two items are equal ignoring durability. * * @param item1 the first item to check with. * @param item2 the second item to check with. * @return true if the items are equal. */ public static boolean areEqual(ItemStack item1, ItemStack item2) { // Clone the items ItemStack newItem1 = item1.clone(); ItemStack newItem2 = item2.clone(); // Set durabilities newItem1.setDurability(Short.parseShort("1")); newItem2.setDurability(Short.parseShort("1")); // Return the boolean return newItem1.equals(newItem2); } /** * Checks to see if two items are equal ignoring durability and enchantments. * * @param item1 the first item to check with. * @param item2 the second item to check with. * @return true if the items are equal. */ public static boolean areEqualIgnoreEnchantments(ItemStack item1, ItemStack item2) { // Create new items ItemStack newItem1 = item1.clone(); ItemStack newItem2 = item2.clone(); for (Enchantment enchantment : Enchantment.values()) { newItem1.removeEnchantment(enchantment); newItem2.removeEnchantment(enchantment); } // Return the boolean return ItemUtil.areEqual(newItem1, newItem2); } public static String serializeItemStack(ItemStack inv) { try { ByteArrayOutputStream os = new ByteArrayOutputStream(); BukkitObjectOutputStream bos = new BukkitObjectOutputStream(os); bos.writeObject(inv); String hex = BukkitObjectUtil.byteArrayToHexString(os.toByteArray()); bos.close(); os.close(); return hex; } catch (IOException ex) { ex.printStackTrace(); } return null; } public static ItemStack deserializeItemStack(String s) { try { byte[] b = BukkitObjectUtil.hexStringToByteArray(s); ByteArrayInputStream bais = new ByteArrayInputStream(b); BukkitObjectInputStream bois = new BukkitObjectInputStream(bais); ItemStack items = (ItemStack) bois.readObject(); bois.close(); bais.close(); return items; } catch (Exception ex) { ex.printStackTrace(); } return null; } public static String serializeItemStacks(ItemStack[] inv) { try { ByteArrayOutputStream os = new ByteArrayOutputStream(); BukkitObjectOutputStream bos = new BukkitObjectOutputStream(os); bos.writeObject(inv); String hex = BukkitObjectUtil.byteArrayToHexString(os.toByteArray()); bos.close(); os.close(); return hex; } catch (IOException ex) { ex.printStackTrace(); } return null; } public static ItemStack[] deserializeItemStacks(String s) { try { byte[] b = BukkitObjectUtil.hexStringToByteArray(s); ByteArrayInputStream bais = new ByteArrayInputStream(b); BukkitObjectInputStream bois = new BukkitObjectInputStream(bais); ItemStack[] items = (ItemStack[]) bois.readObject(); bois.close(); bais.close(); return items; } catch (Exception ex) { ex.printStackTrace(); } return null; } }