diff --git a/src/main/java/net/citizensnpcs/commands/EditorCommands.java b/src/main/java/net/citizensnpcs/commands/EditorCommands.java index e5b560282..2b9efe344 100644 --- a/src/main/java/net/citizensnpcs/commands/EditorCommands.java +++ b/src/main/java/net/citizensnpcs/commands/EditorCommands.java @@ -35,11 +35,12 @@ public class EditorCommands { modifiers = { "path" }, min = 1, max = 1, + flags = "*", permission = "citizens.npc.edit.path") @Requirements(selected = true, ownership = true, excludedTypes = { EntityType.BLAZE, EntityType.ENDER_DRAGON, EntityType.GHAST, EntityType.BAT, EntityType.WITHER, EntityType.SQUID }) public void path(CommandContext args, Player player, NPC npc) { - Editor.enterOrLeave(player, npc.getTrait(Waypoints.class).getEditor(player)); + Editor.enterOrLeave(player, npc.getTrait(Waypoints.class).getEditor(player, args)); } @Command( diff --git a/src/main/java/net/citizensnpcs/commands/NPCCommands.java b/src/main/java/net/citizensnpcs/commands/NPCCommands.java index c53c36861..ab52540d8 100644 --- a/src/main/java/net/citizensnpcs/commands/NPCCommands.java +++ b/src/main/java/net/citizensnpcs/commands/NPCCommands.java @@ -334,37 +334,7 @@ public class NPCCommands { } if (args.hasValueFlag("at")) { - String[] parts = Iterables.toArray(Splitter.on(':').split(args.getFlag("at")), String.class); - if (parts.length > 0) { - String worldName = args.getSenderLocation() != null ? args.getSenderLocation().getWorld().getName() - : ""; - int x = 0, y = 0, z = 0; - float yaw = 0F, pitch = 0F; - switch (parts.length) { - case 6: - pitch = Float.parseFloat(parts[5]); - case 5: - yaw = Float.parseFloat(parts[4]); - case 4: - worldName = parts[3]; - case 3: - x = Integer.parseInt(parts[0]); - y = Integer.parseInt(parts[1]); - z = Integer.parseInt(parts[2]); - break; - default: - throw new CommandException(Messages.INVALID_SPAWN_LOCATION); - } - World world = Bukkit.getWorld(worldName); - if (world == null) - throw new CommandException(Messages.INVALID_SPAWN_LOCATION); - spawnLoc = new Location(world, x, y, z, yaw, pitch); - } else { - Player search = Bukkit.getPlayerExact(args.getFlag("at")); - if (search == null) - throw new CommandException(Messages.PLAYER_NOT_FOUND_FOR_SPAWN); - spawnLoc = search.getLocation(); - } + spawnLoc = Util.parseLocation(args.getSenderLocation(), args.getFlag("at")); } if (spawnLoc == null) { npc.destroy(); diff --git a/src/main/java/net/citizensnpcs/editor/Editor.java b/src/main/java/net/citizensnpcs/editor/Editor.java index 06aaef0c0..5a49589b0 100644 --- a/src/main/java/net/citizensnpcs/editor/Editor.java +++ b/src/main/java/net/citizensnpcs/editor/Editor.java @@ -26,6 +26,8 @@ public abstract class Editor implements Listener { } public static void enterOrLeave(Player player, Editor editor) { + if (editor == null) + return; Editor edit = EDITING.get(player.getName()); if (edit == null) enter(player, editor); diff --git a/src/main/java/net/citizensnpcs/trait/waypoint/LinearWaypointProvider.java b/src/main/java/net/citizensnpcs/trait/waypoint/LinearWaypointProvider.java index eab3e338e..33e53b251 100644 --- a/src/main/java/net/citizensnpcs/trait/waypoint/LinearWaypointProvider.java +++ b/src/main/java/net/citizensnpcs/trait/waypoint/LinearWaypointProvider.java @@ -12,6 +12,8 @@ import net.citizensnpcs.api.ai.GoalSelector; import net.citizensnpcs.api.ai.Navigator; import net.citizensnpcs.api.ai.event.CancelReason; import net.citizensnpcs.api.ai.event.NavigatorCallback; +import net.citizensnpcs.api.command.CommandContext; +import net.citizensnpcs.api.command.exception.CommandException; import net.citizensnpcs.api.event.NPCDespawnEvent; import net.citizensnpcs.api.event.NPCRemoveEvent; import net.citizensnpcs.api.npc.NPC; @@ -22,6 +24,7 @@ import net.citizensnpcs.editor.Editor; import net.citizensnpcs.trait.waypoint.triggers.TriggerEditPrompt; import net.citizensnpcs.util.Messages; import net.citizensnpcs.util.NMS; +import net.citizensnpcs.util.Util; import org.bukkit.Bukkit; import org.bukkit.ChatColor; @@ -48,7 +51,24 @@ public class LinearWaypointProvider implements WaypointProvider { private final List waypoints = Lists.newArrayList(); @Override - public WaypointEditor createEditor(Player player) { + public WaypointEditor createEditor(Player player, CommandContext args) { + if (args.hasFlag('h')) { + waypoints.add(new Waypoint(player.getLocation())); + return null; + } + if (args.hasValueFlag("at")) { + try { + Location location = Util.parseLocation(player.getLocation(), args.getFlag("at")); + waypoints.add(new Waypoint(location)); + } catch (CommandException e) { + Messaging.sendError(player, e.getMessage()); + } + return null; + } + if (args.hasFlag('p')) { + setPaused(!isPaused()); + return null; + } return new LinearWaypointEditor(player); } diff --git a/src/main/java/net/citizensnpcs/trait/waypoint/WanderWaypointProvider.java b/src/main/java/net/citizensnpcs/trait/waypoint/WanderWaypointProvider.java index 3de48544a..24cfebd90 100644 --- a/src/main/java/net/citizensnpcs/trait/waypoint/WanderWaypointProvider.java +++ b/src/main/java/net/citizensnpcs/trait/waypoint/WanderWaypointProvider.java @@ -3,6 +3,7 @@ package net.citizensnpcs.trait.waypoint; import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.ai.Goal; import net.citizensnpcs.api.ai.goals.WanderGoal; +import net.citizensnpcs.api.command.CommandContext; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.persistence.Persist; import net.citizensnpcs.api.util.DataKey; @@ -18,7 +19,7 @@ public class WanderWaypointProvider implements WaypointProvider { private final int yrange = DEFAULT_YRANGE; @Override - public WaypointEditor createEditor(Player player) { + public WaypointEditor createEditor(Player player, CommandContext args) { return new WaypointEditor() { @Override public void begin() { diff --git a/src/main/java/net/citizensnpcs/trait/waypoint/WaypointProvider.java b/src/main/java/net/citizensnpcs/trait/waypoint/WaypointProvider.java index befcb0179..25481de30 100644 --- a/src/main/java/net/citizensnpcs/trait/waypoint/WaypointProvider.java +++ b/src/main/java/net/citizensnpcs/trait/waypoint/WaypointProvider.java @@ -1,5 +1,6 @@ package net.citizensnpcs.trait.waypoint; +import net.citizensnpcs.api.command.CommandContext; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.util.DataKey; @@ -12,9 +13,10 @@ public interface WaypointProvider { * * @param player * The player to link the editor with + * @param args * @return The editor */ - public WaypointEditor createEditor(Player player); + public WaypointEditor createEditor(Player player, CommandContext args); /** * Returns whether this provider has paused execution of waypoints. diff --git a/src/main/java/net/citizensnpcs/trait/waypoint/Waypoints.java b/src/main/java/net/citizensnpcs/trait/waypoint/Waypoints.java index 34a93408f..97a623ff8 100644 --- a/src/main/java/net/citizensnpcs/trait/waypoint/Waypoints.java +++ b/src/main/java/net/citizensnpcs/trait/waypoint/Waypoints.java @@ -3,6 +3,7 @@ package net.citizensnpcs.trait.waypoint; import java.util.Map; import java.util.Map.Entry; +import net.citizensnpcs.api.command.CommandContext; import net.citizensnpcs.api.exception.NPCLoadException; import net.citizensnpcs.api.trait.Trait; import net.citizensnpcs.api.util.DataKey; @@ -57,8 +58,8 @@ public class Waypoints extends Trait { return providerName; } - public Editor getEditor(Player player) { - return provider.createEditor(player); + public Editor getEditor(Player player, CommandContext args) { + return provider.createEditor(player, args); } @Override diff --git a/src/main/java/net/citizensnpcs/util/Util.java b/src/main/java/net/citizensnpcs/util/Util.java index 816435108..d668f1117 100644 --- a/src/main/java/net/citizensnpcs/util/Util.java +++ b/src/main/java/net/citizensnpcs/util/Util.java @@ -2,6 +2,7 @@ package net.citizensnpcs.util; import java.util.Random; +import net.citizensnpcs.api.command.exception.CommandException; import net.citizensnpcs.api.event.NPCCollisionEvent; import net.citizensnpcs.api.event.NPCPushEvent; import net.citizensnpcs.api.npc.NPC; @@ -9,6 +10,7 @@ import net.citizensnpcs.api.npc.NPC; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; @@ -16,6 +18,7 @@ import org.bukkit.entity.Player; import org.bukkit.util.Vector; import com.google.common.base.Splitter; +import com.google.common.collect.Iterables; public class Util { // Static class for small (emphasis small) utility methods @@ -117,4 +120,37 @@ public class Util { } return false; } + + public static Location parseLocation(Location currentLocation, String flag) throws CommandException { + String[] parts = Iterables.toArray(Splitter.on(':').split(flag), String.class); + if (parts.length > 0) { + String worldName = currentLocation != null ? currentLocation.getWorld().getName() : ""; + int x = 0, y = 0, z = 0; + float yaw = 0F, pitch = 0F; + switch (parts.length) { + case 6: + pitch = Float.parseFloat(parts[5]); + case 5: + yaw = Float.parseFloat(parts[4]); + case 4: + worldName = parts[3]; + case 3: + x = Integer.parseInt(parts[0]); + y = Integer.parseInt(parts[1]); + z = Integer.parseInt(parts[2]); + break; + default: + throw new CommandException(Messages.INVALID_SPAWN_LOCATION); + } + World world = Bukkit.getWorld(worldName); + if (world == null) + throw new CommandException(Messages.INVALID_SPAWN_LOCATION); + return new Location(world, x, y, z, yaw, pitch); + } else { + Player search = Bukkit.getPlayerExact(flag); + if (search == null) + throw new CommandException(Messages.PLAYER_NOT_FOUND_FOR_SPAWN); + return search.getLocation(); + } + } }