From af7e6445fb8646a6ca51ff6a29582c7755c40c75 Mon Sep 17 00:00:00 2001 From: David Cernat Date: Mon, 10 Jun 2013 20:50:24 +0300 Subject: [PATCH] Add getClosestPlayer() utility. Add tag. --- .../denizen/npc/traits/HealthTrait.java | 2 -- .../aufdemrand/denizen/tags/core/NPCTags.java | 22 ++++++++++-- .../denizen/utilities/Utilities.java | 35 ++++++++++++++++++- 3 files changed, 53 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/aufdemrand/denizen/npc/traits/HealthTrait.java b/src/main/java/net/aufdemrand/denizen/npc/traits/HealthTrait.java index 03d8f2e3de..65968a4446 100644 --- a/src/main/java/net/aufdemrand/denizen/npc/traits/HealthTrait.java +++ b/src/main/java/net/aufdemrand/denizen/npc/traits/HealthTrait.java @@ -189,8 +189,6 @@ public void onDeath(EntityDamageEvent event) { // Check if the event pertains to this NPC if (event.getEntity() != npc.getBukkitEntity() || dying) return; - dB.echoApproval("Health left is: " + this.getHealth()); - // Make sure this is a killing blow if (this.getHealth() - event.getDamage() > 0) return; diff --git a/src/main/java/net/aufdemrand/denizen/tags/core/NPCTags.java b/src/main/java/net/aufdemrand/denizen/tags/core/NPCTags.java index 25635917b4..e08625ad11 100644 --- a/src/main/java/net/aufdemrand/denizen/tags/core/NPCTags.java +++ b/src/main/java/net/aufdemrand/denizen/tags/core/NPCTags.java @@ -6,6 +6,8 @@ import net.aufdemrand.denizen.npc.traits.AssignmentTrait; import net.aufdemrand.denizen.npc.traits.NicknameTrait; import net.aufdemrand.denizen.utilities.DenizenAPI; +import net.aufdemrand.denizen.utilities.Utilities; +import net.aufdemrand.denizen.utilities.arguments.aH; import net.aufdemrand.denizen.utilities.arguments.dLocation; import net.citizensnpcs.api.ai.event.NavigationBeginEvent; import net.citizensnpcs.api.ai.event.NavigationCancelEvent; @@ -34,16 +36,30 @@ public void npcTags(ReplaceableTagEvent event) { if (n == null) return; // to avoid exceptions in scripts with no NPC attached String type = event.getType() != null ? event.getType().toUpperCase() : ""; + String typeContext = event.getTypeContext() != null ? event.getTypeContext() : ""; String subType = event.getSubType() != null ? event.getSubType().toUpperCase() : ""; - + if (type.equals("NAME")) { event.setReplaced(ChatColor.stripColor(n.getName())); if (subType.equals("NICKNAME")) { if (n.getCitizen().hasTrait(NicknameTrait.class)) event.setReplaced(n.getCitizen().getTrait(NicknameTrait.class).getNickname()); + } + } + + else if (type.equalsIgnoreCase("CLOSEST")) + { + int range = 100; + + if (aH.matchesInteger(typeContext)) + range = aH.getIntegerFrom(typeContext); + + if (subType.equalsIgnoreCase("PLAYER")) { + event.setReplaced(String.valueOf(Utilities.getClosestPlayer(n.getLocation(), range).getName())); } - - } else if (type.equals("HEALTH")) { + } + + else if (type.equals("HEALTH")) { if (subType.equals("MAX")) event.setReplaced(String.valueOf(n.getHealthTrait().getMaxhealth())); diff --git a/src/main/java/net/aufdemrand/denizen/utilities/Utilities.java b/src/main/java/net/aufdemrand/denizen/utilities/Utilities.java index edff8e7740..55e073ef6c 100644 --- a/src/main/java/net/aufdemrand/denizen/utilities/Utilities.java +++ b/src/main/java/net/aufdemrand/denizen/utilities/Utilities.java @@ -316,6 +316,36 @@ public static void faceLocation(Entity from, Location at) { public static void faceEntity(Entity entity, Entity target) { faceLocation(entity, target.getLocation()); } + + + /** + * Finds the closest Player to a particular location. + * + * @param location The location to find the closest Player to. + * @param range The maximum range to look for the Player. + * + * @return The closest Player to the location, or null if no Player was found + * within the range specified. + */ + + @SuppressWarnings("unchecked") + public static Player getClosestPlayer (Location location, int range) { + + Player closestPlayer = null; + double closestDistance = Math.pow(range, 2); + List playerList = new ArrayList(Arrays.asList(Bukkit.getOnlinePlayers())); + Iterator it = playerList.iterator(); + while (it.hasNext()) { + Player player = it.next(); + Location loc = player.getLocation(); + if (loc.getWorld().equals(location.getWorld()) + && loc.distanceSquared(location) < closestDistance) { + closestPlayer = player; + closestDistance = player.getLocation().distanceSquared(location); + } + } + return closestPlayer; + } /** @@ -329,9 +359,10 @@ public static void faceEntity(Entity entity, Entity target) { */ public static dNPC getClosestNPC (Location location, int range) { + dNPC closestNPC = null; double closestDistance = Math.pow(range, 2); - Iterator it = DenizenAPI.getSpawnedNPCs().iterator(); + Iterator it = DenizenAPI.getSpawnedNPCs().iterator(); while (it.hasNext()) { dNPC npc = it.next(); Location loc = npc.getLocation(); @@ -355,6 +386,7 @@ public static dNPC getClosestNPC (Location location, int range) { */ public static Set getClosestNPCs (Location location, int maxRange) { + maxRange = (int) Math.pow(maxRange, 2); Set closestNPCs = new HashSet (); Iterator it = DenizenAPI.getSpawnedNPCs().iterator(); @@ -379,6 +411,7 @@ public static Set getClosestNPCs (Location location, int maxRange) { */ public static double normalizeYaw(double yaw) { + yaw = (yaw - 90) % 360; if (yaw < 0) yaw += 360.0; return yaw;