Package net.aufdemrand.denizen.scripts.commands.npc

Source Code of net.aufdemrand.denizen.scripts.commands.npc.TraitCommand

package net.aufdemrand.denizen.scripts.commands.npc;

import net.aufdemrand.denizen.BukkitScriptEntryData;
import net.aufdemrand.denizencore.exceptions.CommandExecutionException;
import net.aufdemrand.denizencore.exceptions.InvalidArgumentsException;
import net.aufdemrand.denizen.objects.Element;
import net.aufdemrand.denizen.objects.aH;
import net.aufdemrand.denizen.scripts.ScriptEntry;
import net.aufdemrand.denizen.scripts.commands.AbstractCommand;
import net.aufdemrand.denizen.utilities.debugging.dB;
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;

        }

    }
}
TOP

Related Classes of net.aufdemrand.denizen.scripts.commands.npc.TraitCommand

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.