From 6f3c5733a2d8dde9c2d01e447b486078eb39f989 Mon Sep 17 00:00:00 2001 From: Alex 'mcmonkey' Goodwin Date: Tue, 9 Jun 2020 19:49:08 -0700 Subject: [PATCH] trait command: to list argument --- .../scripts/commands/npc/TraitCommand.java | 105 ++++++++++-------- 1 file changed, 57 insertions(+), 48 deletions(-) diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/TraitCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/TraitCommand.java index 6ce201925c..2f00db85f8 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/TraitCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/TraitCommand.java @@ -1,30 +1,36 @@ package com.denizenscript.denizen.scripts.commands.npc; +import com.denizenscript.denizen.objects.NPCTag; import com.denizenscript.denizen.utilities.Utilities; import com.denizenscript.denizen.utilities.debugging.Debug; import com.denizenscript.denizencore.exceptions.InvalidArgumentsException; import com.denizenscript.denizencore.objects.Argument; +import com.denizenscript.denizencore.objects.ArgumentHelper; import com.denizenscript.denizencore.objects.core.ElementTag; +import com.denizenscript.denizencore.objects.core.ListTag; import com.denizenscript.denizencore.scripts.ScriptEntry; import com.denizenscript.denizencore.scripts.commands.AbstractCommand; import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.trait.Trait; +import java.util.Collections; +import java.util.List; + public class TraitCommand extends AbstractCommand { public TraitCommand() { setName("trait"); - setSyntax("trait (state:true/false/{toggle}) []"); - setRequiredArguments(1, 2); + setSyntax("trait (state:true/false/{toggle}) [] (to:|...)"); + setRequiredArguments(1, 3); isProcedural = false; } // <--[command] // @Name Trait - // @Syntax trait (state:true/false/{toggle}) [] + // @Syntax trait (state:true/false/{toggle}) [] (to:|...) // @Required 1 - // @Maximum 2 + // @Maximum 3 // @Plugin Citizens // @Short Adds or removes a trait from an NPC. // @Group npc @@ -39,6 +45,8 @@ public TraitCommand() { // // The trait input is simply the name of the trait, like "sentinel". // + // Optionally, specify a list of NPCs to apply the trait to. If unspecified, the linked NPC will be used. + // // @Tags // ]> // @@ -58,7 +66,6 @@ private enum Toggle {TOGGLE, TRUE, FALSE, ON, OFF} public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException { for (Argument arg : scriptEntry.getProcessedArgs()) { - if (!scriptEntry.hasObject("state") && arg.matchesPrefix("state", "s") && arg.matchesEnum(Toggle.values())) { @@ -67,19 +74,25 @@ public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException else if (!scriptEntry.hasObject("trait")) { scriptEntry.addObject("trait", new ElementTag(arg.getValue())); } - + else if (!scriptEntry.hasObject("npcs") + && arg.matchesArgumentList(NPCTag.class)) { + scriptEntry.addObject("npcs", arg.asType(ListTag.class).filter(NPCTag.class, scriptEntry)); + } + else { + arg.reportUnhandled(); + } } if (!scriptEntry.hasObject("trait")) { throw new InvalidArgumentsException("Missing trait argument!"); } - - if (!Utilities.entryHasNPC(scriptEntry)) { - throw new InvalidArgumentsException("This command requires a linked NPC!"); + if (!scriptEntry.hasObject("npcs")) { + if (!Utilities.entryHasNPC(scriptEntry)) { + throw new InvalidArgumentsException("This command requires a linked NPC!"); + } + scriptEntry.addObject("npcs", Collections.singletonList(Utilities.getEntryNPC(scriptEntry))); } - scriptEntry.defaultObject("state", new ElementTag("TOGGLE")); - } @Override @@ -87,15 +100,13 @@ public void execute(ScriptEntry scriptEntry) { ElementTag toggle = scriptEntry.getElement("state"); ElementTag traitName = scriptEntry.getElement("trait"); - NPC npc = Utilities.getEntryNPC(scriptEntry).getCitizen(); + List npcs = (List) scriptEntry.getObject("npcs"); if (scriptEntry.dbCallShouldDebug()) { - Debug.report(scriptEntry, getName(), traitName.debug() + - toggle.debug() + - Utilities.getEntryNPC(scriptEntry).debug()); - + toggle.debug() + + ArgumentHelper.debugList("npc", npcs)); } Class trait = CitizensAPI.getTraitFactory().getTraitClass(traitName.asString()); @@ -105,38 +116,36 @@ public void execute(ScriptEntry scriptEntry) { return; } - switch (Toggle.valueOf(toggle.asString())) { - - case TRUE: - case ON: - if (npc.hasTrait(trait)) { - Debug.echoError(scriptEntry.getResidingQueue(), "NPC already has trait '" + traitName.asString() + "'"); - } - else { - npc.addTrait(trait); - } - break; - - case FALSE: - case OFF: - if (!npc.hasTrait(trait)) { - Debug.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; - + for (NPCTag npcTag : npcs) { + NPC npc = npcTag.getCitizen(); + switch (Toggle.valueOf(toggle.asString())) { + case TRUE: + case ON: + if (npc.hasTrait(trait)) { + Debug.echoError(scriptEntry.getResidingQueue(), "NPC already has trait '" + traitName.asString() + "'"); + } + else { + npc.addTrait(trait); + } + break; + case FALSE: + case OFF: + if (!npc.hasTrait(trait)) { + Debug.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; + } } - } }