diff --git a/src/main/java/com/gamingmesh/jobs/ItemBoostManager.java b/src/main/java/com/gamingmesh/jobs/ItemBoostManager.java index 2f8ed29e..e6034753 100644 --- a/src/main/java/com/gamingmesh/jobs/ItemBoostManager.java +++ b/src/main/java/com/gamingmesh/jobs/ItemBoostManager.java @@ -1,7 +1,5 @@ package com.gamingmesh.jobs; -import java.io.File; -import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -10,8 +8,8 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import org.bukkit.Color; import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; import com.gamingmesh.jobs.CMILib.CMIEnchantment; import com.gamingmesh.jobs.container.BoostMultiplier; @@ -20,216 +18,191 @@ import com.gamingmesh.jobs.container.Job; import com.gamingmesh.jobs.container.JobItems; import net.Zrips.CMILib.Colors.CMIChatColor; +import net.Zrips.CMILib.Container.CMIList; import net.Zrips.CMILib.FileHandler.ConfigReader; +import net.Zrips.CMILib.Items.CMIItemStack; import net.Zrips.CMILib.Items.CMIMaterial; import net.Zrips.CMILib.Messages.CMIMessages; +import net.Zrips.CMILib.NBT.CMINBT; public final class ItemBoostManager { private static final Map ITEMS = new HashMap<>(); - private static final Map LEGACY = new HashMap<>(); - @SuppressWarnings("deprecation") + static boolean informed = false; + public static void load() { - ConfigReader cfg; - try { - cfg = new ConfigReader(Jobs.getInstance(), "boostedItems.yml"); - } catch (Exception e2) { - e2.printStackTrace(); - return; - } + ConfigReader cfg; + try { + cfg = new ConfigReader(Jobs.getInstance(), "boostedItems.yml"); + } catch (Exception e2) { + e2.printStackTrace(); + return; + } - ITEMS.clear(); - LEGACY.clear(); + ITEMS.clear(); - // Converting from existing records in Jobs from old format which was located in jobConfig.yml file - boolean save = false; - for (Job one : Jobs.getJobs()) { - for (Entry oneI : one.getItemBonus().entrySet()) { - JobItems item = oneI.getValue(); + Set keys = cfg.getC().getKeys(false); - String name = one.getName() + "_" + oneI.getKey(); - org.bukkit.inventory.ItemStack stack = item.getItemStack(null); + cfg.addComment("exampleBoost", "Attention! If category name has _ in it, that means its legacy item which was converted from jobConfig.yml file", + "Keep this format until you will be sure that all legacy items have been converted throw usage, which is automatic process when player uses items with boost in them", + "", + "Name which will be used to identify this particular item boost", + "This is EXAMPLE boost and will be ignored"); + cfg.addComment("exampleBoost.ItemStack", "Item information, on usage read more at https://www.zrips.net/cmi/commands/icwol/", + "You can use ingame command /jobs edititemboost to give particular boost to any item you are holding"); + cfg.get("exampleBoost.ItemStack", "Golden_shovel;n{&2Custom_item_name};l{&2Some_random\\n&5Lore_with_some\\n{#pink}Colors};FIRE_ASPECT:1,DAMAGE_ALL:1"); - cfg.getC().set(name + ".id", CMIMaterial.get(stack).toString()); - cfg.getC().set(name + ".jobs", Arrays.asList(one.getName())); - if (stack.hasItemMeta()) { - cfg.getC().set(name + ".name", stack.getItemMeta().hasDisplayName() ? CMIChatColor.deColorize(stack.getItemMeta().getDisplayName()) : null); - cfg.getC().set(name + ".lore", stack.getItemMeta().hasLore() ? CMIChatColor.deColorize(stack.getItemMeta().getLore()) : null); - } - List ench = new ArrayList<>(); - for (Entry oneE : stack.getEnchantments().entrySet()) { - ench.add(CMIEnchantment.get(oneE.getKey()) + "=" + oneE.getValue()); - } - cfg.getC().set(name + ".enchants", ench); - for (CurrencyType oneC : CurrencyType.values()) { - cfg.getC().set(name + "." + oneC.toString().toLowerCase() + "Boost", ((int) (item.getBoost().get(oneC) * 100D) / 100D) + 1D); - } - save = true; - } + cfg.addComment("exampleBoost.moneyBoost", "[Required] Money boost: 1.1 is equals 10% more income when 0.9 is equals 10% less from base income"); + for (CurrencyType oneC : CurrencyType.values()) { + cfg.get("exampleBoost." + oneC.toString().toLowerCase() + "Boost", 1D); + } + cfg.addComment("exampleBoost.jobs", "[Required] Jobs which should receive this boost", + "Can be specific jobs or use 'all' to give this boost for every job"); + cfg.get("exampleBoost.jobs", Arrays.asList("Miner", "Woodcutter", "all")); - one.getItemBonus().clear(); - } + cfg.addComment("exampleBoost.levelFrom", "(Optional) Defines level of job from which this boost should be applied", + "Keep in mind that if boost have multiple jobs, then level will be checked by job which is requesting boost value"); + cfg.get("exampleBoost.levelFrom", 0); + cfg.addComment("exampleBoost.levelUntil", "(Optional) Defines level of job until which this boost should be applied"); + cfg.get("exampleBoost.levelUntil", 50); - if (save) { - try { - cfg.getC().save(new File(Jobs.getFolder(), "boostedItems.yml")); - } catch (IOException e1) { - e1.printStackTrace(); - } - try { - cfg = new ConfigReader(Jobs.getInstance(), "boostedItems.yml"); - } catch (Exception e) { - e.printStackTrace(); - return; - } - } + for (String one : keys) { + if (!cfg.getC().isConfigurationSection(one)) + continue; - Set keys = cfg.getC().getKeys(false); + // Ignoring example boost + if (one.equalsIgnoreCase("exampleBoost")) + continue; - cfg.addComment("exampleBoost", "Attention! If category name has _ in it, that means its legacy item which was converted from jobConfig.yml file", - "Keep this format until you will be sure that all legacy items have been converted throw usage, which is automatic process when player uses items with boost in them", - "", - "Name which will be used to identify this particular item boost", - "This is EXAMPLE boost and will be ignored"); - cfg.addComment("exampleBoost.id", "Item Id which can be any material name as of 1.13 update", - "This is only used when performing command like /jobs give, but boost itself is not dependent on item type", - "You can use ingame command /jobs edititemboost to give particular boost to any item you are holding"); - cfg.get("exampleBoost.id", "Golden_shovel"); - cfg.addComment("exampleBoost.name", "(Optional) Item custom name", "Custom colors like &2 &5 can be used"); - cfg.get("exampleBoost.name", "&2Custom item name"); - cfg.addComment("exampleBoost.lore", "(Optional) Item custom lore", "Same as name, supports color codes"); - cfg.get("exampleBoost.lore", Arrays.asList("&2Some random", "&5Lore with some", "&7Colors")); - cfg.addComment("exampleBoost.enchants", "(Optional) Item custom enchants", - "All enchantment names can be found https://hub.spigotmc.org/javadocs/spigot/org/bukkit/enchantments/Enchantment.html"); - cfg.get("exampleBoost.enchants", Arrays.asList("FIRE_ASPECT=1", "DAMAGE_ALL=1")); - cfg.addComment("exampleBoost.leather-color", "(Optional) Leather armour colors (0-255)"); - cfg.get("exampleBoost.leather-color", "82,34,125"); - cfg.addComment("exampleBoost.moneyBoost", "[Required] Money boost: 1.1 is equals 10% more income when 0.9 is equals 10% less from base income"); - for (CurrencyType oneC : CurrencyType.values()) { - cfg.get("exampleBoost." + oneC.toString().toLowerCase() + "Boost", 1D); - } - cfg.addComment("exampleBoost.jobs", "[Required] Jobs which should receive this boost", - "Can be specific jobs or use 'all' to give this boost for every job"); - cfg.get("exampleBoost.jobs", Arrays.asList("Miner", "Woodcutter", "all")); + List jobs = new ArrayList<>(); + List j = cfg.get(one + ".jobs", Arrays.asList("")); - cfg.addComment("exampleBoost.levelFrom", "(Optional) Defines level of job from which this boost should be applied", - "Keep in mind that if boost have multiple jobs, then level will be checked by job which is requesting boost value"); - cfg.get("exampleBoost.levelFrom", 0); - cfg.addComment("exampleBoost.levelUntil", "(Optional) Defines level of job until which this boost should be applied"); - cfg.get("exampleBoost.levelUntil", 50); + if (j.contains("all")) { + jobs.addAll(Jobs.getJobs()); + } else { + for (String oneJ : j) { + Job job = Jobs.getJob(oneJ); - for (String one : keys) { - if (!cfg.getC().isConfigurationSection(one)) - continue; + if (job != null) { + jobs.add(job); + } else { + Jobs.getPluginLogger().warning("Cant determine job by " + oneJ + " name for " + one + " boosted item!"); + } + } + } - // Ignoring example boost - if (one.equalsIgnoreCase("exampleBoost")) - continue; + if (jobs.isEmpty()) { + Jobs.getPluginLogger().warning("Jobs list is empty for " + one + " boosted item!"); + continue; + } - List jobs = new ArrayList<>(); - List j = cfg.get(one + ".jobs", Arrays.asList("")); + BoostMultiplier b = new BoostMultiplier(); + for (CurrencyType oneC : CurrencyType.values()) { + String typeName = oneC.toString().toLowerCase(); - if (j.contains("all")) { - jobs.addAll(Jobs.getJobs()); - } else { - for (String oneJ : j) { - Job job = Jobs.getJob(oneJ); + if (cfg.getC().isDouble(one + "." + typeName + "Boost")) + b.add(oneC, cfg.get(one + "." + typeName + "Boost", 1D) - 1); + } - if (job != null) { - jobs.add(job); - } else { - Jobs.getPluginLogger().warning("Cant determine job by " + oneJ + " name for " + one + " boosted item!"); - } - } - } + String node = one.toLowerCase(); - if (jobs.isEmpty()) { - Jobs.getPluginLogger().warning("Jobs list is empty for " + one + " boosted item!"); - continue; - } + JobItems jitem = new JobItems(node); - List lore = cfg.get(one + ".lore", Arrays.asList("")); - for (int a = 0; a < lore.size(); a++) { - lore.set(a, CMIChatColor.translate(lore.get(a))); - } + jitem.setJobs(jobs); + jitem.setBoostMultiplier(b); + + if (cfg.getC().isInt(one + ".levelFrom")) + jitem.setFromLevel(cfg.get(one + ".levelFrom", 0)); - Map enchants = new HashMap<>(); - if (cfg.getC().isList(one + ".enchants")) - for (String eachLine : cfg.get(one + ".enchants", Arrays.asList(""))) { - String[] split = eachLine.split("=", 2); - if (split.length == 0) - continue; + if (cfg.getC().isInt(one + ".levelUntil")) + jitem.setUntilLevel(cfg.get(one + ".levelUntil", 1000)); - Enchantment ench = CMIEnchantment.getEnchantment(split[0]); - int level = -1; + // Old format, should be removed down the line + if (cfg.getC().isString(one + ".id")) { - if (split.length > 1) { - try { - level = Integer.parseInt(split[1]); - } catch (NumberFormatException e) { - continue; - } - } + if (!informed) { + CMIMessages.consoleMessage("&5Update boosted item " + one + " item section to use new 'ItemStack' format"); + informed = true; + } - if (ench != null && level != -1) - enchants.put(ench, level); - } + CMIMaterial mat = cfg.getC().isString(one + ".id") ? CMIMaterial.get(cfg.get(one + ".id", "Stone")) : null; - BoostMultiplier b = new BoostMultiplier(); - for (CurrencyType oneC : CurrencyType.values()) { - String typeName = oneC.toString().toLowerCase(); + String name = cfg.getC().isString(one + ".name") ? cfg.get(one + ".name", "") : null; - if (cfg.getC().isDouble(one + "." + typeName + "Boost")) - b.add(oneC, cfg.get(one + "." + typeName + "Boost", 1D) - 1); - } + if (mat == null) { + CMIMessages.consoleMessage("&cCould not determine boosted item material (" + node + ")"); + continue; + } + List lore = cfg.get(one + ".lore", new ArrayList()); + for (int a = 0; a < lore.size(); a++) { + lore.set(a, CMIChatColor.translate(lore.get(a)).replace(" ", "_")); + } - CMIMaterial mat = cfg.getC().isString(one + ".id") ? CMIMaterial.get(cfg.get(one + ".id", "Stone")) : null; + StringBuilder enchants = new StringBuilder(); - String name = cfg.getC().isString(one + ".name") ? cfg.get(one + ".name", "") : null; - String node = one.toLowerCase(); + if (cfg.getC().isList(one + ".enchants")) + for (String eachLine : cfg.get(one + ".enchants", Arrays.asList(""))) { + String[] split = eachLine.split("=", 2); + if (split.length == 0) + continue; - Color leatherColor = null; - String lc = cfg.getC().getString(one + ".leather-color", ""); - if (!lc.isEmpty()) { - String[] split = lc.split(",", 3); + Enchantment ench = CMIEnchantment.getEnchantment(split[0]); - if (split.length != 0) { - int red = Integer.parseInt(split[0]); - int green = split.length > 0 ? Integer.parseInt(split[1]) : 0; - int blue = split.length > 1 ? Integer.parseInt(split[2]) : 0; + if (ench == null) + continue; - try { - leatherColor = Color.fromRGB(red, green, blue); - } catch (IllegalArgumentException e) { - } - } - } + int level = -1; - JobItems item = new JobItems(node, mat, 1, name, lore, enchants, b, jobs, null, leatherColor); + if (split.length > 1) { + try { + level = Integer.parseInt(split[1]); + } catch (NumberFormatException e) { + continue; + } + } - if (cfg.getC().isInt(one + ".levelFrom")) - item.setFromLevel(cfg.get(one + ".levelFrom", 0)); + if (level == -1) + continue; - if (cfg.getC().isInt(one + ".levelUntil")) - item.setUntilLevel(cfg.get(one + ".levelUntil", 1000)); + if (!enchants.toString().isEmpty()) + enchants.append(","); + enchants.append(split[0] + ":" + level); - for (Job oneJ : jobs) { - oneJ.getItemBonus().put(node, item); - } + } - // Lets add into legacy map - String[] split = one.split("_", 2); - if (split.length > 1) { - item.setLegacyKey(split[1].toLowerCase()); - LEGACY.put(item.getLegacyKey(), item); - } + String lc = cfg.getC().getString(one + ".leather-color", ""); - ITEMS.put(node, item); - } + String itemSring = mat.toString(); + if (name != null) + itemSring += ";n{" + name.replace(" ", "_") + "}"; - cfg.save(); - CMIMessages.consoleMessage("&eLoaded &6" + ITEMS.size() + " &eboosted items"); + if (!lore.isEmpty()) + itemSring += ";l{" + CMIList.listToString(lore, "\\n") + "}"; + + if (lc != null) + itemSring += ";" + lc; + + if (!enchants.toString().isEmpty()) + itemSring += ";" + enchants.toString(); + + jitem.setItemString(itemSring); + } else if (cfg.getC().isString(one + ".ItemStack")) { + String itemString = cfg.get(one + ".ItemStack", cfg.getC().getString(one + ".ItemStack")); + CMIItemStack item = CMIItemStack.deserialize(itemString, null); + + if (item == null || item.getCMIType().isNone()) { + CMIMessages.consoleMessage("&cInvalid ItemStack for boosted item (" + node + ")"); + continue; + } + jitem.setItemString(itemString); + } + + ITEMS.put(node, jitem); + } + + cfg.save(); + CMIMessages.consoleMessage("&eLoaded &6" + ITEMS.size() + " &eboosted items"); } /** @@ -239,13 +212,13 @@ public final class ItemBoostManager { * @return List of {@link JobItems} */ public static List getItemsByJob(Job job) { - List ls = new ArrayList<>(); - for (JobItems one : ITEMS.values()) { - if (one.getJobs().contains(job)) - ls.add(one); - } + List ls = new ArrayList<>(); + for (JobItems one : ITEMS.values()) { + if (one.getJobs().contains(job)) + ls.add(one); + } - return ls; + return ls; } /** Returns a map of items from the specific job. @@ -254,13 +227,13 @@ public final class ItemBoostManager { * @return map of items */ public static Map getItemsMapByJob(Job job) { - Map i = new HashMap<>(); - for (Entry one : ITEMS.entrySet()) { - if (one.getValue().getJobs().contains(job)) - i.put(one.getKey(), one.getValue()); - } + Map i = new HashMap<>(); + for (Entry one : ITEMS.entrySet()) { + if (one.getValue().getJobs().contains(job)) + i.put(one.getKey(), one.getValue()); + } - return i; + return i; } /** @@ -270,23 +243,53 @@ public final class ItemBoostManager { * @return {@link JobItems} */ public static JobItems getItemByKey(String key) { - key = key.toLowerCase(); - - JobItems item = ITEMS.get(key); - return item != null ? item : LEGACY.get(key); + return ITEMS.get(key.toLowerCase()); } /** * @return the current cached map of items. */ public static Map getItems() { - return ITEMS; + return ITEMS; } - /** - * @return the current cached map of legacy items. - */ - public static Map getLegacyItems() { - return LEGACY; + private static final String jobsItemBoost = "JobsItemBoost"; + + public static boolean containsItemBoostByNBT(ItemStack item) { + return item != null && new CMINBT(item).hasNBT(jobsItemBoost); + } + + public static JobItems getJobsItemByNbt(ItemStack item) { + if (item == null) + return null; + + Object itemName = new CMINBT(item).getString(jobsItemBoost); + + if (itemName == null || itemName.toString().isEmpty()) { + // Checking old boost items and converting to new format if needed + if (new CMINBT(item).hasNBT(jobsItemBoost)) { + for (Job one : Jobs.getJobs()) { + itemName = new CMINBT(item).getString(jobsItemBoost + "." + one.getName()); + if (itemName != null) { + JobItems b = getItemByKey(itemName.toString()); + if (b != null) { + ItemStack ic = (ItemStack) new CMINBT(item).setString(jobsItemBoost, b.getNode()); + item.setItemMeta(ic.getItemMeta()); + } + break; + } + } + } + if (itemName == null) + return null; + } + + return getItemByKey(itemName.toString()); + } + + public static ItemStack applyNBT(ItemStack item, String node) { + if (item == null) + return null; + return (ItemStack) new CMINBT(item).setString(jobsItemBoost, node); } } diff --git a/src/main/java/com/gamingmesh/jobs/PlayerManager.java b/src/main/java/com/gamingmesh/jobs/PlayerManager.java index 15ef2a66..f18a14d3 100644 --- a/src/main/java/com/gamingmesh/jobs/PlayerManager.java +++ b/src/main/java/com/gamingmesh/jobs/PlayerManager.java @@ -66,6 +66,7 @@ import net.Zrips.CMILib.ActionBar.CMIActionBar; import net.Zrips.CMILib.Container.CMINumber; import net.Zrips.CMILib.Items.CMIItemStack; import net.Zrips.CMILib.Items.CMIMaterial; +import net.Zrips.CMILib.Logs.CMIDebug; import net.Zrips.CMILib.Messages.CMIMessages; import net.Zrips.CMILib.NBT.CMINBT; import net.Zrips.CMILib.Version.Version; @@ -1073,46 +1074,25 @@ public class PlayerManager { JobProgression progress = getJobsPlayer(player).getJobProgression(job); for (JobItems jitem : jitems) { - if (jitem != null && jitem.getJobs().contains(job)) { - data.add(jitem.getBoost(progress)); - } + if (jitem == null) + continue; + if (!jitem.getJobs().contains(job)) + continue; + + data.add(jitem.getBoost(progress)); } return data; } - private final String jobsItemBoost = "JobsItemBoost"; - + @Deprecated public boolean containsItemBoostByNBT(ItemStack item) { - return item != null && new CMINBT(item).hasNBT(jobsItemBoost); + return containsItemBoostByNBT(item); } + @Deprecated public JobItems getJobsItemByNbt(ItemStack item) { - if (item == null) - return null; - - Object itemName = new CMINBT(item).getString(jobsItemBoost); - - if (itemName == null || itemName.toString().isEmpty()) { - // Checking old boost items and converting to new format if needed - if (new CMINBT(item).hasNBT(jobsItemBoost)) { - for (Job one : Jobs.getJobs()) { - itemName = new CMINBT(item).getString(jobsItemBoost + "." + one.getName()); - if (itemName != null) { - JobItems b = ItemBoostManager.getItemByKey(itemName.toString()); - if (b != null) { - ItemStack ic = (ItemStack) new CMINBT(item).setString(jobsItemBoost, b.getNode()); - item.setItemMeta(ic.getItemMeta()); - } - break; - } - } - } - if (itemName == null) - return null; - } - - return ItemBoostManager.getItemByKey(itemName.toString()); + return ItemBoostManager.getJobsItemByNbt(item); } public enum BoostOf { diff --git a/src/main/java/com/gamingmesh/jobs/commands/list/give.java b/src/main/java/com/gamingmesh/jobs/commands/list/give.java index 9f8ff994..37050fd6 100644 --- a/src/main/java/com/gamingmesh/jobs/commands/list/give.java +++ b/src/main/java/com/gamingmesh/jobs/commands/list/give.java @@ -14,6 +14,9 @@ import com.gamingmesh.jobs.container.JobLimitedItems; import com.gamingmesh.jobs.i18n.Language; import com.gamingmesh.jobs.stuff.GiveItem; +import net.Zrips.CMILib.Items.CMIAsyncHead; +import net.Zrips.CMILib.Items.CMIItemStack; + public class give implements Cmd { private enum actions { @@ -72,17 +75,27 @@ public class give implements Cmd { return true; } + Player p = player; + switch (name) { case items: JobItems jItem = ItemBoostManager.getItemByKey(itemName); - ItemStack item = jItem == null ? null : jItem.getItemStack(player); - if (item == null) { + CMIAsyncHead ahead = new CMIAsyncHead() { + @Override + public void afterAsyncUpdate(ItemStack item) { + GiveItem.giveItemForPlayer(p, ItemBoostManager.applyNBT(item, jItem.getNode())); + } + }; + + CMIItemStack item = jItem == null ? null : jItem.getItemStack(player, ahead); + + if (jItem == null || item == null) { Language.sendMessage(sender, "command.give.output.noitem"); return true; } - - GiveItem.giveItemForPlayer(player, item); + if (!ahead.isAsyncHead()) + GiveItem.giveItemForPlayer(player, ItemBoostManager.applyNBT(item.getItemStack(), jItem.getNode())); break; case limiteditems: if (job == null) { @@ -91,14 +104,23 @@ public class give implements Cmd { } JobLimitedItems jLItem = job.getLimitedItems().get(itemName.toLowerCase()); - ItemStack limItem = jLItem == null ? null : jLItem.getItemStack(player); + + ahead = new CMIAsyncHead() { + @Override + public void afterAsyncUpdate(ItemStack item) { + GiveItem.giveItemForPlayer(p, item); + } + }; + + CMIItemStack limItem = jLItem == null ? null : jLItem.getItemStack(player, ahead); if (limItem == null) { Language.sendMessage(sender, "command.give.output.noitem"); return true; } - GiveItem.giveItemForPlayer(player, limItem); + if (!ahead.isAsyncHead()) + GiveItem.giveItemForPlayer(player, limItem.getItemStack()); break; default: break; diff --git a/src/main/java/com/gamingmesh/jobs/config/ConfigManager.java b/src/main/java/com/gamingmesh/jobs/config/ConfigManager.java index bc0a253b..f4b18394 100644 --- a/src/main/java/com/gamingmesh/jobs/config/ConfigManager.java +++ b/src/main/java/com/gamingmesh/jobs/config/ConfigManager.java @@ -52,9 +52,11 @@ import com.gamingmesh.jobs.container.JobLimitedItems; import com.gamingmesh.jobs.container.JobPermission; import com.gamingmesh.jobs.container.Quest; import com.gamingmesh.jobs.container.QuestObjective; +import com.gamingmesh.jobs.listeners.JobsListener; import com.gamingmesh.jobs.stuff.Util; import net.Zrips.CMILib.Colors.CMIChatColor; +import net.Zrips.CMILib.Container.CMIList; import net.Zrips.CMILib.Entities.CMIEntityType; import net.Zrips.CMILib.Equations.ParseError; import net.Zrips.CMILib.Equations.Parser; @@ -1317,64 +1319,6 @@ public class ConfigManager { } job.setCommands(jobCommand); - // Items **OUTDATED** Moved to ItemBoostManager!! - HashMap jobItems = new HashMap<>(); - ConfigurationSection itemsSection = jobSection.getConfigurationSection("items"); - if (itemsSection != null) { - for (String itemKey : itemsSection.getKeys(false)) { - ConfigurationSection itemSection = itemsSection.getConfigurationSection(itemKey); - - String node = itemKey.toLowerCase(); - if (itemSection == null) { - log.warning("Job " + jobConfigName + " has an invalid item key " + itemKey + "!"); - continue; - } - int id = itemSection.getInt("id"); - - String name = null; - if (itemSection.isString("name")) - name = itemSection.getString("name"); - - List lore = new ArrayList<>(); - if (itemSection.contains("lore")) - for (String eachLine : itemSection.getStringList("lore")) { - lore.add(CMIChatColor.translate(eachLine)); - } - - HashMap enchants = new HashMap<>(); - if (itemSection.contains("enchants")) - for (String eachLine : itemSection.getStringList("enchants")) { - - if (!eachLine.contains("=")) - continue; - - Enchantment ench = CMIEnchantment.getEnchantment(eachLine.split("=")[0]); - Integer level = -1; - try { - level = Integer.parseInt(eachLine.split("=")[1]); - } catch (NumberFormatException e) { - continue; - } - - if (ench != null && level != -1) - enchants.put(ench, level); - } - - BoostMultiplier b = new BoostMultiplier(); - if (itemSection.isDouble("moneyBoost")) - b.add(CurrencyType.MONEY, itemSection.getDouble("moneyBoost") - 1); - if (itemSection.isDouble("pointBoost")) - b.add(CurrencyType.POINTS, itemSection.getDouble("pointBoost") - 1); - if (itemSection.isDouble("expBoost")) - b.add(CurrencyType.EXP, itemSection.getDouble("expBoost") - 1); - - jobItems.put(node.toLowerCase(), new JobItems(node, CMIMaterial.get(id), 1, name, lore, enchants, b, new ArrayList())); - } - - CMIMessages.consoleMessage("&cRemove Items section from " + jobConfigName + " job, as of Jobs 4.10.0 version this was moved to boostedItems.yml file!"); - } - job.setItemBonus(jobItems); - // Limited Items Map jobLimitedItems = new HashMap<>(); ConfigurationSection limitedItemsSection = jobSection.getConfigurationSection("limitedItems"); @@ -1406,11 +1350,12 @@ public class ConfigManager { List lore = itemSection.getStringList("lore"); - for (int a = 0; a < lore.size(); a++) { - lore.set(a, CMIChatColor.translate(lore.get(a))); - } + if (lore != null) + for (int a = 0; a < lore.size(); a++) { + lore.set(a, CMIChatColor.translate(lore.get(a).replace(" ", "_"))); + } - Map enchants = new HashMap<>(); + StringBuilder enchants = new StringBuilder(); for (String eachLine : itemSection.getStringList("enchants")) { String[] split = eachLine.split("=", 2); if (split.length == 0) @@ -1429,11 +1374,30 @@ public class ConfigManager { } } - if (level != -1) - enchants.put(ench, level); + if (level == -1) + continue; + + if (!enchants.toString().isEmpty()) + enchants.append(","); + enchants.append(split[0] + ":" + level); } - jobLimitedItems.put(node, new JobLimitedItems(node, mat, 1, itemSection.getString("name"), lore, enchants, itemSection.getInt("level"))); + String itemString = ""; + + String name = CMIChatColor.translate(itemSection.getString("name")); + + if (name != null) + itemString += ";n{" + name.replace(" ", "_") + "}"; + + if (lore != null) + for (int b = 0; b < lore.size(); b++) { + lore.set(b, CMIChatColor.translate(lore.get(b).replace(" ", "_"))); + } + + if (lore != null && !lore.isEmpty()) + itemString += ";l{" + CMIList.listToString(lore, "\\n") + "}"; + + jobLimitedItems.put(node, new JobLimitedItems(node, itemString, itemSection.getInt("level"))); if (!informedLimited) { CMIMessages.consoleMessage("&5Update " + jobConfigName @@ -1450,11 +1414,12 @@ public class ConfigManager { continue; } - jobLimitedItems.put(node, new JobLimitedItems(node, limitedItem.getItemStack(), itemSection.getInt("level"))); + jobLimitedItems.put(node, new JobLimitedItems(node, itemSection.getString("ItemStack"), itemSection.getInt("level"))); } } } + job.setLimitedItems(jobLimitedItems); job.setCmdOnJoin(jobSection.getStringList("cmd-on-join")); diff --git a/src/main/java/com/gamingmesh/jobs/config/ShopManager.java b/src/main/java/com/gamingmesh/jobs/config/ShopManager.java index a02f480d..b43e7556 100644 --- a/src/main/java/com/gamingmesh/jobs/config/ShopManager.java +++ b/src/main/java/com/gamingmesh/jobs/config/ShopManager.java @@ -6,7 +6,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.UUID; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -16,31 +15,28 @@ import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.inventory.meta.SkullMeta; -import org.bukkit.potion.Potion; -import org.bukkit.potion.PotionData; import org.bukkit.potion.PotionType; import com.gamingmesh.jobs.Jobs; import com.gamingmesh.jobs.CMILib.CMIEnchantment; -import com.gamingmesh.jobs.container.BoostMultiplier; import com.gamingmesh.jobs.container.Job; import com.gamingmesh.jobs.container.JobItems; import com.gamingmesh.jobs.container.JobProgression; import com.gamingmesh.jobs.container.JobsPlayer; import com.gamingmesh.jobs.container.ShopItem; import com.gamingmesh.jobs.stuff.GiveItem; -import com.gamingmesh.jobs.stuff.Util; import net.Zrips.CMILib.Colors.CMIChatColor; +import net.Zrips.CMILib.Container.CMIList; import net.Zrips.CMILib.GUI.CMIGui; import net.Zrips.CMILib.GUI.CMIGuiButton; import net.Zrips.CMILib.GUI.GUIManager.GUIClickType; import net.Zrips.CMILib.GUI.GUIManager.GUIRows; +import net.Zrips.CMILib.Items.CMIAsyncHead; +import net.Zrips.CMILib.Items.CMIItemStack; import net.Zrips.CMILib.Items.CMIMaterial; import net.Zrips.CMILib.Locale.LC; import net.Zrips.CMILib.Messages.CMIMessages; -import net.Zrips.CMILib.Version.Version; @SuppressWarnings("deprecation") public class ShopManager { @@ -110,7 +106,15 @@ public class ShopManager { mainCycle: for (ShopItem item : ls) { List lore = new ArrayList<>(); - CMIMaterial mat = CMIMaterial.get(item.getIconMaterial()); + + CMIAsyncHead ahead = new CMIAsyncHead() { + @Override + public void afterAsyncUpdate(ItemStack item) { + + } + }; + + CMIItemStack icon = item.getIcon(player, ahead); boolean hiddenLore = false; @@ -124,26 +128,18 @@ public class ShopManager { if (item.isHideIfNoEnoughPoints() && item.getPointPrice() > 0 && jPlayer.getPointsData().getCurrentPoints() < item.getPointPrice()) { - mat = CMIMaterial.STONE_BUTTON; + icon = CMIMaterial.STONE_BUTTON.newCMIItemStack(); lore.add(Jobs.getLanguage().getMessage("command.shop.info.NoPoints")); hiddenLore = true; } - if (mat == CMIMaterial.NONE) - mat = CMIMaterial.STONE_BUTTON; - - ItemStack guiItem = mat.newItemStack(); + ItemStack guiItem = icon.getItemStack(); ItemMeta meta = guiItem.getItemMeta(); if (meta == null) continue; - guiItem.setAmount(item.getIconAmount()); - - if (item.getIconName() != null) - meta.setDisplayName(item.getIconName()); - if (!hiddenLore) { - lore.addAll(item.getIconLore()); + lore.addAll(icon.getLore()); if (item.getPointPrice() > 0) { String color = item.getPointPrice() >= points ? "" : Jobs.getLanguage().getMessage("command.shop.info.haveColor"); @@ -190,32 +186,6 @@ public class ShopManager { meta.setLore(lore); - if (item.getCustomHead() != null) { - guiItem = CMIMaterial.PLAYER_HEAD.newItemStack(item.getIconAmount()); - - SkullMeta skullMeta = (SkullMeta) guiItem.getItemMeta(); - if (skullMeta == null) - continue; - - if (item.getIconName() != null) - skullMeta.setDisplayName(item.getIconName()); - - skullMeta.setLore(lore); - - if (item.isHeadOwner()) { - Util.setSkullOwner(skullMeta, jPlayer.getPlayer()); - } else { - try { - Util.setSkullOwner(skullMeta, Bukkit.getOfflinePlayer(UUID.fromString(item.getCustomHead()))); - } catch (IllegalArgumentException ex) { - Util.setSkullOwner(skullMeta, Bukkit.getOfflinePlayer(item.getCustomHead())); - } - } - - guiItem.setItemMeta(skullMeta); - } else - guiItem.setItemMeta(meta); - CMIGuiButton button = new CMIGuiButton(guiItem) { @Override public void click(GUIClickType type) { @@ -272,7 +242,15 @@ public class ShopManager { } for (JobItems one : item.getitems()) { - GiveItem.giveItemForPlayer(player, one.getItemStack(player)); + CMIAsyncHead ahead = new CMIAsyncHead() { + @Override + public void afterAsyncUpdate(ItemStack item) { + GiveItem.giveItemForPlayer(player, item); + } + }; + CMIItemStack citem = one.getItemStack(player, ahead); + if (citem != null && !ahead.isAsyncHead()) + GiveItem.giveItemForPlayer(player, citem.getItemStack()); } if (item.getPointPrice() > 0) { @@ -326,6 +304,8 @@ public class ShopManager { return true; } + boolean informed = false; + public void load() { list.clear(); @@ -361,27 +341,71 @@ public class ShopManager { sItem.setPointPrice(pointPrice); sItem.setVaultPrice(vaultPrice); - if (nameSection.isString("Icon.Id")) - sItem.setIconMaterial(nameSection.getString("Icon.Id")); - else { + if (nameSection.contains("Icon.Id")) { + + String itemString = ""; + + if (!informed) { + CMIMessages.consoleMessage("&5Update shops items icon section and use 'ItemStack' instead"); + informed = true; + } + + CMIMaterial mat = null; + if (nameSection.isString("Icon.Id")) + mat = CMIMaterial.get(nameSection.getString("Icon.Id")); + + if (mat == null) { + Jobs.getPluginLogger().severe("Shop item " + category + " has an invalid Icon name property. Skipping!"); + continue; + } + + int amount = nameSection.getInt("Icon.Amount", 1); + + if (amount > 1) + itemString += ";" + amount; + + String name = CMIChatColor.translate(nameSection.getString("Icon.Name")); + + if (name != null) + itemString += ";n{" + name.replace(" ", "_") + "}"; + + List lore = nameSection.getStringList("Icon.Lore"); + if (lore != null) + for (int b = 0; b < lore.size(); b++) { + lore.set(b, CMIChatColor.translate(lore.get(b).replace(" ", "_"))); + } + + if (lore != null && !lore.isEmpty()) + itemString += ";l{" + CMIList.listToString(lore, "\\n") + "}"; + + if (nameSection.isString("Icon.CustomHead.PlayerName")) { + itemString = mat.toString() + ":" + nameSection.getString("Icon.CustomHead.PlayerName") + itemString; + } else if (nameSection.getBoolean("Icon.CustomHead.UseCurrentPlayer", false)) { + itemString = mat.toString() + ":[player]" + itemString; + } else { + itemString = mat.toString() + itemString; + } + + sItem.setIconString(itemString); + + } else if (nameSection.contains("Icon.ItemStack")) { + + String itemString = nameSection.getString("Icon.ItemStack"); + CMIItemStack item = CMIItemStack.deserialize(itemString, null); + + if (item == null || item.getCMIType().isNone()) { + CMIMessages.consoleMessage("&cInvalid ItemStack for shop icon item (" + category + ")"); + continue; + } + + sItem.setIconString(itemString); + } + + if (sItem.getIconString() == null) { Jobs.getPluginLogger().severe("Shop item " + category + " has an invalid Icon name property. Skipping!"); continue; } - sItem.setIconAmount(nameSection.getInt("Icon.Amount", 1)); - sItem.setIconName(CMIChatColor.translate(nameSection.getString("Icon.Name"))); - - List lore = nameSection.getStringList("Icon.Lore"); - for (int b = 0; b < lore.size(); b++) { - lore.set(b, CMIChatColor.translate(lore.get(b))); - } - - sItem.setIconLore(lore); - - if (nameSection.isString("Icon.CustomHead.PlayerName")) - sItem.setCustomHead(nameSection.getString("Icon.CustomHead.PlayerName")); - - sItem.setCustomHeadOwner(nameSection.getBoolean("Icon.CustomHead.UseCurrentPlayer", true)); sItem.setHideIfThereIsNoEnoughPoints(nameSection.getBoolean("Icon.HideIfThereIsNoEnoughPoints")); sItem.setHideWithoutPerm(nameSection.getBoolean("Icon.HideWithoutPermission")); sItem.setRequiredPerm(nameSection.getStringList("RequiredPermission")); @@ -417,73 +441,114 @@ public class ShopManager { } sItem.setCommands(performCommands); - ConfigurationSection itemsSection = nameSection.getConfigurationSection("GiveItems"); - if (itemsSection != null) { + if (nameSection.isList("GiveItems")) { + List items = new ArrayList<>(); + for (String itemString : nameSection.getStringList("GiveItems")) { - for (String oneItemName : itemsSection.getKeys(false)) { - ConfigurationSection itemSection = itemsSection.getConfigurationSection(oneItemName); - if (itemSection == null) - continue; + CMIItemStack item = CMIItemStack.deserialize(itemString, null); - String id = null; - if (itemSection.isString("Id")) - id = itemSection.getString("Id"); - else { - Jobs.getPluginLogger().severe("Shop item " + category + " has an invalid GiveItems item id property. Skipping!"); + if (item == null || item.getCMIType().isNone()) { + CMIMessages.consoleMessage("&cInvalid ItemStack for boosted item (" + itemString + ")"); continue; } - - int amount = itemSection.getInt("Amount", 1); - String name = CMIChatColor.translate(itemSection.getString("Name")); - - List giveLore = itemSection.getStringList("Lore"); - for (int v = 0; v < giveLore.size(); v++) { - giveLore.set(v, CMIChatColor.translate(giveLore.get(v))); - } - - Map enchants = new HashMap<>(); - for (String eachLine : itemSection.getStringList("Enchants")) { - String[] split = eachLine.split("=", 2); - if (split.length == 0) - continue; - - Enchantment ench = CMIEnchantment.getEnchantment(split[0]); - if (ench == null) - continue; - - Integer level = 1; - if (split.length > 1) { - try { - level = Integer.parseInt(split[1]); - } catch (NumberFormatException e) { - continue; - } - } - - enchants.put(ench, level); - } - - Object potionData = null; - if (itemSection.contains("potion-type")) { - PotionType type; - try { - type = PotionType.valueOf(itemSection.getString("potion-type", "speed").toUpperCase()); - } catch (IllegalArgumentException ex) { - type = PotionType.SPEED; - } - - if (Version.isCurrentEqualOrHigher(Version.v1_10_R1)) { - potionData = new PotionData(type); - } else { - potionData = new Potion(type, 1, false); - } - } - - items.add(new JobItems(oneItemName.toLowerCase(), id == null ? CMIMaterial.STONE : CMIMaterial.get(id), amount, name, giveLore, - enchants, new BoostMultiplier(), new ArrayList<>(), potionData, null)); + JobItems jitem = new JobItems(""); + jitem.setItemString(itemString); + items.add(jitem); } sItem.setitems(items); + + } else { + + // Outdated method + ConfigurationSection itemsSection = nameSection.getConfigurationSection("GiveItems"); + if (itemsSection != null) { + List items = new ArrayList<>(); + + for (String oneItemName : itemsSection.getKeys(false)) { + ConfigurationSection itemSection = itemsSection.getConfigurationSection(oneItemName); + if (itemSection == null) + continue; + + if (itemSection.contains("Id")) { + CMIMaterial mat = null; + if (itemSection.isString("Id")) + mat = CMIMaterial.get(itemSection.getString("Id")); + else { + Jobs.getPluginLogger().severe("Shop item " + category + " has an invalid GiveItems item id property. Skipping!"); + continue; + } + + int amount = itemSection.getInt("Amount", 1); + String name = CMIChatColor.translate(itemSection.getString("Name")); + + List giveLore = itemSection.getStringList("Lore"); + if (giveLore != null) + for (int v = 0; v < giveLore.size(); v++) { + giveLore.set(v, CMIChatColor.translate(giveLore.get(v)).replace(" ", "_")); + } + + StringBuilder enchants = new StringBuilder(); + for (String eachLine : itemSection.getStringList("Enchants")) { + String[] split = eachLine.split("=", 2); + if (split.length == 0) + continue; + + Enchantment ench = CMIEnchantment.getEnchantment(split[0]); + if (ench == null) + continue; + + Integer level = 1; + if (split.length > 1) { + try { + level = Integer.parseInt(split[1]); + } catch (NumberFormatException e) { + continue; + } + } + + if (!enchants.toString().isEmpty()) + enchants.append(","); + enchants.append(split[0] + ":" + level); + } + + String potionData = ""; + if (itemSection.contains("potion-type")) { + PotionType type; + try { + type = PotionType.valueOf(itemSection.getString("potion-type", "speed").toUpperCase()); + } catch (IllegalArgumentException ex) { + type = PotionType.SPEED; + } + + potionData += type.toString() + ":false:false"; + } + + String itemSring = mat.toString(); + if (name != null) + itemSring += ";n{" + name.replace(" ", "_") + "}"; + if (amount > 1) + itemSring += ";" + amount; + + if (giveLore != null && !giveLore.isEmpty()) + itemSring += ";l{" + CMIList.listToString(giveLore, "\\n") + "}"; + + if (!potionData.isEmpty()) + itemSring += ";" + potionData; + + if (!enchants.toString().isEmpty()) + itemSring += ";" + enchants.toString(); + + JobItems jitem = new JobItems(oneItemName.toLowerCase()); + + jitem.setItemString(itemSring); + + items.add(jitem); + } + + } + sItem.setitems(items); + } } i++; diff --git a/src/main/java/com/gamingmesh/jobs/container/Job.java b/src/main/java/com/gamingmesh/jobs/container/Job.java index a314a494..fbb3c03e 100644 --- a/src/main/java/com/gamingmesh/jobs/container/Job.java +++ b/src/main/java/com/gamingmesh/jobs/container/Job.java @@ -58,7 +58,7 @@ public class Job { private List jobCommands; private List jobConditions; - private Map jobItems; +// private Map jobItems; private Map jobLimitedItems; private String jobName = "N/A"; @@ -115,7 +115,7 @@ public class Job { vipmaxLevel, maxSlots, jobPermissions, jobCommands, jobConditions, jobLimitedItems, cmdOnJoin, cmdOnLeave, guiItem, guiSlot, worldBlacklist); - this.jobItems = jobItems; +// this.jobItems = jobItems; this.description = description; } @@ -580,36 +580,6 @@ public class Job { return this; } - /** - * No longer used, moved to ItemBoostManager - * @return Items for this job - */ - @Deprecated - public Map getItemBonus() { - if (jobItems == null) - jobItems = new HashMap(); - return jobItems; - } - - /** - * No longer used, moved to ItemBoostManager - * @return Items for this job - */ - @Deprecated - public JobItems getItemBonus(String key) { - return jobItems.get(key.toLowerCase()); - } - - /** - * No longer used, moved to ItemBoostManager - * @return Items for this job - */ - @Deprecated - public Job setItemBonus(HashMap jobItems) { - this.jobItems = jobItems; - return this; - } - /** * Get the limited item nodes for this job * @return Limited items for this job diff --git a/src/main/java/com/gamingmesh/jobs/container/JobItems.java b/src/main/java/com/gamingmesh/jobs/container/JobItems.java index d0e91490..239c00d5 100644 --- a/src/main/java/com/gamingmesh/jobs/container/JobItems.java +++ b/src/main/java/com/gamingmesh/jobs/container/JobItems.java @@ -19,37 +19,19 @@ package com.gamingmesh.jobs.container; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import org.bukkit.Color; -import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.EnchantmentStorageMeta; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.inventory.meta.LeatherArmorMeta; -import org.bukkit.inventory.meta.PotionMeta; -import org.bukkit.potion.PotionEffectType; -import net.Zrips.CMILib.Colors.CMIChatColor; -import net.Zrips.CMILib.Items.CMIMaterial; -import net.Zrips.CMILib.NBT.CMINBT; -import net.Zrips.CMILib.Version.Version; +import net.Zrips.CMILib.Items.CMIAsyncHead; +import net.Zrips.CMILib.Items.CMIItemStack; -@SuppressWarnings("deprecation") public class JobItems { private String node; - private String legacyKey; - private ItemStack item; - private Object potion; - private Color leatherColor; + private String itemString; - private final Map enchants = new HashMap<>(); private BoostMultiplier boostMultiplier = new BoostMultiplier(); private final List jobs = new ArrayList<>(); @@ -57,139 +39,16 @@ public class JobItems { private int fromLevel = 0; private int untilLevel = Integer.MAX_VALUE; - public JobItems(String node, CMIMaterial mat, int amount, String name, List lore, Map enchants, BoostMultiplier boostMultiplier, List jobs) { - this(node, mat, amount, name, lore, enchants, boostMultiplier, jobs, null, null); - } - - public JobItems(String node, CMIMaterial mat, int amount, String name, List lore, Map enchants, BoostMultiplier boostMultiplier, List jobs, - Object potion, Color leatherColor) { - if (mat == null) { - mat = CMIMaterial.STONE; - } - - if (enchants != null) { - this.enchants.putAll(enchants); - } - + public JobItems(String node) { this.node = node; - - if (boostMultiplier != null) { - this.boostMultiplier = boostMultiplier; - } - - setJobs(jobs); - - ItemMeta meta = (item = mat.newItemStack()).getItemMeta(); - if (potion != null && meta instanceof PotionMeta && CMIMaterial.isPotion(mat.getMaterial())) { - PotionMeta potionMeta = (PotionMeta) meta; - - if (Version.isCurrentEqualOrHigher(Version.v1_10_R1) && potion instanceof org.bukkit.potion.PotionData) { - potionMeta.setBasePotionData((org.bukkit.potion.PotionData) potion); - } else if (potion instanceof org.bukkit.potion.Potion) { - PotionEffectType effectType = ((org.bukkit.potion.Potion) potion).getType().getEffectType(); - - if (effectType != null) { - potionMeta.setMainEffect(effectType); - } - } - - meta = potionMeta; - } else if (leatherColor != null && meta instanceof LeatherArmorMeta && CMIMaterial.isLeatherArmor(mat.getMaterial())) { - LeatherArmorMeta armorMeta = (LeatherArmorMeta) meta; - armorMeta.setColor(this.leatherColor = leatherColor); - meta = armorMeta; - } - - if (meta != null) { - if (name != null) - meta.setDisplayName(CMIChatColor.translate(name)); - - if (lore != null) - meta.setLore(lore); - - if (enchants != null) { - if (mat == CMIMaterial.ENCHANTED_BOOK) { - EnchantmentStorageMeta bookMeta = (EnchantmentStorageMeta) meta; - for (Entry oneEnch : enchants.entrySet()) { - bookMeta.addStoredEnchant(oneEnch.getKey(), oneEnch.getValue(), true); - } - } else { - for (Entry oneEnchant : enchants.entrySet()) { - meta.addEnchant(oneEnchant.getKey(), oneEnchant.getValue(), true); - } - } - } - - item.setItemMeta(meta); - } - - item.setAmount(amount); - CMINBT nbt = new CMINBT(item); - item = (ItemStack) nbt.setString("JobsItemBoost", node); } public String getNode() { return node; } - public ItemStack getItemStack(Player player) { - if (player == null) - return item; - - ItemStack item = this.item.clone(); - ItemMeta meta = item.getItemMeta(); - if (meta == null) { - return item; - } - - if (potion != null && CMIMaterial.isPotion(item.getType()) && meta instanceof PotionMeta) { - PotionMeta potionMeta = (PotionMeta) meta; - - if (Version.isCurrentEqualOrHigher(Version.v1_10_R1) && potion instanceof org.bukkit.potion.PotionData) { - potionMeta.setBasePotionData((org.bukkit.potion.PotionData) potion); - } else if (potion instanceof org.bukkit.potion.Potion) { - PotionEffectType effectType = ((org.bukkit.potion.Potion) potion).getType().getEffectType(); - - if (effectType != null) { - potionMeta.setMainEffect(effectType); - } - } - - meta = potionMeta; - } else if (leatherColor != null && CMIMaterial.isLeatherArmor(item.getType()) && meta instanceof LeatherArmorMeta) { - LeatherArmorMeta armorMeta = (LeatherArmorMeta) meta; - armorMeta.setColor(leatherColor); - meta = armorMeta; - } - - if (meta.hasDisplayName()) - meta.setDisplayName(CMIChatColor.translate(meta.getDisplayName().replace("[player]", player.getName()))); - - if (meta.hasLore()) { - List translatedLore = meta.getLore(); - - for (int a = 0; a < translatedLore.size(); a++) { - translatedLore.set(a, CMIChatColor.translate(translatedLore.get(a).replace("[player]", player.getName()))); - } - - meta.setLore(translatedLore); - } - - if (enchants != null) { - if (item.getType() == CMIMaterial.ENCHANTED_BOOK.getMaterial()) { - EnchantmentStorageMeta bookMeta = (EnchantmentStorageMeta) meta; - for (Entry oneEnch : enchants.entrySet()) { - bookMeta.addStoredEnchant(oneEnch.getKey(), oneEnch.getValue(), true); - } - } else { - for (Entry oneEnchant : enchants.entrySet()) { - meta.addEnchant(oneEnchant.getKey(), oneEnchant.getValue(), true); - } - } - } - - item.setItemMeta(meta); - return item; + public CMIItemStack getItemStack(Player player, CMIAsyncHead ahead) { + return CMIItemStack.deserialize(itemString.replace("[player]", player == null ? "" : player.getName()), ahead); } public BoostMultiplier getBoost() { @@ -215,10 +74,6 @@ public class JobItems { } } - public Map getEnchants() { - return enchants; - } - public int getFromLevel() { return fromLevel; } @@ -235,11 +90,16 @@ public class JobItems { this.untilLevel = untilLevel; } - public String getLegacyKey() { - return legacyKey; + public CMIItemStack getItem() { + return CMIItemStack.deserialize(itemString); } - public void setLegacyKey(String legacyKey) { - this.legacyKey = legacyKey; + public void setItemString(String itemString) { + this.itemString = itemString.replace(" ", "_"); } + + public void setBoostMultiplier(BoostMultiplier boostMultiplier) { + this.boostMultiplier = boostMultiplier; + } + } diff --git a/src/main/java/com/gamingmesh/jobs/container/JobLimitedItems.java b/src/main/java/com/gamingmesh/jobs/container/JobLimitedItems.java index 3c009caa..4c1ca9ae 100644 --- a/src/main/java/com/gamingmesh/jobs/container/JobLimitedItems.java +++ b/src/main/java/com/gamingmesh/jobs/container/JobLimitedItems.java @@ -18,59 +18,44 @@ package com.gamingmesh.jobs.container; -import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; -import net.Zrips.CMILib.Colors.CMIChatColor; -import net.Zrips.CMILib.Container.CMINumber; +import net.Zrips.CMILib.Items.CMIAsyncHead; import net.Zrips.CMILib.Items.CMIItemStack; import net.Zrips.CMILib.Items.CMIMaterial; +import net.Zrips.CMILib.NBT.CMINBT; public class JobLimitedItems { private String node; CMIMaterial mat; private String name; - private ItemStack item; + private String itemString; private List lore; private Map enchants; private int level; - public JobLimitedItems(String node, CMIMaterial material, int amount, String name, List lore, Map enchants, int level) { + public JobLimitedItems(String node, String itemString, int level) { this.node = node; + this.itemString = itemString.replace(" ", "_"); - CMIItemStack ct = material.newCMIItemStack(CMINumber.clamp(amount, 1, material.getMaterial().getMaxStackSize())); - ct.setDisplayName(name); - ct.setLore(lore); - for (Entry one : enchants.entrySet()) { - ct.addEnchant(one.getKey(), one.getValue()); - } - this.item = ct.getItemStack(); + CMIItemStack citem = CMIItemStack.deserialize(itemString); - this.name = name; - this.lore = lore; - this.enchants = enchants; - this.level = level; - this.mat = material; - } - - public JobLimitedItems(String node, ItemStack item, int level) { - this.node = node; - this.item = item; - if (this.item.hasItemMeta()) { - ItemMeta meta = this.item.getItemMeta(); + ItemStack item = citem.getItemStack(); + if (item.hasItemMeta()) { + ItemMeta meta = item.getItemMeta(); if (meta.hasDisplayName()) name = meta.getDisplayName(); if (meta.hasLore()) lore = meta.getLore(); } enchants = item.getEnchantments(); + mat = citem.getCMIType(); this.level = level; } @@ -79,26 +64,8 @@ public class JobLimitedItems { return node; } - public ItemStack getItemStack(Player player) { - - ItemStack item = this.item.clone(); - - ItemMeta meta = item.getItemMeta(); - if (meta == null) { - return item; - } - - if (lore != null && !lore.isEmpty()) { - List translatedLore = new ArrayList<>(); - for (String oneLore : lore) { - translatedLore.add(CMIChatColor.translate(oneLore.replace("[player]", player.getName()))); - } - - meta.setLore(translatedLore); - } - - item.setItemMeta(meta); - return item; + public CMIItemStack getItemStack(Player player, CMIAsyncHead ahead) { + return CMIItemStack.deserialize(itemString.replace("[player]", player == null ? "" : player.getName()), ahead); } @Deprecated @@ -125,4 +92,10 @@ public class JobLimitedItems { public int getLevel() { return level; } + + public static ItemStack applyNBT(ItemStack item, int jobId, String node) { + CMINBT nbt = new CMINBT(item); + nbt.setInt("JobsLimited", jobId); + return (ItemStack) nbt.setString("JobsLimitedNode", node); + } } diff --git a/src/main/java/com/gamingmesh/jobs/container/ShopItem.java b/src/main/java/com/gamingmesh/jobs/container/ShopItem.java index 3d766a4e..6fe350d3 100644 --- a/src/main/java/com/gamingmesh/jobs/container/ShopItem.java +++ b/src/main/java/com/gamingmesh/jobs/container/ShopItem.java @@ -5,6 +5,12 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import net.Zrips.CMILib.Items.CMIAsyncHead; +import net.Zrips.CMILib.Items.CMIItemStack; + public class ShopItem { private double pointPrice = 0D; @@ -12,11 +18,8 @@ public class ShopItem { private int slot = -1; private int page = -1; - private int iconAmount = 1; private String nodeName; - private String iconMaterial; - private String iconName; private boolean hideWithoutPerm = false; private boolean hideNoEnoughPoint = false; @@ -25,13 +28,19 @@ public class ShopItem { private Map requiredJobs = new HashMap<>(); - private final List iconLore = new ArrayList<>(); +// private final List iconLore = new ArrayList<>(); private final List requiredPerm = new ArrayList<>(); private final List commands = new ArrayList<>(); private final List items = new ArrayList<>(); - private String playerName; - private boolean useCurrentPlayer = false; +// private String playerName; +// private boolean useCurrentPlayer = false; + + private String iconString; + + public CMIItemStack getIcon(Player player, CMIAsyncHead ahead) { + return CMIItemStack.deserialize(iconString.replace("[player]", player.getName()), ahead); + } public ShopItem(String nodeName) { this.nodeName = nodeName; @@ -110,28 +119,28 @@ public class ShopItem { return hideWithoutPerm; } - public void setIconLore(List iconLore) { - this.iconLore.clear(); - - if (iconLore != null) - this.iconLore.addAll(iconLore); - } - - public List getIconLore() { - return iconLore; - } +// public void setIconLore(List iconLore) { +// this.iconLore.clear(); +// +// if (iconLore != null) +// this.iconLore.addAll(iconLore); +// } +// +// public List getIconLore() { +// return iconLore; +// } public String getNodeName() { return nodeName; } - public String getIconMaterial() { - return iconMaterial; - } - - public void setIconMaterial(String iconMaterial) { - this.iconMaterial = iconMaterial; - } +// public String getIconMaterial() { +// return iconMaterial; +// } +// +// public void setIconMaterial(String iconMaterial) { +// this.iconMaterial = iconMaterial; +// } @Deprecated public double getPrice() { @@ -142,21 +151,21 @@ public class ShopItem { return pointPrice; } - public void setIconAmount(int iconAmount) { - this.iconAmount = iconAmount; - } - - public int getIconAmount() { - return iconAmount; - } - - public void setIconName(String iconName) { - this.iconName = iconName; - } - - public String getIconName() { - return iconName; - } +// public void setIconAmount(int iconAmount) { +// this.iconAmount = iconAmount; +// } +// +// public int getIconAmount() { +// return iconAmount; +// } +// +// public void setIconName(String iconName) { +// this.iconName = iconName; +// } +// +// public String getIconName() { +// return iconName; +// } public int getRequiredTotalLevels() { return requiredTotalLevels; @@ -166,21 +175,21 @@ public class ShopItem { this.requiredTotalLevels = requiredTotalLevels; } - public String getCustomHead() { - return playerName; - } - - public void setCustomHead(String playerName) { - this.playerName = playerName; - } - - public boolean isHeadOwner() { - return useCurrentPlayer; - } - - public void setCustomHeadOwner(boolean useCurrentPlayer) { - this.useCurrentPlayer = useCurrentPlayer; - } +// public String getCustomHead() { +// return playerName; +// } +// +// public void setCustomHead(String playerName) { +// this.playerName = playerName; +// } +// +// public boolean isHeadOwner() { +// return useCurrentPlayer; +// } +// +// public void setCustomHeadOwner(boolean useCurrentPlayer) { +// this.useCurrentPlayer = useCurrentPlayer; +// } public double getVaultPrice() { return vaultPrice; @@ -193,4 +202,12 @@ public class ShopItem { public void setPointPrice(double pointPrice) { this.pointPrice = pointPrice; } + + public String getIconString() { + return iconString; + } + + public void setIconString(String iconString) { + this.iconString = iconString; + } } diff --git a/src/main/java/com/gamingmesh/jobs/listeners/JobsListener.java b/src/main/java/com/gamingmesh/jobs/listeners/JobsListener.java index 5d15387d..314c798c 100644 --- a/src/main/java/com/gamingmesh/jobs/listeners/JobsListener.java +++ b/src/main/java/com/gamingmesh/jobs/listeners/JobsListener.java @@ -416,7 +416,7 @@ public class JobsListener implements Listener { return false; } - + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onLimitedItemInteract(PlayerInteractEvent event) { @@ -470,7 +470,7 @@ public class JobsListener implements Listener { String itemNode = null; CMIMaterial mat = CMIMaterial.get(iih); - Integer jobId = null; + int jobId = 0; mein: for (JobProgression one : jPlayer.getJobProgression()) { for (JobLimitedItems oneItem : one.getJob().getLimitedItems().values()) { if (one.getLevel() >= oneItem.getLevel() || !isThisItem(oneItem, mat, name, lore, enchants)) @@ -486,9 +486,7 @@ public class JobsListener implements Listener { event.setCancelled(true); CMIActionBar.send(player, Jobs.getLanguage().getMessage("limitedItem.error.levelup", "[jobname]", meinOk)); - CMINBT nbt = new CMINBT(iih); - nbt.setInt("JobsLimited", jobId); - iih = (ItemStack) nbt.setString("JobsLimitedNode", itemNode); + iih = JobLimitedItems.applyNBT(iih, jobId, itemNode); try { if (Version.isCurrentHigher(Version.v1_8_R3) && event.getHand() != EquipmentSlot.HAND) { CMIItemStack.setItemInOffHand(player, iih); @@ -502,8 +500,9 @@ public class JobsListener implements Listener { } private static boolean isThisItem(JobLimitedItems oneItem, CMIMaterial mat, String name, List lore, Map enchants) { - if (oneItem.getType() != mat) + if (oneItem.getType() != mat) { return false; + } if (oneItem.getName() != null && !CMIChatColor.translate(oneItem.getName()).equalsIgnoreCase(name)) { return false; @@ -518,12 +517,12 @@ public class JobsListener implements Listener { for (Entry oneE : enchants.entrySet()) { Integer value = oneItem.getEnchants().get(oneE.getKey()); - if (value != null && value <= oneE.getValue()) { - return true; + if (value != null && value > oneE.getValue()) { + return false; } } - return false; + return true; } @EventHandler(ignoreCancelled = true) diff --git a/src/main/java/com/gamingmesh/jobs/listeners/JobsPaymentListener.java b/src/main/java/com/gamingmesh/jobs/listeners/JobsPaymentListener.java index 680901a4..c3ac6dcc 100644 --- a/src/main/java/com/gamingmesh/jobs/listeners/JobsPaymentListener.java +++ b/src/main/java/com/gamingmesh/jobs/listeners/JobsPaymentListener.java @@ -1044,7 +1044,7 @@ public final class JobsPaymentListener implements Listener { if (!Jobs.getGCManager().allowEnchantingBoostedItems) { for (JobProgression prog : jPlayer.getJobProgression()) { for (JobItems jobItem : ItemBoostManager.getItemsByJob(prog.getJob())) { - if (event.getItem().isSimilar(jobItem.getItemStack(player))) { + if (event.getItem().isSimilar(jobItem.getItemStack(player, null).getItemStack())) { event.setCancelled(true); return; } diff --git a/src/main/java/com/gamingmesh/jobs/stuff/GiveItem.java b/src/main/java/com/gamingmesh/jobs/stuff/GiveItem.java index b5b65952..5230b63d 100644 --- a/src/main/java/com/gamingmesh/jobs/stuff/GiveItem.java +++ b/src/main/java/com/gamingmesh/jobs/stuff/GiveItem.java @@ -12,49 +12,54 @@ import org.bukkit.inventory.meta.ItemMeta; import net.Zrips.CMILib.Colors.CMIChatColor; import net.Zrips.CMILib.Items.CMIMaterial; +import net.Zrips.CMILib.Version.Schedulers.CMIScheduler; public final class GiveItem { public static void giveItemForPlayer(Player player, int id, int meta, int qty, String name, List lore, - java.util.Map enchants) { - ItemStack itemStack = CMIMaterial.get(id, meta).newItemStack(); - itemStack.setAmount(qty); - ItemMeta itemMeta = itemStack.getItemMeta(); - if (itemMeta == null) { - return; - } + java.util.Map enchants) { + ItemStack itemStack = CMIMaterial.get(id, meta).newItemStack(); + itemStack.setAmount(qty); + ItemMeta itemMeta = itemStack.getItemMeta(); + if (itemMeta == null) { + return; + } - if (lore != null && !lore.isEmpty()) { - List translatedLore = new ArrayList<>(); - for (String oneLore : lore) { - translatedLore.add(CMIChatColor.translate(oneLore.replace("[player]", player.getName()))); - } + if (lore != null && !lore.isEmpty()) { + List translatedLore = new ArrayList<>(); + for (String oneLore : lore) { + translatedLore.add(CMIChatColor.translate(oneLore.replace("[player]", player.getName()))); + } - itemMeta.setLore(translatedLore); - } + itemMeta.setLore(translatedLore); + } - if (enchants != null) { - if (itemStack.getType() == CMIMaterial.ENCHANTED_BOOK.getMaterial()) { - EnchantmentStorageMeta bookMeta = (EnchantmentStorageMeta) itemMeta; - for (Entry oneEnch : enchants.entrySet()) { - bookMeta.addStoredEnchant(oneEnch.getKey(), oneEnch.getValue(), true); - } - } else { - for (Entry oneEnchant : enchants.entrySet()) { - itemMeta.addEnchant(oneEnchant.getKey(), oneEnchant.getValue(), true); - } - } - } + if (enchants != null) { + if (itemStack.getType() == CMIMaterial.ENCHANTED_BOOK.getMaterial()) { + EnchantmentStorageMeta bookMeta = (EnchantmentStorageMeta) itemMeta; + for (Entry oneEnch : enchants.entrySet()) { + bookMeta.addStoredEnchant(oneEnch.getKey(), oneEnch.getValue(), true); + } + } else { + for (Entry oneEnchant : enchants.entrySet()) { + itemMeta.addEnchant(oneEnchant.getKey(), oneEnchant.getValue(), true); + } + } + } - if (name != null) - itemMeta.setDisplayName(CMIChatColor.translate(name)); + if (name != null) + itemMeta.setDisplayName(CMIChatColor.translate(name)); - itemStack.setItemMeta(itemMeta); - giveItemForPlayer(player, itemStack); + itemStack.setItemMeta(itemMeta); + giveItemForPlayer(player, itemStack); } public static void giveItemForPlayer(Player player, ItemStack item) { - player.getInventory().addItem(item); - player.updateInventory(); + if (player == null) + return; + CMIScheduler.runAtEntity(player, () -> { + player.getInventory().addItem(item); + player.updateInventory(); + }); } } diff --git a/src/main/resources/shopItems.yml b/src/main/resources/shopItems.yml index 6945c78c..66ee5e7a 100644 --- a/src/main/resources/shopItems.yml +++ b/src/main/resources/shopItems.yml @@ -6,27 +6,12 @@ Items: # Atleast one type of currency needs to be defined vaultPrice: 10000.0 Icon: - # (REQUIRED) Icon item - Id: diamond_pickaxe - # (Optional - Default: 1) Icon item amount - Amount: 1 - # (Optional) Icon name. Supports usual color codes - Name: "&eBest pick axe ever!" - # (Optional) Icon lore. Supports usual color codes - Lore: - - "&6Efficiency V" - - "&6Unbreaking III" - - "&eAnd one tasty apple!" + # (REQUIRED) Icon item. [player] can be used as a variable for the player who opens UI + ItemStack: diamond_pickaxe;&eBest_pick_axe_ever!;&6Efficiency_V\n&6Unbreaking_III\n&eAnd_one_tasty_apple! # (Optional - default: false) Hides icon if player don't have permission to get this item HideWithoutPermission: true # (Optional - default: false) Hides icon if player don't have enough point levels to get this icon - HideIfThereIsNoEnoughPoints: false - # (Optional) When you want to use Player Head material with skin then use this - #CustomHead: - # You can specify here valid player name or uuid. - # PlayerName: playerNameOrUUID - # Use the current player who opened the gui, so the head skin will be this player who opened. - # UseCurrentPlayer: true + HideIfThereIsNoEnoughPoints: false # (Optional) List of permissions required to buy this item RequiredPermission: - jobs.item.pickaxe @@ -44,30 +29,9 @@ Items: - "msg &eThanks for buying this super pick axe!" # (Optional) Gives items by defined criteria GiveItems: - # Can be any word - PickAxe: - # (Required) Item name - Id: diamond_pickaxe - # (Optional - Default: 1) Item amount - Amount: 1 - # (Optional) Item name - Name: "&eSuper PickAxe" - # (Optional) Item lore - Lore: - - "&eUber pickAxe" - # (Optional) Item enchants - Enchants: - - DIG_SPEED=5 - - DURABILITY=3 - Giving-Potion: - Id: potion - Amount: 1 - Name: "&6Jump boost" - potion-type: jump - # Can be any word - Apple: - # (Required) Item name - Id: apple + - diamond_pickaxe;2;&eSuper_PickAxe;&eUber_pickAxe;DIG_SPEED:5,DURABILITY:3 + - potion;n{&6Jump_boost};jump + - apple WoodenShovel: pointPrice: 100.0 Icon: