From f3b93549d5887c810ffcef064505f4598378ed83 Mon Sep 17 00:00:00 2001 From: mcmonkey4eva Date: Thu, 2 Jul 2015 15:23:39 -0700 Subject: [PATCH] location.precise_impact_normal --- .../aufdemrand/denizen/objects/dLocation.java | 21 +++++++++++++++++++ .../denizen/utilities/entity/Rotation.java | 9 ++++++++ 2 files changed, 30 insertions(+) diff --git a/src/main/java/net/aufdemrand/denizen/objects/dLocation.java b/src/main/java/net/aufdemrand/denizen/objects/dLocation.java index dec2621d33..161dc290df 100644 --- a/src/main/java/net/aufdemrand/denizen/objects/dLocation.java +++ b/src/main/java/net/aufdemrand/denizen/objects/dLocation.java @@ -641,6 +641,27 @@ else if (type == Material.TRAP_DOOR // DIRECTION ATTRIBUTES ///////////////// + // <--[tag] + // @attribute ]> + // @returns dLocation + // @description + // Returns the exact impact normal at the location this location is pointing at. + // Optionally, specify a maximum range to find the location from. + // --> + if (attribute.startsWith("precise_impact_normal")) { + int range = attribute.getIntContext(1); + if (range < 1) range = 200; + double xzLen = Math.cos((getPitch() % 360) * (Math.PI / 180)); + double nx = xzLen * Math.sin(-getYaw() * (Math.PI / 180)); + double ny = Math.sin(getPitch() * (Math.PI / 180)); + double nz = xzLen * Math.cos(getYaw() * (Math.PI / 180)); + Location location = Rotation.getImpactNormal(this, new org.bukkit.util.Vector(nx, -ny, nz), range); + if (location != null) + return new dLocation(location).getAttribute(attribute.fulfill(1)); + else + return null; + } + // <--[tag] // @attribute ]> // @returns dLocation diff --git a/src/main/java/net/aufdemrand/denizen/utilities/entity/Rotation.java b/src/main/java/net/aufdemrand/denizen/utilities/entity/Rotation.java index 63210cd134..3a7eb6f0a0 100644 --- a/src/main/java/net/aufdemrand/denizen/utilities/entity/Rotation.java +++ b/src/main/java/net/aufdemrand/denizen/utilities/entity/Rotation.java @@ -143,6 +143,15 @@ public static Location rayTrace(Location start, Vector direction, double range) return null; } + public static Location getImpactNormal(Location start, Vector direction, double range) { + Vector startVec = start.toVector(); + MovingObjectPosition l = rayTrace(start.getWorld(), startVec, startVec.clone().add(direction.multiply(range))); + if (l != null && l.direction != null) { + return new Location(start.getWorld(), l.direction.getAdjacentX(), l.direction.getAdjacentY(), l.direction.getAdjacentZ()); + } + return null; + } + /** * Gets the precise location a LivingEntity is looking at. *