Support ItemFlags on items loaded from hand, see #557

This commit is contained in:
BuildTools 2018-12-05 14:29:38 -05:00
parent 2bfe3b0ec5
commit 8a27ffeeaa
2 changed files with 37 additions and 9 deletions

View File

@ -24,6 +24,7 @@ import org.bukkit.ChatColor;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory; import org.bukkit.inventory.PlayerInventory;
@ -419,11 +420,13 @@ public class Quest {
if (i.getEnchantments().isEmpty()) { if (i.getEnchantments().isEmpty()) {
text = "- " + ChatColor.DARK_AQUA + ChatColor.ITALIC + i.getItemMeta().getDisplayName() + ChatColor.RESET + ChatColor.GRAY + " x " + i.getAmount(); text = "- " + ChatColor.DARK_AQUA + ChatColor.ITALIC + i.getItemMeta().getDisplayName() + ChatColor.RESET + ChatColor.GRAY + " x " + i.getAmount();
} else { } else {
text = "- " + ChatColor.DARK_AQUA + ChatColor.ITALIC + i.getItemMeta().getDisplayName() + ChatColor.RESET + ChatColor.GRAY + " " + Lang.get(player, "with") text = "- " + ChatColor.DARK_AQUA + ChatColor.ITALIC + i.getItemMeta().getDisplayName() + ChatColor.RESET;
+ ChatColor.DARK_PURPLE; if (!i.getItemMeta().hasItemFlag(ItemFlag.HIDE_ENCHANTS)) {
text += ChatColor.GRAY + " " + Lang.get(player, "with") + ChatColor.DARK_PURPLE;
for (Entry<Enchantment, Integer> e : i.getEnchantments().entrySet()) { for (Entry<Enchantment, Integer> e : i.getEnchantments().entrySet()) {
text += " " + Quester.prettyEnchantmentString(e.getKey()) + ":" + e.getValue(); text += " " + Quester.prettyEnchantmentString(e.getKey()) + ":" + e.getValue();
} }
}
text += ChatColor.GRAY + " x " + i.getAmount(); text += ChatColor.GRAY + " x " + i.getAmount();
} }
} else if (i.getDurability() != 0) { } else if (i.getDurability() != 0) {
@ -440,10 +443,13 @@ public class Quest {
if (i.getEnchantments().isEmpty()) { if (i.getEnchantments().isEmpty()) {
text = "- " + ChatColor.DARK_GREEN + ItemUtil.getName(i) + ChatColor.GRAY + " x " + i.getAmount(); text = "- " + ChatColor.DARK_GREEN + ItemUtil.getName(i) + ChatColor.GRAY + " x " + i.getAmount();
} else { } else {
text = "- " + ChatColor.DARK_GREEN + ItemUtil.getName(i) + ChatColor.GRAY + " " + Lang.get(player, "with"); text = "- " + ChatColor.DARK_GREEN + ItemUtil.getName(i);
if (!i.getItemMeta().hasItemFlag(ItemFlag.HIDE_ENCHANTS)) {
text += ChatColor.GRAY + " " + Lang.get(player, "with");
for (Entry<Enchantment, Integer> e : i.getEnchantments().entrySet()) { for (Entry<Enchantment, Integer> e : i.getEnchantments().entrySet()) {
text += " " + Quester.prettyEnchantmentString(e.getKey()) + ":" + e.getValue(); text += " " + Quester.prettyEnchantmentString(e.getKey()) + ":" + e.getValue();
} }
}
text += ChatColor.GRAY + " x " + i.getAmount(); text += ChatColor.GRAY + " x " + i.getAmount();
} }
} }

View File

