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;