package net.aufdemrand.denizen.scripts.commands.npc; import net.aufdemrand.denizen.BukkitScriptEntryData; import net.aufdemrand.denizen.utilities.debugging.dB; import net.aufdemrand.denizencore.exceptions.CommandExecutionException; import net.aufdemrand.denizencore.exceptions.InvalidArgumentsException; import net.aufdemrand.denizencore.objects.Element; import net.aufdemrand.denizencore.objects.aH; import net.aufdemrand.denizencore.scripts.ScriptEntry; import net.aufdemrand.denizencore.scripts.commands.AbstractCommand; import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.trait.Trait; public class TraitCommand extends AbstractCommand { private enum Toggle {TOGGLE, TRUE, FALSE, ON, OFF} @Override public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException { for (aH.Argument arg : aH.interpret(scriptEntry.getArguments())) { if (!scriptEntry.hasObject("state") && arg.matchesPrefix("state", "s") && arg.matchesEnum(Toggle.values())) { scriptEntry.addObject("state", new Element(arg.getValue().toUpperCase())); } else if (!scriptEntry.hasObject("trait")) { scriptEntry.addObject("trait", new Element(arg.getValue())); } } if (!scriptEntry.hasObject("trait")) { throw new InvalidArgumentsException("Missing trait argument!"); } if (!((BukkitScriptEntryData) scriptEntry.entryData).hasNPC()) { throw new InvalidArgumentsException("This command requires a linked NPC!"); } scriptEntry.defaultObject("state", new Element("TOGGLE")); } @Override public void execute(ScriptEntry scriptEntry) throws CommandExecutionException { Element toggle = scriptEntry.getElement("state"); Element traitName = scriptEntry.getElement("trait"); NPC npc = ((BukkitScriptEntryData) scriptEntry.entryData).getNPC().getCitizen(); dB.report(scriptEntry, getName(), traitName.debug() + toggle.debug() + ((BukkitScriptEntryData) scriptEntry.entryData).getNPC().debug()); Class<? extends Trait> trait = CitizensAPI.getTraitFactory().getTraitClass(traitName.asString()); if (trait == null) { dB.echoError(scriptEntry.getResidingQueue(), "Trait not found: " + traitName.asString()); return; } switch (Toggle.valueOf(toggle.asString())) { case TRUE: case ON: if (npc.hasTrait(trait)) { dB.echoError(scriptEntry.getResidingQueue(), "NPC already has trait '" + traitName.asString() + "'"); } else { npc.addTrait(trait); } break; case FALSE: case OFF: if (!npc.hasTrait(trait)) { dB.echoError(scriptEntry.getResidingQueue(), "NPC does not have trait '" + traitName.asString() + "'"); } else { npc.removeTrait(trait); } break; case TOGGLE: if (npc.hasTrait(trait)) { npc.removeTrait(trait); } else { npc.addTrait(trait); } break; } } }