@@ -0,0 +1,2555 @@
+package com.elmakers.mine.bukkit.block;%0A%0Aimport org.bukkit.block.Block;%0A%0A/**%0A * Represents the face of a block%0A *%0A * This was copied from the Bukkit API to add%0A * vertical diagonals.%0A */%0Apublic enum BlockFace %7B%0A    NORTH(0, 0, -1),%0A    EAST(1, 0, 0),%0A    SOUTH(0, 0, 1),%0A    WEST(-1, 0, 0),%0A    UP(0, 1, 0),%0A    DOWN(0, -1, 0),%0A    NORTH_EAST(NORTH, EAST),%0A    NORTH_WEST(NORTH, WEST),%0A    SOUTH_EAST(SOUTH, EAST),%0A    SOUTH_WEST(SOUTH, WEST),%0A    WEST_NORTH_WEST(WEST, NORTH_WEST),%0A    NORTH_NORTH_WEST(NORTH, NORTH_WEST),%0A    NORTH_NORTH_EAST(NORTH, NORTH_EAST),%0A    EAST_NORTH_EAST(EAST, NORTH_EAST),%0A    EAST_SOUTH_EAST(EAST, SOUTH_EAST),%0A    SOUTH_SOUTH_EAST(SOUTH, SOUTH_EAST),%0A    SOUTH_SOUTH_WEST(SOUTH, SOUTH_WEST),%0A    WEST_SOUTH_WEST(WEST, SOUTH_WEST),%0A    SELF(0, 0, 0),%0A%0A    UP_NORTH(UP, NORTH),%0A    UP_EAST(UP, EAST),%0A    UP_SOUTH(UP, SOUTH),%0A    UP_WEST(UP, WEST),%0A%0A    UP_NORTH_EAST(UP, NORTH_EAST),%0A    UP_NORTH_WEST(UP, NORTH_WEST),%0A    UP_SOUTH_EAST(UP, SOUTH_EAST),%0A    UP_SOUTH_WEST(UP, SOUTH_WEST),%0A%0A    DOWN_NORTH(DOWN, NORTH),%0A    DOWN_EAST(DOWN, EAST),%0A    DOWN_SOUTH(DOWN, SOUTH),%0A    DOWN_WEST(DOWN, WEST),%0A%0A    DOWN_NORTH_EAST(DOWN, NORTH_EAST),%0A    DOWN_NORTH_WEST(DOWN, NORTH_WEST),%0A    DOWN_SOUTH_EAST(DOWN, SOUTH_EAST),%0A    DOWN_SOUTH_WEST(DOWN, SOUTH_WEST)%0A    ;%0A%0A    private final int modX;%0A    private final int modY;%0A    private final int modZ;%0A%0A    private BlockFace(final int modX, final int modY, final int modZ) %7B%0A        this.modX = modX;%0A        this.modY = modY;%0A        this.modZ = modZ;%0A    %7D%0A%0A    private BlockFace(final BlockFace face1, final BlockFace face2) %7B%0A        this.modX = face1.getModX() + face2.getModX();%0A        this.modY = face1.getModY() + face2.getModY();%0A        this.modZ = face1.getModZ() + face2.getModZ();%0A    %7D%0A%0A    /**%0A     * Get the amount of X-coordinates to modify to get the represented block%0A     *%0A     * @return Amount of X-coordinates to modify%0A     */%0A    public int getModX() %7B%0A        return modX;%0A    %7D%0A%0A    /**%0A     * Get the amount of Y-coordinates to modify to get the represented block%0A     *%0A     * @return Amount of Y-coordinates to modify%0A     */%0A    public int getModY() %7B%0A        return modY;%0A    %7D%0A%0A    /**%0A     * Get the amount of Z-coordinates to modify to get the represented block%0A     *%0A     * @return Amount of Z-coordinates to modify%0A     */%0A    public int getModZ() %7B%0A        return modZ;%0A    %7D%0A%0A    public Block getRelative(Block block) %7B%0A        return block.getWorld().getBlockAt(block.getX() + modX, block.getY() + modY, block.getZ() + modZ);%0A    %7D%0A%7D%0A

Add a custom version of the BlockFace enum that contains UP/DOWN neighbors as well.