This commit is contained in:
rockyhawk64 2025-07-19 13:10:52 +10:00
parent 74d73aa0de
commit 54be917af7
29 changed files with 197 additions and 220 deletions

View File

@ -111,7 +111,7 @@
<dependency>
<groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId>
<version>1.21.7-R0.1-SNAPSHOT</version>
<version>1.21.8-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>

View File

@ -1,4 +1,4 @@
version: 4.0.1
version: 4.0.2
main: me.rockyhawk.commandpanels.CommandPanels
name: CommandPanels
author: RockyHawk

View File

@ -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;

View File

@ -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;
}

View File

@ -35,7 +35,7 @@ public class SimpleForm {
List<FloodgateButton> 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;
}

View File

@ -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) {

View File

@ -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());

View File

@ -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<Pattern> patterns = new ArrayList<>(); //Load patterns in order top to bottom
List<Pattern> 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;
}

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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<Enchantment,Integer> 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;
}

View File

@ -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;
}
}

View File

@ -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<String, Color> 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);
}};
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;

View File

@ -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!");

View File

@ -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();
}
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<String> lore = panelItem.lore();
if (!lore.isEmpty()) {
List<Component> 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
);
}
}

View File

@ -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() {

View File

@ -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;
}
}

View File

@ -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] <levels|points> <amount>");
return false;

View File

@ -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,

View File

@ -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());
}
}

View File

@ -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;