package dev.plex.itemizerx; import java.util.HashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import org.apache.commons.lang3.StringUtils; import org.bukkit.Color; import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.block.Block; import org.bukkit.block.Sign; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.EnchantmentWrapper; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.BookMeta; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.inventory.meta.SkullMeta; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; public class ItemizerXCommand implements CommandExecutor, ItemizerXBase { final List POTIONS = Arrays.asList(Material.POTION, Material.LINGERING_POTION, Material.SPLASH_POTION); final Map COLOR_TRANSLATION = new HashMap<>(){{ put("&a", ""); put("&b", ""); put("&c", ""); put("&d", ""); put("&e", ""); put("&f", ""); put("&k", ""); put("&l", ""); put("&m", ""); put("&n", ""); put("&o", ""); put("&r", ""); put("&1", ""); put("&2", ""); put("&3", ""); put("&4", ""); put("&5", ""); put("&6", ""); put("&7", ""); put("&8", ""); put("&9", ""); put("&0", ""); }}; CoreProtectBridge cpb = new CoreProtectBridge(); MiniMessage mm = MiniMessage.miniMessage(); @Override public boolean onCommand(CommandSender sender, Command cmd, String string, String[] args) { if (!sender.hasPermission("itemizer.use")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } if (args.length == 0) { sender.sendMessage(mm.deserialize("ItemizerX v" + plugin.getDescription().getVersion() + " by " + StringUtils.join(plugin.getDescription().getAuthors(), ", "))); sender.sendMessage(mm.deserialize("Type /itemizer help for help")); return true; } if (!(sender instanceof final Player player)) { sender.sendMessage(mm.deserialize("You must be a player to execute this command!")); return true; } final ItemStack item = player.getInventory().getItemInMainHand(); final boolean hasItem = item.getType() != Material.AIR; final boolean hasPotion = POTIONS.contains(item.getType()); final boolean hasBook = item.getType() == Material.WRITTEN_BOOK; final ItemMeta meta = item.getItemMeta(); switch (args[0]) { case "help" -> { sender.sendMessage(mm.deserialize(""" =============[ItemizerX Commands]============= /itemizer name <name> - Name your item /itemizer id <id> - Change the item's material /itemizer lore - Lore editing command /itemizer potion - Potion editing command /itemizer attr - Attribute editing command /itemizer flag - Flag editing command /itemizer enchant - Enchant editing command /itemizer title <name> - Set the book's title /itemizer author <name> - Set the book's author /itemizer head <name> - Set the player of the head /itemizer sign <line> <text> - Change the line on the sign /itemizer clearall - Clears all metadata from your item""")); return true; } case "name" -> { if (!sender.hasPermission("itemizer.name")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } if (args.length == 1) { sender.sendMessage(mm.deserialize("===============[Name Commands]===============")); sender.sendMessage(mm.deserialize("/itemizer name <name> - Name your item")); } else { if (!hasItem) { sender.sendMessage(mm.deserialize("You do not have an item in your hand.")); return true; } Component name = colorize(StringUtils.join(args, " ", 1, args.length)); assert meta != null; meta.displayName(name); item.setItemMeta(meta); sender.sendMessage(mm.deserialize("The name of the item in your hand has been set to '" + mm.serialize(name) + "'")); } return true; } case "id" -> { if (!sender.hasPermission("itemizer.id")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } if (args.length == 1) { sender.sendMessage(mm.deserialize("===============[ID Commands]===============")); sender.sendMessage(mm.deserialize("/itemizer id <id> - Change the item's material")); return true; } if (!hasItem) { sender.sendMessage(mm.deserialize("You do not have an item in your hand.")); return true; } Material material = Material.matchMaterial(args[1].toUpperCase()); if (material == null) { sender.sendMessage(mm.deserialize("The material \"" + args[1] + "\" does not exist!")); return true; } item.setType(material); sender.sendMessage(mm.deserialize("The material of the item has changed to '" + material.name() + "'")); return true; } case "lore" -> { if (!sender.hasPermission("itemizer.lore")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } if (args.length == 1) { sender.sendMessage(mm.deserialize(""" ===============[Lore Commands]=============== /itemizer lore add <text> - Add a line of text to your item's lore /itemizer lore remove <index> - Remove a line of text from your item's lore /itemizer lore change <index> <text> - Change a line of text in your item's lore /itemizer lore clear - Clear the item's lore""")); return true; } if (!hasItem) { sender.sendMessage(mm.deserialize("You do not have an item in your hand.")); return true; } else { switch (args[1]) { case "add" -> { if (!sender.hasPermission("itemizer.lore.add")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } if (args.length == 2) { sender.sendMessage(mm.deserialize("===============[Lore Commands]===============")); sender.sendMessage(mm.deserialize("/itemizer lore add <text> - Add a line of text to your item's lore")); return true; } Component lore = colorize(StringUtils.join(args, " ", 2, args.length)); assert meta != null; List lores = new ArrayList<>(); if (meta.lore() != null) { lores = meta.lore(); } lores.add(lore); meta.lore(lores); item.setItemMeta(meta); sender.sendMessage(mm.deserialize("Line '" + mm.serialize(lore) + "' added to the item's lore")); return true; } case "remove" -> { if (!sender.hasPermission("itemizer.lore.remove")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } if (args.length == 2) { sender.sendMessage(mm.deserialize("===============[Lore Commands]===============")); sender.sendMessage(mm.deserialize("/itemizer lore remove <index> - Remove a line of text from your item's lore")); return true; } Integer index = parseInt(sender, args[2]); if (index == null) { return true; } assert meta != null; List lores; if (meta.lore() != null) { lores = meta.lore(); } else { sender.sendMessage(mm.deserialize("This item has no lores.")); return true; } if (index > lores.size()) { sender.sendMessage(mm.deserialize("The item's lore doesn't have line '" + index + "'")); return true; } lores.remove(index - 1); meta.lore(lores); item.setItemMeta(meta); sender.sendMessage(mm.deserialize("Line '" + index + "' removed from the item's lore")); return true; } case "change" -> { if (!sender.hasPermission("itemizer.lore.change")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } if (args.length < 4) { sender.sendMessage(mm.deserialize("===============[Lore Commands]===============")); sender.sendMessage(mm.deserialize("/itemizer lore change <index> <text> - Change a line of text in your item's lore")); return true; } Integer index = parseInt(sender, args[2]); if (index == null) { return true; } Component lore = colorize(StringUtils.join(args, " ", 3, args.length)); assert meta != null; List lores; if (meta.lore() != null) { lores = meta.lore(); } else { sender.sendMessage(mm.deserialize("This item has no lores.")); return true; } if (index > lores.size()) { sender.sendMessage(mm.deserialize("The item's lore doesn't have line '" + index + "'")); return true; } lores.set(index - 1, lore); meta.lore(lores); item.setItemMeta(meta); sender.sendMessage(mm.deserialize("Line '" + index + "' has been changed to '" + mm.serialize(lore) + "'")); return true; } case "clear" -> { if (!sender.hasPermission("itemizer.lore.clear")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } assert meta != null; if (meta.lore() == null || meta.lore().isEmpty()) { sender.sendMessage(mm.deserialize("The item has no lores.")); return true; } meta.lore(null); item.setItemMeta(meta); sender.sendMessage(mm.deserialize("The item's lore has been cleared!")); return true; } default -> { sender.sendMessage(mm.deserialize("Unknown sub-command. Type for help.")); return true; } } } } case "potion" -> { if (!sender.hasPermission("itemizer.potion")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } if (args.length == 1) { sender.sendMessage(mm.deserialize(""" ===============[Potion Commands]=============== /itemizer potion add <effect> <level> <time[tick]> - Add a potion effect /itemizer potion remove <effect> - Remove a potion effect /itemizer potion change <name> - Change the potion type /itemizer potion color <hexcolor> - Set the potion color /itemizer potion list - List all potion effects""")); return true; } if (!hasPotion) { sender.sendMessage(mm.deserialize("You do not have a potion in your hand.")); return true; } else { switch (args[1]) { case "add" -> { if (!sender.hasPermission("itemizer.potion.add")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } if (args.length < 5) { sender.sendMessage(mm.deserialize("===============[Potion Commands]===============")); sender.sendMessage(mm.deserialize("/itemizer potion add <effect> <level> <time[tick]> - Add a potion effect")); return true; } PotionEffectType potType = PotionEffectType.getByName(args[2].toUpperCase()); if (potType == null) { sender.sendMessage(mm.deserialize("The potion \"" + args[2] + "\" does not exist!")); return true; } Integer level = parseInt(sender, args[3]); Integer tick = parseInt(sender, args[4]); if (level == null || tick == null) { return true; } final PotionEffect pot = new PotionEffect(potType, tick, level); final PotionMeta potionMeta = (PotionMeta) meta; assert potionMeta != null; if (potionMeta.hasCustomEffect(pot.getType())) { sender.sendMessage(mm.deserialize("This potion already has " + pot.getType().getName())); return true; } potionMeta.addCustomEffect(pot, false); item.setItemMeta(potionMeta); sender.sendMessage(mm.deserialize(pot.getType().getName() + " has been added to the potion")); return true; } case "remove" -> { if (!sender.hasPermission("itemizer.potion.remove")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } if (args.length == 2) { sender.sendMessage(mm.deserialize("===============[Potion Commands]===============")); sender.sendMessage(mm.deserialize("/itemizer potion remove <effect> - Remove a potion effect")); return true; } PotionEffectType potType = PotionEffectType.getByName(args[2].toUpperCase()); if (potType == null) { sender.sendMessage(mm.deserialize("The potion effect \"" + args[2] + "\" does not exist!")); return true; } final PotionMeta potionMeta = (PotionMeta) meta; assert potionMeta != null; if (!potionMeta.hasCustomEffect(potType)) { sender.sendMessage(mm.deserialize("This potion does not have " + potType.getName())); return true; } potionMeta.removeCustomEffect(potType); item.setItemMeta(potionMeta); sender.sendMessage(mm.deserialize(potType.getName() + " has been removed from the potion")); return true; } case "change" -> { if (!sender.hasPermission("itemizer.potion.change")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } if (args.length == 2) { sender.sendMessage(mm.deserialize("===============[Potion Commands]===============")); sender.sendMessage(mm.deserialize("/itemizer potion change <name> - Change the potion type")); return true; } Material material = Material.matchMaterial(args[2]); if (material == null || !POTIONS.contains(material)) { sender.sendMessage(mm.deserialize(material != null ? "'" + material.name() + "' is not a potion type!" : "That material doesn't exist!")); return true; } item.setType(material); sender.sendMessage(mm.deserialize("The potion in hand has changed to '" + material.name() + "'")); return true; } case "color" -> { if (!sender.hasPermission("itemizer.potion.color")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } if (args.length < 3) { sender.sendMessage(mm.deserialize("===============[Potion Commands]===============")); sender.sendMessage(mm.deserialize("/itemizer potion color <hexcolor> - Set the potion color")); return true; } final PotionMeta potionMeta = (PotionMeta) meta; assert potionMeta != null; try { java.awt.Color awtColor = java.awt.Color.decode(args[2]); Color color = Color.fromRGB(awtColor.getRed(), awtColor.getGreen(), awtColor.getBlue()); potionMeta.setColor(color); item.setItemMeta(potionMeta); sender.sendMessage(mm.deserialize(args[2] + " has been set as potion color")); } catch (NumberFormatException ignored) { sender.sendMessage(mm.deserialize("The hex \"" + args[2] + "\" is invalid!")); return true; } return true; } case "list" -> { if (!sender.hasPermission("itemizer.potion.list")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } StringBuilder sb = new StringBuilder(); PotionEffectType[] effects; for (int i = 0; i < (effects = PotionEffectType.values()).length; i++) { sb.append(", ").append(effects[i].getName()); } sender.sendMessage(mm.deserialize("Available potion effects: " + sb.toString().replaceFirst(", ", ""))); return true; } default -> { sender.sendMessage(mm.deserialize("Unknown sub-command. Type /itemizer potion for help.")); return true; } } } } case "attr" -> { if (!sender.hasPermission("itemizer.attr")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } if (args.length == 1) { sender.sendMessage(mm.deserialize(""" ===============[Attribute Commands]=============== /itemizer attr add <name> <strength> [slot] - Add an attribute /itemizer attr remove <name> - Remove an attribute /itemizer attr list - List all item's attributes /itemizer attr listall - List all supported attributes""")); return true; } if (!hasItem) { sender.sendMessage(mm.deserialize("You do not have an item in your hand.")); return true; } else { switch (args[1]) { case "add" -> { if (!sender.hasPermission("itemizer.attr.add")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } plugin.attr.addAttr(player, args); return true; } case "remove" -> { if (!sender.hasPermission("itemizer.attr.remove")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } // NPE to fix here plugin.attr.removeAttr(player, args[2]); return true; } case "list" -> { if (!sender.hasPermission("itemizer.attr.list")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } plugin.attr.listAttr(player); return true; } case "listall" -> { if (!sender.hasPermission("itemizer.attr.listall")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } sender.sendMessage(mm.deserialize("Supported attributes: " + Attributes.getAttributes())); return true; } default -> { sender.sendMessage(mm.deserialize("Unknown sub-command. Type /itemizer attr for help.")); return true; } } } } case "flag" -> { if (!sender.hasPermission("itemizer.flag")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } if (args.length == 1) { sender.sendMessage(mm.deserialize(""" ===============[Flag Commands]=============== /itemizer flag add <name - Add a flag /itemizer flag remove <name - Remove a flag /itemizer flag list - List all item's flags /itemizer flag listall - List all available flags""")); return true; } if (!hasItem) { sender.sendMessage(mm.deserialize("You do not have an item in your hand.")); return true; } switch (args[1]) { case "add" -> { if (!sender.hasPermission("itemizer.flag.add")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } if (args.length == 2) { sender.sendMessage(mm.deserialize("===============[Flag Commands]===============")); sender.sendMessage(mm.deserialize("/itemizer flag add <name - Add a flag")); return true; } ItemFlag flag = null; try { flag = ItemFlag.valueOf(args[2].toUpperCase()); } catch (Exception ignored) { } if (flag == null) { sender.sendMessage(mm.deserialize("The flag \"" + args[2] + "\" does not exist!")); return true; } assert meta != null; if (meta.getItemFlags().contains(flag)) { sender.sendMessage(mm.deserialize("The flag '" + args[2].toUpperCase() + "' is already added to the item!")); return true; } meta.addItemFlags(flag); item.setItemMeta(meta); sender.sendMessage(mm.deserialize("The flag '" + args[2].toUpperCase() + "' has been added to your item!")); return true; } case "remove" -> { if (!sender.hasPermission("itemizer.flag.remove")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } if (args.length == 2) { sender.sendMessage(mm.deserialize("===============[Flag Commands]===============")); sender.sendMessage(mm.deserialize("/itemizer flag remove <name - Remove a flag")); return true; } ItemFlag flag = null; try { flag = ItemFlag.valueOf(args[2].toUpperCase()); } catch (Exception ignored) { } if (flag == null) { sender.sendMessage(mm.deserialize("The flag \"" + args[2] + "\" does not exist!")); return true; } assert meta != null; if (!meta.getItemFlags().contains(flag)) { sender.sendMessage(mm.deserialize("The flag '" + args[2].toUpperCase() + "' has not been added to the item!")); return true; } meta.removeItemFlags(flag); item.setItemMeta(meta); sender.sendMessage(mm.deserialize("The flag '" + args[2].toUpperCase() + "' has been removed from your item!")); return true; } case "list" -> { if (!sender.hasPermission("itemizer.flag.list")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } assert meta != null; if (Objects.requireNonNull(meta.getItemFlags()).isEmpty()) { sender.sendMessage(mm.deserialize("The item in your hand does not have any flags")); return true; } sender.sendMessage(mm.deserialize("Item flags: " + StringUtils.join(meta.getItemFlags(), ", "))); return true; } case "listall" -> { if (!sender.hasPermission("itemizer.flag.listall")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } sender.sendMessage(mm.deserialize("Available item flags: " + StringUtils.join(ItemFlag.values(), ", "))); return true; } default -> { sender.sendMessage(mm.deserialize("Unknown sub-command. Type /itemizer flag for help.")); return true; } } } case "enchant" -> { if (!sender.hasPermission("itemizer.enchant")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } if (args.length == 1) { sender.sendMessage(mm.deserialize(""" ===============[Enchant Commands]=============== /itemizer enchant add <name> <level> - Add an enchant /itemizer enchant remove <name> - Remove an enchant /itemizer enchant list - List all item's enchants /itemizer enchant listall - List all available enchants""")); return true; } if (!hasItem) { sender.sendMessage(mm.deserialize("You do not have an item in your hand.")); return true; } switch (args[1]) { case "add" -> { if (!sender.hasPermission("itemizer.enchant.add")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } if (args.length < 4) { sender.sendMessage(mm.deserialize("===============[Enchant Commands]===============")); sender.sendMessage(mm.deserialize("/itemizer enchant add <name> <level> - Add an enchant")); return true; } final Enchantment ench = EnchantmentWrapper.getByKey(NamespacedKey.minecraft(args[2].toLowerCase())); if (ench == null) { sender.sendMessage(mm.deserialize("The enchantment '" + args[2] + "' does not exist!")); return true; } Integer level = parseInt(sender, args[3]); if (level == null) { return true; } item.addUnsafeEnchantment(ench, level); sender.sendMessage(mm.deserialize("The enchant '" + ench.getKey().getKey() + "' has been added to your item")); return true; } case "remove" -> { if (!sender.hasPermission("itemizer.enchant.remove")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } if (args.length == 2) { sender.sendMessage(mm.deserialize("===============[Enchant Commands]===============")); sender.sendMessage(mm.deserialize("/itemizer enchant remove <name> - Remove an enchant")); return true; } final Enchantment ench = EnchantmentWrapper.getByKey(NamespacedKey.minecraft(args[2].toLowerCase())); if (ench == null) { sender.sendMessage(mm.deserialize("The enchantment '" + args[2] + "' does not exist!")); return true; } assert meta != null; if (Objects.requireNonNull(meta.getEnchants()).isEmpty()) { sender.sendMessage(mm.deserialize("This item doesn't hold any enchants")); return true; } if (!meta.getEnchants().containsKey(ench)) { sender.sendMessage(mm.deserialize("This item doesn't have enchant!")); return true; } item.removeEnchantment(ench); sender.sendMessage(mm.deserialize("The enchant '" + ench.getKey().getKey() + "' has been removed from your item")); return true; } case "list" -> { if (!sender.hasPermission("itemizer.enchant.list")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } assert meta != null; if (Objects.requireNonNull(meta.getEnchants()).isEmpty()) { sender.sendMessage(mm.deserialize("This item doesn't hold any enchants")); return true; } sender.sendMessage(mm.deserialize("Item enchants: " + StringUtils.join(meta.getEnchants().keySet(), ", "))); return true; } case "listall" -> { if (!sender.hasPermission("itemizer.enchant.listall")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } StringBuilder sb = new StringBuilder(); Enchantment[] enchantments; for (int i = 0; i < (enchantments = Enchantment.values()).length; i++) { sb.append(", ").append(enchantments[i].getKey().getKey()); } sender.sendMessage(mm.deserialize("Available item enchants: " + sb.toString().replaceFirst(", ", ""))); return true; } default -> { sender.sendMessage(mm.deserialize("Unknown sub-command. Type /itemizer enchant for help.")); return true; } } } case "title" -> { if (!sender.hasPermission("itemizer.title")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } if (args.length == 1) { sender.sendMessage(mm.deserialize("===============[Title Command]===============")); sender.sendMessage(mm.deserialize("/itemizer title <name> - Set the book's title")); return true; } if (!hasBook) { sender.sendMessage(mm.deserialize("You do not have a Written Book in your hand.")); return true; } Component name = colorize(StringUtils.join(args, " ", 1, args.length)); final BookMeta bookMeta = (BookMeta) meta; assert bookMeta != null; bookMeta.title(name); item.setItemMeta(bookMeta); sender.sendMessage(mm.deserialize("The title of the book has been set to '" + mm.serialize(name) + "'")); return true; } case "author" -> { if (!sender.hasPermission("itemizer.author")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } if (args.length == 1) { sender.sendMessage(mm.deserialize("===============[Author Command]===============")); sender.sendMessage(mm.deserialize("/itemizer author <name> - Set the book's author")); return true; } if (!hasBook) { sender.sendMessage(mm.deserialize("You do not have a Written Book in your hand.")); return true; } Component name = colorize(args[1]); final BookMeta bookMeta = (BookMeta) meta; assert bookMeta != null; bookMeta.author(name); item.setItemMeta(bookMeta); sender.sendMessage(mm.deserialize("The author of the book has been set to '" + mm.serialize(name) + "'")); return true; } case "head" -> { if (!sender.hasPermission("itemizer.head")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } if (args.length == 1) { sender.sendMessage(mm.deserialize("===============[Head Command]===============")); sender.sendMessage(mm.deserialize("/itemizer head <name> - Set the player of the head")); return true; } if (item.getType() != Material.PLAYER_HEAD) { sender.sendMessage(mm.deserialize("You do not have a Skull in your hand.")); return true; } String name = args[1]; if (name.length() > 16) { name = name.substring(0, 16); } final SkullMeta skullMeta = (SkullMeta) meta; assert skullMeta != null; skullMeta.setOwner(name); item.setItemMeta(skullMeta); sender.sendMessage(mm.deserialize("The player of the head has been set to '" + name + "'")); return true; } case "sign" -> { if (!sender.hasPermission("itemizer.sign")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } if (args.length < 3) { sender.sendMessage(mm.deserialize("===============[Sign Commands]===============")); sender.sendMessage(mm.deserialize("/itemizer sign <line> <text> - Change the line on the sign")); return true; } final Block block = player.getTargetBlockExact(20); if (block == null || block.getType() == Material.AIR || !block.getType().toString().contains("SIGN")) { sender.sendMessage(mm.deserialize("Please look at a sign!")); return true; } Integer line = parseInt(sender, args[1]); if (line == null) { return true; } else if (line > 4) { sender.sendMessage(mm.deserialize("There's a maximum of 4 lines on a sign")); return true; } Component text = colorize(StringUtils.join(args, " ", 2, args.length)); if (cpb.getAPI() != null) { cpb.getAPI().logRemoval(player.getName(), block.getLocation(), block.getType(), block.getBlockData()); } Sign sign = (Sign) block.getState(); sign.line(line - 1, text); sign.update(); if (cpb.getAPI() != null) { cpb.getAPI().logPlacement(player.getName(), sign.getLocation(), sign.getType(), sign.getBlockData()); } sender.sendMessage(mm.deserialize("Line '" + line + "' has successfully changed to '" + mm.serialize(text) + "'")); return true; } case "clearall" -> { if (!sender.hasPermission("itemizer.clearall")) { sender.sendMessage(mm.deserialize("You don't have permission to use this command!")); return true; } if (!hasItem) { sender.sendMessage(mm.deserialize("You do not have an item in your hand.")); return true; } item.setItemMeta(null); sender.sendMessage(mm.deserialize("All data cleared from your item")); return true; } default -> { sender.sendMessage(mm.deserialize("Unknown sub-command. Type /itemizer help for help.")); return true; } } } private Component colorize(String string) { Matcher matcher = Pattern.compile("&[a-fk-or0-9]", Pattern.CASE_INSENSITIVE).matcher(string); while (matcher.find()) { String color = matcher.group(); string = string.replace(color, COLOR_TRANSLATION.getOrDefault(color.toLowerCase(), color)); } return mm.deserialize(string); } private Integer parseInt(CommandSender sender, String string) { try { return Integer.parseInt(string); } catch (NumberFormatException ex) { sender.sendMessage(mm.deserialize("\"" + string + "\" is not a valid number!")); } return null; } }