From efaa46289499a92ba9d2dac47f9d4d514dd60427 Mon Sep 17 00:00:00 2001 From: aPunch Date: Wed, 8 Feb 2012 02:26:14 -0600 Subject: [PATCH] dynamic help menus --- plugin.yml | 2 + src/net/citizensnpcs/Citizens.java | 27 ++++-- src/net/citizensnpcs/NPCUpdater.java | 3 +- .../citizensnpcs/command/CommandManager.java | 15 +-- .../command/command/AdminCommands.java | 10 +- .../command/command/HelpCommands.java | 95 +++++++++++++++++++ .../command/command/NPCCommands.java | 7 +- src/net/citizensnpcs/util/StringHelper.java | 10 ++ 8 files changed, 136 insertions(+), 33 deletions(-) create mode 100644 src/net/citizensnpcs/command/command/HelpCommands.java diff --git a/plugin.yml b/plugin.yml index bcf5a9e2c..65cbaa9d2 100644 --- a/plugin.yml +++ b/plugin.yml @@ -3,5 +3,7 @@ authors: [aPunch, fullwall] version: 2.0 main: net.citizensnpcs.Citizens commands: + citizens: + description: Administration commands npc: description: Basic commands for all NPC-related things \ No newline at end of file diff --git a/src/net/citizensnpcs/Citizens.java b/src/net/citizensnpcs/Citizens.java index f3c4f10c0..87f4c7028 100644 --- a/src/net/citizensnpcs/Citizens.java +++ b/src/net/citizensnpcs/Citizens.java @@ -14,13 +14,13 @@ import net.citizensnpcs.api.exception.NPCLoadException; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.npc.trait.Character; import net.citizensnpcs.api.npc.trait.DefaultInstanceFactory; -import net.citizensnpcs.api.npc.trait.InstanceFactory; import net.citizensnpcs.api.npc.trait.Trait; import net.citizensnpcs.api.npc.trait.trait.Owner; import net.citizensnpcs.api.npc.trait.trait.SpawnLocation; import net.citizensnpcs.api.npc.trait.trait.Spawned; import net.citizensnpcs.command.CommandManager; import net.citizensnpcs.command.Injector; +import net.citizensnpcs.command.command.HelpCommands; import net.citizensnpcs.command.command.NPCCommands; import net.citizensnpcs.command.exception.CommandUsageException; import net.citizensnpcs.command.exception.MissingNestedCommandException; @@ -59,9 +59,9 @@ public class Citizens extends JavaPlugin { LookClose.class, SpawnLocation.class, Inventory.class); private volatile CitizensNPCManager npcManager; - private final InstanceFactory characterManager = new DefaultInstanceFactory(); - private final InstanceFactory traitManager = new DefaultInstanceFactory(); - private CommandManager cmdManager; + private final DefaultInstanceFactory characterManager = new DefaultInstanceFactory(); + private final DefaultInstanceFactory traitManager = new DefaultInstanceFactory(); + private final CommandManager cmdManager = new CommandManager(); private Settings config; private Storage saves; private boolean compatible; @@ -213,11 +213,24 @@ public class Citizens extends JavaPlugin { } } - private void registerCommands() { - cmdManager = new CommandManager(); - cmdManager.setInjector(new Injector(npcManager, characterManager)); + public CitizensNPCManager getNPCManager() { + return npcManager; + } + public DefaultInstanceFactory getCharacterManager() { + return characterManager; + } + + public CommandManager getCommandManager() { + return cmdManager; + } + + private void registerCommands() { + cmdManager.setInjector(new Injector(this)); + + // Register command classes cmdManager.register(NPCCommands.class); + cmdManager.register(HelpCommands.class); } private void registerPermissions() { diff --git a/src/net/citizensnpcs/NPCUpdater.java b/src/net/citizensnpcs/NPCUpdater.java index 29149b54b..2098b236a 100644 --- a/src/net/citizensnpcs/NPCUpdater.java +++ b/src/net/citizensnpcs/NPCUpdater.java @@ -16,8 +16,7 @@ public class NPCUpdater implements Runnable { for (NPC npc : npcManager) { if (!npc.isSpawned()) continue; - CitizensNPC handle = (CitizensNPC) npc; - handle.update(); + ((CitizensNPC) npc).update(); } } } \ No newline at end of file diff --git a/src/net/citizensnpcs/command/CommandManager.java b/src/net/citizensnpcs/command/CommandManager.java index f09ee414c..74ac22d37 100644 --- a/src/net/citizensnpcs/command/CommandManager.java +++ b/src/net/citizensnpcs/command/CommandManager.java @@ -22,6 +22,7 @@ package net.citizensnpcs.command; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; @@ -51,8 +52,6 @@ import net.citizensnpcs.util.Messaging; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.entity.Player; -import com.google.common.collect.Lists; - public class CommandManager { /* @@ -264,7 +263,7 @@ public class CommandManager { public List getCommands(String command) { if (subCommands.containsKey(command)) return subCommands.get(command); - List cmds = Lists.newArrayList(); + List cmds = new ArrayList(); for (Entry entry : commands.get(null).entrySet()) { if (!entry.getKey().getCommand().equalsIgnoreCase(command) || !entry.getValue().isAnnotationPresent(Command.class)) @@ -362,16 +361,6 @@ public class CommandManager { instances.put(method, obj); } - /* - * // Build a list of commands and their usage details, at least for - * // root level commands if (parent == null) if - * (cmd.usage().length() == 0) descs.put(new - * CommandIdentifier(cmd.aliases()[0], cmd.modifiers()[0]), - * cmd.desc()); else descs.put(new - * CommandIdentifier(cmd.aliases()[0], cmd.modifiers()[0]), - * cmd.usage() + " - " + cmd.desc()); - */ - // Look for nested commands -- if there are any, those have // to be cached too so that they can be quickly looked // up when processing commands diff --git a/src/net/citizensnpcs/command/command/AdminCommands.java b/src/net/citizensnpcs/command/command/AdminCommands.java index 9aa96cc2b..6c5717cc9 100644 --- a/src/net/citizensnpcs/command/command/AdminCommands.java +++ b/src/net/citizensnpcs/command/command/AdminCommands.java @@ -1,15 +1,9 @@ package net.citizensnpcs.command.command; -import net.citizensnpcs.api.npc.trait.Character; -import net.citizensnpcs.api.npc.trait.DefaultInstanceFactory; -import net.citizensnpcs.npc.CitizensNPCManager; +import net.citizensnpcs.Citizens; public class AdminCommands { - private final CitizensNPCManager npcManager; - private final DefaultInstanceFactory characterManager; - public AdminCommands(CitizensNPCManager npcManager, DefaultInstanceFactory characterManager) { - this.npcManager = npcManager; - this.characterManager = characterManager; + public AdminCommands(Citizens plugin) { } } \ No newline at end of file diff --git a/src/net/citizensnpcs/command/command/HelpCommands.java b/src/net/citizensnpcs/command/command/HelpCommands.java new file mode 100644 index 000000000..27d098abf --- /dev/null +++ b/src/net/citizensnpcs/command/command/HelpCommands.java @@ -0,0 +1,95 @@ +package net.citizensnpcs.command.command; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.bukkit.entity.Player; + +import net.citizensnpcs.Citizens; +import net.citizensnpcs.api.npc.NPC; +import net.citizensnpcs.command.CommandContext; +import net.citizensnpcs.command.CommandManager; +import net.citizensnpcs.command.annotation.Command; +import net.citizensnpcs.command.annotation.Requirements; +import net.citizensnpcs.util.Messaging; +import net.citizensnpcs.util.StringHelper; + +@Requirements +public class HelpCommands { + private static final int LINES_PER_PAGE = 9; + + private final CommandManager cmdManager; + + public HelpCommands(Citizens plugin) { + cmdManager = plugin.getCommandManager(); + } + + @Command( + aliases = { "citizens" }, + usage = "help (page)", + desc = "Citizens help menu", + modifiers = { "help" }, + min = 1, + max = 2, + permission = "citizens.help") + @Requirements + public void citizensHelp(CommandContext args, Player player, NPC npc) { + int page = args.argsLength() == 2 ? args.getInteger(1) : 1; + if (!sendPage(player, args.getCommand(), page)) + Messaging.sendError(player, "The page '" + page + "' does not exist."); + } + + @Command( + aliases = { "npc" }, + usage = "help (page)", + desc = "NPC help menu", + modifiers = { "help" }, + min = 1, + max = 2, + permission = "npc.help") + @Requirements + public void npcHelp(CommandContext args, Player player, NPC npc) { + int page = args.argsLength() == 2 ? args.getInteger(1) : 1; + if (!sendPage(player, args.getCommand(), page)) + Messaging.sendError(player, "The page '" + page + "' does not exist."); + } + + private boolean sendPage(Player player, String baseCommand, int page) { + List lines = getLines(player, baseCommand); + int pages = (lines.size() / LINES_PER_PAGE == 0) ? 1 : lines.size() / LINES_PER_PAGE; + if (page < 0 || page > pages) + return false; + + int startIndex = LINES_PER_PAGE * page - LINES_PER_PAGE; + int endIndex = page * LINES_PER_PAGE; + + Messaging.send( + player, + StringHelper.parseColors("=====[ " + + (baseCommand.equalsIgnoreCase("npc") ? "NPC" : StringHelper.capitalize(baseCommand + .toLowerCase())) + " Help " + page + "/" + pages + " ]=====")); + + if (lines.size() < endIndex) + endIndex = lines.size() - 1; + for (String line : lines.subList(startIndex, endIndex)) + Messaging.send(player, line); + return true; + } + + private List getLines(Player player, String baseCommand) { + // Ensures that commands with multiple modifiers are only added once + Set cmds = new HashSet(); + List lines = new ArrayList(); + for (Command cmd : cmdManager.getCommands(baseCommand)) { + if (cmds.contains(cmd) || !player.hasPermission("citizens." + cmd.permission())) + continue; + lines.add(StringHelper.parseColors("<7>/" + cmd.aliases()[0] + " " + cmd.usage() + " <7>- " + + cmd.desc())); + if (cmd.modifiers().length > 1) + cmds.add(cmd); + } + return lines; + } +} \ No newline at end of file diff --git a/src/net/citizensnpcs/command/command/NPCCommands.java b/src/net/citizensnpcs/command/command/NPCCommands.java index dcf3ff326..6d19a63db 100644 --- a/src/net/citizensnpcs/command/command/NPCCommands.java +++ b/src/net/citizensnpcs/command/command/NPCCommands.java @@ -1,5 +1,6 @@ package net.citizensnpcs.command.command; +import net.citizensnpcs.Citizens; import net.citizensnpcs.Settings.Setting; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.npc.trait.Character; @@ -25,9 +26,9 @@ public class NPCCommands { private final CitizensNPCManager npcManager; private final DefaultInstanceFactory characterManager; - public NPCCommands(CitizensNPCManager npcManager, DefaultInstanceFactory characterManager) { - this.npcManager = npcManager; - this.characterManager = characterManager; + public NPCCommands(Citizens plugin) { + npcManager = plugin.getNPCManager(); + characterManager = plugin.getCharacterManager(); } @Command( diff --git a/src/net/citizensnpcs/util/StringHelper.java b/src/net/citizensnpcs/util/StringHelper.java index 7914b1dc6..293989b11 100644 --- a/src/net/citizensnpcs/util/StringHelper.java +++ b/src/net/citizensnpcs/util/StringHelper.java @@ -57,10 +57,20 @@ public class StringHelper { return ChatColor.YELLOW + string.toString() + ChatColor.GREEN; } + public static String wrap(Object string, ChatColor after) { + return ChatColor.YELLOW + string.toString() + after; + } + public static String parseColors(Object string) { String parsed = string.toString(); for (ChatColor color : ChatColor.values()) parsed = parsed.replace("<" + color.getChar() + ">", color.toString()); return parsed; } + + public static String capitalize(Object string) { + String capitalize = string.toString(); + return capitalize.replaceFirst(String.valueOf(capitalize.charAt(0)), + String.valueOf(Character.toUpperCase(capitalize.charAt(0)))); + } } \ No newline at end of file