package me.unurled.sacredrealms.sr.utils; import static me.unurled.sacredrealms.sr.utils.Component.comp; import static me.unurled.sacredrealms.sr.utils.Component.textComp; import static me.unurled.sacredrealms.sr.utils.SRPlayerUtils.syncSRToPlayer; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.atomic.AtomicReference; import me.unurled.sacredrealms.sr.components.attributes.Attribute; import me.unurled.sacredrealms.sr.components.item.Item; import me.unurled.sacredrealms.sr.components.item.ItemManager; import me.unurled.sacredrealms.sr.components.player.PlayerManager; import me.unurled.sacredrealms.sr.components.player.SRPlayer; import me.unurled.sacredrealms.sr.managers.Manager; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.EntityEquipment; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; import org.jetbrains.annotations.NotNull; @SuppressWarnings("UnusedReturnValue") public class Items { private Items() {} public static @NotNull ItemStack cancelItem() { ItemStack cancel = new ItemStack(Material.BARRIER); ItemMeta cancelMeta = cancel.getItemMeta(); cancelMeta.displayName(textComp("Cancel")); cancel.setItemMeta(cancelMeta); return cancel; } public static @NotNull ItemStack glassPane() { ItemStack itemStack = new ItemStack(Material.GRAY_STAINED_GLASS_PANE); ItemMeta itemMeta = itemStack.getItemMeta(); itemMeta.displayName(textComp("")); itemStack.setItemMeta(itemMeta); return itemStack; } public static @NotNull Double getTotalAttribute(@NotNull Player player, Attribute attribute) { return getTotalAttribute(player.getEquipment(), attribute); } public static @NotNull Double getTotalAttribute(EntityEquipment inv, Attribute attribute) { ItemManager im = Manager.getInstance(ItemManager.class); if (im == null) return 0.0; AtomicReference total = new AtomicReference<>(0.0); Arrays.stream(inv.getArmorContents()) .toList() .forEach(item -> total.updateAndGet(v -> (v + getAttribute(item, attribute)))); total.updateAndGet(v -> (v + getAttribute(inv.getItemInMainHand(), attribute))); total.updateAndGet(v -> (v + getAttribute(inv.getItemInOffHand(), attribute))); return total.get(); } public static Double getAttribute(ItemStack item, Attribute attribute) { ItemManager im = Manager.getInstance(ItemManager.class); if (im == null) return 0.0; if (item == null) return 0.0; if (item.getType().equals(Material.AIR)) return 0.0; PersistentDataContainer p = item.getItemMeta().getPersistentDataContainer(); if (p.has(ItemManager.ID, PersistentDataType.STRING)) { Item i = im.getItem(p.get(ItemManager.ID, PersistentDataType.STRING)); if (i != null) { return i.getAttribute(attribute); } } if (p.has(attribute.getKey(), PersistentDataType.DOUBLE)) { try { return p.get(attribute.getKey(), PersistentDataType.DOUBLE); } catch (Exception e) { return 0.0; } } return 0.0; } /** * @param stack the itemstack * @return the itemstack with lore */ public static ItemStack lore(ItemStack stack) { ItemManager im = Manager.getInstance(ItemManager.class); if (im == null) return stack; if (stack == null) return stack; if (stack.getType().equals(Material.AIR)) return stack; PersistentDataContainer p = stack.getItemMeta().getPersistentDataContainer(); if (!p.has(ItemManager.ID, PersistentDataType.STRING)) return stack; Item item = im.getItem(p.get(ItemManager.ID, PersistentDataType.STRING)); List lore = new ArrayList<>(); lore.add(comp("" + item.getRarity().getName())); lore.add(comp("" + item.getDescription())); if (!item.getAttributes().isEmpty()) { lore.add(comp("Attributes:")); item.getAttributes() .forEach( (k, v) -> lore.add( comp( " ➤ " + k.getName() + ": " + (v < 0 ? "" : "") + "+" + v))); } if (!item.getAbilities().isEmpty()) { lore.add(comp("Abilities:")); item.getAbilities() .forEach( a -> { lore.add(comp(" ➤ " + a.name() + ", " + a.getDescription())); lore.add(comp(" cooldown: " + a.getCooldown() + "s,")); lore.add(comp(" damage: " + a.getDamage() + ",")); lore.add(comp(" mana cost: " + a.getManaCost())); }); } if (!item.getEnchantments().isEmpty()) { lore.add(comp("Enchantments:")); item.getEnchantments() .forEach( (k, v) -> lore.add(comp(" ➤ " + k.name() + " " + v))); } stack.lore(lore); return stack; } public static void updatePlayer(@NotNull Player player, ItemStack oldItem, ItemStack newItem) { PlayerManager pm = Manager.getInstance(PlayerManager.class); if (pm == null) { return; } SRPlayer p = pm.getPlayer(player.getUniqueId()); if (p == null) { return; } ItemManager im = Manager.getInstance(ItemManager.class); if (im == null) { return; } // remove status of old Item if (oldItem != null && !oldItem.getType().equals(Material.AIR)) { for (Attribute a : Attribute.values()) { p.removeItemAttributes(a, oldItem); } } // add status of new Item if (newItem != null && !newItem.getType().equals(Material.AIR)) { for (Attribute a : Attribute.values()) { p.setItemAttributes(a, newItem, getAttribute(newItem, a)); } } syncSRToPlayer(p, player); } }