diff --git a/pom.xml b/pom.xml index d90034d..44e2c15 100644 --- a/pom.xml +++ b/pom.xml @@ -111,7 +111,7 @@ io.papermc.paper paper-api - 1.21.7-R0.1-SNAPSHOT + 1.21.8-R0.1-SNAPSHOT provided diff --git a/resource/plugin.yml b/resource/plugin.yml index 5fb6b14..b8faac7 100644 --- a/resource/plugin.yml +++ b/resource/plugin.yml @@ -1,4 +1,4 @@ -version: 4.0.1 +version: 4.0.2 main: me.rockyhawk.commandpanels.CommandPanels name: CommandPanels author: RockyHawk diff --git a/src/me/rockyhawk/commandpanels/Context.java b/src/me/rockyhawk/commandpanels/Context.java index a0ebf28..7aa9d82 100644 --- a/src/me/rockyhawk/commandpanels/Context.java +++ b/src/me/rockyhawk/commandpanels/Context.java @@ -2,7 +2,6 @@ package me.rockyhawk.commandpanels; import me.rockyhawk.commandpanels.commands.MainCommand; import me.rockyhawk.commandpanels.commands.TabComplete; -import me.rockyhawk.commandpanels.commands.subcommands.GenerateCommand; import me.rockyhawk.commandpanels.formatter.Placeholders; import me.rockyhawk.commandpanels.formatter.TextFormatter; import me.rockyhawk.commandpanels.formatter.data.DataLoader; diff --git a/src/me/rockyhawk/commandpanels/builder/floodgate/CustomForm.java b/src/me/rockyhawk/commandpanels/builder/floodgate/CustomForm.java index df6454e..58c1ea8 100644 --- a/src/me/rockyhawk/commandpanels/builder/floodgate/CustomForm.java +++ b/src/me/rockyhawk/commandpanels/builder/floodgate/CustomForm.java @@ -35,7 +35,7 @@ public class CustomForm { // Build the form inputs in order for (int i = 0; i < panel.getOrder().size(); i++) { if (!panel.getOrder().containsKey(String.valueOf(i))) { - ctx.text.sendError(player, "Panel order is missing a number"); + ctx.text.sendError(player, "Panel layout is missing/skipping a number."); return; } diff --git a/src/me/rockyhawk/commandpanels/builder/floodgate/SimpleForm.java b/src/me/rockyhawk/commandpanels/builder/floodgate/SimpleForm.java index 253e353..c301d89 100644 --- a/src/me/rockyhawk/commandpanels/builder/floodgate/SimpleForm.java +++ b/src/me/rockyhawk/commandpanels/builder/floodgate/SimpleForm.java @@ -35,7 +35,7 @@ public class SimpleForm { List buttonList = new ArrayList<>(); for (int i = 0; i < panel.getOrder().size(); i++) { if(!panel.getOrder().containsKey(String.valueOf(i))){ - ctx.text.sendError(p,"Panel order is missing a number"); + ctx.text.sendError(p,"Panel layout is missing/skipping a number."); return; } diff --git a/src/me/rockyhawk/commandpanels/builder/inventory/PanelFactory.java b/src/me/rockyhawk/commandpanels/builder/inventory/PanelFactory.java index 47a700d..c92af20 100644 --- a/src/me/rockyhawk/commandpanels/builder/inventory/PanelFactory.java +++ b/src/me/rockyhawk/commandpanels/builder/inventory/PanelFactory.java @@ -1,5 +1,7 @@ package me.rockyhawk.commandpanels.builder.inventory; +import io.papermc.paper.datacomponent.DataComponentTypes; +import io.papermc.paper.datacomponent.item.TooltipDisplay; import me.rockyhawk.commandpanels.Context; import me.rockyhawk.commandpanels.builder.inventory.items.ItemBuilder; import me.rockyhawk.commandpanels.builder.logic.ConditionNode; @@ -14,11 +16,8 @@ import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataType; -import java.util.List; - public class PanelFactory { protected final Context ctx; protected final InventoryPanelBuilder panelBuilder; @@ -87,15 +86,12 @@ public class PanelFactory { // Fill empty slots if necessary if(fill != null) { - ItemMeta meta = fill.getItemMeta(); - if(meta != null) { - // Hide the tooltip for filler items - meta.setHideTooltip(true); - // Assign data so that the updater will skip over filler items - NamespacedKey filler = new NamespacedKey(ctx.plugin, "fill_item"); - meta.getPersistentDataContainer().set(filler, PersistentDataType.STRING, "true"); - fill.setItemMeta(meta); - } + // Hide the tooltip for filler items + TooltipDisplay tooltipHidden = TooltipDisplay.tooltipDisplay().hideTooltip(true).build(); + fill.setData(DataComponentTypes.TOOLTIP_DISPLAY, tooltipHidden); + // Assign data so that the updater will skip over filler items + NamespacedKey filler = new NamespacedKey(ctx.plugin, "fill_item"); + fill.editPersistentDataContainer(c -> c.set(filler, PersistentDataType.STRING, "true")); for (int i = 0; i < inv.getSize(); i++) { ItemStack current = inv.getItem(i); if (current == null || current.getType() == Material.AIR) { diff --git a/src/me/rockyhawk/commandpanels/builder/inventory/items/ItemBuilder.java b/src/me/rockyhawk/commandpanels/builder/inventory/items/ItemBuilder.java index 51ebc9c..ae4b21f 100644 --- a/src/me/rockyhawk/commandpanels/builder/inventory/items/ItemBuilder.java +++ b/src/me/rockyhawk/commandpanels/builder/inventory/items/ItemBuilder.java @@ -2,20 +2,15 @@ package me.rockyhawk.commandpanels.builder.inventory.items; import me.rockyhawk.commandpanels.Context; import me.rockyhawk.commandpanels.builder.PanelBuilder; -import me.rockyhawk.commandpanels.builder.inventory.InventoryPanelBuilder; import me.rockyhawk.commandpanels.builder.inventory.items.itemcomponents.*; import me.rockyhawk.commandpanels.builder.inventory.items.materialcomponents.*; import me.rockyhawk.commandpanels.builder.inventory.items.utils.NameHandler; -import me.rockyhawk.commandpanels.builder.logic.ConditionNode; -import me.rockyhawk.commandpanels.builder.logic.ConditionParser; import me.rockyhawk.commandpanels.session.Panel; -import me.rockyhawk.commandpanels.session.inventory.InventoryPanel; import me.rockyhawk.commandpanels.session.inventory.PanelItem; import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataType; import org.jetbrains.annotations.NotNull; @@ -51,14 +46,12 @@ public class ItemBuilder { } // Use PersistentDataContainer for item recognition - ItemMeta meta = itemStack.getItemMeta(); NamespacedKey itemId = new NamespacedKey(ctx.plugin, "item_id"); NamespacedKey baseItemId = new NamespacedKey(ctx.plugin, "base_item_id"); NamespacedKey panelId = new NamespacedKey(ctx.plugin, "panel_id"); - meta.getPersistentDataContainer().set(itemId, PersistentDataType.STRING, item.id()); - meta.getPersistentDataContainer().set(panelId, PersistentDataType.STRING, panel.getName()); - meta.getPersistentDataContainer().set(baseItemId, PersistentDataType.STRING, item.id()); - itemStack.setItemMeta(meta); + itemStack.editPersistentDataContainer(c -> c.set(itemId, PersistentDataType.STRING, item.id())); + itemStack.editPersistentDataContainer(c -> c.set(panelId, PersistentDataType.STRING, panel.getName())); + itemStack.editPersistentDataContainer(c -> c.set(baseItemId, PersistentDataType.STRING, item.id())); // Set item to the slot return itemStack; @@ -119,9 +112,10 @@ public class ItemBuilder { // Add Item Components this.itemComponents.add(new EnchantedComponent()); this.itemComponents.add(new ItemModelComponent()); + this.itemComponents.add(new CustomModelDataComponent()); this.itemComponents.add(new TooltipComponent()); this.itemComponents.add(new BannerComponent()); - this.itemComponents.add(new LeatherArmorComponent()); + this.itemComponents.add(new LeatherColorComponent()); this.itemComponents.add(new PotionComponent()); this.itemComponents.add(new PotionColorComponent()); this.itemComponents.add(new DamageComponent()); diff --git a/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/BannerComponent.java b/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/BannerComponent.java index e795733..3b84a99 100644 --- a/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/BannerComponent.java +++ b/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/BannerComponent.java @@ -1,5 +1,7 @@ package me.rockyhawk.commandpanels.builder.inventory.items.itemcomponents; +import io.papermc.paper.datacomponent.DataComponentTypes; +import io.papermc.paper.datacomponent.item.BannerPatternLayers; import me.rockyhawk.commandpanels.Context; import me.rockyhawk.commandpanels.builder.inventory.items.ItemComponent; import me.rockyhawk.commandpanels.session.inventory.PanelItem; @@ -9,7 +11,6 @@ import org.bukkit.Registry; import org.bukkit.block.banner.Pattern; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.BannerMeta; import java.util.ArrayList; import java.util.List; @@ -20,21 +21,23 @@ public class BannerComponent implements ItemComponent { public ItemStack apply(Context ctx, ItemStack itemStack, Player player, PanelItem item) { if(item.banner().isEmpty()) return itemStack; - BannerMeta bannerMeta = (BannerMeta) itemStack.getItemMeta(); - List patterns = new ArrayList<>(); //Load patterns in order top to bottom + List patterns = new ArrayList<>(); for (String temp : item.banner()) { temp = ctx.text.parseTextToString(player,temp); String[] dyePattern = temp.split(","); patterns.add( new Pattern(DyeColor.valueOf( - dyePattern[0]), - Registry.BANNER_PATTERN.get(NamespacedKey.fromString("minecraft:" + dyePattern[1])) + dyePattern[0].toUpperCase()), + Registry.BANNER_PATTERN.get(NamespacedKey.fromString("minecraft:" + dyePattern[1].toLowerCase())) ) ); //load patterns in config: RED,STRIPE_TOP } - bannerMeta.setPatterns(patterns); - itemStack.setItemMeta(bannerMeta); + + itemStack.setData( + DataComponentTypes.BANNER_PATTERNS, + BannerPatternLayers.bannerPatternLayers().addAll(patterns) + ); return itemStack; } diff --git a/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/CustomModelDataComponent.java b/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/CustomModelDataComponent.java new file mode 100644 index 0000000..be7e699 --- /dev/null +++ b/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/CustomModelDataComponent.java @@ -0,0 +1,25 @@ +package me.rockyhawk.commandpanels.builder.inventory.items.itemcomponents; + +import io.papermc.paper.datacomponent.DataComponentTypes; +import io.papermc.paper.datacomponent.item.CustomModelData; +import me.rockyhawk.commandpanels.Context; +import me.rockyhawk.commandpanels.builder.inventory.items.ItemComponent; +import me.rockyhawk.commandpanels.session.inventory.PanelItem; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +public class CustomModelDataComponent implements ItemComponent { + + @Override + public ItemStack apply(Context ctx, ItemStack itemStack, Player player, PanelItem item) { + if(item.customModelData() == null) return itemStack; + + itemStack.setData( + DataComponentTypes.CUSTOM_MODEL_DATA, CustomModelData.customModelData().addString( + ctx.text.parseTextToString(player, item.customModelData()) + ) + ); + + return itemStack; + } +} \ No newline at end of file diff --git a/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/DamageComponent.java b/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/DamageComponent.java index 65ae306..492f59e 100644 --- a/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/DamageComponent.java +++ b/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/DamageComponent.java @@ -1,12 +1,11 @@ package me.rockyhawk.commandpanels.builder.inventory.items.itemcomponents; +import io.papermc.paper.datacomponent.DataComponentTypes; import me.rockyhawk.commandpanels.Context; import me.rockyhawk.commandpanels.builder.inventory.items.ItemComponent; import me.rockyhawk.commandpanels.session.inventory.PanelItem; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.Damageable; -import org.bukkit.inventory.meta.ItemMeta; public class DamageComponent implements ItemComponent { @@ -17,18 +16,15 @@ public class DamageComponent implements ItemComponent { //change the damage amount (placeholders accepted) //if the damage is not unbreakable and should be a value if(item.damage().equals("-1")){ - //if the player wants the item to be unbreakable. Only works in non legacy versions - ItemMeta unbreak = itemStack.getItemMeta(); - unbreak.setUnbreakable(true); - itemStack.setItemMeta(unbreak); + //if the player wants the item to be unbreakable + itemStack.setData( + DataComponentTypes.UNBREAKABLE + ); }else { - try { - Damageable itemDamage = (Damageable) itemStack.getItemMeta(); - itemDamage.setDamage(Integer.parseInt(ctx.text.parseTextToString(player, item.damage()))); - itemStack.setItemMeta(itemDamage); - } catch (Exception e) { - ctx.text.sendError(player, "Error with Item Damage for: " + item.id()); - } + itemStack.setData( + DataComponentTypes.DAMAGE, + Integer.parseInt(ctx.text.parseTextToString(player, item.damage())) + ); } return itemStack; diff --git a/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/EnchantedComponent.java b/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/EnchantedComponent.java index bbb8a53..dc0ec91 100644 --- a/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/EnchantedComponent.java +++ b/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/EnchantedComponent.java @@ -1,13 +1,20 @@ package me.rockyhawk.commandpanels.builder.inventory.items.itemcomponents; +import io.papermc.paper.datacomponent.DataComponentTypes; +import io.papermc.paper.datacomponent.item.ItemEnchantments; +import io.papermc.paper.registry.RegistryAccess; +import io.papermc.paper.registry.RegistryKey; import me.rockyhawk.commandpanels.Context; import me.rockyhawk.commandpanels.builder.inventory.items.ItemComponent; import me.rockyhawk.commandpanels.session.inventory.PanelItem; -import org.bukkit.NamespacedKey; -import org.bukkit.Registry; +import net.kyori.adventure.key.Key; +import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; +import org.intellij.lang.annotations.Subst; + +import java.util.HashMap; +import java.util.Map; public class EnchantedComponent implements ItemComponent { @@ -15,20 +22,27 @@ public class EnchantedComponent implements ItemComponent { public ItemStack apply(Context ctx, ItemStack itemStack, Player player, PanelItem item) { if(item.enchantments().isEmpty()) return itemStack; - ItemMeta EnchantMeta; - EnchantMeta = itemStack.getItemMeta(); + Map enchantments = new HashMap<>(); for(String enchantment : item.enchantments()){ - String[] enchant = ctx.text.parseTextToString(player, enchantment) + String[] value = ctx.text.parseTextToString(player, enchantment) .toLowerCase() .split("\\s"); - NamespacedKey key = enchant[0].contains(":") ? - NamespacedKey.fromString(enchant[0]) : - NamespacedKey.minecraft(enchant[0]); - EnchantMeta.addEnchant(Registry.ENCHANTMENT.get(key), Integer.parseInt(enchant[1]), true); + @Subst("") String enchant = value[0].contains(":") ? value[0] : "minecraft:" + value[0]; + int level = Integer.parseInt(value[1]); + + Enchantment enchantmentVal = RegistryAccess.registryAccess() + .getRegistry(RegistryKey.ENCHANTMENT) + .get(Key.key(enchant)); + + enchantments.put(enchantmentVal, level); } - itemStack.setItemMeta(EnchantMeta); + + itemStack.setData( + DataComponentTypes.ENCHANTMENTS, + ItemEnchantments.itemEnchantments(enchantments) + ); return itemStack; } diff --git a/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/ItemModelComponent.java b/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/ItemModelComponent.java index 9a7e0fd..88e9cec 100644 --- a/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/ItemModelComponent.java +++ b/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/ItemModelComponent.java @@ -1,12 +1,12 @@ package me.rockyhawk.commandpanels.builder.inventory.items.itemcomponents; +import io.papermc.paper.datacomponent.DataComponentTypes; import me.rockyhawk.commandpanels.Context; import me.rockyhawk.commandpanels.builder.inventory.items.ItemComponent; import me.rockyhawk.commandpanels.session.inventory.PanelItem; import org.bukkit.NamespacedKey; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; public class ItemModelComponent implements ItemComponent { @@ -14,12 +14,14 @@ public class ItemModelComponent implements ItemComponent { public ItemStack apply(Context ctx, ItemStack itemStack, Player player, PanelItem item) { if(item.itemModel() == null) return itemStack; - ItemMeta itemMeta = itemStack.getItemMeta(); - itemMeta.setItemModel( - NamespacedKey.fromString(ctx.text.parseTextToString(player, item.itemModel())) + NamespacedKey itemModel = NamespacedKey.fromString(ctx.text.parseTextToString(player, item.itemModel())); + if(itemModel == null) return itemStack; + + itemStack.setData( + DataComponentTypes.ITEM_MODEL, + itemModel ); - itemStack.setItemMeta(itemMeta); return itemStack; } } \ No newline at end of file diff --git a/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/LeatherArmorComponent.java b/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/LeatherArmorComponent.java deleted file mode 100644 index e806f12..0000000 --- a/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/LeatherArmorComponent.java +++ /dev/null @@ -1,68 +0,0 @@ -package me.rockyhawk.commandpanels.builder.inventory.items.itemcomponents; - -import me.rockyhawk.commandpanels.Context; -import me.rockyhawk.commandpanels.builder.inventory.items.ItemComponent; -import me.rockyhawk.commandpanels.session.inventory.PanelItem; -import org.bukkit.Color; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.LeatherArmorMeta; - -import java.util.HashMap; -import java.util.Map; - -public class LeatherArmorComponent implements ItemComponent { - - @Override - public ItemStack apply(Context ctx, ItemStack itemStack, Player player, PanelItem item) { - if(item.leatherArmor() == null) return itemStack; - - if (itemStack.getType() == Material.LEATHER_BOOTS || - itemStack.getType() == Material.LEATHER_LEGGINGS || - itemStack.getType() == Material.LEATHER_CHESTPLATE || - itemStack.getType() == Material.LEATHER_HELMET || - itemStack.getType() == Material.LEATHER_HORSE_ARMOR) { - - LeatherArmorMeta leatherMeta = (LeatherArmorMeta) itemStack.getItemMeta(); - String colourCode = ctx.text.parseTextToString(player, item.leatherArmor()); - - if (!colourCode.contains(",")) { - //use a color name - leatherMeta.setColor(colourCodes.get(colourCode.toUpperCase())); - } else { - //use RGB sequence - int[] colorRGB = {255, 255, 255}; - int count = 0; - for (String colourNum : colourCode.split(",")) { - colorRGB[count] = Integer.parseInt(colourNum); - count += 1; - } - leatherMeta.setColor(Color.fromRGB(colorRGB[0], colorRGB[1], colorRGB[2])); - } - itemStack.setItemMeta(leatherMeta); - } - - return itemStack; - } - - private final Map colourCodes = new HashMap<>() {{ - put("AQUA", Color.AQUA); - put("BLUE", Color.BLUE); - put("GRAY", Color.GRAY); - put("GREEN", Color.GREEN); - put("RED", Color.RED); - put("WHITE", Color.WHITE); - put("BLACK", Color.BLACK); - put("FUCHSIA", Color.FUCHSIA); - put("LIME", Color.LIME); - put("MAROON", Color.MAROON); - put("NAVY", Color.NAVY); - put("OLIVE", Color.OLIVE); - put("ORANGE", Color.ORANGE); - put("PURPLE", Color.PURPLE); - put("SILVER", Color.SILVER); - put("TEAL", Color.TEAL); - put("YELLOW", Color.YELLOW); - }}; -} \ No newline at end of file diff --git a/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/LeatherColorComponent.java b/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/LeatherColorComponent.java new file mode 100644 index 0000000..3af8337 --- /dev/null +++ b/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/LeatherColorComponent.java @@ -0,0 +1,28 @@ +package me.rockyhawk.commandpanels.builder.inventory.items.itemcomponents; + +import io.papermc.paper.datacomponent.DataComponentTypes; +import io.papermc.paper.datacomponent.item.DyedItemColor; +import me.rockyhawk.commandpanels.Context; +import me.rockyhawk.commandpanels.builder.inventory.items.ItemComponent; +import me.rockyhawk.commandpanels.session.inventory.PanelItem; +import org.bukkit.Color; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +public class LeatherColorComponent implements ItemComponent { + + @Override + public ItemStack apply(Context ctx, ItemStack itemStack, Player player, PanelItem item) { + if (item.leatherColor() == null) return itemStack; + + String[] rgb = ctx.text.parseTextToString(player, item.leatherColor()).split(","); + Color colour = Color.fromRGB(Integer.parseInt(rgb[0]), Integer.parseInt(rgb[1]), Integer.parseInt(rgb[2])); + + itemStack.setData( + DataComponentTypes.DYED_COLOR, + DyedItemColor.dyedItemColor().color(colour) + ); + + return itemStack; + } +} \ No newline at end of file diff --git a/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/PotionColorComponent.java b/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/PotionColorComponent.java index 7d29b5e..fcac243 100644 --- a/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/PotionColorComponent.java +++ b/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/PotionColorComponent.java @@ -1,12 +1,13 @@ package me.rockyhawk.commandpanels.builder.inventory.items.itemcomponents; +import io.papermc.paper.datacomponent.DataComponentTypes; +import io.papermc.paper.datacomponent.item.PotionContents; import me.rockyhawk.commandpanels.Context; import me.rockyhawk.commandpanels.builder.inventory.items.ItemComponent; import me.rockyhawk.commandpanels.session.inventory.PanelItem; import org.bukkit.Color; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.PotionMeta; public class PotionColorComponent implements ItemComponent { @@ -15,11 +16,13 @@ public class PotionColorComponent implements ItemComponent { if(item.potionColor() == null) return itemStack; String[] rgb = ctx.text.parseTextToString(player, item.potionColor()).split(","); - Color color = Color.fromRGB(Integer.parseInt(rgb[0]), Integer.parseInt(rgb[1]), Integer.parseInt(rgb[2])); - PotionMeta potionMeta = (PotionMeta) itemStack.getItemMeta(); + Color colour = Color.fromRGB(Integer.parseInt(rgb[0]), Integer.parseInt(rgb[1]), Integer.parseInt(rgb[2])); + + itemStack.setData( + DataComponentTypes.POTION_CONTENTS, + PotionContents.potionContents().customColor(colour) + ); - potionMeta.setColor(color); - itemStack.setItemMeta(potionMeta); return itemStack; } } \ No newline at end of file diff --git a/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/PotionComponent.java b/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/PotionComponent.java index ad4546d..5bef969 100644 --- a/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/PotionComponent.java +++ b/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/PotionComponent.java @@ -16,17 +16,14 @@ public class PotionComponent implements ItemComponent { //if the item is a potion, give it an effect String[] effectType = ctx.text.parseTextToString(player,item.potion()).split("\\s"); - try { - PotionMeta potionMeta = (PotionMeta) itemStack.getItemMeta(); - assert potionMeta != null; - PotionType newData = PotionType.valueOf(effectType[0].toUpperCase()); - //set meta - potionMeta.setBasePotionType(newData); - itemStack.setItemMeta(potionMeta); - } catch (Exception er) { - //don't add the effect - ctx.text.sendError(player, "Error with Potion for item: " + item.id()); - } + + PotionMeta potionMeta = (PotionMeta) itemStack.getItemMeta(); + assert potionMeta != null; + PotionType newData = PotionType.valueOf(effectType[0].toUpperCase()); + + //set meta + potionMeta.setBasePotionType(newData); + itemStack.setItemMeta(potionMeta); return itemStack; } diff --git a/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/TooltipComponent.java b/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/TooltipComponent.java index 75680c8..4c45e97 100644 --- a/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/TooltipComponent.java +++ b/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/TooltipComponent.java @@ -1,12 +1,12 @@ package me.rockyhawk.commandpanels.builder.inventory.items.itemcomponents; +import io.papermc.paper.datacomponent.DataComponentTypes; import me.rockyhawk.commandpanels.Context; import me.rockyhawk.commandpanels.builder.inventory.items.ItemComponent; import me.rockyhawk.commandpanels.session.inventory.PanelItem; import org.bukkit.NamespacedKey; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; public class TooltipComponent implements ItemComponent { @@ -14,9 +14,10 @@ public class TooltipComponent implements ItemComponent { public ItemStack apply(Context ctx, ItemStack itemStack, Player player, PanelItem item) { if(item.tooltipStyle() == null) return itemStack; - ItemMeta itemMeta = itemStack.getItemMeta(); - itemMeta.setTooltipStyle(NamespacedKey.fromString(ctx.text.parseTextToString(player, item.tooltipStyle()))); - itemStack.setItemMeta(itemMeta); + NamespacedKey tooltipStyle = NamespacedKey.fromString(ctx.text.parseTextToString(player, item.tooltipStyle())); + + itemStack.setData(DataComponentTypes.TOOLTIP_STYLE, + tooltipStyle); return itemStack; } diff --git a/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/TrimComponent.java b/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/TrimComponent.java index bcaec6e..6619f31 100644 --- a/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/TrimComponent.java +++ b/src/me/rockyhawk/commandpanels/builder/inventory/items/itemcomponents/TrimComponent.java @@ -1,5 +1,7 @@ package me.rockyhawk.commandpanels.builder.inventory.items.itemcomponents; +import io.papermc.paper.datacomponent.DataComponentTypes; +import io.papermc.paper.datacomponent.item.ItemArmorTrim; import me.rockyhawk.commandpanels.Context; import me.rockyhawk.commandpanels.builder.inventory.items.ItemComponent; import me.rockyhawk.commandpanels.session.inventory.PanelItem; @@ -7,7 +9,6 @@ import org.bukkit.NamespacedKey; import org.bukkit.Registry; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ArmorMeta; import org.bukkit.inventory.meta.trim.ArmorTrim; import org.bukkit.inventory.meta.trim.TrimMaterial; import org.bukkit.inventory.meta.trim.TrimPattern; @@ -29,17 +30,17 @@ public class TrimComponent implements ItemComponent { String trimMaterialString = trimList[0].toLowerCase(); String trimPatternString = trimList[1].toLowerCase(); - // Check if Material and Pattern are valid and the itemstack is an armor piece + // Check if Material and Pattern are valid and the item stack is an armor piece if (isTrimMaterial(trimMaterialString) && isTrimPattern(trimPatternString)) { - // Getting the correct Pattern and Material - Seems to be experimental this way + // Getting the correct Pattern and Material // Material and Pattern don't have a valueOf-function to get them the easier way. TrimMaterial trimMaterial = Registry.TRIM_MATERIAL.get(NamespacedKey.fromString("minecraft:" + trimMaterialString)); TrimPattern trimPattern = Registry.TRIM_PATTERN.get(NamespacedKey.fromString("minecraft:" + trimPatternString)); - ArmorMeta armorMeta = (ArmorMeta) itemStack.getItemMeta(); - armorMeta.setTrim(new ArmorTrim(trimMaterial, trimPattern)); - itemStack.setItemMeta(armorMeta); + ArmorTrim trim = new ArmorTrim(trimMaterial, trimPattern); + itemStack.setData(DataComponentTypes.TRIM, + ItemArmorTrim.itemArmorTrim(trim)); } return itemStack; diff --git a/src/me/rockyhawk/commandpanels/builder/inventory/items/materialcomponents/HeadDatabaseComponent.java b/src/me/rockyhawk/commandpanels/builder/inventory/items/materialcomponents/HeadDatabaseComponent.java index 909d2cb..44d06b1 100644 --- a/src/me/rockyhawk/commandpanels/builder/inventory/items/materialcomponents/HeadDatabaseComponent.java +++ b/src/me/rockyhawk/commandpanels/builder/inventory/items/materialcomponents/HeadDatabaseComponent.java @@ -19,7 +19,6 @@ public class HeadDatabaseComponent implements MaterialComponent { if (Bukkit.getServer().getPluginManager().isPluginEnabled("HeadDatabase")) { HeadDatabaseAPI api; api = new HeadDatabaseAPI(); - return api.getItemHead(head); } else { ctx.text.sendWarn(player, "Download the HeadDatabase plugin to use this feature!"); diff --git a/src/me/rockyhawk/commandpanels/builder/inventory/items/materialcomponents/ItemsAdderComponent.java b/src/me/rockyhawk/commandpanels/builder/inventory/items/materialcomponents/ItemsAdderComponent.java index b10c57c..2e171d2 100644 --- a/src/me/rockyhawk/commandpanels/builder/inventory/items/materialcomponents/ItemsAdderComponent.java +++ b/src/me/rockyhawk/commandpanels/builder/inventory/items/materialcomponents/ItemsAdderComponent.java @@ -14,9 +14,8 @@ public class ItemsAdderComponent implements MaterialComponent { } @Override - public ItemStack createItem(Context ctx, String tag, Player player, PanelItem item) { - String namespaceID = tag.split("\\s")[1]; - CustomStack stack = CustomStack.getInstance(namespaceID); + public ItemStack createItem(Context ctx, String itemID, Player player, PanelItem item) { + CustomStack stack = CustomStack.getInstance(itemID); return stack.getItemStack().clone(); } -} +} \ No newline at end of file diff --git a/src/me/rockyhawk/commandpanels/builder/inventory/items/materialcomponents/MMOItemsComponent.java b/src/me/rockyhawk/commandpanels/builder/inventory/items/materialcomponents/MMOItemsComponent.java index a0f2a90..e5eca4a 100644 --- a/src/me/rockyhawk/commandpanels/builder/inventory/items/materialcomponents/MMOItemsComponent.java +++ b/src/me/rockyhawk/commandpanels/builder/inventory/items/materialcomponents/MMOItemsComponent.java @@ -19,13 +19,9 @@ public class MMOItemsComponent implements MaterialComponent { String itemType = tag.split("\\s")[1]; String itemID = tag.split("\\s")[2]; - try { - MMOItem mmoitem = MMOItems.plugin.getMMOItem(MMOItems.plugin.getTypes().get(itemType), itemID); - if(mmoitem != null){ - return mmoitem.newBuilder().build(); - } - } catch (Exception e) { - ctx.text.sendError(player, "Error with MMOItems Material Tag: " + itemID); + MMOItem mmoitem = MMOItems.plugin.getMMOItem(MMOItems.plugin.getTypes().get(itemType), itemID); + if(mmoitem != null){ + return mmoitem.newBuilder().build(); } return null; } diff --git a/src/me/rockyhawk/commandpanels/builder/inventory/items/materialcomponents/NexoComponent.java b/src/me/rockyhawk/commandpanels/builder/inventory/items/materialcomponents/NexoComponent.java index 9f60f92..8acd313 100644 --- a/src/me/rockyhawk/commandpanels/builder/inventory/items/materialcomponents/NexoComponent.java +++ b/src/me/rockyhawk/commandpanels/builder/inventory/items/materialcomponents/NexoComponent.java @@ -16,13 +16,9 @@ public class NexoComponent implements MaterialComponent { @Override public ItemStack createItem(Context ctx, String itemID, Player player, PanelItem item) { - try { - ItemBuilder builder = NexoItems.itemFromId(itemID); - if (builder != null) { - return builder.build(); - } - } catch (Exception e) { - ctx.text.sendError(player, "Error with Nexo Material Tag: " + itemID); + ItemBuilder builder = NexoItems.itemFromId(itemID); + if (builder != null) { + return builder.build(); } return null; } diff --git a/src/me/rockyhawk/commandpanels/builder/inventory/items/utils/NameHandler.java b/src/me/rockyhawk/commandpanels/builder/inventory/items/utils/NameHandler.java index 3bc15d2..c06bb49 100644 --- a/src/me/rockyhawk/commandpanels/builder/inventory/items/utils/NameHandler.java +++ b/src/me/rockyhawk/commandpanels/builder/inventory/items/utils/NameHandler.java @@ -1,14 +1,13 @@ package me.rockyhawk.commandpanels.builder.inventory.items.utils; +import io.papermc.paper.datacomponent.DataComponentTypes; +import io.papermc.paper.datacomponent.item.ItemLore; +import io.papermc.paper.datacomponent.item.TooltipDisplay; import me.rockyhawk.commandpanels.Context; import me.rockyhawk.commandpanels.session.inventory.PanelItem; import net.kyori.adventure.text.Component; -import org.bukkit.NamespacedKey; import org.bukkit.entity.Player; -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; @@ -23,48 +22,40 @@ public class NameHandler { } public ItemStack setName(ItemStack item, PanelItem panelItem, Player player) { - ItemMeta meta = item.getItemMeta(); - if (meta == null) return item; - boolean attributes = Boolean.parseBoolean( ctx.text.parseTextToString(player,panelItem.attributes())); if (!attributes) { - hideAttributes(meta); + TooltipDisplay hideAttributes = TooltipDisplay.tooltipDisplay() + .addHiddenComponents( + DataComponentTypes.POTION_CONTENTS, + DataComponentTypes.ENCHANTMENTS, + DataComponentTypes.ATTRIBUTE_MODIFIERS, + DataComponentTypes.DYED_COLOR, + DataComponentTypes.TRIM, + DataComponentTypes.BANNER_PATTERNS + ).build(); + item.setData(DataComponentTypes.TOOLTIP_DISPLAY, hideAttributes); } boolean tooltip = Boolean.parseBoolean( ctx.text.parseTextToString(player,panelItem.tooltip())); if (!tooltip) { - meta.setHideTooltip(true); + TooltipDisplay tooltipHidden = TooltipDisplay.tooltipDisplay().hideTooltip(true).build(); + item.setData(DataComponentTypes.TOOLTIP_DISPLAY, tooltipHidden); } String name = panelItem.displayName(); if (!name.isEmpty()) { - meta.displayName(ctx.text.parseTextToComponent(player, name)); + item.setData(DataComponentTypes.ITEM_NAME, + ctx.text.parseTextToComponent(player, name)); } List lore = panelItem.lore(); if (!lore.isEmpty()) { List formattedLore = loreFormatter.format(lore, player); - meta.lore(formattedLore); + item.setData(DataComponentTypes.LORE, ItemLore.lore( + formattedLore)); } - - // Add CommandPanels PersistentData - NamespacedKey namespacedKey = new NamespacedKey(ctx.plugin, "panel_item_id"); - meta.getPersistentDataContainer().set(namespacedKey, PersistentDataType.STRING, name); - item.setItemMeta(meta); - return item; } - - private void hideAttributes(ItemMeta meta) { - meta.addItemFlags( - ItemFlag.HIDE_ENCHANTS, - ItemFlag.HIDE_ATTRIBUTES, - ItemFlag.HIDE_ARMOR_TRIM, - ItemFlag.HIDE_DYE, - ItemFlag.HIDE_UNBREAKABLE, - ItemFlag.HIDE_PLACED_ON - ); - } } \ No newline at end of file diff --git a/src/me/rockyhawk/commandpanels/formatter/TextFormatter.java b/src/me/rockyhawk/commandpanels/formatter/TextFormatter.java index e4693c0..29b10fa 100644 --- a/src/me/rockyhawk/commandpanels/formatter/TextFormatter.java +++ b/src/me/rockyhawk/commandpanels/formatter/TextFormatter.java @@ -12,6 +12,7 @@ import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; +import org.intellij.lang.annotations.Subst; import org.jetbrains.annotations.NotNull; public class TextFormatter { @@ -58,6 +59,7 @@ public class TextFormatter { return deserializeAppropriately(input); } + @Subst("") @NotNull public String parseTextToString(Player player, String input) { Component component = parseTextToComponent(player, input); @@ -75,8 +77,8 @@ public class TextFormatter { private Component deserializeAppropriately(String input) { try { Component component; - if (containsLegacyColorCodes(input)) { - component = legacySerializer.deserialize(input.replace('&', '§')); + if (containsLegacyCodes(input)) { + component = legacySerializer.deserialize(input.replaceAll("(?i)&([0-9a-fk-or])", "§$1")); } else { component = miniMessage.deserialize(input); } @@ -94,9 +96,9 @@ public class TextFormatter { } } - private boolean containsLegacyColorCodes(String input) { - // Simple check for common legacy indicators - return input.contains("&") || input.contains("§"); + // Check for legacy codes with regex + private boolean containsLegacyCodes(String input) { + return input.matches(".*&[0-9a-fk-or].*"); } public TextComponent getTag() { diff --git a/src/me/rockyhawk/commandpanels/interaction/commands/RequirementRunner.java b/src/me/rockyhawk/commandpanels/interaction/commands/RequirementRunner.java index c8a3d36..3887745 100644 --- a/src/me/rockyhawk/commandpanels/interaction/commands/RequirementRunner.java +++ b/src/me/rockyhawk/commandpanels/interaction/commands/RequirementRunner.java @@ -54,7 +54,7 @@ public class RequirementRunner { } if (!matched) { - ctx.text.sendError(player, "Unknown requirement tag: " + tag); + ctx.text.sendError(player, "Unknown requirement tag."); return false; } } diff --git a/src/me/rockyhawk/commandpanels/interaction/commands/requirements/XpTag.java b/src/me/rockyhawk/commandpanels/interaction/commands/requirements/XpTag.java index 152b850..ec2a189 100644 --- a/src/me/rockyhawk/commandpanels/interaction/commands/requirements/XpTag.java +++ b/src/me/rockyhawk/commandpanels/interaction/commands/requirements/XpTag.java @@ -14,7 +14,7 @@ public class XpTag implements RequirementTagResolver { @Override public boolean check(Context ctx, Panel panel, Player player, String args) { - String[] split = args.trim().split(" "); + String[] split = args.trim().split("\\s"); if (split.length != 2) { ctx.text.sendError(player, "Invalid XP requirement. Use: [xp] "); return false; diff --git a/src/me/rockyhawk/commandpanels/session/inventory/PanelItem.java b/src/me/rockyhawk/commandpanels/session/inventory/PanelItem.java index 9a0bb90..28d7231 100644 --- a/src/me/rockyhawk/commandpanels/session/inventory/PanelItem.java +++ b/src/me/rockyhawk/commandpanels/session/inventory/PanelItem.java @@ -24,7 +24,8 @@ public record PanelItem( ClickActions shiftRightClick, String damage, String itemModel, - String leatherArmor, + String customModelData, + String leatherColor, String armorTrim, String potionColor, String potion, @@ -50,7 +51,8 @@ public record PanelItem( ClickActions shiftRightClick, String damage, String itemModel, - String leatherArmor, + String customModelData, + String leatherColor, String armorTrim, String potionColor, String potion, @@ -75,7 +77,8 @@ public record PanelItem( this.shiftRightClick = shiftRightClick; this.damage = damage; this.itemModel = itemModel; - this.leatherArmor = leatherArmor; + this.customModelData = customModelData; + this.leatherColor = leatherColor; this.armorTrim = armorTrim; this.potionColor = potionColor; this.potion = potion; @@ -103,7 +106,8 @@ public record PanelItem( String damage = section.getString("damage", "0"); String itemModel = section.getString("item-model", null); - String leatherArmor = section.getString("leather-armor", null); + String customModelData = section.getString("custom-model-data", null); + String leatherColor = section.getString("leather-color", null); String armorTrim = section.getString("armor-trim", null); String potionColor = section.getString("potion-color", null); String potion = section.getString("potion", null); @@ -130,7 +134,8 @@ public record PanelItem( shiftRightClick, damage, itemModel, - leatherArmor, + customModelData, + leatherColor, armorTrim, potionColor, potion, diff --git a/src/me/rockyhawk/commandpanels/session/inventory/generator/resolvers/ArmorColorResolver.java b/src/me/rockyhawk/commandpanels/session/inventory/generator/resolvers/ArmorColorResolver.java index c3a5236..4071877 100644 --- a/src/me/rockyhawk/commandpanels/session/inventory/generator/resolvers/ArmorColorResolver.java +++ b/src/me/rockyhawk/commandpanels/session/inventory/generator/resolvers/ArmorColorResolver.java @@ -14,6 +14,6 @@ public class ArmorColorResolver implements ItemResolver { if (!(item.getItemMeta() instanceof LeatherArmorMeta meta)) return; Color color = meta.getColor(); - itemData.put("leather-armor", color.getRed() + "," + color.getGreen() + "," + color.getBlue()); + itemData.put("leather-color", color.getRed() + "," + color.getGreen() + "," + color.getBlue()); } } \ No newline at end of file diff --git a/src/me/rockyhawk/commandpanels/session/inventory/listeners/ClickEvents.java b/src/me/rockyhawk/commandpanels/session/inventory/listeners/ClickEvents.java index 038bb62..e15ab89 100644 --- a/src/me/rockyhawk/commandpanels/session/inventory/listeners/ClickEvents.java +++ b/src/me/rockyhawk/commandpanels/session/inventory/listeners/ClickEvents.java @@ -19,8 +19,6 @@ import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; -import java.util.List; - public class ClickEvents implements Listener { private final Context ctx;