From ef0a494153ec26dfa79d1ad5bb44a1df40b081dc Mon Sep 17 00:00:00 2001 From: Krakenied Date: Sat, 13 Jul 2024 07:45:39 +0200 Subject: Fix HIDE_ATTRIBUTES for 1.20.5+ Change invalidItemStack to screaming snake case --- .../quests/bukkit/BukkitQuestsPlugin.java | 7 + .../quests/bukkit/hook/itemgetter/ItemGetter.java | 7 +- .../bukkit/hook/itemgetter/ItemGetter13.java | 12 +- .../bukkit/hook/itemgetter/ItemGetter14.java | 14 +- .../bukkit/hook/itemgetter/ItemGetter20.java | 301 +++++++++++++++++++++ .../quests/bukkit/hook/itemgetter/ItemGetter8.java | 14 +- 6 files changed, 333 insertions(+), 22 deletions(-) create mode 100644 bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter20.java (limited to 'bukkit/src') diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java index 2496ee85..6cf2c8cf 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java @@ -19,6 +19,7 @@ import com.leonardobishop.quests.bukkit.hook.essentials.EssentialsHook; import com.leonardobishop.quests.bukkit.hook.itemgetter.ItemGetter; import com.leonardobishop.quests.bukkit.hook.itemgetter.ItemGetter13; import com.leonardobishop.quests.bukkit.hook.itemgetter.ItemGetter14; +import com.leonardobishop.quests.bukkit.hook.itemgetter.ItemGetter20; import com.leonardobishop.quests.bukkit.hook.itemgetter.ItemGetter8; import com.leonardobishop.quests.bukkit.hook.papi.AbstractPlaceholderAPIHook; import com.leonardobishop.quests.bukkit.hook.papi.PlaceholderAPIHook; @@ -808,6 +809,12 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests { } private void setItemGetter() { + // Spigot 1.20.5+ + if (CompatUtils.classWithMethodExists("org.bukkit.inventory.meta.ItemMeta", "setEnchantmentGlintOverride", Boolean.class)) { + itemGetter = new ItemGetter20(this); + return; + } + // Spigot 1.14+ if (CompatUtils.classWithMethodExists("org.bukkit.inventory.meta.ItemMeta", "setCustomModelData", Integer.class)) { itemGetter = new ItemGetter14(this); diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter.java index 999a1461..f79b916b 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter.java @@ -7,7 +7,8 @@ import org.bukkit.inventory.ItemStack; public abstract class ItemGetter { - protected static final ItemStack invalidItemStack = new ItemStack(Material.STONE, 1); + protected static final ItemStack INVALID_ITEM_STACK = new ItemStack(Material.STONE, 1); + protected final BukkitQuestsPlugin plugin; public ItemGetter(BukkitQuestsPlugin plugin) { @@ -50,6 +51,8 @@ public abstract class ItemGetter { ITEM_FLAGS, UNBREAKABLE, ATTRIBUTE_MODIFIER, - CUSTOM_MODEL_DATA + CUSTOM_MODEL_DATA, + ENCHANTMENT_GLINT_OVERRIDE, + HIDE_TOOLTIP } } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter13.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter13.java index b72894fa..18ec5656 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter13.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter13.java @@ -15,9 +15,9 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.SkullMeta; -import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.UUID; /** @@ -29,7 +29,7 @@ import java.util.UUID; *
  • enchantments (with namespace support)
  • *
  • item flags
  • *
  • unbreakability (with CraftBukkit support)
  • - *
  • attribute modifiers
  • + *
  • attribute modifiers (without namespace support)
  • * * Requires at least API version 1.13. */ @@ -44,10 +44,10 @@ public class ItemGetter13 extends ItemGetter { public ItemStack getItem(String path, ConfigurationSection config, Filter... excludes) { config = config.getConfigurationSection(path); if (config == null) { - return invalidItemStack; + return INVALID_ITEM_STACK; } - List filters = Arrays.asList(excludes); + Set filters = Set.of(excludes); // type (without data) String typeString = config.getString("item", config.getString("type")); @@ -226,12 +226,12 @@ public class ItemGetter13 extends ItemGetter { @Override public ItemStack getItemStack(String typeString) { if (typeString == null) { - return invalidItemStack; + return INVALID_ITEM_STACK; } Material type = Material.getMaterial(typeString); if (type == null) { - return invalidItemStack; + return INVALID_ITEM_STACK; } return new ItemStack(type, 1); diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter14.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter14.java index c90ca99c..5ed190ba 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter14.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter14.java @@ -16,9 +16,9 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.SkullMeta; -import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.UUID; /** @@ -30,7 +30,7 @@ import java.util.UUID; *
  • enchantments (with namespace support)
  • *
  • item flags
  • *
  • unbreakability (with CraftBukkit support)
  • - *
  • attribute modifiers
  • + *
  • attribute modifiers (without namespace support)
  • *
  • custom model data
  • * * Requires at least API version 1.14. @@ -46,10 +46,10 @@ public class ItemGetter14 extends ItemGetter { public ItemStack getItem(String path, ConfigurationSection config, Filter... excludes) { config = config.getConfigurationSection(path); if (config == null) { - return invalidItemStack; + return INVALID_ITEM_STACK; } - List filters = Arrays.asList(excludes); + Set filters = Set.of(excludes); // type (without data) String typeString = config.getString("item", config.getString("type")); @@ -234,7 +234,7 @@ public class ItemGetter14 extends ItemGetter { @Override public ItemStack getItemStack(String typeString) { if (typeString == null) { - return invalidItemStack; + return INVALID_ITEM_STACK; } Material type = Material.getMaterial(typeString); @@ -244,7 +244,7 @@ public class ItemGetter14 extends ItemGetter { NamespacedKey typeKey = NamespacedKeyUtils.fromString(typeString); if (typeKey == null) { - return invalidItemStack; + return INVALID_ITEM_STACK; } type = Registry.MATERIAL.get(typeKey); @@ -252,7 +252,7 @@ public class ItemGetter14 extends ItemGetter { return new ItemStack(type, 1); } - return invalidItemStack; + return INVALID_ITEM_STACK; } @Override diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter20.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter20.java new file mode 100644 index 00000000..cca3e903 --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter20.java @@ -0,0 +1,301 @@ +package com.leonardobishop.quests.bukkit.hook.itemgetter; + +import com.google.common.collect.Multimap; +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.util.NamespacedKeyUtils; +import com.leonardobishop.quests.bukkit.util.chat.Chat; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.Registry; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeModifier; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.SkullMeta; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +/** + * Reads the following: + *
      + *
    • type (without data support, with namespace support)
    • + *
    • name
    • + *
    • lore
    • + *
    • enchantments (with namespace support)
    • + *
    • item flags
    • + *
    • unbreakability (with CraftBukkit support)
    • + *
    • attribute modifiers
    • + *
    • custom model data
    • + *
    • attribute modifiers (without namespace support)
    • // TODO: add namespace support + *
    • hide tooltip
    • + *
    + * Requires at least API version 1.20.(5). + */ +@SuppressWarnings("DuplicatedCode") +public class ItemGetter20 extends ItemGetter { + + public ItemGetter20(BukkitQuestsPlugin plugin) { + super(plugin); + } + + @Override + public ItemStack getItem(String path, ConfigurationSection config, Filter... excludes) { + config = config.getConfigurationSection(path); + if (config == null) { + return INVALID_ITEM_STACK; + } + + Set filters = Set.of(excludes); + + // type (without data) + String typeString = config.getString("item", config.getString("type")); + ItemStack item = getItemStack(typeString); + ItemMeta meta = item.getItemMeta(); + + // skull + if (meta instanceof SkullMeta skullMeta) { + String ownerName = config.getString("owner-username"); + String ownerUniqueIdString = config.getString("owner-uuid"); + String ownerBase64 = config.getString("owner-base64"); + + plugin.getSkullGetter().apply(skullMeta, ownerName, ownerUniqueIdString, ownerBase64); + } + + // name + String nameString = config.getString("name"); + if (nameString != null && !filters.contains(Filter.DISPLAY_NAME)) { + nameString = Chat.legacyColor(nameString); + + meta.setDisplayName(nameString); + } + + // lore + List loreStrings = config.getStringList("lore"); + if (!loreStrings.isEmpty() && !filters.contains(Filter.LORE)) { + loreStrings = Chat.legacyColor(loreStrings); + + meta.setLore(loreStrings); + } + + // enchantments + List enchantmentStrings = config.getStringList("enchantments"); + if (!enchantmentStrings.isEmpty() && !filters.contains(Filter.ENCHANTMENTS)) { + for (String enchantmentString : enchantmentStrings) { + String[] parts = enchantmentString.split(":"); + if (parts.length == 0) { + continue; + } + + boolean namespaced = parts.length >= 2 && parts[0].startsWith("(") && parts[1].endsWith(")"); + + Enchantment enchantment; + if (namespaced) { + String namespacedKeyString = enchantmentString.substring(1, parts[0].length() + parts[1].length()); + NamespacedKey namespacedKey = NamespacedKeyUtils.fromString(namespacedKeyString); + enchantment = Enchantment.getByKey(namespacedKey); + } else { + enchantment = Enchantment.getByName(parts[0]); + } + + if (enchantment == null) { + continue; + } + + // (namespace:key):level + // 0 1 2 + // SOME_ENUM_NAME:level + // 0 1 + int levelIndex = namespaced ? 2 : 1; + + int level = 1; + if (parts.length >= levelIndex + 1) { + try { + level = Integer.parseUnsignedInt(parts[levelIndex]); + } catch (NumberFormatException ignored) { + } + } + + meta.addEnchant(enchantment, level, true); + } + } + + // item flags + List itemFlagStrings = config.getStringList("itemflags"); + if (!itemFlagStrings.isEmpty() && !filters.contains(Filter.ITEM_FLAGS)) { + // in case some idiot adds a flag twice - not sure about its behaviour + boolean modifiersAdded = false; + + for (String itemFlagString : itemFlagStrings) { + ItemFlag itemFlag; + try { + itemFlag = ItemFlag.valueOf(itemFlagString); + } catch (IllegalArgumentException e) { + continue; + } + + if (!modifiersAdded && itemFlag == ItemFlag.HIDE_ATTRIBUTES) { + Material type = item.getType(); + + for (EquipmentSlot equipmentSlot : EquipmentSlot.values()) { + Multimap attributeModifiers = type.getDefaultAttributeModifiers(equipmentSlot); + + attributeModifiers.forEach(meta::addAttributeModifier); + } + + modifiersAdded = true; + } + + meta.addItemFlags(itemFlag); + } + } + + // unbreakability + Boolean unbreakable = (Boolean) config.get("unbreakable"); + if (unbreakable != null && !filters.contains(Filter.UNBREAKABLE)) { + meta.setUnbreakable(unbreakable); + } + + // attribute modifiers // TODO: use dedicated 1.20.5 solution + List> attributeModifierMaps = config.getMapList("attributemodifiers"); + if (!attributeModifierMaps.isEmpty() && !filters.contains(Filter.ATTRIBUTE_MODIFIER)) { + for (Map attributeModifierMap : attributeModifierMaps) { + // attribute + String attributeString = (String) attributeModifierMap.get("attribute"); + Attribute attribute; + try { + attribute = Attribute.valueOf(attributeString); + } catch (IllegalArgumentException e) { + continue; + } + + // modifier (map) + Map modifierMap = (Map) attributeModifierMap.get("modifier"); + if (modifierMap == null) { + continue; + } + + // modifier unique id + String modifierUniqueIdString = (String) modifierMap.get("uuid"); + UUID modifierUniqueId; + try { + modifierUniqueId = UUID.fromString(modifierUniqueIdString); + } catch (IllegalArgumentException e) { + modifierUniqueId = null; + } + + // modifier name + String modifierName = (String) modifierMap.get("name"); + if (modifierName == null) { + continue; + } + + // modifier amount + Object modifierAmountObject = modifierMap.get("amount"); + double modifierAmount; + if (modifierAmountObject instanceof Number modifierAmountNumber) { + modifierAmount = modifierAmountNumber.doubleValue(); + } else { + continue; + } + + // modifier operation + String modifierOperationString = (String) modifierMap.get("operation"); + AttributeModifier.Operation modifierOperation; + try { + modifierOperation = AttributeModifier.Operation.valueOf(modifierOperationString); + } catch (IllegalArgumentException e) { + continue; + } + + // modifier equipment slot + String equipmentSlotString = (String) modifierMap.get("equipmentslot"); + EquipmentSlot equipmentSlot; + try { + equipmentSlot = EquipmentSlot.valueOf(equipmentSlotString); + } catch (IllegalArgumentException e) { + equipmentSlot = null; + } + + // modifier (ctor) + AttributeModifier modifier; + if (modifierUniqueId != null) { + if (equipmentSlot != null) { + modifier = new AttributeModifier(modifierUniqueId, modifierName, modifierAmount, modifierOperation, equipmentSlot); + } else { + modifier = new AttributeModifier(modifierUniqueId, modifierName, modifierAmount, modifierOperation); + } + } else { + modifier = new AttributeModifier(modifierName, modifierAmount, modifierOperation); + } + + meta.addAttributeModifier(attribute, modifier); + } + } + + // custom model data + Integer customModelData = (Integer) config.get("custommodeldata"); + if (customModelData != null && !filters.contains(Filter.CUSTOM_MODEL_DATA)) { + meta.setCustomModelData(customModelData); + } + + // enchantment glint override + Boolean enchantmentGlintOverride = (Boolean) config.get("enchantmentglintoverride"); + if (enchantmentGlintOverride != null && !filters.contains(Filter.ENCHANTMENT_GLINT_OVERRIDE)) { + meta.setEnchantmentGlintOverride(enchantmentGlintOverride); + } + + // hide tooltip + Boolean hideTooltip = (Boolean) config.get("hidetooltip"); + if (hideTooltip != null && !filters.contains(Filter.HIDE_TOOLTIP)) { + meta.setHideTooltip(hideTooltip); + } + + item.setItemMeta(meta); + return item; + } + + @Override + public ItemStack getItemStack(String typeString) { + if (typeString == null) { + return INVALID_ITEM_STACK; + } + + Material type = Material.getMaterial(typeString); + if (type != null) { + return new ItemStack(type, 1); + } + + NamespacedKey typeKey = NamespacedKeyUtils.fromString(typeString); + if (typeKey == null) { + return INVALID_ITEM_STACK; + } + + type = Registry.MATERIAL.get(typeKey); + if (type != null) { + return new ItemStack(type, 1); + } + + return INVALID_ITEM_STACK; + } + + @Override + public boolean isValidMaterial(String typeString) { + if (Material.getMaterial(typeString) != null) { + return true; + } + + NamespacedKey typeKey = NamespacedKeyUtils.fromString(typeString); + if (typeKey == null) { + return false; + } + + return Registry.MATERIAL.get(typeKey) != null; + } +} diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter8.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter8.java index d3405a5e..3e84c522 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter8.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/itemgetter/ItemGetter8.java @@ -12,8 +12,8 @@ import org.bukkit.inventory.meta.SkullMeta; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.util.Arrays; import java.util.List; +import java.util.Set; /** * Reads the following: @@ -52,10 +52,10 @@ public class ItemGetter8 extends ItemGetter { public ItemStack getItem(String path, ConfigurationSection config, Filter... excludes) { config = config.getConfigurationSection(path); if (config == null) { - return invalidItemStack; + return INVALID_ITEM_STACK; } - List filters = Arrays.asList(excludes); + Set filters = Set.of(excludes); // type (with data) String typeString = config.getString("item", config.getString("type")); @@ -151,7 +151,7 @@ public class ItemGetter8 extends ItemGetter { @Override public ItemStack getItemStack(String typeString) { if (typeString == null) { - return invalidItemStack; + return INVALID_ITEM_STACK; } Material type = Material.getMaterial(typeString); @@ -161,19 +161,19 @@ public class ItemGetter8 extends ItemGetter { String[] parts = typeString.split(":"); if (parts.length != 2) { - return invalidItemStack; + return INVALID_ITEM_STACK; } type = Material.getMaterial(parts[0]); if (type == null) { - return invalidItemStack; + return INVALID_ITEM_STACK; } byte data; try { data = Byte.parseByte(parts[1]); } catch (NumberFormatException ignored) { - return invalidItemStack; + return INVALID_ITEM_STACK; } return new ItemStack(type, 1, (short) 0, data); -- cgit v1.2.3-70-g09d2