diff --git a/pom.xml b/pom.xml index f5578c9c..6a8805f3 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 net.Indyuce MMOItems - 6.1.2 + 6.1.3 MMOItems A great item solution for your RPG server. diff --git a/src/main/java/net/Indyuce/mmoitems/api/UpdaterData.java b/src/main/java/net/Indyuce/mmoitems/api/UpdaterData.java index 721481e2..e3f3e154 100644 --- a/src/main/java/net/Indyuce/mmoitems/api/UpdaterData.java +++ b/src/main/java/net/Indyuce/mmoitems/api/UpdaterData.java @@ -1,21 +1,19 @@ package net.Indyuce.mmoitems.api; +import net.Indyuce.mmoitems.api.item.template.MMOItemTemplate; +import net.Indyuce.mmoitems.manager.UpdaterManager.KeepOption; +import net.mmogroup.mmolib.api.item.NBTItem; +import org.apache.commons.lang.Validate; +import org.bukkit.configuration.ConfigurationSection; + import java.util.Arrays; import java.util.HashSet; import java.util.Set; import java.util.UUID; -import org.apache.commons.lang.Validate; -import org.bukkit.configuration.ConfigurationSection; - -import net.Indyuce.mmoitems.manager.UpdaterManager.KeepOption; -import net.mmogroup.mmolib.api.item.NBTItem; - public class UpdaterData { // TODO change this to MMOItemTemplate - private final Type type; - private final String id; /* * two UUIDs can be found : one on the itemStack in the nbttags, and one in @@ -23,27 +21,28 @@ public class UpdaterData { * they don't match, the item needs to be updated. UUID not final because it * must be changed */ + private final MMOItemTemplate template; + private UUID uuid; private final Set options = new HashSet<>(); - public UpdaterData(Type type, String id, ConfigurationSection config) { - this(type, id, UUID.fromString(config.getString("uuid"))); + public UpdaterData(MMOItemTemplate template, ConfigurationSection config) { + this(template, UUID.fromString(config.getString("uuid"))); for (KeepOption option : KeepOption.values()) if (config.getBoolean(option.getPath())) options.add(option); } - public UpdaterData(Type type, String id, UUID uuid, KeepOption... options) { + public UpdaterData(MMOItemTemplate template, UUID uuid, KeepOption... options) { + this.template = template; this.uuid = uuid; - this.type = type; - this.id = id; this.options.addAll(Arrays.asList(options)); } - public UpdaterData(Type type, String id, UUID uuid, boolean enableAllOptions) { - this(type, id, uuid); + public UpdaterData(MMOItemTemplate template, UUID uuid, boolean enableAllOptions) { + this(template, uuid); if (enableAllOptions) options.addAll(Arrays.asList(KeepOption.values())); @@ -57,15 +56,15 @@ public class UpdaterData { } public String getPath() { - return type.getId() + "." + id; + return template.getType().getId() + "." + template.getId(); } public Type getType() { - return type; + return template.getType(); } public String getId() { - return id; + return template.getId(); } public UUID getUniqueId() { diff --git a/src/main/java/net/Indyuce/mmoitems/command/UpdateItemCommand.java b/src/main/java/net/Indyuce/mmoitems/command/UpdateItemCommand.java index 644cf1ab..4b3492a6 100644 --- a/src/main/java/net/Indyuce/mmoitems/command/UpdateItemCommand.java +++ b/src/main/java/net/Indyuce/mmoitems/command/UpdateItemCommand.java @@ -1,19 +1,18 @@ package net.Indyuce.mmoitems.command; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.api.Type; import net.Indyuce.mmoitems.api.util.message.Message; import net.Indyuce.mmoitems.gui.edition.ItemUpdaterEdition; import net.mmogroup.mmolib.MMOLib; import net.mmogroup.mmolib.api.item.NBTItem; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; public class UpdateItemCommand implements CommandExecutor { @Override @@ -36,7 +35,7 @@ public class UpdateItemCommand implements CommandExecutor { return true; } - ItemStack newItem = MMOItems.plugin.getUpdater().getUpdated(item.getItem()); + ItemStack newItem = MMOItems.plugin.getUpdater().getUpdated(item.getItem(), player); if (newItem == null || newItem.getType() == Material.AIR) { sender.sendMessage(ChatColor.RED + "Could not update your item."); return true; diff --git a/src/main/java/net/Indyuce/mmoitems/gui/edition/ItemUpdaterEdition.java b/src/main/java/net/Indyuce/mmoitems/gui/edition/ItemUpdaterEdition.java index 0ea078bc..0f8b3a1d 100644 --- a/src/main/java/net/Indyuce/mmoitems/gui/edition/ItemUpdaterEdition.java +++ b/src/main/java/net/Indyuce/mmoitems/gui/edition/ItemUpdaterEdition.java @@ -1,16 +1,5 @@ package net.Indyuce.mmoitems.gui.edition; -import java.util.ArrayList; -import java.util.List; - -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - import net.Indyuce.mmoitems.MMOItems; import net.Indyuce.mmoitems.MMOUtils; import net.Indyuce.mmoitems.api.UpdaterData; @@ -18,6 +7,16 @@ import net.Indyuce.mmoitems.api.item.template.MMOItemTemplate; import net.Indyuce.mmoitems.manager.UpdaterManager.KeepOption; import net.mmogroup.mmolib.api.util.AltChar; import net.mmogroup.mmolib.version.VersionMaterial; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.List; public class ItemUpdaterEdition extends EditionInventory { private static final int[] slots = { 19, 20, 21, 28, 29, 30, 37, 38, 39 }; @@ -38,22 +37,33 @@ public class ItemUpdaterEdition extends EditionInventory { UpdaterData did = MMOItems.plugin.getUpdater().getData(template); - ItemStack disable = VersionMaterial.RED_STAINED_GLASS_PANE.toItem(); + ItemStack disable = VersionMaterial.RED_DYE.toItem(); ItemMeta disableMeta = disable.getItemMeta(); - disableMeta.setDisplayName(ChatColor.GREEN + "Disable"); + disableMeta.setDisplayName(ChatColor.RED + "Disable"); List disableLore = new ArrayList(); - disableLore.add(ChatColor.GRAY + "Your item will not be dynamically updated."); + disableLore.add(ChatColor.RED + "Your item will not be dynamically updated."); disableLore.add(""); disableLore.add(ChatColor.YELLOW + AltChar.listDash + " Click to disable the item updater."); disableMeta.setLore(disableLore); disable.setItemMeta(disableMeta); + ItemStack enable = VersionMaterial.LIME_DYE.toItem(); + ItemMeta enableMeta = enable.getItemMeta(); + enableMeta.setDisplayName(ChatColor.GREEN + "Enable"); + List enableLore = new ArrayList(); + enableLore.add(ChatColor.GREEN + "Your item will be dynamically updated."); + enableLore.add(""); + enableLore.add(ChatColor.YELLOW + AltChar.listDash + " Click to enable the item updater."); + enableMeta.setLore(enableLore); + enable.setItemMeta(enableMeta); + int n = 0; for (KeepOption option : KeepOption.values()) inv.setItem(slots[n++], getBooleanItem(MMOUtils.caseOnWords(option.name().substring(5).toLowerCase()), did.hasOption(option), option.getLore())); inv.setItem(32, disable); + inv.setItem(23, enable); inv.setItem(4, getCachedItem()); return inv; @@ -87,13 +97,19 @@ public class ItemUpdaterEdition extends EditionInventory { return; } - if (item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Disable")) { + if (item.getItemMeta().getDisplayName().equals(ChatColor.RED + "Disable")) { MMOItems.plugin.getUpdater().disable(template); player.closeInventory(); player.sendMessage(ChatColor.YELLOW + "Successfully disabled the item updater for '" + template.getId() + "'."); return; } + if (item.getItemMeta().getDisplayName().equals(ChatColor.GREEN + "Enable")) { + player.closeInventory(); + player.sendMessage(ChatColor.YELLOW + "Successfully enabled the item updater for '" + template.getId() + "'."); + return; + } + /* * find clicked option based on item display name. no need to use * NBTTags diff --git a/src/main/java/net/Indyuce/mmoitems/manager/PluginUpdateManager.java b/src/main/java/net/Indyuce/mmoitems/manager/PluginUpdateManager.java index 2ccb680c..8efb07b5 100644 --- a/src/main/java/net/Indyuce/mmoitems/manager/PluginUpdateManager.java +++ b/src/main/java/net/Indyuce/mmoitems/manager/PluginUpdateManager.java @@ -129,7 +129,7 @@ public class PluginUpdateManager { new String[] { "Enables the item updater for every item.", "&cNot recommended unless you know what you are doing." }, sender -> { for (Type type : MMOItems.plugin.getTypes().getAll()) for (String id : type.getConfigFile().getConfig().getKeys(false)) - MMOItems.plugin.getUpdater().enable(new UpdaterData(type, id, UUID.randomUUID(), true)); + MMOItems.plugin.getUpdater().enable(new UpdaterData(MMOItems.plugin.getTemplates().getTemplate(type, id), UUID.randomUUID(), true)); })); register(new PluginUpdate(4, diff --git a/src/main/java/net/Indyuce/mmoitems/manager/UpdaterManager.java b/src/main/java/net/Indyuce/mmoitems/manager/UpdaterManager.java index 861259a8..6cfafb9a 100644 --- a/src/main/java/net/Indyuce/mmoitems/manager/UpdaterManager.java +++ b/src/main/java/net/Indyuce/mmoitems/manager/UpdaterManager.java @@ -1,11 +1,18 @@ package net.Indyuce.mmoitems.manager; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.UUID; -import java.util.logging.Level; - +import net.Indyuce.mmoitems.MMOItems; +import net.Indyuce.mmoitems.api.ConfigFile; +import net.Indyuce.mmoitems.api.Type; +import net.Indyuce.mmoitems.api.UpdaterData; +import net.Indyuce.mmoitems.api.item.ItemReference; +import net.Indyuce.mmoitems.api.item.mmoitem.MMOItem; +import net.Indyuce.mmoitems.api.item.mmoitem.VolatileMMOItem; +import net.Indyuce.mmoitems.api.item.template.MMOItemTemplate; +import net.Indyuce.mmoitems.api.player.PlayerData; +import net.Indyuce.mmoitems.api.util.TemplateMap; +import net.Indyuce.mmoitems.stat.type.ItemStat; +import net.mmogroup.mmolib.MMOLib; +import net.mmogroup.mmolib.api.item.NBTItem; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.configuration.file.FileConfiguration; @@ -15,15 +22,14 @@ import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; +import org.bukkit.inventory.meta.ItemMeta; -import net.Indyuce.mmoitems.MMOItems; -import net.Indyuce.mmoitems.api.ConfigFile; -import net.Indyuce.mmoitems.api.Type; -import net.Indyuce.mmoitems.api.UpdaterData; -import net.Indyuce.mmoitems.api.item.ItemReference; -import net.Indyuce.mmoitems.api.util.TemplateMap; -import net.mmogroup.mmolib.MMOLib; -import net.mmogroup.mmolib.api.item.NBTItem; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.UUID; +import java.util.logging.Level; public class UpdaterManager implements Listener { private final TemplateMap data = new TemplateMap<>(); @@ -34,10 +40,10 @@ public class UpdaterManager implements Listener { try { Type type = MMOItems.plugin.getTypes().getOrThrow(typeFormat); for (String id : config.getConfigurationSection(typeFormat).getKeys(false)) - enable(new UpdaterData(type, id, config.getConfigurationSection(typeFormat + "." + id))); + enable(new UpdaterData(MMOItems.plugin.getTemplates().getTemplate(type, id), config.getConfigurationSection(typeFormat + "." + id))); } catch (IllegalArgumentException exception) { MMOItems.plugin.getLogger().log(Level.WARNING, - "An issue occured while trying to load dynamic updater data: " + exception.getMessage()); + "An issue occurred while trying to load dynamic updater data: " + exception.getMessage()); } } @@ -54,11 +60,12 @@ public class UpdaterManager implements Listener { } public void enable(ItemReference template) { - this.data.setValue(template.getType(), template.getId(), new UpdaterData(template.getType(), template.getId(), UUID.randomUUID())); + this.data.setValue(template.getType(), template.getId(), new UpdaterData(MMOItems.plugin.getTemplates() + .getTemplate(template.getType(), template.getId()), UUID.randomUUID())); } public void enable(Type type, String id) { - this.data.setValue(type, id, new UpdaterData(type, id, UUID.randomUUID())); + this.data.setValue(type, id, new UpdaterData(MMOItems.plugin.getTemplates().getTemplate(type, id), UUID.randomUUID())); } public void enable(UpdaterData data) { @@ -86,7 +93,7 @@ public class UpdaterManager implements Listener { if (item == null || item.getType() == Material.AIR) return; - ItemStack newItem = getUpdated(item); + ItemStack newItem = getUpdated(item, (Player) event.getWhoClicked()); if (!newItem.equals(item)) event.setCurrentItem(newItem); } @@ -98,119 +105,112 @@ public class UpdaterManager implements Listener { public void updateOnJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); - player.getEquipment().setHelmet(getUpdated(player.getEquipment().getHelmet())); - player.getEquipment().setChestplate(getUpdated(player.getEquipment().getChestplate())); - player.getEquipment().setLeggings(getUpdated(player.getEquipment().getLeggings())); - player.getEquipment().setBoots(getUpdated(player.getEquipment().getBoots())); + player.getEquipment().setHelmet(getUpdated(player.getEquipment().getHelmet(), player)); + player.getEquipment().setChestplate(getUpdated(player.getEquipment().getChestplate(), player)); + player.getEquipment().setLeggings(getUpdated(player.getEquipment().getLeggings(), player)); + player.getEquipment().setBoots(getUpdated(player.getEquipment().getBoots(), player)); for (int j = 0; j < 9; j++) - player.getInventory().setItem(j, getUpdated(player.getInventory().getItem(j))); - player.getEquipment().setItemInOffHand(getUpdated(player.getEquipment().getItemInOffHand())); + player.getInventory().setItem(j, getUpdated(player.getInventory().getItem(j), player)); + player.getEquipment().setItemInOffHand(getUpdated(player.getEquipment().getItemInOffHand(), player)); } - public ItemStack getUpdated(ItemStack item) { - return getUpdated(MMOLib.plugin.getVersion().getWrapper().getNBTItem(item)); + public ItemStack getUpdated(ItemStack item, Player target) { + if (item == null) { + return null; + } + if (item.getType() == Material.AIR) + return item; + return getUpdated(MMOLib.plugin.getVersion().getWrapper().getNBTItem(item), target); } - public ItemStack getUpdated(NBTItem item) { + public ItemStack getUpdated(NBTItem item, Player target) { /* - * If the item type is null, then it is not an mmoitem and it does not - * need to be updated - */ - Type type = item.getType(); - if (type == null) + * If the item type is null, then it is not an mmoitem and it does not + * need to be updated + */ + if (item.getType() == null) return item.getItem(); - return item.getItem(); + if (!data.hasValue(item.getType(), item.getString("MMOITEMS_ITEM_ID"))) + return item.getItem(); - // String id = item.getString("MMOITEMS_ITEM_ID"); - // String path = type.getId() + "." + id; - // if (!data.containsKey(path)) - // return item.getItem(); - // - // /* - // * check the internal UUID of the item, if it does not make the one - // * stored in the item updater data then the item is outdated. - // */ - // UpdaterData did = data.get(path); - // if (did.matches(item)) - // return item.getItem(); - // - // // (funny bug fix) CLONE THE MMOITEM - // MMOItem newItemMMO = MMOItems.plugin.getItems().getMMOItem(type, - // id).clone(); - // - // /* - // * apply older gem stones, using a light MMOItem so the item does not - // * calculate every stat data from the older item. - // */ - // MMOItem itemMMO = new VolatileMMOItem(item); - // if (did.hasOption(KeepOption.KEEP_GEMS) && - // itemMMO.hasData(ItemStat.GEM_SOCKETS)) - // newItemMMO.setData(ItemStat.GEM_SOCKETS, - // itemMMO.getData(ItemStat.GEM_SOCKETS)); - // - // if (did.hasOption(KeepOption.KEEP_SOULBOUND) && - // itemMMO.hasData(ItemStat.SOULBOUND)) - // newItemMMO.setData(ItemStat.SOULBOUND, - // itemMMO.getData(ItemStat.SOULBOUND)); - // - // // if (did.hasOption(KeepOption.KEEP_SKIN) && itemMMO.hasData(stat)) - // - // // apply amount - // ItemStack newItem = newItemMMO.newBuilder().build(); - // newItem.setAmount(item.getItem().getAmount()); - // - // ItemMeta newItemMeta = newItem.getItemMeta(); - // List lore = newItemMeta.getLore(); - // - // /* - // * add old enchants to the item. warning - if enabled the item will - // * remember of ANY enchant on the old item, even the enchants that - // were - // * removed! - // */ - // if (did.hasOption(KeepOption.KEEP_ENCHANTS)) - // item.getItem().getItemMeta().getEnchants().forEach((enchant, level) - // -> newItemMeta.addEnchant(enchant, level, true)); - // - // /* - // * keepLore is used to save enchants from custom enchants plugins that - // * only use lore to save enchant data - // */ - // if (did.hasOption(KeepOption.KEEP_LORE)) { - // int n = 0; - // for (String s : item.getItem().getItemMeta().getLore()) { - // if (!s.startsWith(ChatColor.GRAY + "")) - // break; - // lore.add(n++, s); - // } - // } - // - // /* - // * keep durability can be used for tools to save their durability so - // * users do not get extra durability when the item is updated - // */ - // VersionWrapper wrapper = MMOLib.plugin.getVersion().getWrapper(); - // if (did.hasOption(KeepOption.KEEP_DURABILITY) && - // wrapper.isDamageable(item.getItem()) && - // wrapper.isDamageable(newItem)) - // wrapper.applyDurability(newItem, newItemMeta, - // wrapper.getDurability(item.getItem(), item.getItem().getItemMeta())); - // - // /* - // * keep name so players who renamed the item in the anvil does not - // have - // * to rename it again - // */ - // if (did.hasOption(KeepOption.KEEP_NAME) && - // item.getItem().getItemMeta().hasDisplayName()) - // newItemMeta.setDisplayName(item.getItem().getItemMeta().getDisplayName()); - // - // newItemMeta.setLore(lore); - // newItem.setItemMeta(newItemMeta); - // return newItem; + + /* + * check the internal UUID of the item, if it does not make the one + * stored in the item updater data then the item is outdated. + */ + UpdaterData did = data.getValue(item.getType(), item.getString("MMOITEMS_ITEM_ID")); + if (did.matches(item)) + return item.getItem(); + + MMOItemTemplate template = MMOItems.plugin.getTemplates().getTemplate(item.getType(), item.getString("MMOITEMS_ITEM_ID")); + MMOItem newMMOItem = template.newBuilder(PlayerData.get(target).getRPG()).build(); + + /* + * apply older gem stones, using a light MMOItem so the item does not + * calculate every stat data from the older item. + */ + MMOItem volatileItem = new VolatileMMOItem(item); + if (did.hasOption(KeepOption.KEEP_GEMS) && volatileItem.hasData(ItemStat.GEM_SOCKETS)) + newMMOItem.replaceData(ItemStat.GEM_SOCKETS, volatileItem.getData(ItemStat.GEM_SOCKETS)); + + if (did.hasOption(KeepOption.KEEP_SOULBOUND) && volatileItem.hasData(ItemStat.SOULBOUND)) + newMMOItem.replaceData(ItemStat.SOULBOUND, volatileItem.getData(ItemStat.SOULBOUND)); + + // if (did.hasOption(KeepOption.KEEP_SKIN) && itemMMO.hasData(stat)) + + // apply amount + ItemStack newItem = newMMOItem.newBuilder().build(); + newItem.setAmount(item.getItem().getAmount()); + + ItemMeta newItemMeta = newItem.getItemMeta(); + List lore = newItemMeta.getLore(); + + /* + * add old enchants to the item. warning - if enabled the item will + * remember of ANY enchant on the old item, even the enchants that + were + * removed! + */ + if (did.hasOption(KeepOption.KEEP_ENCHANTS)) + item.getItem().getItemMeta().getEnchants().forEach((enchant, level) -> newItemMeta.addEnchant(enchant, level, true)); + + /* + * keepLore is used to save enchants from custom enchants plugins that + * only use lore to save enchant data + */ + if (did.hasOption(KeepOption.KEEP_LORE)) { + int n = 0; + for (String s : item.getItem().getItemMeta().getLore()) { + if (!s.startsWith(ChatColor.GRAY + "")) + break; + lore.add(n++, s); + } + } + + /* + * keep durability can be used for tools to save their durability so + * users do not get extra durability when the item is updated + */ + ; + if (did.hasOption(KeepOption.KEEP_DURABILITY) && item.getItem().getItemMeta() instanceof Damageable && newItemMeta instanceof Damageable) { + ((Damageable) newItemMeta).setDamage(((Damageable) item.getItem().getItemMeta()).getDamage()); + } + + + /* + * keep name so players who renamed the item in the anvil does not + have + * to rename it again + */ + if (did.hasOption(KeepOption.KEEP_NAME) && item.getItem().getItemMeta().hasDisplayName()) + newItemMeta.setDisplayName(item.getItem().getItemMeta().getDisplayName()); + + newItemMeta.setLore(lore); + newItem.setItemMeta(newItemMeta); + return newItem; } public enum KeepOption { @@ -222,7 +222,6 @@ public class UpdaterManager implements Listener { KEEP_GEMS("The item keeps its empty gem", "sockets and applied gems."), KEEP_SOULBOUND("The item keeps its soulbound data."), // KEEP_SKIN("Keep the item applied skins."), - ; private final List lore;