+ * | Stairs | getFacing() returns opposite of what it’s set to. |
+ * | Torch | Facing and attached face are opposite; getFacing() is accurate. |
+ * | Ladder | Facing and AttachedFace are the same, but SimpleAttachableMaterialData will
+ * flip the result when you call getFacing() so it lies. |
+ * | Button | same as Torch |
+ * | Lever | same as Torch? |
+ * | Trapdoor | same as Torch |
+ * | TripwireHook | same as Torch |
+ *
+ * Basically, this ask the Block for its facing, and if it is one that lies, the result is flipped.
+ * @param handle the block whose facing you want to know.
+ * @return the true facing of the block.
+ */
+ private BlockFace getActualFacing(Directional dirData) {
+ BlockFace facing = dirData.getFacing();
+ if (Stairs.class.isAssignableFrom(dirData.getClass())
+ || Ladder.class.isAssignableFrom(dirData.getClass())) {
+ facing = facing.getOppositeFace();
+ }
+ return facing;
+ }
+
+
+ private BlockFace getRotatedFacing(BlockFace inFacing) {
+ BlockFace facing = inFacing;
+ int angle = this.rotation;
+ while (angle > 0) {
+ switch (facing) {
+ case NORTH:
+ facing = BlockFace.EAST;
+ break;
+ case EAST:
+ facing = BlockFace.SOUTH;
+ break;
+ case SOUTH:
+ facing = BlockFace.WEST;
+ break;
+ case WEST:
+ facing = BlockFace.NORTH;
+ break;
+ case NORTH_EAST:
+ facing = BlockFace.SOUTH_EAST;
+ break;
+ case NORTH_WEST:
+ facing = BlockFace.NORTH_EAST;
+ break;
+ case SOUTH_EAST:
+ facing = BlockFace.SOUTH_WEST;
+ break;
+ case SOUTH_WEST:
+ facing = BlockFace.NORTH_WEST;
+ break;
+ case WEST_NORTH_WEST:
+ facing = BlockFace.NORTH_NORTH_EAST;
+ break;
+ case NORTH_NORTH_WEST:
+ facing = BlockFace.EAST_NORTH_EAST;
+ break;
+ case NORTH_NORTH_EAST:
+ facing = BlockFace.EAST_SOUTH_EAST;
+ break;
+ case EAST_NORTH_EAST:
+ facing = BlockFace.SOUTH_SOUTH_EAST;
+ break;
+ case EAST_SOUTH_EAST:
+ facing = BlockFace.SOUTH_SOUTH_WEST;
+ break;
+ case SOUTH_SOUTH_EAST:
+ facing = BlockFace.WEST_SOUTH_WEST;
+ break;
+ case SOUTH_SOUTH_WEST:
+ facing = BlockFace.WEST_NORTH_WEST;
+ break;
+ case WEST_SOUTH_WEST:
+ facing = BlockFace.NORTH_NORTH_WEST;
+ break;
+ }
+ angle -= 90;
+ }
+ return facing;
+ }
+
+
+ /**
+ * attempts to work around any bugs in any Directional block type’s
+ * {@link Directional#setFacingDirection(org.bukkit.block.BlockFace) setFacingDirection()}.
+ * @param data
+ * @param dataAsDirectional
+ * @param newFacing
+ */
+ private void setFacingCorrectly(MaterialData data,
+ Directional dataAsDirectional,
+ BlockFace newFacing) {
+ if (Door.class.isAssignableFrom(data.getClass())) {
+ int faceVal = (((newFacing == BlockFace.WEST) ? 0x00 : ((newFacing == BlockFace.NORTH) ? 0x01 : ((newFacing == BlockFace.EAST) ? 0x02 : 0x03))));
+ int cleanData = data.getData() & 0x03;
+ int newData = cleanData | faceVal;
+ data.setData((byte)newData);
+ } else {
+ dataAsDirectional.setFacingDirection(newFacing);
+ }
+ }
+}
diff --git a/src/main/java/me/simplex/buildr/runnable/builder/SlopeBuilderTask.java b/src/main/java/me/simplex/buildr/runnable/builder/SlopeBuilderTask.java
index edcb9dc..1418af3 100644
--- a/src/main/java/me/simplex/buildr/runnable/builder/SlopeBuilderTask.java
+++ b/src/main/java/me/simplex/buildr/runnable/builder/SlopeBuilderTask.java
@@ -20,9 +20,9 @@
package me.simplex.buildr.runnable.builder;
import java.util.HashMap;
+import java.util.Map;
import me.simplex.buildr.Buildr;
import me.simplex.buildr.util.Buildr_Container_UndoBlock;
-import me.simplex.buildr.util.MaterialAndData;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
@@ -78,7 +78,7 @@ public void run() {
int north = Math.min(position1.getZ(), position2.getZ());
int south = Math.max(position1.getZ(), position2.getZ());
- HashMap