package net.aufdemrand.denizen.scripts.commands.npc;
import net.aufdemrand.denizen.BukkitScriptEntryData;
import net.aufdemrand.denizen.objects.dLocation;
import net.aufdemrand.denizen.objects.dNPC;
import net.aufdemrand.denizen.utilities.debugging.dB;
import net.aufdemrand.denizencore.exceptions.CommandExecutionException;
import net.aufdemrand.denizencore.exceptions.InvalidArgumentsException;
import net.aufdemrand.denizencore.objects.aH;
import net.aufdemrand.denizencore.scripts.ScriptEntry;
import net.aufdemrand.denizencore.scripts.commands.AbstractCommand;
import net.citizensnpcs.trait.Poses;
import org.bukkit.Location;
import org.bukkit.entity.Player;
public class PoseCommand extends AbstractCommand {
private enum TargetType {NPC, PLAYER}
private enum Action {ADD, REMOVE, ASSUME}
@Override
public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException {
// Parse Arguments
for (aH.Argument arg : aH.interpret(scriptEntry.getArguments())) {
if (arg.matches("add", "assume", "remove")) {
scriptEntry.addObject("action", Action.valueOf(arg.getValue().toUpperCase()));
}
else if (arg.matchesPrefix("id")) {
scriptEntry.addObject("pose_id", arg.getValue());
}
else if (arg.matches("player")) {
scriptEntry.addObject("target", TargetType.PLAYER);
}
else if (arg.matchesArgumentType(dLocation.class)) {
scriptEntry.addObject("pose_loc", arg.asType(dLocation.class));
}
}
// Even if the target is a player, this command requires an NPC to get the pose from.
if (!((BukkitScriptEntryData) scriptEntry.entryData).hasNPC()) {
throw new InvalidArgumentsException("This command requires an NPC!");
}
// It also requires a pose ID
if (!scriptEntry.hasObject("pose_id")) {
throw new InvalidArgumentsException("No ID specified!");
}
// Set default objects
scriptEntry.defaultObject("target", TargetType.NPC);
scriptEntry.defaultObject("action", Action.ASSUME);
// If the target is a player, it needs a player! However, you can't ADD/REMOVE poses
// from players, so only allow ASSUME.
if (scriptEntry.getObject("target") == TargetType.PLAYER) {
if (scriptEntry.getObject("action") != Action.ASSUME) {
throw new InvalidArgumentsException("You cannot add or remove poses from a player.");
}
else if (!((BukkitScriptEntryData) scriptEntry.entryData).hasPlayer()) {
throw new InvalidArgumentsException("This command requires a linked player!");
}
}
}
@Override
public void execute(ScriptEntry scriptEntry) throws CommandExecutionException {
// Get objects
TargetType target = (TargetType) scriptEntry.getObject("target");
dNPC npc = ((BukkitScriptEntryData) scriptEntry.entryData).getNPC();
Action action = (Action) scriptEntry.getObject("action");
String id = (String) scriptEntry.getObject("pose_id");
dLocation pose_loc = (dLocation) scriptEntry.getObject("pose_loc");
// Report to dB
dB.report(scriptEntry, getName(),
aH.debugObj("Target", target.toString())
+ (target == TargetType.PLAYER ? ((BukkitScriptEntryData) scriptEntry.entryData).getPlayer().debug() : "")
+ npc.debug()
+ aH.debugObj("Action", action.toString())
+ aH.debugObj("Id", id)
+ (pose_loc != null ? pose_loc.debug() : ""));
if (!npc.getCitizen().hasTrait(Poses.class)) {
npc.getCitizen().addTrait(Poses.class);
}
Poses poses = npc.getCitizen().getTrait(Poses.class);
switch (action) {
case ASSUME:
if (!poses.hasPose(id)) {
throw new CommandExecutionException("Pose \"" + id + "\" doesn't exist for " + npc.toString());
}
if (target.name().equals("NPC")) {
poses.assumePose(id);
}
else {
Player player = ((BukkitScriptEntryData) scriptEntry.entryData).getPlayer().getPlayerEntity();
Location location = player.getLocation();
location.setYaw(poses.getPose(id).getYaw());
location.setPitch(poses.getPose(id).getPitch());
// The only way to change a player's yaw and pitch in Bukkit
// is to use teleport on him/her
player.teleport(location);
}
break;
case ADD:
if (!poses.addPose(id, pose_loc)) {
throw new CommandExecutionException(npc.toString() + " already has that pose!");
}
break;
case REMOVE:
if (!poses.removePose(id)) {
throw new CommandExecutionException(npc.toString() + " does not have that pose!");
}
break;
}
}
}