001    package org.bukkit.block;
002    
003    /**
004     * Represents the face of a block
005     */
006    public enum BlockFace {
007        NORTH(0, 0, -1),
008        EAST(1, 0, 0),
009        SOUTH(0, 0, 1),
010        WEST(-1, 0, 0),
011        UP(0, 1, 0),
012        DOWN(0, -1, 0),
013        NORTH_EAST(NORTH, EAST),
014        NORTH_WEST(NORTH, WEST),
015        SOUTH_EAST(SOUTH, EAST),
016        SOUTH_WEST(SOUTH, WEST),
017        WEST_NORTH_WEST(WEST, NORTH_WEST),
018        NORTH_NORTH_WEST(NORTH, NORTH_WEST),
019        NORTH_NORTH_EAST(NORTH, NORTH_EAST),
020        EAST_NORTH_EAST(EAST, NORTH_EAST),
021        EAST_SOUTH_EAST(EAST, SOUTH_EAST),
022        SOUTH_SOUTH_EAST(SOUTH, SOUTH_EAST),
023        SOUTH_SOUTH_WEST(SOUTH, SOUTH_WEST),
024        WEST_SOUTH_WEST(WEST, SOUTH_WEST),
025        SELF(0, 0, 0);
026    
027        private final int modX;
028        private final int modY;
029        private final int modZ;
030    
031        private BlockFace(final int modX, final int modY, final int modZ) {
032            this.modX = modX;
033            this.modY = modY;
034            this.modZ = modZ;
035        }
036    
037        private BlockFace(final BlockFace face1, final BlockFace face2) {
038            this.modX = face1.getModX() + face2.getModX();
039            this.modY = face1.getModY() + face2.getModY();
040            this.modZ = face1.getModZ() + face2.getModZ();
041        }
042    
043        /**
044         * Get the amount of X-coordinates to modify to get the represented block
045         *
046         * @return Amount of X-coordinates to modify
047         */
048        public int getModX() {
049            return modX;
050        }
051    
052        /**
053         * Get the amount of Y-coordinates to modify to get the represented block
054         *
055         * @return Amount of Y-coordinates to modify
056         */
057        public int getModY() {
058            return modY;
059        }
060    
061        /**
062         * Get the amount of Z-coordinates to modify to get the represented block
063         *
064         * @return Amount of Z-coordinates to modify
065         */
066        public int getModZ() {
067            return modZ;
068        }
069    
070        public BlockFace getOppositeFace() {
071            switch (this) {
072            case NORTH:
073                return BlockFace.SOUTH;
074    
075            case SOUTH:
076                return BlockFace.NORTH;
077    
078            case EAST:
079                return BlockFace.WEST;
080    
081            case WEST:
082                return BlockFace.EAST;
083    
084            case UP:
085                return BlockFace.DOWN;
086    
087            case DOWN:
088                return BlockFace.UP;
089    
090            case NORTH_EAST:
091                return BlockFace.SOUTH_WEST;
092    
093            case NORTH_WEST:
094                return BlockFace.SOUTH_EAST;
095    
096            case SOUTH_EAST:
097                return BlockFace.NORTH_WEST;
098    
099            case SOUTH_WEST:
100                return BlockFace.NORTH_EAST;
101    
102            case WEST_NORTH_WEST:
103                return BlockFace.EAST_SOUTH_EAST;
104    
105            case NORTH_NORTH_WEST:
106                return BlockFace.SOUTH_SOUTH_EAST;
107    
108            case NORTH_NORTH_EAST:
109                return BlockFace.SOUTH_SOUTH_WEST;
110    
111            case EAST_NORTH_EAST:
112                return BlockFace.WEST_SOUTH_WEST;
113    
114            case EAST_SOUTH_EAST:
115                return BlockFace.WEST_NORTH_WEST;
116    
117            case SOUTH_SOUTH_EAST:
118                return BlockFace.NORTH_NORTH_WEST;
119    
120            case SOUTH_SOUTH_WEST:
121                return BlockFace.NORTH_NORTH_EAST;
122    
123            case WEST_SOUTH_WEST:
124                return BlockFace.EAST_NORTH_EAST;
125    
126            case SELF:
127                return BlockFace.SELF;
128            }
129    
130            return BlockFace.SELF;
131        }
132    }