package server.command;
import java.util.Map;
import server.Player;
import server.Skill;
import server.SyntaxException;
public class AdminSkillCommand extends Command {
public AdminSkillCommand() {
super(CommandCategory.ADMIN, "Administers the skill system.");
}
@Override
public void run(Player player) throws SyntaxException {
String subcmd = CommandProcessor.nextToken();
if (subcmd == null) {
throw new SyntaxException();
}
else if ("list".equals(subcmd)) {
if (CommandProcessor.nextToken() != null) {
throw new SyntaxException();
}
player.sendText(true, "The following skills are available:");
printSkills(player, Skill.getRoot(), 0, "");
}
else if ("add".equals(subcmd)) {
String name = CommandProcessor.nextToken();
if (name == null || CommandProcessor.nextToken() != null) {
throw new SyntaxException();
}
if (Skill.getRoot().createSkill(name)) {
player.sendText(true, "Skill added.");
}
else {
player.sendText(true, "That skill already exists.");
}
for (Player p : Player.getOnlinePlayers()) {
p.validateSkills();
}
}
else if ("delete".equals(subcmd)) {
String name = CommandProcessor.nextToken();
if (name == null || CommandProcessor.nextToken() != null) {
throw new SyntaxException();
}
Skill subskill = Skill.getRoot().getSkill(name);
if (subskill == null) {
player.sendText(true, "That skill doesn't exist.");
}
else if (!subskill.isLeaf()) {
player.sendText(true, "Only leaf skills can be deleted.");
}
else {
Skill.getRoot().deleteSkill(name);
player.sendText(true, "Skill deleted.");
}
for (Player p : Player.getOnlinePlayers()) {
p.validateSkills();
}
}
else {
throw new SyntaxException();
}
}
private static void printSkills(Player player, Skill skill, int indentLevel, String prefix) {
for (Map.Entry<String,Skill> entry : skill.getSubSkills().entrySet()) {
String newPrefix = prefix;
if (prefix.length() > 0) {
newPrefix += '.';
}
newPrefix += entry.getKey();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < indentLevel; i++) {
sb.append("| ");
}
sb.append(entry.getKey());
if (entry.getValue().isLeaf()) {
for (int i = sb.length(); i < 20; i++) {
sb.append('.');
}
sb.append(' ');
sb.append(player.getSkillLevel(newPrefix));
}
player.sendText(false, sb.toString());
SkillCommand.printSkills(player, entry.getValue(), indentLevel + 1, newPrefix);
}
}
@Override
public String[] getSyntax(Player player) {
return new String[] {
"LIST",
"ADD <skill>",
"DELETE <skill>",
};
}
}