package net.citizensnpcs.commands; import java.util.List; import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.command.Command; import net.citizensnpcs.api.command.CommandConfigurable; import net.citizensnpcs.api.command.CommandContext; import net.citizensnpcs.api.command.Requirements; import net.citizensnpcs.api.command.exception.CommandException; import net.citizensnpcs.api.command.exception.NoPermissionsException; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.trait.Trait; import net.citizensnpcs.api.util.Messaging; import net.citizensnpcs.util.Messages; import net.citizensnpcs.util.StringHelper; import org.bukkit.command.CommandSender; import com.google.common.base.Joiner; import com.google.common.base.Splitter; import com.google.common.collect.Lists; @Requirements(selected = true, ownership = true) public class TraitCommands { @Command(aliases = { "trait", "tr" }, usage = "add [trait name]...", desc = "Adds traits to the NPC", modifiers = { "add", "a" }, min = 1, permission = "citizens.npc.trait") public void add(CommandContext args, CommandSender sender, NPC npc) throws CommandException { List added = Lists.newArrayList(); List failed = Lists.newArrayList(); for (String traitName : Splitter.on(',').split(args.getJoinedStrings(0))) { if (!sender.hasPermission("citizens.npc.trait." + traitName)) { failed.add(String.format("%s: No permission", traitName)); continue; } Class clazz = CitizensAPI.getTraitFactory().getTraitClass(traitName); if (clazz == null) { failed.add(String.format("%s: Trait not found", traitName)); continue; } if (npc.hasTrait(clazz)) { failed.add(String.format("%s: Already added", traitName)); continue; } npc.addTrait(clazz); added.add(StringHelper.wrap(traitName)); } if (added.size() > 0) Messaging.sendTr(sender, Messages.TRAITS_ADDED, Joiner.on(", ").join(added)); if (failed.size() > 0) Messaging.sendTr(sender, Messages.TRAITS_FAILED_TO_ADD, Joiner.on(", ").join(failed)); } @Command( aliases = { "traitc", "trc" }, usage = "[trait name] (flags)", desc = "Configures a trait", modifiers = { "*" }, min = 1, flags = "*", permission = "citizens.npc.trait-configure") public void configure(CommandContext args, CommandSender sender, NPC npc) throws CommandException { String traitName = args.getString(0); if (!sender.hasPermission("citizens.npc.trait-configure." + traitName)) throw new NoPermissionsException(); Class clazz = CitizensAPI.getTraitFactory().getTraitClass(args.getString(0)); if (clazz == null) throw new CommandException(Messages.TRAIT_NOT_FOUND); if (!CommandConfigurable.class.isAssignableFrom(clazz)) throw new CommandException(Messages.TRAIT_NOT_CONFIGURABLE); if (!npc.hasTrait(clazz)) throw new CommandException(Messages.TRAIT_NOT_FOUND_ON_NPC); CommandConfigurable trait = (CommandConfigurable) npc.getTrait(clazz); trait.configure(args); } @Command( aliases = { "trait", "tr" }, usage = "remove [trait name]...", desc = "Removes traits on the NPC", modifiers = { "remove", "rem", "r" }, min = 1, permission = "citizens.npc.trait") public void remove(CommandContext args, CommandSender sender, NPC npc) throws CommandException { List removed = Lists.newArrayList(); List failed = Lists.newArrayList(); for (String traitName : Splitter.on(',').split(args.getJoinedStrings(0))) { if (!sender.hasPermission("citizens.npc.trait." + traitName)) { failed.add(String.format("%s: No permission", traitName)); continue; } Class clazz = CitizensAPI.getTraitFactory().getTraitClass(traitName); if (clazz == null) { failed.add(String.format("%s: Trait not found", traitName)); continue; } boolean hasTrait = npc.hasTrait(clazz); if (!hasTrait) { failed.add(String.format("%s: Trait not attached", traitName)); continue; } npc.removeTrait(clazz); removed.add(StringHelper.wrap(traitName)); } if (removed.size() > 0) Messaging.sendTr(sender, Messages.TRAITS_REMOVED, Joiner.on(", ").join(removed)); if (failed.size() > 0) Messaging.sendTr(sender, Messages.FAILED_TO_REMOVE, Joiner.on(", ").join(failed)); } @Command( aliases = { "trait", "tr" }, usage = "[trait name], [trait name]...", desc = "Toggles traits on the NPC", modifiers = { "*" }, min = 1, permission = "citizens.npc.trait") public void toggle(CommandContext args, CommandSender sender, NPC npc) throws CommandException { List added = Lists.newArrayList(); List removed = Lists.newArrayList(); List failed = Lists.newArrayList(); for (String traitName : Splitter.on(',').split(args.getJoinedStrings(0))) { if (!sender.hasPermission("citizens.npc.trait." + traitName)) { failed.add(String.format("%s: No permission", traitName)); continue; } Class clazz = CitizensAPI.getTraitFactory().getTraitClass(traitName); if (clazz == null) { failed.add(String.format("%s: Trait not found", traitName)); continue; } boolean remove = npc.hasTrait(clazz); if (remove) { npc.removeTrait(clazz); removed.add(StringHelper.wrap(traitName)); continue; } npc.addTrait(clazz); added.add(StringHelper.wrap(traitName)); } if (added.size() > 0) Messaging.sendTr(sender, Messages.TRAITS_ADDED, Joiner.on(", ").join(added)); if (removed.size() > 0) Messaging.sendTr(sender, Messages.TRAITS_REMOVED, Joiner.on(", ").join(removed)); if (failed.size() > 0) Messaging.sendTr(sender, Messages.TRAITS_FAILED_TO_CHANGE, Joiner.on(", ").join(failed)); } }