EnchantedItem.java 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package me.lethunderhawk.minion.enchantedVariant.item.abstraction;
  2. import me.lethunderhawk.main.Main;
  3. import me.lethunderhawk.main.util.UnItalic;
  4. import net.kyori.adventure.text.Component;
  5. import org.bukkit.Material;
  6. import org.bukkit.NamespacedKey;
  7. import org.bukkit.inventory.ItemFlag;
  8. import org.bukkit.inventory.ItemStack;
  9. import org.bukkit.inventory.meta.ItemMeta;
  10. import org.bukkit.persistence.PersistentDataType;
  11. import java.util.List;
  12. /**
  13. * Abstract base class for all enchanted items
  14. */
  15. public abstract class EnchantedItem {
  16. protected final Component displayName;
  17. protected final List<Component> lore;
  18. protected final Material baseMaterial;
  19. // Persistent Data Container key for storing item ID
  20. protected final NamespacedKey itemIdKey;
  21. private final String itemId;
  22. private final ItemStack itemStack;
  23. public EnchantedItem(String itemId, Component displayName, List<Component> lore, Material baseMaterial) {
  24. this.displayName = displayName;
  25. this.lore = lore;
  26. this.baseMaterial = baseMaterial;
  27. this.itemId = itemId;
  28. this.itemIdKey = new NamespacedKey(Main.getInstance(), itemId);
  29. this.itemStack = createItem();
  30. }
  31. public ItemStack getItemStack() {
  32. return itemStack;
  33. }
  34. /**
  35. * Create the ItemStack with embedded metadata
  36. */
  37. private ItemStack createItem() {
  38. ItemStack item = new ItemStack(baseMaterial);
  39. ItemMeta meta = item.getItemMeta();
  40. // Set visible properties
  41. meta.displayName(displayName);
  42. if (lore != null && !lore.isEmpty()) {
  43. meta.lore(lore);
  44. }
  45. // Embed the unique identifier in Persistent Data Container
  46. meta.getPersistentDataContainer().set(
  47. itemIdKey,
  48. PersistentDataType.STRING,
  49. itemId
  50. );
  51. //meta.setHideTooltip(true);
  52. meta.addItemFlags(ItemFlag.HIDE_PLACED_ON);
  53. item.setItemMeta(UnItalic.removeItalicFromMeta(meta));
  54. // Apply any additional customizations
  55. applyCustomizations(item);
  56. return item;
  57. }
  58. /**
  59. * Check if an ItemStack is an instance of this custom item
  60. */
  61. public boolean isEnchantedItem(ItemStack item) {
  62. if (item == null || !item.hasItemMeta()) return false;
  63. ItemMeta meta = item.getItemMeta();
  64. String storedId = meta.getPersistentDataContainer().get(itemIdKey, PersistentDataType.STRING);
  65. return itemId.equals(storedId);
  66. }
  67. /**
  68. * Get the custom item ID from an ItemStack
  69. */
  70. public static String getEnchantedItemId(ItemStack item, NamespacedKey key) {
  71. if (item == null || !item.hasItemMeta()) return null;
  72. ItemMeta meta = item.getItemMeta();
  73. return meta.getPersistentDataContainer().get(key, PersistentDataType.STRING);
  74. }
  75. /**
  76. * Template method for subclasses to add additional customizations
  77. */
  78. protected void applyCustomizations(ItemStack item) {
  79. }
  80. // Getters
  81. public String getItemId() { return itemId; }
  82. public Component getDisplayName() { return displayName; }
  83. public Material getBaseMaterial() { return baseMaterial; }
  84. public NamespacedKey getItemIdKey() { return itemIdKey; }
  85. public String getName() {
  86. return displayName.toString();
  87. }
  88. }