package com.zivilon.itemeffects.commands; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffectType; import me.dpohvar.powernbt.api.NBTCompound; import me.dpohvar.powernbt.api.NBTManager; import me.dpohvar.powernbt.api.NBTList; import me.dpohvar.powernbt.PowerNBT; import java.util.Arrays; import com.zivilon.itemeffects.ItemEffects; public class itemeffect_command implements CommandExecutor { private final ItemEffects plugin; public itemeffect_command(ItemEffects plugin) { this.plugin = plugin; } @Override public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { if (cmd.getName().equalsIgnoreCase("itemeffect")) { if (!sender.hasPermission("admin")) { sender.sendMessage(ChatColor.RED + "You do not have permission to use this command."); return true; } if (!(sender instanceof Player)) { sender.sendMessage("This command can only be used by players."); return true; } Player player = (Player) sender; if (args.length < 1) { sender.sendMessage("Invalid usage. Correct usage: /itemeffect "); return true; } String subcommand = args[0].toLowerCase(); switch (subcommand) { case "add": if (args.length < 4) { player.sendMessage("Usage: /itemeffect add "); return true; } String type = args[1].toUpperCase(); String effect = args[2].toUpperCase(); int level; try { level = Integer.parseInt(args[3]); } catch (NumberFormatException e) { player.sendMessage("Invalid level. Please enter a number."); return true; } Integer radius = null; // We use Integer to allow for null checks if (type.equals("HELD_AURA") || type.equals("INVENTORY_AURA") || type.equals("WORN_AURA")) { if (args.length < 5) { player.sendMessage("Aura type effects require a radius. Usage: /itemeffect add "); return true; } try { radius = Integer.parseInt(args[4]); } catch (NumberFormatException e) { player.sendMessage("Invalid radius. Please enter a number."); return true; } } if (!isValidType(type)) { player.sendMessage("Invalid type. Valid types are: HELD, WORN, INVENTORY."); return true; } if (!isValidEffect(effect)) { player.sendMessage("Invalid effect. Provide a valid potion effect."); return true; } ItemStack item = player.getInventory().getItemInHand(); addEffectToItem(item, type, effect, level, radius); player.sendMessage("Effect added to item!"); break; case "addaura": // Not sure why this is here, regular add should work. // Will remove later once I work out why this is here in the first place break; case "remove": if (args.length < 3) { player.sendMessage("Usage: /itemeffect remove "); return true; } String typeToRemove = args[1].toUpperCase(); String effectToRemove = args[2].toUpperCase(); if (removeEffectFromItem(player.getInventory().getItemInHand(), typeToRemove, effectToRemove)) { player.sendMessage("Effect removed from item!"); } else { player.sendMessage("Specified effect not found on item."); } break; case "removeaura": // Not sure why this is here, regular remove should work. // Will remove later once I work out why this is here in the first place break; case "list": listEffectsOnItem(player.getInventory().getItemInHand(), player); break; default: sender.sendMessage("Unknown subcommand. Correct usage: /itemeffect "); break; } } return true; } private boolean isValidType(String type) { return Arrays.asList("HELD", "WORN", "INVENTORY", "HELD_AURA", "WORN_AURA", "INVENTORY_AURA").contains(type); } private boolean isValidEffect(String effect) { if (effect == null || effect.isEmpty()) { return false; } PotionEffectType potionType = PotionEffectType.getByName(effect.toUpperCase()); return potionType != null; } private void addEffectToItem(ItemStack item, String type, String effect, int level, Integer radius) { // Fetch current item's NBT data NBTCompound itemData = plugin.nbtManager.read(item); NBTCompound newEffect = new NBTCompound(); if (radius != null) { newEffect.put("radius", radius.intValue()); } // Get the "ItemEffects" list from the NBT data, or create one if it doesn't exist NBTList itemEffects = itemData.getList("ItemEffects"); if (itemEffects == null) { itemEffects = new NBTList(); itemData.put("ItemEffects", itemEffects); plugin.nbtManager.write(item, itemData); itemData = plugin.nbtManager.read(item); itemEffects = itemData.getList("ItemEffects"); } boolean effectFound = false; for (Object obj : itemEffects) { if (obj instanceof NBTCompound) { NBTCompound currentEffect = (NBTCompound) obj; String currentType = currentEffect.getString("type"); String currentEffectName = currentEffect.getString("effect"); if (type.equals(currentType) && effect.equals(currentEffectName)) { // Found the existing effect. Overwrite its attributes. currentEffect.put("level", level); effectFound = true; break; } } } if (!effectFound) { newEffect.put("type", type); newEffect.put("effect", effect); newEffect.put("level", level); itemEffects.add(newEffect); } plugin.nbtManager.write(item, itemData); } private boolean removeEffectFromItem(ItemStack item, String type, String effect) { NBTCompound itemData = plugin.nbtManager.read(item); NBTList itemEffects = itemData.getList("ItemEffects"); if (itemEffects == null) return false; for (Object obj : itemEffects) { if (obj instanceof NBTCompound) { NBTCompound currentEffect = (NBTCompound) obj; String currentType = currentEffect.getString("type"); String currentEffectName = currentEffect.getString("effect"); if (type.equals(currentType) && effect.equals(currentEffectName)) { itemEffects.remove(currentEffect); plugin.nbtManager.write(item, itemData); return true; } } } return false; } private void listEffectsOnItem(ItemStack item, Player player) { NBTCompound itemData = plugin.nbtManager.read(item); NBTList itemEffects = itemData.getList("ItemEffects"); if (itemEffects == null || itemEffects.isEmpty()) { player.sendMessage("No effects found on this item."); return; } player.sendMessage(ChatColor.GOLD + "Item Effects:"); for (Object obj : itemEffects) { if (obj instanceof NBTCompound) { NBTCompound currentEffect = (NBTCompound) obj; String currentType = currentEffect.getString("type"); String currentEffectName = currentEffect.getString("effect"); int currentLevel = currentEffect.getInt("level"); player.sendMessage(ChatColor.YELLOW + "- Type: " + currentType + ", Effect: " + currentEffectName + ", Level: " + currentLevel); } } } }