diff --git a/.project b/.project index 0cfb388..4727319 100644 --- a/.project +++ b/.project @@ -1,6 +1,6 @@ - Spigot_EnderBank2 + Spigot_EnderBank diff --git a/config.yml b/config.yml index 2f987ab..97e382b 100644 --- a/config.yml +++ b/config.yml @@ -4,15 +4,34 @@ Default_Page_Price: 10 #This is how much the first bank page will cost - Page_Price_Multiplier: 1 #This is how much the bank page cost will be multiplied #by for every additional page. - Page_Price_Addition: 0 #This is how much the bank page cost will be increased #by for every additional page. +Use_Item_For_Page_Price: false +#Enable this if you wish to use an item to purchase new pages. +#This does NOT replace cash but works WITH cash. Set cash to 0 +#if you only want items for purchase + +Page_Price_Items: + 2: + id: "STICK" + amount: 2 + #This item "2" is the item required for the second page (first unlocked). Same goes for other pages. + Default: + id: "EMERALD" + name: "&r&cEnderBank Storage Upgrade" + amount: 1 + lore: + - "&r&7Use me to upgrade your EnderBank page count!" + #This default item is the one that will be looked for if a specific page doesn't + #have an item like how page 1 does above. + #If you wish to cap the EnderBank page counts, simply put specific items for all + #the pages you wish to include, and then make the default item something unobtainable. + Must_Look_At_Chest_To_Search: true #This makes it so players must be looking at an EnderChest #to utilize the search feature, resulting in a "never left @@ -42,12 +61,65 @@ Open_Bank_Noise_Global: true #This is a list of worlds that the plugin is disabled in. #To enable this feature, simply uncomment it. +Disable_Dump_Into_Inventory: false +#Setting this to true disables use of the dump buttons. + +Dump_Into_Inventory_Blacklist: + item1randomidentifier: + id: "COMPASS" + name: "&cServer Changer" + lore: + - "&rRight click to change servers!" + item2randomidentifier: + id: "STICK" +#Items on this blacklist will not automatically be carried over into EnderBanks upon clicking the +#dump into inventory buttons. Add server switching compasses, tutorial books, or anything else like that +#you see fit. PROBABLY REMOVE THE VANILLA STICK FROM IT. + +########################## +###Syntax for each item### +########################## + +#id: DIRT (Required) +#amount: 1 (Optional) +#name: "Dirt" (Optional) +#enchantments: (Optional) +# - "arrowdamage:1" (Optional) +# - "arrowfire:1" (Optional) +# - "arrowinfinite:1" (Optional) +# - "arrowknockback:1" (Optional) +# - "damage:1" (Optional) +# - "digspeed:1" (Optional) +# - "durability:1" (Optional) +# - "fireaspect:1" (Optional) +# - "knockback:1" (Optional) +# - "lootbonusblock:1" (Optional) +# - "lootbonusmob:1" (Optional) +# - "luck:1" (Optional) +# - "protectionfall:1" (Optional) +# - "protectionfire:1" (Optional) +# - "silktouch:1" (Optional) +#tags: (Optional) +# - "playerskullskin:SKINVALUE" (Optional) +# - "vanilladurability:256" (Optional) +# - "unbreakable:true" (Optional) +# - "custommodeldata:1234567" (Optional) +#flags: (Optional) +# - "HIDE_ATTRIBUTES" (Optional) +# - "HIDE_DESTROYS" (Optional) +# - "HIDE_ENCHANTS" (Optional) +# - "HIDE_PLACED_ON" (Optional) +# - "HIDE_POTION_EFFECTS" (Optional) +# - "HIDE_UNBREAKABLE" (Optional) + ########################################################## # GUI Items # ########################################################## #Syntax: #%eb_pagecost% -> Cost of next page +#%eb_pagecostitemname% -> Name of item required for next page purchase +#%eb_pagecostitemamount% -> Amount of item required for next page purchase GUI: Next_Page: @@ -91,5 +163,5 @@ GUI: # Version # ########################################################## -VERSION: 4 +VERSION: 7 #Do not touch this. No touchy. \ No newline at end of file diff --git a/plugin.yml b/plugin.yml index b09a782..7bff786 100644 --- a/plugin.yml +++ b/plugin.yml @@ -1,6 +1,6 @@ name: "EnderBank" author: TheTealViper -version: "1.15.2.a.8" +version: "1.15.2.b.3" api-version: 1.13 description: "Bank system from popular RPG's." main: me.TheTealViper.enderbank.EnderBank diff --git a/src/me/TheTealViper/enderbank/BankStorage.java b/src/me/TheTealViper/enderbank/BankStorage.java index 30757dc..502eee6 100644 --- a/src/me/TheTealViper/enderbank/BankStorage.java +++ b/src/me/TheTealViper/enderbank/BankStorage.java @@ -15,13 +15,17 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import me.TheTealViper.enderbank.utils.LoadItemstackFromConfig; import me.TheTealViper.enderbank.utils.PluginFile; +import net.milkbowl.vault.economy.Economy; public class BankStorage { public static Map bankDatabase = new HashMap(); // This links players to THEIR own bank public static Map openBankDatabase = new HashMap(); // This links players to the bank they are viewing public static Map searchDatabase = new HashMap(); // This links players to the last bank they tried to search public static EnderBank plugin; + public static List dumpBlacklistedItems = new ArrayList(); + public static Map pagePriceItems = new HashMap(); public List items; public int unlockedPages; @@ -31,6 +35,11 @@ public class BankStorage { public List itemIdentifiers; public UUID bankOwnerUUID; + //Multiple people editing the same EnderBank at the same time should 100% corrupt the saves and lead to potential duplication methods. + //Don't do that. + //If you're reading this and not TheTealViper, now you know the secret. + //Staff are the only ones who could open an enderbank at the same time though so there would have to be a rat who helps players dupe. + public static void setup(EnderBank plugin) { BankStorage.plugin = plugin; } @@ -191,7 +200,14 @@ public class BankStorage { if(replaced) continue; - //First check for same items + //First check for blacklist + for(ItemStack blacklistedItem : dumpBlacklistedItems) { + if(blacklistedItem.isSimilar(pItem)) { + return; + } + } + + //Second check for same items if(items.get(i).isSimilar(pItem)) { //If there is empty space in the bank ItemStack bItem = items.get(i); int bAmount = bItem.getAmount(); @@ -223,6 +239,70 @@ public class BankStorage { if(playerInvSlotNumber == 40 && pAmount == 0) opener.getInventory().setItemInOffHand(new ItemStack(Material.AIR)); } + + @SuppressWarnings("deprecation") + public void attemptToPurchasePage(Economy econ, Player opener, Inventory inv) { + if(plugin.getConfig().getBoolean("Use_Item_For_Page_Price")) { + ConfigurationSection sec = plugin.getConfig().contains("Page_Price_Items." + (lastOpenedPage+1)) ? plugin.getConfig().getConfigurationSection("Page_Price_Items." + (lastOpenedPage+1)) : plugin.getConfig().getConfigurationSection("Page_Price_Items.Default"); + ItemStack itemRequiredForPay = new LoadItemstackFromConfig().getItem(sec); + int amountRequiredForPayment = itemRequiredForPay.getAmount(); + int amountPlayerHas = 0; + + //Check if player has enough of item + for(ItemStack i : opener.getInventory().getContents()) { + if(i != null && LoadItemstackFromConfig.isSimilar(i, itemRequiredForPay)) + amountPlayerHas += i.getAmount(); + } + if(amountPlayerHas < amountRequiredForPayment) { + opener.sendMessage(EnderBank.notificationString + " You don't have required items!"); + return; + } + + //Check balance of player if funds also involved + if(!econ.has(opener.getName(), BankStorage.getPageCost(unlockedPages + 1))) { + opener.sendMessage(EnderBank.notificationString + " You don't have enough money!"); + return; + } + + //Remove items from player + int amountToRemove = amountRequiredForPayment; + for(ItemStack i : opener.getInventory().getContents()) { + if(i != null && LoadItemstackFromConfig.isSimilar(i, itemRequiredForPay)){ + if(amountToRemove > i.getAmount()) { + amountToRemove -= i.getAmount(); + i.setAmount(0); + }else { + i.setAmount(i.getAmount() - amountToRemove); + amountToRemove = 0; + } + } + } + + //Remove cash from player + econ.withdrawPlayer(opener.getName(), BankStorage.getPageCost(unlockedPages + 1)); + + //Close out of purchase state + EnderBank.pendingResponseDatabase.remove(opener); + unlockedPages = pf.getInt("unlockedPages") + 1; + savePage(lastOpenedPage, inv); + openPage(lastOpenedPage + 1, opener); + }else { + //Check balance of player if funds also involved + if(!econ.has(opener.getName(), BankStorage.getPageCost(unlockedPages + 1))) { + opener.sendMessage(EnderBank.notificationString + " You don't have enough money!"); + return; + } + + //Remove cash from player + econ.withdrawPlayer(opener.getName(), BankStorage.getPageCost(unlockedPages + 1)); + + //Close out of purchase state + EnderBank.pendingResponseDatabase.remove(opener); + unlockedPages = pf.getInt("unlockedPages") + 1; + savePage(lastOpenedPage, inv); + openPage(lastOpenedPage + 1, opener); + } + } public void openSearch(String search, Player opener) { //Load up inventory diff --git a/src/me/TheTealViper/enderbank/CustomItemHandler.java b/src/me/TheTealViper/enderbank/CustomItemHandler.java index 1d48e92..b42812d 100644 --- a/src/me/TheTealViper/enderbank/CustomItemHandler.java +++ b/src/me/TheTealViper/enderbank/CustomItemHandler.java @@ -10,7 +10,7 @@ import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; -import me.TheTealViper.enderbank.utils.ItemCreator; +import me.TheTealViper.enderbank.utils.LoadItemstackFromConfig; public class CustomItemHandler implements Listener{ @@ -37,7 +37,7 @@ public class CustomItemHandler implements Listener{ static ItemStack NextPage = null; public static ItemStack GetNextPage(){ if(NextPage == null) { - NextPage = ItemCreator.createItemFromConfiguration(EnderBank.plugin.getConfig().getConfigurationSection("GUI.Next_Page")); + NextPage = new LoadItemstackFromConfig().getItem(EnderBank.plugin.getConfig().getConfigurationSection("GUI.Next_Page")); } return NextPage.clone(); } @@ -45,7 +45,7 @@ public class CustomItemHandler implements Listener{ static ItemStack BuyNextPage = null; public static ItemStack GetBuyNextPage(){ if(BuyNextPage == null) { - BuyNextPage = ItemCreator.createItemFromConfiguration(EnderBank.plugin.getConfig().getConfigurationSection("GUI.Buy_Next_Page")); + BuyNextPage = new LoadItemstackFromConfig().getItem(EnderBank.plugin.getConfig().getConfigurationSection("GUI.Buy_Next_Page")); } return BuyNextPage.clone(); } @@ -53,7 +53,7 @@ public class CustomItemHandler implements Listener{ static ItemStack ConfirmBuyNextPage = null; public static ItemStack GetConfirmBuyNextPage(){ if(ConfirmBuyNextPage == null) { - ConfirmBuyNextPage = ItemCreator.createItemFromConfiguration(EnderBank.plugin.getConfig().getConfigurationSection("GUI.Confirm_Buy_Next_Page")); + ConfirmBuyNextPage = new LoadItemstackFromConfig().getItem(EnderBank.plugin.getConfig().getConfigurationSection("GUI.Confirm_Buy_Next_Page")); } return ConfirmBuyNextPage.clone(); } @@ -61,7 +61,7 @@ public class CustomItemHandler implements Listener{ static ItemStack PreviousPage = null; public static ItemStack GetPreviousPage(){ if(PreviousPage == null) { - PreviousPage = ItemCreator.createItemFromConfiguration(EnderBank.plugin.getConfig().getConfigurationSection("GUI.Previous_Page")); + PreviousPage = new LoadItemstackFromConfig().getItem(EnderBank.plugin.getConfig().getConfigurationSection("GUI.Previous_Page")); } return PreviousPage.clone(); } @@ -69,7 +69,7 @@ public class CustomItemHandler implements Listener{ static ItemStack DumpEquipment = null; public static ItemStack GetDumpEquipment(){ if(DumpEquipment == null) { - DumpEquipment = ItemCreator.createItemFromConfiguration(EnderBank.plugin.getConfig().getConfigurationSection("GUI.Dump_Equipment")); + DumpEquipment = new LoadItemstackFromConfig().getItem(EnderBank.plugin.getConfig().getConfigurationSection("GUI.Dump_Equipment")); } return DumpEquipment.clone(); } @@ -77,7 +77,7 @@ public class CustomItemHandler implements Listener{ static ItemStack DumpItems = null; public static ItemStack GetDumpItems(){ if(DumpItems == null) { - DumpItems = ItemCreator.createItemFromConfiguration(EnderBank.plugin.getConfig().getConfigurationSection("GUI.Dump_Items")); + DumpItems = new LoadItemstackFromConfig().getItem(EnderBank.plugin.getConfig().getConfigurationSection("GUI.Dump_Items")); } return DumpItems.clone(); } @@ -85,7 +85,7 @@ public class CustomItemHandler implements Listener{ static ItemStack Search = null; public static ItemStack GetSearch(){ if(Search == null) { - Search = ItemCreator.createItemFromConfiguration(EnderBank.plugin.getConfig().getConfigurationSection("GUI.Search")); + Search = new LoadItemstackFromConfig().getItem(EnderBank.plugin.getConfig().getConfigurationSection("GUI.Search")); } return Search.clone(); } @@ -93,7 +93,7 @@ public class CustomItemHandler implements Listener{ static ItemStack Separator = null; public static ItemStack GetSeparator(){ if(Separator == null) { - Separator = ItemCreator.createItemFromConfiguration(EnderBank.plugin.getConfig().getConfigurationSection("GUI.Separator")); + Separator = new LoadItemstackFromConfig().getItem(EnderBank.plugin.getConfig().getConfigurationSection("GUI.Separator")); } return Separator.clone(); } @@ -102,8 +102,38 @@ public class CustomItemHandler implements Listener{ List lore = item.hasItemMeta() && item.getItemMeta().hasLore() ? item.getItemMeta().getLore() : new ArrayList(); List dummy = new ArrayList (lore); BankStorage bank = BankStorage.getBank(uuid); + ItemStack pageCostItem = null; for(int i = 0;i < dummy.size();i++) { - lore.set(i, dummy.get(i).replace("%eb_pagecost%", BankStorage.getPageCost(bank.unlockedPages + 1) + "")); + String s = dummy.get(i); + while(s.contains("%eb_pagecost%")) + s = s.replace("%eb_pagecost%", BankStorage.getPageCost(bank.unlockedPages + 1) + ""); + while(s.contains("%eb_pagecostitemname%")) { + if(pageCostItem == null) { + if(BankStorage.pagePriceItems.containsKey(bank.unlockedPages + 1)) { + pageCostItem = BankStorage.pagePriceItems.get(bank.unlockedPages + 1); + } else { + pageCostItem = BankStorage.pagePriceItems.get(0); + } + } + if(pageCostItem.hasItemMeta() && pageCostItem.getItemMeta().hasDisplayName()) + s = s.replace("%eb_pagecostitemname%", pageCostItem.getItemMeta().getDisplayName()); + else { + String type = pageCostItem.getType().toString(); + type = type.replaceAll("_", " "); + type = type.substring(0, 1) + type.substring(1).toLowerCase(); + s = s.replace("%eb_pagecostitemname%", type); + } + } + while(s.contains("%eb_pagecostitemamount%")) { + if(pageCostItem == null) { + if(BankStorage.pagePriceItems.containsKey(bank.unlockedPages + 1)) + pageCostItem = BankStorage.pagePriceItems.get(bank.unlockedPages + 1); + else + pageCostItem = BankStorage.pagePriceItems.get(0); + } + s = s.replace("%eb_pagecostitemamount%", BankStorage.pagePriceItems.get(bank.unlockedPages + 1).getAmount() + ""); + } + lore.set(i, s); } ItemMeta meta = item.getItemMeta(); meta.setLore(lore); diff --git a/src/me/TheTealViper/enderbank/EnderBank.java b/src/me/TheTealViper/enderbank/EnderBank.java index 8563cdf..e0ff976 100644 --- a/src/me/TheTealViper/enderbank/EnderBank.java +++ b/src/me/TheTealViper/enderbank/EnderBank.java @@ -13,6 +13,7 @@ import org.bukkit.OfflinePlayer; import org.bukkit.block.Block; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -25,10 +26,12 @@ import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.java.JavaPlugin; import me.TheTealViper.enderbank.utils.EnableShit; +import me.TheTealViper.enderbank.utils.LoadItemstackFromConfig; import me.TheTealViper.enderbank.utils.VersionType; import me.TheTealViper.enderbank.utils.ViperStringUtils; import net.milkbowl.vault.economy.Economy; @@ -90,6 +93,23 @@ public class EnderBank extends JavaPlugin implements Listener { RegisteredServiceProvider rsp = getServer().getServicesManager().getRegistration(Economy.class); if (rsp != null) econ = rsp.getProvider(); + + ConfigurationSection mainSec = getConfig().getConfigurationSection("Dump_Into_Inventory_Blacklist"); + for(String itemIdentifier : mainSec.getKeys(false)) { + ItemStack item = new LoadItemstackFromConfig().getItem(mainSec.getConfigurationSection(itemIdentifier)); + BankStorage.dumpBlacklistedItems.add(item); + } + + if(getConfig().getBoolean("Use_Item_For_Page_Price")) { + for(String pageIdentifier : getConfig().getConfigurationSection("Page_Price_Items").getKeys(false)) { + ItemStack item = new LoadItemstackFromConfig().getItem(getConfig().getConfigurationSection("Page_Price_Items." + pageIdentifier)); + if(pageIdentifier.equalsIgnoreCase("default")) { + BankStorage.pagePriceItems.put(0, item); + }else { + BankStorage.pagePriceItems.put(Integer.valueOf(pageIdentifier), item); + } + } + } } public void onDisable() { @@ -159,7 +179,6 @@ public class EnderBank extends JavaPlugin implements Listener { getServer().getConsoleSender().sendMessage(ViperStringUtils.makeColors(s)); } - @SuppressWarnings("deprecation") @EventHandler public void onInventoryClick(InventoryClickEvent e) { Player opener = (Player) e.getWhoClicked(); @@ -177,16 +196,7 @@ public class EnderBank extends JavaPlugin implements Listener { }else if(e.getSlot() == 8) { //next page e.setCancelled(true); if(pendingResponseDatabase.containsKey(opener) && pendingResponseDatabase.get(opener).equals("buypage")) { //If responding to confirm purchase - //Confirm if have the funds - if(econ.has(opener.getName(), BankStorage.getPageCost(bank.unlockedPages + 1))) { - econ.withdrawPlayer(opener.getName(), BankStorage.getPageCost(bank.unlockedPages + 1)); - pendingResponseDatabase.remove(opener); - bank.unlockedPages = bank.pf.getInt("unlockedPages") + 1; - bank.savePage(bank.lastOpenedPage, e.getInventory()); - bank.openPage(bank.lastOpenedPage + 1, opener); - }else { - opener.sendMessage(EnderBank.notificationString + " You don't have enough money!"); - } + bank.attemptToPurchasePage(econ, opener, e.getInventory()); }else if(bank.lastOpenedPage == bank.unlockedPages) { //If clicking buy ask to confirm e.getInventory().setItem(8, CustomItemHandler.GetConfirmBuyNextPage().clone()); pendingResponseDatabase.put(opener, "buypage"); @@ -205,35 +215,15 @@ public class EnderBank extends JavaPlugin implements Listener { } }else if(e.getSlot() == 26) { e.setCancelled(true); - }else if(e.getSlot() == 35) { + }else if(e.getSlot() == 35) { //Dump equipment e.setCancelled(true); - bank.savePage(bank.lastOpenedPage, e.getInventory()); - for(int j = 9;j < 13;j++) { - if(opener.getInventory().getItem(j) != null) { - //Check if rune filler -// boolean currentIsTome = false; -// if(!p.getInventory().getItem(j).getType().toString().equals("AIR")) { -// if(p.getInventory().getItem(j).hasItemMeta()) { -// if(p.getInventory().getItem(j).getItemMeta().hasDisplayName()) { -// if(p.getInventory().getItem(j).getItemMeta().getDisplayName().contains("Tome")) { -// currentIsTome = true; -// }else { -// -// } -// }else { -// -// } -// }else { -// -// } -// } -// -// if(currentIsTome) { -// bank.attemptToAddToBank(j); -// p.getInventory().setItem(j, CustomItemHandler.GetRelicFiller()); -// } - } + + if(getConfig().getBoolean("Disable_Dump_Into_Inventory")) { + e.getWhoClicked().sendMessage(EnderBank.notificationString + " The server has disabled this feature!"); + return; } + + bank.savePage(bank.lastOpenedPage, e.getInventory()); for(int j = 36;j < 40;j++) { if(opener.getInventory().getItem(j) != null) { bank.attemptToAddToBank(j, opener); @@ -242,6 +232,12 @@ public class EnderBank extends JavaPlugin implements Listener { bank.openPage(bank.lastOpenedPage, opener); }else if(e.getSlot() == 44) { //Dump all items e.setCancelled(true); + + if(getConfig().getBoolean("Disable_Dump_Into_Inventory")) { + e.getWhoClicked().sendMessage(EnderBank.notificationString + " The server has disabled this feature!"); + return; + } + bank.savePage(bank.lastOpenedPage, e.getInventory()); if(e.getAction().equals(InventoryAction.PICKUP_ALL)) { //Encluding hotbar for(int j = 9;j < 36;j++) { diff --git a/src/me/TheTealViper/enderbank/utils/LoadItemstackFromConfig.java b/src/me/TheTealViper/enderbank/utils/LoadItemstackFromConfig.java new file mode 100644 index 0000000..4185b4c --- /dev/null +++ b/src/me/TheTealViper/enderbank/utils/LoadItemstackFromConfig.java @@ -0,0 +1,262 @@ +package me.TheTealViper.enderbank.utils; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.Map.Entry; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.craftbukkit.libs.org.apache.commons.codec.binary.Base64; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.SkullMeta; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.mojang.authlib.GameProfile; +import com.mojang.authlib.properties.Property; + +public class LoadItemstackFromConfig { + /** + * id: DIRT + * amount: 1 + * name: "Dirt" + * enchantments: + * - "arrowdamage:1" + * - "arrowfire:1" + * - "arrowinfinite:1" + * - "arrowknockback:1" + * - "damage:1" + * - "digspeed:1" + * - "durability:1" + * - "fireaspect:1" + * - "knockback:1" + * - "lootbonusblock:1" + * - "lootbonusmob:1" + * - "luck:1" + * - "protectionfall:1" + * - "protectionfire:1" + * - "silktouch:1" + * tags: + * - "playerskullskin:SKINVALUE" //Do note that skulls will NOT stack properly or be considered "similar" because different UUID. Use Enhanced for UUID tracking. + * - "vanilladurability:256" + * - "unbreakable:true" + * - "custommodeldata:1234567" + * flags: + * - "HIDE_ATTRIBUTES" + * - "HIDE_DESTROYS" + * - "HIDE_ENCHANTS" + * - "HIDE_PLACED_ON" + * - "HIDE_POTION_EFFECTS" + * - "HIDE_UNBREAKABLE" + */ + + public LoadItemstackFromConfig(){ + } + + public ItemStack getItem(ConfigurationSection sec) { + //Null check + if(sec == null) + return null; + ItemStack item = null; + boolean modifiedMetaSoApply = false; + + //Handle ID + item = (sec == null || !sec.contains("id")) ? null : new ItemStack(Material.getMaterial(sec.getString("id"))); + + //Initiate Meta + ItemMeta meta = item.getItemMeta(); + + //Handle amount + if(sec.contains("amount")) item.setAmount(sec.getInt("amount")); + + //Handle name + if(sec.contains("name")) {meta.setDisplayName(ViperStringUtils.makeColors(sec.getString("name"))); modifiedMetaSoApply = true;} + + //Handle lore + if(sec.contains("lore")) { + List dummy = sec.getStringList("lore"); + List lore = new ArrayList(); + for(String s : dummy) { + lore.add(ViperStringUtils.makeColors(s)); + } + meta.setLore(lore); + modifiedMetaSoApply = true; + } + + //Handle enchantments + if(sec.contains("enchantments")) { + List enchantmentStrings = sec.getStringList("enchantments"); + for(String enchantmentString : enchantmentStrings) { + String enchantmentName = enchantmentString.split(":")[0]; + int enchantmentLevel = Integer.valueOf(enchantmentString.split(":")[1]); + switch(enchantmentName) { + case "arrowdamage": + meta.addEnchant(Enchantment.ARROW_DAMAGE, enchantmentLevel, true); + break; + case "arrowfire": + meta.addEnchant(Enchantment.ARROW_FIRE, enchantmentLevel, true); + break; + case "arrowinfinite": + meta.addEnchant(Enchantment.ARROW_INFINITE, enchantmentLevel, true); + break; + case "arrowknockback": + meta.addEnchant(Enchantment.ARROW_KNOCKBACK, enchantmentLevel, true); + break; + case "damage": + meta.addEnchant(Enchantment.DAMAGE_ALL, enchantmentLevel, true); + break; + case "digspeed": + meta.addEnchant(Enchantment.DIG_SPEED, enchantmentLevel, true); + break; + case "durability": + meta.addEnchant(Enchantment.DURABILITY, enchantmentLevel, true); + break; + case "fireaspect": + meta.addEnchant(Enchantment.FIRE_ASPECT, enchantmentLevel, true); + break; + case "knockback": + meta.addEnchant(Enchantment.KNOCKBACK, enchantmentLevel, true); + break; + case "lootbonusblock": + meta.addEnchant(Enchantment.LOOT_BONUS_BLOCKS, enchantmentLevel, true); + break; + case "lootbonusmob": + meta.addEnchant(Enchantment.LOOT_BONUS_MOBS, enchantmentLevel, true); + break; + case "luck": + meta.addEnchant(Enchantment.LUCK, enchantmentLevel, true); + break; + case "protectionfall": + meta.addEnchant(Enchantment.PROTECTION_FALL, enchantmentLevel, true); + break; + case "protectionfire": + meta.addEnchant(Enchantment.PROTECTION_FALL, enchantmentLevel, true); + break; + case "silktouch": + meta.addEnchant(Enchantment.SILK_TOUCH, enchantmentLevel, true); + break; + } + } + modifiedMetaSoApply = true; + } + + //Handle vanilla tags + if(sec.contains("tags")) { + for(String tagString : sec.getStringList("tags")) { + String[] tagStringProcessed = tagString.split(":"); + String tag = tagStringProcessed[0]; + String value = tagStringProcessed[1]; + switch(tag) { + case "playerskullskin": + JsonParser parser = new JsonParser(); + JsonObject o = parser.parse(new String(Base64.decodeBase64(value))).getAsJsonObject(); + String skinUrl = o.get("textures").getAsJsonObject().get("SKIN").getAsJsonObject().get("url").getAsString(); + SkullMeta skullMeta = (SkullMeta) meta; + GameProfile profile = new GameProfile(UUID.randomUUID(), null); + byte[] encodedData = Base64.encodeBase64(("{textures:{SKIN:{url:\"" + skinUrl + "\"}}}").getBytes()); + profile.getProperties().put("textures", new Property("textures", new String(encodedData))); + Field profileField = null; + try { + profileField = skullMeta.getClass().getDeclaredField("profile"); + profileField.setAccessible(true); + profileField.set(skullMeta, profile); + } catch (Exception e) { + e.printStackTrace(); + } + meta = skullMeta; + break; + case "vanilladurability": + Bukkit.broadcastMessage("changing durability: " + value); + Damageable dam = (Damageable) meta; + dam.setDamage(Integer.valueOf(value)); + meta = (ItemMeta) dam; + break; + case "unbreakable": + meta.setUnbreakable(Boolean.valueOf(value)); + break; + case "custommodeldata": + meta.setCustomModelData(Integer.valueOf(value)); + break; + } + } + modifiedMetaSoApply = true; + } + + //Handle vanilla flags + if(sec.contains("flags")){ + for(String s : sec.getStringList("flags")){ + meta.addItemFlags(ItemFlag.valueOf(s)); + } + modifiedMetaSoApply = true; + } + + if(modifiedMetaSoApply) item.setItemMeta(meta); + return item; + } + + public static boolean isSimilar(ItemStack item1, ItemStack item2) { + if(item2.getType() != item1.getType()) + return false; + if(item2.hasItemMeta() != item1.hasItemMeta()) + return false; + if(item2.hasItemMeta()) { + ItemMeta item1Meta = item1.getItemMeta(); + ItemMeta item2Meta = item2.getItemMeta(); + + if (item2Meta.hasDisplayName() != item1Meta.hasDisplayName()) + return false; + if(item2Meta.hasDisplayName()) { + if(!item2Meta.getDisplayName().equals(item1Meta.getDisplayName())) + return false; + } + if (item2Meta.hasLore() != item1Meta.hasLore()) + return false; + if (item2Meta.hasLore()) { + for(int i = 0;i < item2Meta.getLore().size();i++) { + if(!item2Meta.getLore().get(i).equals(item1Meta.getLore().get(i))) + return false; + } + } + if (item2Meta.hasEnchants() != item1Meta.hasEnchants()) + return false; + if (item2Meta.hasEnchants()) { + if (item2Meta.getEnchants().size() != item1Meta.getEnchants().size()) { + return false; + } + for (Entry enchantInfo : item1Meta.getEnchants().entrySet()) { + if (item2Meta.getEnchantLevel(enchantInfo.getKey()) != item1Meta.getEnchantLevel(enchantInfo.getKey())) { + return false; + } + } + } + if (item2Meta.getItemFlags().size() != item1Meta.getItemFlags().size()) + return false; + for (ItemFlag flag : item2Meta.getItemFlags()) { //We can do this because we already know the itemflag list size is the same + if (!item1Meta.hasItemFlag(flag)) { + return false; + } + } + if((item2Meta instanceof Damageable) != (item1Meta instanceof Damageable)) + return false; + if(item2Meta instanceof Damageable) { + Damageable dam1 = (Damageable) item1Meta; + Damageable dam2 = (Damageable) item2Meta; + if(dam1.hasDamage() != dam2.hasDamage()) + return false; + if(dam2.hasDamage()) { + if(dam2.getDamage() != dam1.getDamage()) + return false; + } + } + } + return true; + } + +}