diff --git a/plugin/src/main/java/net/aufdemrand/denizen/objects/dLocation.java b/plugin/src/main/java/net/aufdemrand/denizen/objects/dLocation.java index c5b39e07d9..33cad02f6f 100644 --- a/plugin/src/main/java/net/aufdemrand/denizen/objects/dLocation.java +++ b/plugin/src/main/java/net/aufdemrand/denizen/objects/dLocation.java @@ -2167,6 +2167,15 @@ public void applyProperty(Mechanism mechanism) { dB.echoError("Cannot apply properties to a location!"); } + public static BlockFace faceFor(Vector vec) { + for (BlockFace face : BlockFace.values()) { + if (face.getDirection().distanceSquared(vec) < 0.01) { // floating-point safe check + return face; + } + } + return null; + } + @Override public void adjust(Mechanism mechanism) { @@ -2178,6 +2187,28 @@ public void adjust(Mechanism mechanism) { blockData.setBlock(getBlock(), false); } + // <--[mechanism] + // @object dLocation + // @name block_facing + // @input dLocation + // @description + // Sets the facing direction of the block, as a vector. + // @tags + // + // --> + if (mechanism.matches("block_facing") && mechanism.requireObject(dLocation.class)) { + dLocation faceVec = value.asType(dLocation.class); + if (getBlock().getBlockData() instanceof Directional) { + Directional dir = (Directional) getBlock().getBlockData(); + BlockFace newFace = faceFor(faceVec.toVector()); + if (newFace == null) { + dB.echoError("Direction '" + faceVec + "' does not appear to be a valid block face."); + } + dir.setFacing(newFace); + getBlock().setBlockData(dir); + } + } + // <--[mechanism] // @object dLocation // @name block_type