@ -26,6 +26,7 @@ import org.bukkit.Material;
import org.bukkit.configuration.serialization.ConfigurationSerialization; import org.bukkit.configuration.serialization.ConfigurationSerialization;
import org.bukkit.configuration.serialization.DelegateDeserialization; import org.bukkit.configuration.serialization.DelegateDeserialization;
import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.EnchantmentStorageMeta; import org.bukkit.inventory.meta.EnchantmentStorageMeta;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
@ -80,6 +81,11 @@ public class ItemUtil {
} else if (one.getItemMeta().hasLore() && two.getItemMeta().hasLore() && one.getItemMeta().getLore().equals(two.getItemMeta().getLore()) == false) { } else if (one.getItemMeta().hasLore() && two.getItemMeta().hasLore() && one.getItemMeta().getLore().equals(two.getItemMeta().getLore()) == false) {
return -4; return -4;
} }
for (ItemFlag flag : ItemFlag.values()) {
if (one.getItemMeta().hasItemFlag(flag) == false && two.getItemMeta().hasItemFlag(flag)) {
return -4;
}
}
} }
if (one.getEnchantments().equals(two.getEnchantments()) == false) { if (one.getEnchantments().equals(two.getEnchantments()) == false) {
return -5; return -5;
@ -126,7 +132,8 @@ public class ItemUtil {
/** /**
* Get ItemStack from formatted string. See serialize() for reverse function. * Get ItemStack from formatted string. See serialize() for reverse function.
* *
* <p>Supplied format = name-name:amount-amount:data-data:enchantment-enchantment level:displayname-displayname:lore-lore: * <p>Supplied format = name-name:amount-amount:data-data:enchantment-enchantment level:displayname-displayname:lore-lore
* <p>May continue with extraneous data such as :ItemFlags-flags:stored-enchants:{enc, level}:interal-hashstring
* *
* @param data formatted string * @param data formatted string
* @return ItemStack, or null if invalid format * @return ItemStack, or null if invalid format
@ -144,6 +151,7 @@ public class ItemUtil {
Map<Enchantment, Integer> enchs = new HashMap<Enchantment, Integer>(); Map<Enchantment, Integer> enchs = new HashMap<Enchantment, Integer>();
String display = null; String display = null;
LinkedList<String> lore = new LinkedList<String>(); LinkedList<String> lore = new LinkedList<String>();
ItemFlag[] flags = new ItemFlag[ItemFlag.values().length];
LinkedHashMap<Enchantment, Integer> stored = new LinkedHashMap<Enchantment, Integer>(); LinkedHashMap<Enchantment, Integer> stored = new LinkedHashMap<Enchantment, Integer>();
LinkedHashMap<String, Object> extra = new LinkedHashMap<String, Object>(); LinkedHashMap<String, Object> extra = new LinkedHashMap<String, Object>();
ItemMeta meta = null; ItemMeta meta = null;
@ -161,13 +169,22 @@ public class ItemUtil {
try { try {
enchs.put(Quests.getEnchantment(temp[0]), Integer.parseInt(temp[1])); enchs.put(Quests.getEnchantment(temp[0]), Integer.parseInt(temp[1]));
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
Bukkit.getLogger().severe("[Quests] The enchantment name \'" + temp[0] + "\' is invalid. Make sure quests.yml is UTF-8 encoded"); Bukkit.getLogger().severe("The enchantment name \'" + temp[0] + "\' is invalid. Make sure quests.yml is UTF-8 encoded");
return null; return null;
} }
} else if (arg.startsWith("displayname-")) { } else if (arg.startsWith("displayname-")) {
display = ChatColor.translateAlternateColorCodes('&', arg.substring(12)); display = ChatColor.translateAlternateColorCodes('&', arg.substring(12));
} else if (arg.startsWith("lore-")) { } else if (arg.startsWith("lore-")) {
lore.add(ChatColor.translateAlternateColorCodes('&', arg.substring(5))); lore.add(ChatColor.translateAlternateColorCodes('&', arg.substring(5)));
} else if (arg.startsWith("ItemFlags-")) {
int dash = arg.lastIndexOf('-');
String value = arg.substring(dash + 1);
String[] mapping = value.replace("[", "").replace("]", "").split(", ");
int index = 0;
for (String s : mapping) {
flags[index] = ItemFlag.valueOf(s);
index++;
}
} else if (arg.startsWith("stored-enchants")) { } else if (arg.startsWith("stored-enchants")) {
int dash = arg.lastIndexOf('-'); int dash = arg.lastIndexOf('-');
String value = arg.substring(dash + 1); String value = arg.substring(dash + 1);
@ -238,6 +255,11 @@ public class ItemUtil {
if (!lore.isEmpty()) { if (!lore.isEmpty()) {
meta.setLore(lore); meta.setLore(lore);
} }
if (flags[0] != null && flags[0].toString() != "") {
for (ItemFlag flag : flags) {
meta.addItemFlags(flag);
}
}
if (stack.getType().equals(Material.ENCHANTED_BOOK)) { if (stack.getType().equals(Material.ENCHANTED_BOOK)) {
esmeta = (EnchantmentStorageMeta) meta; esmeta = (EnchantmentStorageMeta) meta;
for (Entry<Enchantment, Integer> e : stored.entrySet()) { for (Entry<Enchantment, Integer> e : stored.entrySet()) {