diff --git a/src/main/java/kamkeel/npcs/command/profile/CommandProfile.java b/src/main/java/kamkeel/npcs/command/profile/CommandProfile.java index ac0c232fb..035fecb1a 100644 --- a/src/main/java/kamkeel/npcs/command/profile/CommandProfile.java +++ b/src/main/java/kamkeel/npcs/command/profile/CommandProfile.java @@ -26,6 +26,7 @@ public class CommandProfile extends CommandBase { registerCommand(new CommandProfileRemove()); registerCommand(new CommandProfileAdmin()); registerCommand(new CommandProfileList()); + registerCommand(new CommandProfileRename()); } public void registerCommand(CommandProfileBase command){ diff --git a/src/main/java/kamkeel/npcs/command/profile/CommandProfileAdmin.java b/src/main/java/kamkeel/npcs/command/profile/CommandProfileAdmin.java index 4e6b2e6a3..4b1c2429d 100644 --- a/src/main/java/kamkeel/npcs/command/profile/CommandProfileAdmin.java +++ b/src/main/java/kamkeel/npcs/command/profile/CommandProfileAdmin.java @@ -190,18 +190,72 @@ public class CommandProfileAdmin extends CommandProfileBase { sendError(sender, "Profile not found for player: " + targetPlayer); return; } - StringBuilder sb = new StringBuilder(); - sb.append("Profile Slots for ").append(targetPlayer).append(":\n"); + sendMessage(sender, "Profile Slots for " + targetPlayer + ":"); for (Map.Entry entry : targetProfile.slots.entrySet()) { int id = entry.getKey(); String name = entry.getValue().getName(); - if (id == targetProfile.currentID) { - sb.append(" * "); // active slot - } else { - sb.append(" - "); - } - sb.append("Slot ").append(id).append(": ").append(name).append("\n"); + String prefix = (id == targetProfile.currentID) ? "* " : "- "; + sendMessage(sender, prefix + "Slot " + id + ": " + name); } - sendMessage(sender, sb.toString()); + } + + @SubCommand( + desc = "Rename a specified player's slot.", + usage = " " + ) + public void rename(ICommandSender sender, String[] args) throws CommandException { + if (args.length < 3) { + sendError(sender, "Usage: /profile admin rename "); + return; + } + String targetPlayer = args[0]; + int slotId; + try { + slotId = Integer.parseInt(args[1]); + } catch (NumberFormatException ex) { + sendError(sender, "Slot ID must be a number."); + return; + } + // Combine remaining arguments for the new name. + StringBuilder sb = new StringBuilder(); + for (int i = 2; i < args.length; i++) { + if (i > 2) sb.append(" "); + sb.append(args[i]); + } + String newName = sb.toString().trim(); + // Cap name at 20 characters. + if (newName.length() > 20) { + newName = newName.substring(0, 20); + } + // Validate that name contains only letters and spaces. + if (!newName.matches("[A-Za-z ]+")) { + sendError(sender, "Invalid name. Only alphabetic characters and spaces are allowed."); + return; + } + Profile targetProfile = ProfileController.getProfile(targetPlayer); + if (targetProfile == null) { + sendError(sender, "Profile not found for player: " + targetPlayer); + return; + } + if (targetProfile.locked) { + sendError(sender, "Profile for " + targetPlayer + " is locked. Please try again later."); + return; + } + if (!targetProfile.slots.containsKey(slotId)) { + sendError(sender, "Slot " + slotId + " not found in " + targetPlayer + "'s profile."); + return; + } + // Rename the slot. + Slot targetSlot = targetProfile.slots.get(slotId); + targetSlot.setName(newName); + // Save the updated profile. + if (targetProfile.player != null) { + ProfileController.save(targetProfile.player, targetProfile); + } else { + UUID uuid = ProfileController.getUUIDFromUsername(targetPlayer); + if (uuid != null) + ProfileController.saveOffline(targetProfile, uuid); + } + sendResult(sender, "Successfully renamed slot %s for %s to '%s'.", slotId, targetPlayer, newName); } } diff --git a/src/main/java/kamkeel/npcs/command/profile/CommandProfileList.java b/src/main/java/kamkeel/npcs/command/profile/CommandProfileList.java index 2382d14b5..3ba49fc9a 100644 --- a/src/main/java/kamkeel/npcs/command/profile/CommandProfileList.java +++ b/src/main/java/kamkeel/npcs/command/profile/CommandProfileList.java @@ -23,7 +23,7 @@ public class CommandProfileList extends CommandProfileBase { @Override public String getUsage() { - return ""; // No extra parameters + return ""; // No extra parameters. } @Override @@ -38,18 +38,12 @@ public class CommandProfileList extends CommandProfileBase { sendError(sender, "Profile not found."); return; } - StringBuilder sb = new StringBuilder(); - sb.append("Your Profile Slots:\n"); + sendMessage(sender, "Your Profile Slots:"); for (Map.Entry entry : profile.slots.entrySet()) { int id = entry.getKey(); String name = entry.getValue().getName(); - if (id == profile.currentID) { - sb.append(" * "); // mark active slot - } else { - sb.append(" - "); - } - sb.append("Slot ").append(id).append(": ").append(name).append("\n"); + String prefix = (id == profile.currentID) ? "* " : "- "; + sendMessage(sender, prefix + "Slot " + id + ": " + name); } - sendMessage(sender, sb.toString()); } } diff --git a/src/main/java/kamkeel/npcs/command/profile/CommandProfileRename.java b/src/main/java/kamkeel/npcs/command/profile/CommandProfileRename.java new file mode 100644 index 000000000..53c092b45 --- /dev/null +++ b/src/main/java/kamkeel/npcs/command/profile/CommandProfileRename.java @@ -0,0 +1,77 @@ +package kamkeel.npcs.command.profile; + +import kamkeel.npcs.controllers.ProfileController; +import kamkeel.npcs.controllers.data.Profile; +import kamkeel.npcs.controllers.data.Slot; +import net.minecraft.command.CommandException; +import net.minecraft.command.ICommandSender; +import net.minecraft.entity.player.EntityPlayer; + +public class CommandProfileRename extends CommandProfileBase { + + @Override + public String getCommandName() { + return "rename"; + } + + @Override + public String getDescription() { + return "Rename one of your profile slots. Only letters and spaces are allowed (max 20 characters)."; + } + + @Override + public String getUsage() { + return " "; + } + + @Override + public void processCommand(ICommandSender sender, String[] args) throws CommandException { + if (!(sender instanceof EntityPlayer)) { + sendError(sender, "This command can only be used by a player."); + return; + } + if (args.length < 2) { + sendError(sender, "Usage: " + getUsage()); + return; + } + int slotId; + try { + slotId = Integer.parseInt(args[0]); + } catch (NumberFormatException e) { + sendError(sender, "Slot ID must be a number."); + return; + } + // Combine remaining arguments into one name string. + StringBuilder sb = new StringBuilder(); + for (int i = 1; i < args.length; i++) { + if (i > 1) sb.append(" "); + sb.append(args[i]); + } + String newName = sb.toString().trim(); + // Cap at 20 characters. + if (newName.length() > 20) { + newName = newName.substring(0, 20); + } + // Validate that the new name contains only letters and spaces. + if (!newName.matches("[A-Za-z ]+")) { + sendError(sender, "Invalid name. Only alphabetic characters and spaces are allowed."); + return; + } + + EntityPlayer player = (EntityPlayer) sender; + Profile profile = ProfileController.getProfile(player); + if (profile == null) { + sendError(sender, "Profile not found."); + return; + } + if (!profile.slots.containsKey(slotId)) { + sendError(sender, "Slot " + slotId + " not found in your profile."); + return; + } + Slot slot = profile.slots.get(slotId); + slot.setName(newName); + // Save the profile after renaming. + ProfileController.save(player, profile); + sendResult(sender, "Successfully renamed slot %s to '%s'.", slotId, newName); + } +}