001    package net.minecraftforge.common;
002    
003    public enum ForgeDirection
004    {
005        /** -Y */
006        DOWN(0, -1, 0),
007    
008        /** +Y */
009        UP(0, 1, 0),
010    
011        /** -Z */
012        NORTH(0, 0, -1),
013    
014        /** +Z */
015        SOUTH(0, 0, 1),
016    
017        /** -X */
018        WEST(-1, 0, 0),
019    
020        /** +X */
021        EAST(1, 0, 0),
022    
023        /**
024         * Used only by getOrientation, for invalid inputs
025         */
026        UNKNOWN(0, 0, 0);
027    
028        public final int offsetX;
029        public final int offsetY;
030        public final int offsetZ;
031        public final int flag;
032        public static final ForgeDirection[] VALID_DIRECTIONS = {DOWN, UP, NORTH, SOUTH, WEST, EAST};
033        public static final int[] OPPOSITES = {1, 0, 3, 2, 5, 4, 6};
034        public static final int[] TO_LEFT = {0, 1, 5, 4, 3, 2, 6};
035    
036        private ForgeDirection(int x, int y, int z)
037        {
038            offsetX = x;
039            offsetY = y;
040            offsetZ = z;
041            flag = 1 << ordinal();
042        }
043    
044        public static ForgeDirection getOrientation(int id)
045        {
046            if (id >= 0 && id < VALID_DIRECTIONS.length)
047            {
048                return VALID_DIRECTIONS[id];
049            }
050            return UNKNOWN;
051        }
052    
053        public ForgeDirection getOpposite()
054        {
055            return getOrientation(OPPOSITES[ordinal()]);
056        }
057    
058        public ForgeDirection getLeftRotation()
059        {
060            return getOrientation(TO_LEFT[ordinal()]);
061        }
062    }