From 967eef4836c4de31d0c574c88bc5c4807ca221a8 Mon Sep 17 00:00:00 2001 From: aPunch Date: Sun, 29 Jan 2012 11:52:50 -0600 Subject: [PATCH] added selection command, bug fixes --- lib/CitizensAPI.jar | Bin 19574 -> 19990 bytes src/net/citizensnpcs/Citizens.java | 4 + .../command/command/NPCCommands.java | 76 ++++++++++++------ .../citizensnpcs/npc/CitizensNPCManager.java | 41 +++++----- 4 files changed, 74 insertions(+), 47 deletions(-) diff --git a/lib/CitizensAPI.jar b/lib/CitizensAPI.jar index 88920a0ae55614fabc46d71c4acad8e3a07d4969..5056dcedaf4570bb97dccd7eff012c2cbc672d8c 100644 GIT binary patch delta 3990 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 diff --git a/src/net/citizensnpcs/Citizens.java b/src/net/citizensnpcs/Citizens.java index b0794f528..e2eb49448 100644 --- a/src/net/citizensnpcs/Citizens.java +++ b/src/net/citizensnpcs/Citizens.java @@ -191,11 +191,15 @@ public class Citizens extends JavaPlugin { } private void registerPermissions() { + // TODO There has to be a better way than this (maybe use Permission + // annotation to register permissions?) Map children = new HashMap(); children.put("citizens.npc.create", true); children.put("citizens.npc.spawn", true); children.put("citizens.npc.despawn", true); children.put("citizens.npc.select", true); + children.put("citizens.npc.tp", true); + children.put("citizens.npc.tphere", true); Permission perm = new Permission("citizens.*", PermissionDefault.OP, children); getServer().getPluginManager().addPermission(perm); diff --git a/src/net/citizensnpcs/command/command/NPCCommands.java b/src/net/citizensnpcs/command/command/NPCCommands.java index 832395bfc..f9fa542c1 100644 --- a/src/net/citizensnpcs/command/command/NPCCommands.java +++ b/src/net/citizensnpcs/command/command/NPCCommands.java @@ -1,5 +1,6 @@ package net.citizensnpcs.command.command; +import net.citizensnpcs.Settings.Setting; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.npc.trait.Character; import net.citizensnpcs.api.npc.trait.DefaultInstanceFactory; @@ -63,6 +64,19 @@ public class NPCCommands { Messaging.send(player, successMsg); } + @Command( + aliases = { "npc" }, + usage = "despawn", + desc = "Despawn an NPC", + modifiers = { "despawn" }, + min = 1, + max = 1) + @Permission("npc.despawn") + public void despawnNPC(CommandContext args, Player player, NPC npc) { + npc.despawn(); + Messaging.send(player, ChatColor.GREEN + "You despawned " + StringHelper.wrap(npc.getName()) + "."); + } + @Command( aliases = { "npc" }, usage = "spawn [id]", @@ -71,7 +85,6 @@ public class NPCCommands { min = 2, max = 2) @Permission("npc.spawn") - @Requirements public void spawnNPC(CommandContext args, Player player, NPC npc) { CitizensNPC respawn = (CitizensNPC) npcManager.getNPC(args.getInteger(1)); if (respawn == null) { @@ -89,34 +102,34 @@ public class NPCCommands { Messaging.send(player, ChatColor.GREEN + "You respawned " + StringHelper.wrap(respawn.getName()) + " at your location."); } else - Messaging.sendError(player, respawn.getName() - + " is already spawned at another location. Use '/npc move' to teleport the NPC to your location."); + Messaging + .sendError( + player, + respawn.getName() + + " is already spawned at another location. Use '/npc tphere' to teleport the NPC to your location."); } @Command( aliases = { "npc" }, - usage = "despawn", - desc = "Despawn an NPC", - modifiers = { "despawn" }, - min = 1, - max = 1) - @Permission("npc.despawn") - public void despawnNPC(CommandContext args, Player player, NPC npc) { - npc.despawn(); - Messaging.send(player, ChatColor.GREEN + "You despawned " + StringHelper.wrap(npc.getName()) + "."); - } - - @Command( - aliases = { "npc" }, - usage = "tp", - desc = "Teleport to an NPC", - modifiers = { "tp", "teleport" }, - min = 1, - max = 1) - @Permission("npc.tp") - public void teleportToNPC(CommandContext args, Player player, NPC npc) { - player.teleport(npc.getBukkitEntity(), TeleportCause.COMMAND); - Messaging.send(player, ChatColor.GREEN + "You teleported to " + StringHelper.wrap(npc.getName()) + "."); + usage = "select [id]", + desc = "Select an NPC", + modifiers = { "select" }, + min = 2, + max = 2) + @Permission("npc.select") + @Requirements(ownership = true) + public void selectNPC(CommandContext args, Player player, NPC npc) { + NPC toSelect = npcManager.getNPC(args.getInteger(1)); + if (toSelect == null) { + Messaging.sendError(player, "No NPC with the ID '" + args.getInteger(1) + "' exists."); + return; + } + if (npc != null && toSelect.getId() == npc.getId()) { + Messaging.sendError(player, "You already have that NPC selected."); + return; + } + npcManager.selectNPC(player, toSelect); + Messaging.sendWithNPC(player, Setting.SELECTION_MESSAGE.getString(), toSelect); } @Command( @@ -131,4 +144,17 @@ public class NPCCommands { npc.getBukkitEntity().teleport(player, TeleportCause.COMMAND); Messaging.send(player, StringHelper.wrap(npc.getName()) + " was teleported to your location."); } + + @Command( + aliases = { "npc" }, + usage = "tp", + desc = "Teleport to an NPC", + modifiers = { "tp", "teleport" }, + min = 1, + max = 1) + @Permission("npc.tp") + public void teleportToNPC(CommandContext args, Player player, NPC npc) { + player.teleport(npc.getBukkitEntity(), TeleportCause.COMMAND); + Messaging.send(player, ChatColor.GREEN + "You teleported to " + StringHelper.wrap(npc.getName()) + "."); + } } \ No newline at end of file diff --git a/src/net/citizensnpcs/npc/CitizensNPCManager.java b/src/net/citizensnpcs/npc/CitizensNPCManager.java index 5604f5f6f..eb56e09d7 100644 --- a/src/net/citizensnpcs/npc/CitizensNPCManager.java +++ b/src/net/citizensnpcs/npc/CitizensNPCManager.java @@ -31,9 +31,7 @@ import com.google.common.collect.HashMultimap; import com.google.common.collect.SetMultimap; public class CitizensNPCManager implements NPCManager { - // TODO: merge spawned and byID - private final ByIdArray spawned = new ByIdArray(); - private final ByIdArray byID = new ByIdArray(); + private final ByIdArray npcs = new ByIdArray(); private final SetMultimap selected = HashMultimap.create(); private final Storage saves; @@ -52,11 +50,12 @@ public class CitizensNPCManager implements NPCManager { } public NPC createNPC(int id, String name, Character character) { - if (byID.contains(id)) - throw new IllegalArgumentException("id already taken"); + if (npcs.contains(id)) + throw new IllegalArgumentException("An NPC already has the ID '" + id + "'."); + CitizensNPC npc = new CitizensNPC(this, id, name); npc.setCharacter(character); - byID.put(npc.getId(), npc); + npcs.put(npc.getId(), npc); return npc; } @@ -66,7 +65,6 @@ public class CitizensNPCManager implements NPCManager { npc.getTrait(SpawnLocation.class).setLocation(loc); selected.removeAll(npc.getId()); - spawned.remove(mcEntity.getPlayer().getEntityId()); for (Player player : Bukkit.getOnlinePlayers()) ((CraftPlayer) player).getHandle().netServerHandler.sendPacket(new Packet29DestroyEntity(mcEntity.id)); mcEntity.die(); @@ -74,7 +72,7 @@ public class CitizensNPCManager implements NPCManager { @Override public Iterator iterator() { - return byID.iterator(); + return npcs.iterator(); } private MinecraftServer getMinecraftServer(Server server) { @@ -83,22 +81,23 @@ public class CitizensNPCManager implements NPCManager { @Override public NPC getNPC(Entity entity) { - return spawned.get(entity.getEntityId()); + for (NPC npc : npcs) + if (npc.isSpawned() && npc.getBukkitEntity().getEntityId() == entity.getEntityId()) + return npc; + return null; } @Override public NPC getNPC(int id) { - return byID.get(id); + return npcs.get(id); } @Override public Collection getNPCs(Class character) { List npcs = new ArrayList(); - for (NPC npc : this) { - if (npc.getCharacter() != null && npc.getCharacter().getClass().equals(character)) { + for (NPC npc : this) + if (npc.getCharacter() != null && npc.getCharacter().getClass().equals(character)) npcs.add(npc); - } - } return npcs; } @@ -115,13 +114,13 @@ public class CitizensNPCManager implements NPCManager { @Override public boolean isNPC(Entity entity) { - return spawned.contains(entity.getEntityId()); + return getNPC(entity) != null; } public void remove(NPC npc) { - if (spawned.contains(npc.getBukkitEntity().getEntityId())) + if (npc.isSpawned()) despawn(npc); - byID.remove(npc.getId()); + npcs.remove(npc.getId()); saves.getKey("npc").removeKey("" + npc.getId()); selected.removeAll(npc.getId()); } @@ -134,16 +133,14 @@ public class CitizensNPCManager implements NPCManager { mcEntity.setPositionRotation(loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); ws.addEntity(mcEntity); ws.players.remove(mcEntity); - - spawned.put(mcEntity.getPlayer().getEntityId(), npc); return mcEntity; } public void selectNPC(Player player, NPC npc) { // Remove existing selection if any - NPC select = getSelectedNPC(player); - if (select != null) - selected.get(select.getId()).remove(player.getName()); + NPC existing = getSelectedNPC(player); + if (existing != null) + selected.get(existing.getId()).remove(player.getName()); selected.put(npc.getId(), player.getName()); }