diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/type/Type.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/type/Type.java index cd0cb355..247841d9 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/type/Type.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/type/Type.java @@ -2,10 +2,22 @@ package com.hibiscusmc.hmccosmetics.gui.type; import com.hibiscusmc.hmccosmetics.cosmetic.CosmeticHolder; import com.hibiscusmc.hmccosmetics.user.CosmeticUser; +import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; +import me.lojosho.hibiscuscommons.hooks.Hooks; import me.lojosho.shaded.configurate.ConfigurationNode; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextDecoration; +import net.kyori.adventure.text.minimessage.MiniMessage; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.SkullMeta; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; public abstract class Type { @@ -48,4 +60,59 @@ public abstract class Type { * @deprecated Override {@link #setItem(Player, CosmeticHolder, ConfigurationNode, ItemStack, int)} instead. */ public abstract ItemStack setItem(CosmeticUser user, ConfigurationNode config, ItemStack itemStack, int slot); + + @Contract("_, _ -> param2") + @NotNull + @SuppressWarnings("Duplicates") + protected ItemMeta processItemMeta(Player viewer, @NotNull ItemMeta itemMeta) { + // New implementation - Paper and forks + // I know this is a kinda batshit way to do it (with serializing and deserializing MiniMessage) + // But currently I can't think of another good way of doing it without a big refactor. I'll come back to this + // At a later date. + if (HibiscusCommonsPlugin.isOnPaper()) { + List processedLore = new ArrayList<>(); + if (itemMeta.hasDisplayName()) { + String displayName = MiniMessage.miniMessage().serialize(itemMeta.displayName()); + displayName = Hooks.processPlaceholders(viewer, displayName); + itemMeta.displayName(MiniMessage.miniMessage().deserialize(displayName).decorationIfAbsent(TextDecoration.ITALIC, TextDecoration.State.FALSE)); + } + + if (itemMeta.hasLore()) { + for (Component loreLine : itemMeta.lore()) { + String loreStringLine = MiniMessage.miniMessage().serialize(loreLine); + loreStringLine = Hooks.processPlaceholders(viewer, loreStringLine); + processedLore.add(MiniMessage.miniMessage().deserialize(loreStringLine).decorationIfAbsent(TextDecoration.ITALIC, TextDecoration.State.FALSE)); + } + } + + if (itemMeta instanceof SkullMeta skullMeta) { + if (skullMeta.hasOwner() && skullMeta.getOwner() != null) { + skullMeta.setOwner(Hooks.processPlaceholders(viewer, skullMeta.getOwner())); + } + } + + itemMeta.lore(processedLore); + } else { + // Legacy implementation - Spigot + List processedLore = new ArrayList<>(); + if (itemMeta.hasDisplayName()) { + itemMeta.setDisplayName(Hooks.processPlaceholders(viewer, itemMeta.getDisplayName())); + } + + if (itemMeta.hasLore()) { + for (String loreLine : itemMeta.getLore()) { + processedLore.add(Hooks.processPlaceholders(viewer, loreLine)); + } + } + + if (itemMeta instanceof SkullMeta skullMeta) { + if (skullMeta.hasOwner() && skullMeta.getOwner() != null) { + skullMeta.setOwner(Hooks.processPlaceholders(viewer, skullMeta.getOwner())); + } + } + itemMeta.setLore(processedLore); + } + + return itemMeta; + } } diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/type/types/TypeCosmetic.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/type/types/TypeCosmetic.java index c4679812..8d19990e 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/type/types/TypeCosmetic.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/type/types/TypeCosmetic.java @@ -20,9 +20,6 @@ import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.inventory.meta.SkullMeta; -import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -139,7 +136,7 @@ public class TypeCosmetic extends Type { @Override public ItemStack setItem(@NotNull Player viewer, @NotNull CosmeticHolder cosmeticHolder, @NotNull ConfigurationNode config, @NotNull ItemStack itemStack, int slot) { - if (itemStack.hasItemMeta()) itemStack.setItemMeta(processLoreLines(viewer, itemStack.getItemMeta())); + if (itemStack.hasItemMeta()) itemStack.setItemMeta(processItemMeta(viewer, itemStack.getItemMeta())); else MessagesUtil.sendDebugMessages("ItemStack has no ItemMeta?"); if (config.node("cosmetic").virtual()) { @@ -164,7 +161,7 @@ public class TypeCosmetic extends Type { } catch (SerializationException e) { throw new RuntimeException(e); } - if (itemStack.hasItemMeta()) itemStack.setItemMeta(processLoreLines(viewer, itemStack.getItemMeta())); + if (itemStack.hasItemMeta()) itemStack.setItemMeta(processItemMeta(viewer, itemStack.getItemMeta())); else MessagesUtil.sendDebugMessages("ItemStack has no ItemMeta in equipped item?"); return itemStack; } @@ -182,35 +179,10 @@ public class TypeCosmetic extends Type { } catch (SerializationException e) { throw new RuntimeException(e); } - if (itemStack.hasItemMeta()) itemStack.setItemMeta(processLoreLines(viewer, itemStack.getItemMeta())); + if (itemStack.hasItemMeta()) itemStack.setItemMeta(processItemMeta(viewer, itemStack.getItemMeta())); else MessagesUtil.sendDebugMessages("ItemStack has no ItemMeta in locked item?"); return itemStack; } return itemStack; } - - @Contract("_, _ -> param2") - @NotNull - @SuppressWarnings("Duplicates") - private ItemMeta processLoreLines(Player viewer, @NotNull ItemMeta itemMeta) { - List processedLore = new ArrayList<>(); - - if (itemMeta.hasDisplayName()) { - itemMeta.setDisplayName(Hooks.processPlaceholders(viewer, itemMeta.getDisplayName())); - } - - if (itemMeta.hasLore()) { - for (String loreLine : itemMeta.getLore()) { - processedLore.add(Hooks.processPlaceholders(viewer, loreLine)); - } - } - - if (itemMeta instanceof SkullMeta skullMeta) { - if (skullMeta.hasOwner() && skullMeta.getOwner() != null) { - skullMeta.setOwner(Hooks.processPlaceholders(viewer, skullMeta.getOwner())); - } - } - itemMeta.setLore(processedLore); - return itemMeta; - } } diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/type/types/TypeEmpty.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/type/types/TypeEmpty.java index 38d52f85..e94889d3 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/type/types/TypeEmpty.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/gui/type/types/TypeEmpty.java @@ -4,14 +4,12 @@ import com.hibiscusmc.hmccosmetics.cosmetic.CosmeticHolder; import com.hibiscusmc.hmccosmetics.gui.action.Actions; import com.hibiscusmc.hmccosmetics.gui.type.Type; import com.hibiscusmc.hmccosmetics.user.CosmeticUser; -import me.lojosho.hibiscuscommons.hooks.Hooks; import me.lojosho.shaded.configurate.ConfigurationNode; import me.lojosho.shaded.configurate.serialize.SerializationException; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.inventory.meta.SkullMeta; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -78,27 +76,9 @@ public class TypeEmpty extends Type { @Override @SuppressWarnings("Duplicates") public ItemStack setItem(Player viewer, CosmeticHolder cosmeticHolder, ConfigurationNode config, @NotNull ItemStack itemStack, int slot) { - List processedLore = new ArrayList<>(); ItemMeta itemMeta = itemStack.getItemMeta(); - if (itemMeta.hasDisplayName()) { - itemMeta.setDisplayName(Hooks.processPlaceholders(viewer, itemMeta.getDisplayName())); - } - - if (itemMeta.hasLore()) { - for (String loreLine : itemMeta.getLore()) { - processedLore.add(Hooks.processPlaceholders(viewer, loreLine)); - } - } - - if (itemMeta instanceof SkullMeta skullMeta) { - if (skullMeta.hasOwner() && skullMeta.getOwner() != null) { - skullMeta.setOwner(Hooks.processPlaceholders(viewer, skullMeta.getOwner())); - } - } - - itemMeta.setLore(processedLore); - itemStack.setItemMeta(itemMeta); + itemStack.setItemMeta(processItemMeta(viewer, itemMeta)); return itemStack; }