EnchantedItem.java 3.3 KB

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