diff --git a/lib/CitizensAPI.jar b/lib/CitizensAPI.jar index 94c9799f9..f2d6b1bad 100644 Binary files a/lib/CitizensAPI.jar and b/lib/CitizensAPI.jar differ diff --git a/src/main/java/net/citizensnpcs/Citizens.java b/src/main/java/net/citizensnpcs/Citizens.java index bf684b5f1..c0a211ed6 100644 --- a/src/main/java/net/citizensnpcs/Citizens.java +++ b/src/main/java/net/citizensnpcs/Citizens.java @@ -35,8 +35,10 @@ import net.citizensnpcs.command.exception.RequirementMissingException; import net.citizensnpcs.command.exception.ServerCommandException; import net.citizensnpcs.command.exception.UnhandledCommandException; import net.citizensnpcs.command.exception.WrappedCommandException; +import net.citizensnpcs.editor.Editor; import net.citizensnpcs.npc.CitizensNPCManager; import net.citizensnpcs.trait.LookClose; +import net.citizensnpcs.trait.waypoint.Waypoints; import net.citizensnpcs.util.Messaging; import net.citizensnpcs.util.Metrics; import net.citizensnpcs.util.StringHelper; @@ -58,7 +60,7 @@ public class Citizens extends JavaPlugin { private volatile CitizensNPCManager npcManager; private final InstanceFactory characterManager = DefaultInstanceFactory.create(); private final InstanceFactory traitManager = DefaultInstanceFactory.create(Owner.class, Spawned.class, - LookClose.class, SpawnLocation.class, Inventory.class, MobType.class); + LookClose.class, SpawnLocation.class, Inventory.class, MobType.class, Waypoints.class); private final CommandManager commands = new CommandManager(); private Settings config; private Storage saves; @@ -232,6 +234,7 @@ public class Citizens extends JavaPlugin { public void reload() throws NPCLoadException { getServer().getScheduler().cancelTasks(this); + Editor.leaveAll(); config.load(); for (NPC npc : npcManager) npc.despawn(); diff --git a/src/main/java/net/citizensnpcs/command/command/EditorCommands.java b/src/main/java/net/citizensnpcs/command/command/EditorCommands.java index e0461f2a2..b3be6d00e 100644 --- a/src/main/java/net/citizensnpcs/command/command/EditorCommands.java +++ b/src/main/java/net/citizensnpcs/command/command/EditorCommands.java @@ -8,11 +8,17 @@ import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.command.Command; import net.citizensnpcs.command.CommandContext; import net.citizensnpcs.command.Requirements; +import net.citizensnpcs.editor.Editor; +import net.citizensnpcs.editor.EquipmentEditor; +import net.citizensnpcs.editor.TextEditor; +import net.citizensnpcs.trait.waypoint.Waypoints; @Requirements(selected = true, ownership = true) public class EditorCommands { + private final Citizens plugin; public EditorCommands(Citizens plugin) { + this.plugin = plugin; } @Command( @@ -25,17 +31,19 @@ public class EditorCommands { permission = "npc.edit.equip") @Requirements(selected = true, ownership = true, type = EntityType.PLAYER) public void equip(CommandContext args, Player player, NPC npc) { + Editor.enterOrLeave(player, new EquipmentEditor(plugin, player, npc)); } @Command( aliases = { "npc" }, usage = "path", desc = "Toggle the waypoint editor", - modifiers = { "path", "waypoints" }, + modifiers = { "path" }, min = 1, max = 1, permission = "npc.edit.path") public void path(CommandContext args, Player player, NPC npc) { + Editor.enterOrLeave(player, npc.getTrait(Waypoints.class).getEditor(player)); } @Command( @@ -47,5 +55,6 @@ public class EditorCommands { max = 1, permission = "npc.edit.text") public void text(CommandContext args, Player player, NPC npc) { + Editor.enterOrLeave(player, new TextEditor()); } } \ No newline at end of file diff --git a/src/main/java/net/citizensnpcs/editor/Editor.java b/src/main/java/net/citizensnpcs/editor/Editor.java index c2acccccf..f16edcf62 100644 --- a/src/main/java/net/citizensnpcs/editor/Editor.java +++ b/src/main/java/net/citizensnpcs/editor/Editor.java @@ -1,49 +1,51 @@ package net.citizensnpcs.editor; +import java.util.HashMap; import java.util.Map; import net.citizensnpcs.util.Messaging; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; -import com.google.common.collect.Maps; - public abstract class Editor implements Listener { + private static final Map editing = new HashMap(); + public abstract void begin(); public abstract void end(); - public static void enter(Player player, Editor editor) { - if (editing.containsKey(player.getName())) { - Messaging.sendError(player, "You're already in an editor!"); - return; - } - editor.begin(); - Bukkit.getPluginManager().registerEvents(editor, Bukkit.getPluginManager().getPlugin("Citizens")); - editing.put(player.getName(), editor); - } - public static void enterOrLeave(Player player, Editor editor) { Editor edit = editing.get(player.getName()); - if (edit == null) { + if (edit == null) enter(player, editor); - } else if (edit.getClass() == editor.getClass()) { + else if (edit.getClass() == editor.getClass()) leave(player); - } else { + else Messaging.sendError(player, "You're already in an editor!"); - } } public static void leave(Player player) { - if (!editing.containsKey(player.getName())) + if (!hasEditor(player)) return; Editor editor = editing.remove(player.getName()); HandlerList.unregisterAll(editor); editor.end(); } - private static final Map editing = Maps.newHashMap(); + public static void leaveAll() { + editing.clear(); + } + + private static void enter(Player player, Editor editor) { + editor.begin(); + player.getServer().getPluginManager().registerEvents(editor, + player.getServer().getPluginManager().getPlugin("Citizens")); + editing.put(player.getName(), editor); + } + + public static boolean hasEditor(Player player) { + return editing.containsKey(player.getName()); + } } \ No newline at end of file diff --git a/src/main/java/net/citizensnpcs/editor/EquipmentEditor.java b/src/main/java/net/citizensnpcs/editor/EquipmentEditor.java index becc2d36b..287d0450a 100644 --- a/src/main/java/net/citizensnpcs/editor/EquipmentEditor.java +++ b/src/main/java/net/citizensnpcs/editor/EquipmentEditor.java @@ -1,12 +1,52 @@ package net.citizensnpcs.editor; +import net.citizensnpcs.Citizens; +import net.citizensnpcs.api.npc.NPC; +import net.citizensnpcs.util.Messaging; + +import org.bukkit.entity.Player; +import org.bukkit.event.Event.Result; +import org.bukkit.event.EventHandler; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; + public class EquipmentEditor extends Editor { + private final Citizens plugin; + private final Player player; + private final NPC npc; + + public EquipmentEditor(Citizens plugin, Player player, NPC npc) { + this.plugin = plugin; + this.player = player; + this.npc = npc; + } @Override public void begin() { + Messaging.send(player, "Entered the equipment editor!"); + Messaging.send(player, "Right click to equip armor and items."); + Messaging.send(player, "Right click while crouching to equip armor in the NPC's hand."); + Messaging.send(player, "Left click to remove all armor and items."); } @Override public void end() { + Messaging.send(player, "Exited equipment editor."); + } + + @EventHandler + public void onPlayerInteract(PlayerInteractEvent event) { + if (event.getAction() == Action.RIGHT_CLICK_AIR && Editor.hasEditor(event.getPlayer())) + event.setUseItemInHand(Result.DENY); + } + + @EventHandler + public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { + if (plugin.getNPCManager().isNPC(event.getRightClicked()) + && plugin.getNPCManager().getNPC(event.getRightClicked()).equals(npc) + && event.getPlayer().getName().equals(player.getName())) { + npc.chat("You clicked me!"); + } } } \ No newline at end of file diff --git a/src/main/java/net/citizensnpcs/editor/PathEditor.java b/src/main/java/net/citizensnpcs/editor/PathEditor.java deleted file mode 100644 index 4c1357b66..000000000 --- a/src/main/java/net/citizensnpcs/editor/PathEditor.java +++ /dev/null @@ -1,12 +0,0 @@ -package net.citizensnpcs.editor; - -public class PathEditor extends Editor { - - @Override - public void begin() { - } - - @Override - public void end() { - } -} \ No newline at end of file diff --git a/src/main/java/net/citizensnpcs/npc/CitizensNPCManager.java b/src/main/java/net/citizensnpcs/npc/CitizensNPCManager.java index 8d14e676f..6380a8393 100644 --- a/src/main/java/net/citizensnpcs/npc/CitizensNPCManager.java +++ b/src/main/java/net/citizensnpcs/npc/CitizensNPCManager.java @@ -11,6 +11,7 @@ import net.citizensnpcs.api.npc.NPCManager; import net.citizensnpcs.api.trait.Character; import net.citizensnpcs.api.trait.trait.SpawnLocation; import net.citizensnpcs.api.util.Storage; +import net.citizensnpcs.editor.Editor; import net.citizensnpcs.util.ByIdArray; import net.citizensnpcs.util.NPCBuilder; @@ -137,6 +138,9 @@ public class CitizensNPCManager implements NPCManager { selected.get(existing.getId()).remove(player.getName()); selected.put(npc.getId(), player.getName()); + // Remove editor if the player has one + Editor.leave(player); + // Call selection event player.getServer().getPluginManager().callEvent(new NPCSelectEvent(npc, player)); } diff --git a/src/main/java/net/citizensnpcs/trait/waypoint/WaypointProvider.java b/src/main/java/net/citizensnpcs/trait/waypoint/WaypointProvider.java index 5553b36c5..f517325ed 100644 --- a/src/main/java/net/citizensnpcs/trait/waypoint/WaypointProvider.java +++ b/src/main/java/net/citizensnpcs/trait/waypoint/WaypointProvider.java @@ -7,6 +7,7 @@ import net.citizensnpcs.editor.Editor; import org.bukkit.entity.Player; public interface WaypointProvider { + public Editor createEditor(Player player); public void load(DataKey key); diff --git a/src/main/java/net/citizensnpcs/util/StorageUtils.java b/src/main/java/net/citizensnpcs/util/StorageUtils.java index d5bdf6272..298bd9aa1 100644 --- a/src/main/java/net/citizensnpcs/util/StorageUtils.java +++ b/src/main/java/net/citizensnpcs/util/StorageUtils.java @@ -8,16 +8,17 @@ import org.bukkit.Material; import org.bukkit.inventory.ItemStack; public class StorageUtils { + public static Location loadLocation(DataKey root) { root = root.getRelative("location"); - return new Location(Bukkit.getWorld(root.getString("world")), root.getDouble("x"), root.getDouble("y"), - root.getDouble("z"), (float) root.getDouble("yaw", 0), (float) root.getDouble("pitch", 0)); + return new Location(Bukkit.getWorld(root.getString("world")), root.getDouble("x"), root.getDouble("y"), root + .getDouble("z"), (float) root.getDouble("yaw", 0), (float) root.getDouble("pitch", 0)); } public static ItemStack loadItemStack(DataKey root) { root = root.getRelative("item"); - return new ItemStack(Material.matchMaterial(root.getString("id")), root.getInt("amount"), - (short) (root.keyExists("data") ? root.getInt("data") : 0)); + return new ItemStack(Material.matchMaterial(root.getString("id")), root.getInt("amount"), (short) (root + .keyExists("data") ? root.getInt("data") : 0)); } public static void saveLocation(DataKey key, Location location) {