From f63ef768b417de4f8cd5a4a7fa590237399fc79d Mon Sep 17 00:00:00 2001 From: fullwall Date: Tue, 6 Nov 2012 13:42:32 +0800 Subject: [PATCH] Restrict Pose object to inside Poses, metrics version should only report the major version --- .../java/net/citizensnpcs/EventListen.java | 22 ++++-- src/main/java/net/citizensnpcs/Metrics.java | 2 +- .../java/net/citizensnpcs/NPCDataStore.java | 2 +- .../command/command/NPCCommands.java | 27 +++----- .../npc/entity/CitizensHumanNPC.java | 1 - .../java/net/citizensnpcs/trait/Poses.java | 67 ++++++++++++------- src/main/java/net/citizensnpcs/util/Util.java | 4 +- 7 files changed, 69 insertions(+), 56 deletions(-) diff --git a/src/main/java/net/citizensnpcs/EventListen.java b/src/main/java/net/citizensnpcs/EventListen.java index d1b59b439..1ae9f34e9 100644 --- a/src/main/java/net/citizensnpcs/EventListen.java +++ b/src/main/java/net/citizensnpcs/EventListen.java @@ -72,14 +72,19 @@ public class EventListen implements Listener { List ids = toRespawn.get(coord); for (int i = 0; i < ids.size(); i++) { int id = ids.get(i); - NPC npc = npcRegistry.getById(id); - if (npc == null) - continue; - npc.spawn(npc.getTrait(CurrentLocation.class).getLocation()); + spawn(id); + Messaging.debug("Spawned", id, "due to chunk load at [" + coord.x + "," + coord.z + "]"); } toRespawn.removeAll(coord); } + private void spawn(int id) { + NPC npc = npcRegistry.getById(id); + if (npc == null) + return; + npc.spawn(npc.getTrait(CurrentLocation.class).getLocation()); + } + @EventHandler(ignoreCancelled = true) public void onChunkUnload(ChunkUnloadEvent event) { ChunkCoord coord = toCoord(event.getChunk()); @@ -91,6 +96,8 @@ public class EventListen implements Listener { if (event.getWorld().equals(loc.getWorld()) && sameChunkCoordinates) { npc.despawn(); toRespawn.put(coord, npc.getId()); + Messaging.debug("Despawned", npc.getId(), "due to chunk unload at [" + coord.x + "," + + coord.z + "]"); } } } @@ -244,9 +251,9 @@ public class EventListen implements Listener { continue; List ids = toRespawn.get(chunk); for (int i = 0; i < ids.size(); i++) { - int id = ids.get(i); - NPC npc = npcRegistry.getById(id); - npc.spawn(npc.getTrait(CurrentLocation.class).getLocation()); + spawn(ids.get(i)); + Messaging + .debug("Spawned", ids.get(0), "due to world " + event.getWorld().getName() + " load"); } toRespawn.removeAll(chunk); } @@ -259,6 +266,7 @@ public class EventListen implements Listener { continue; storeForRespawn(npc); npc.despawn(); + Messaging.debug("Despawned", npc.getId() + "due to world unload at", event.getWorld().getName()); } } diff --git a/src/main/java/net/citizensnpcs/Metrics.java b/src/main/java/net/citizensnpcs/Metrics.java index 3cbd4f4dd..5a8b96c73 100644 --- a/src/main/java/net/citizensnpcs/Metrics.java +++ b/src/main/java/net/citizensnpcs/Metrics.java @@ -307,7 +307,7 @@ public class Metrics { // Construct the post data final StringBuilder data = new StringBuilder(); data.append(encode("guid")).append('=').append(encode(guid)); - encodeDataPair(data, "version", description.getVersion()); + encodeDataPair(data, "version", description.getVersion().replaceAll("\\(.*$", "")); encodeDataPair(data, "server", Bukkit.getVersion()); encodeDataPair(data, "players", Integer.toString(Bukkit.getServer().getOnlinePlayers().length)); encodeDataPair(data, "revision", String.valueOf(REVISION)); diff --git a/src/main/java/net/citizensnpcs/NPCDataStore.java b/src/main/java/net/citizensnpcs/NPCDataStore.java index c515344ef..e2de85d7a 100644 --- a/src/main/java/net/citizensnpcs/NPCDataStore.java +++ b/src/main/java/net/citizensnpcs/NPCDataStore.java @@ -45,7 +45,7 @@ public class NPCDataStore { created++; } - Messaging.logTr(Messages.NUM_LOADED_NOTIFICATION, created); + Messaging.logTr(Messages.NUM_LOADED_NOTIFICATION, created, "?"); } public void remove(NPC npc) { diff --git a/src/main/java/net/citizensnpcs/command/command/NPCCommands.java b/src/main/java/net/citizensnpcs/command/command/NPCCommands.java index 89ed4ff40..3435d7c10 100644 --- a/src/main/java/net/citizensnpcs/command/command/NPCCommands.java +++ b/src/main/java/net/citizensnpcs/command/command/NPCCommands.java @@ -43,7 +43,6 @@ import net.citizensnpcs.util.Messages; import net.citizensnpcs.util.Messaging; import net.citizensnpcs.util.NMS; import net.citizensnpcs.util.Paginator; -import net.citizensnpcs.util.Pose; import net.citizensnpcs.util.StringHelper; import net.citizensnpcs.util.Util; @@ -705,32 +704,22 @@ public class NPCCommands { } else throw new CommandException(Messages.POSE_ALREADY_EXISTS, args.getFlag("assume")); } else if (args.hasValueFlag("assume")) { - if (args.getFlag("assume").isEmpty()) + String pose = args.getFlag("assume"); + if (pose.isEmpty()) throw new CommandException(Messages.INVALID_POSE_NAME); - Pose pose = trait.getPose(args.getFlag("assume")); - if (pose == null) - throw new CommandException(Messages.POSE_MISSING, args.getFlag("assume")); + if (!trait.hasPose(pose)) + throw new CommandException(Messages.POSE_MISSING, pose); trait.assumePose(pose); } else if (args.hasValueFlag("remove")) { if (args.getFlag("remove").isEmpty()) throw new CommandException(Messages.INVALID_POSE_NAME); - if (trait.removePose(trait.getPose(args.getFlag("remove")))) + if (trait.removePose(args.getFlag("remove"))) { Messaging.sendTr(sender, Messages.POSE_REMOVED); - else + } else throw new CommandException(Messages.POSE_MISSING, args.getFlag("remove")); } else if (!args.hasFlag('a')) { - Paginator paginator = new Paginator().header("Pose"); - paginator.addLine("Key: ID Name Pitch/Yaw"); - for (int i = 0; i < trait.getPoses().size(); i++) { - String line = "" + i + " " + trait.getPoses().get(i).getName() + " " - + trait.getPoses().get(i).getPitch() + "/" + trait.getPoses().get(i).getYaw(); - paginator.addLine(line); - } - - int page = args.getInteger(1, 1); - if (!paginator.sendPage(sender, page)) - throw new CommandException(Messages.COMMAND_PAGE_MISSING); + trait.describe(sender, args.getInteger(1, 1)); } // Assume Player's pose @@ -738,7 +727,7 @@ public class NPCCommands { return; if (sender instanceof Player) { Location location = ((Player) sender).getLocation(); - trait.assumePose(new Pose(sender.getName(), location.getPitch(), location.getYaw())); + trait.assumePose(location); } else throw new ServerCommandException(); } diff --git a/src/main/java/net/citizensnpcs/npc/entity/CitizensHumanNPC.java b/src/main/java/net/citizensnpcs/npc/entity/CitizensHumanNPC.java index 63600d167..1ab9efda5 100644 --- a/src/main/java/net/citizensnpcs/npc/entity/CitizensHumanNPC.java +++ b/src/main/java/net/citizensnpcs/npc/entity/CitizensHumanNPC.java @@ -32,7 +32,6 @@ public class CitizensHumanNPC extends CitizensNPC implements Equipable { final EntityHumanNPC handle = new EntityHumanNPC(ws.getServer().getServer(), ws, StringHelper.parseColors(getFullName()), new ItemInWorldManager(ws), this); handle.getBukkitEntity().teleport(loc); - NMS.setHeadYaw(handle, loc.getYaw() % 360); Bukkit.getScheduler().scheduleSyncDelayedTask(CitizensAPI.getPlugin(), new Runnable() { @Override public void run() { diff --git a/src/main/java/net/citizensnpcs/trait/Poses.java b/src/main/java/net/citizensnpcs/trait/Poses.java index 9feaf5c3b..29a8ec049 100644 --- a/src/main/java/net/citizensnpcs/trait/Poses.java +++ b/src/main/java/net/citizensnpcs/trait/Poses.java @@ -1,20 +1,24 @@ package net.citizensnpcs.trait; -import java.util.ArrayList; -import java.util.List; +import java.util.Map; import net.citizensnpcs.api.exception.NPCLoadException; import net.citizensnpcs.api.trait.Trait; import net.citizensnpcs.api.util.DataKey; +import net.citizensnpcs.command.exception.CommandException; import net.citizensnpcs.util.Messages; import net.citizensnpcs.util.Messaging; +import net.citizensnpcs.util.Paginator; import net.citizensnpcs.util.Pose; import net.citizensnpcs.util.Util; import org.bukkit.Location; +import org.bukkit.command.CommandSender; + +import com.google.common.collect.Maps; public class Poses extends Trait { - private final List poses = new ArrayList(); + private final Map poses = Maps.newHashMap(); public Poses() { super("poses"); @@ -22,28 +26,21 @@ public class Poses extends Trait { public boolean addPose(String name, Location location) { Pose newPose = new Pose(name, location.getPitch(), location.getYaw()); - if (poses.contains(newPose)) + if (poses.containsValue(newPose) || poses.containsKey(name)) return false; - poses.add(newPose); + poses.put(name.toLowerCase(), newPose); return true; } - public void assumePose(Pose pose) { + public void assumePose(Location location) { + assumePose(location.getYaw(), location.getPitch()); + } + + private void assumePose(float yaw, float pitch) { if (!npc.isSpawned()) npc.spawn(npc.getTrait(CurrentLocation.class).getLocation()); - Util.assumePose(npc.getBukkitEntity(), pose); - } - - public Pose getPose(String name) { - for (Pose pose : poses) - if (pose.getName().equalsIgnoreCase(name)) - return pose; - return null; - } - - public List getPoses() { - return poses; + Util.assumePose(npc.getBukkitEntity(), yaw, pitch); } @Override @@ -51,18 +48,14 @@ public class Poses extends Trait { for (DataKey sub : key.getRelative("list").getIntegerSubKeys()) try { String[] parts = sub.getString("").split(";"); - poses.add(new Pose(parts[0], Float.valueOf(parts[1]), Float.valueOf(parts[2]))); + poses.put(parts[0], new Pose(parts[0], Float.valueOf(parts[1]), Float.valueOf(parts[2]))); } catch (NumberFormatException e) { Messaging.logTr(Messages.SKIPPING_INVALID_POSE, sub.name(), e.getMessage()); } } - public boolean removePose(Pose pose) { - if (poses.contains(pose)) { - poses.remove(pose); - return true; - } - return false; + public boolean removePose(String pose) { + return poses.remove(pose.toLowerCase()) != null; } @Override @@ -71,4 +64,28 @@ public class Poses extends Trait { for (int i = 0; i < poses.size(); i++) key.setString("list." + String.valueOf(i), poses.get(i).stringValue()); } + + public void assumePose(String flag) { + Pose pose = poses.get(flag.toLowerCase()); + assumePose(pose.getYaw(), pose.getPitch()); + } + + public boolean hasPose(String pose) { + return poses.containsKey(pose.toLowerCase()); + } + + public void describe(CommandSender sender, int page) throws CommandException { + Paginator paginator = new Paginator().header("Pose"); + paginator.addLine("Key: ID Name Pitch/Yaw"); + int i = 0; + for (Pose pose : poses.values()) { + String line = "" + i + " " + pose.getName() + " " + pose.getPitch() + "/" + + pose.getYaw(); + paginator.addLine(line); + i++; + } + + if (!paginator.sendPage(sender, page)) + throw new CommandException(Messages.COMMAND_PAGE_MISSING); + } } diff --git a/src/main/java/net/citizensnpcs/util/Util.java b/src/main/java/net/citizensnpcs/util/Util.java index aaf97edba..b4a737ecf 100644 --- a/src/main/java/net/citizensnpcs/util/Util.java +++ b/src/main/java/net/citizensnpcs/util/Util.java @@ -27,9 +27,9 @@ public class Util { private Util() { } - public static void assumePose(org.bukkit.entity.Entity entity, Pose pose) { + public static void assumePose(org.bukkit.entity.Entity entity, float yaw, float pitch) { EntityLiving handle = ((CraftLivingEntity) entity).getHandle(); - NMS.look(handle, pose.getYaw(), pose.getPitch()); + NMS.look(handle, yaw,pitch); } public static void callCollisionEvent(NPC npc, net.minecraft.server.Entity entity) {