package me.lethunderhawk.minion.enchantedVariant.item.abstraction; import me.lethunderhawk.bazaarflux.service.Services; import me.lethunderhawk.main.Main; import me.lethunderhawk.main.util.UnItalic; import net.kyori.adventure.text.Component; import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataType; import java.util.List; /** * Abstract base class for all enchanted items */ public abstract class EnchantedItem { protected final Component displayName; protected final List lore; protected final Material baseMaterial; // Persistent Data Container key for storing item ID protected final NamespacedKey itemIdKey; private final String itemId; private final ItemStack itemStack; public EnchantedItem(String itemId, Component displayName, List lore, Material baseMaterial) { this.displayName = displayName; this.lore = lore; this.baseMaterial = baseMaterial; this.itemId = itemId; this.itemIdKey = new NamespacedKey(Services.get(Main.class), itemId); this.itemStack = createItem(); } public ItemStack getItemStack() { return itemStack; } /** * Create the ItemStack with embedded metadata */ private ItemStack createItem() { ItemStack item = new ItemStack(baseMaterial); ItemMeta meta = item.getItemMeta(); // Set visible properties meta.displayName(displayName); if (lore != null && !lore.isEmpty()) { meta.lore(lore); } // Embed the unique identifier in Persistent Data Container meta.getPersistentDataContainer().set( itemIdKey, PersistentDataType.STRING, itemId ); //meta.setHideTooltip(true); meta.addItemFlags(ItemFlag.HIDE_PLACED_ON); item.setItemMeta(UnItalic.removeItalicFromMeta(meta)); // Apply any additional customizations applyCustomizations(item); return item; } /** * Check if an ItemStack is an instance of this custom item */ public boolean isEnchantedItem(ItemStack item) { if (item == null || !item.hasItemMeta()) return false; ItemMeta meta = item.getItemMeta(); String storedId = meta.getPersistentDataContainer().get(itemIdKey, PersistentDataType.STRING); return itemId.equals(storedId); } /** * Get the custom item ID from an ItemStack */ public static String getEnchantedItemId(ItemStack item, NamespacedKey key) { if (item == null || !item.hasItemMeta()) return null; ItemMeta meta = item.getItemMeta(); return meta.getPersistentDataContainer().get(key, PersistentDataType.STRING); } /** * Template method for subclasses to add additional customizations */ protected void applyCustomizations(ItemStack item) { } // Getters public String getItemId() { return itemId; } public Component getDisplayName() { return displayName; } public Material getBaseMaterial() { return baseMaterial; } public NamespacedKey getItemIdKey() { return itemIdKey; } public String getName() { return displayName.toString(); } }