001    package org.bukkit;
002    
003    import java.util.Map;
004    
005    import com.google.common.collect.ImmutableMap;
006    
007    /**
008     * All supported color values for dyes and cloth
009     */
010    public enum DyeColor {
011    
012        /**
013         * Represents white dye.
014         */
015        WHITE(0x0, 0xF, Color.WHITE, Color.fromRGB(0xF0F0F0)),
016        /**
017         * Represents orange dye.
018         */
019        ORANGE(0x1, 0xE, Color.fromRGB(0xD87F33), Color.fromRGB(0xEB8844)),
020        /**
021         * Represents magenta dye.
022         */
023        MAGENTA(0x2, 0xD, Color.fromRGB(0xB24CD8), Color.fromRGB(0xC354CD)),
024        /**
025         * Represents light blue dye.
026         */
027        LIGHT_BLUE(0x3, 0xC, Color.fromRGB(0x6699D8), Color.fromRGB(0x6689D3)),
028        /**
029         * Represents yellow dye.
030         */
031        YELLOW(0x4, 0xB, Color.fromRGB(0xE5E533), Color.fromRGB(0xDECF2A)),
032        /**
033         * Represents lime dye.
034         */
035        LIME(0x5, 0xA, Color.fromRGB(0x7FCC19), Color.fromRGB(0x41CD34)),
036        /**
037         * Represents pink dye.
038         */
039        PINK(0x6, 0x9, Color.fromRGB(0xF27FA5), Color.fromRGB(0xD88198)),
040        /**
041         * Represents gray dye.
042         */
043        GRAY(0x7, 0x8, Color.fromRGB(0x4C4C4C), Color.fromRGB(0x434343)),
044        /**
045         * Represents silver dye.
046         */
047        SILVER(0x8, 0x7, Color.fromRGB(0x999999), Color.fromRGB(0xABABAB)),
048        /**
049         * Represents cyan dye.
050         */
051        CYAN(0x9, 0x6, Color.fromRGB(0x4C7F99), Color.fromRGB(0x287697)),
052        /**
053         * Represents purple dye.
054         */
055        PURPLE(0xA, 0x5, Color.fromRGB(0x7F3FB2), Color.fromRGB(0x7B2FBE)),
056        /**
057         * Represents blue dye.
058         */
059        BLUE(0xB, 0x4, Color.fromRGB(0x334CB2), Color.fromRGB(0x253192)),
060        /**
061         * Represents brown dye.
062         */
063        BROWN(0xC, 0x3, Color.fromRGB(0x664C33), Color.fromRGB(0x51301A)),
064        /**
065         * Represents green dye.
066         */
067        GREEN(0xD, 0x2, Color.fromRGB(0x667F33), Color.fromRGB(0x3B511A)),
068        /**
069         * Represents red dye.
070         */
071        RED(0xE, 0x1, Color.fromRGB(0x993333), Color.fromRGB(0xB3312C)),
072        /**
073         * Represents black dye.
074         */
075        BLACK(0xF, 0x0, Color.fromRGB(0x191919), Color.fromRGB(0x1E1B1B));
076    
077        private final byte woolData;
078        private final byte dyeData;
079        private final Color color;
080        private final Color firework;
081        private final static DyeColor[] BY_WOOL_DATA;
082        private final static DyeColor[] BY_DYE_DATA;
083        private final static Map<Color, DyeColor> BY_COLOR;
084        private final static Map<Color, DyeColor> BY_FIREWORK;
085    
086        private DyeColor(final int woolData, final int dyeData, Color color, Color firework) {
087            this.woolData = (byte) woolData;
088            this.dyeData = (byte) dyeData;
089            this.color = color;
090            this.firework = firework;
091        }
092    
093        /**
094         * Gets the associated (wool) data value representing this color.
095         *
096         * @return A byte containing the (wool) data value of this color
097         * @deprecated The name is misleading. It would imply {@link
098         *     Material#INK_SACK} but uses {@link Material#WOOL}
099         * @see #getWoolData()
100         * @see #getDyeData()
101         */
102        @Deprecated
103        public byte getData() {
104            return getWoolData();
105        }
106    
107        /**
108         * Gets the associated wool data value representing this color.
109         *
110         * @return A byte containing the wool data value of this color
111         * @see #getDyeData()
112         * @deprecated Magic value
113         */
114        @Deprecated
115        public byte getWoolData() {
116            return woolData;
117        }
118    
119        /**
120         * Gets the associated dye data value representing this color.
121         *
122         * @return A byte containing the dye data value of this color
123         * @see #getWoolData()
124         * @deprecated Magic value
125         */
126        @Deprecated
127        public byte getDyeData() {
128            return dyeData;
129        }
130    
131        /**
132         * Gets the color that this dye represents.
133         *
134         * @return The {@link Color} that this dye represents
135         */
136        public Color getColor() {
137            return color;
138        }
139    
140        /**
141         * Gets the firework color that this dye represents.
142         *
143         * @return The {@link Color} that this dye represents
144         */
145        public Color getFireworkColor() {
146            return firework;
147        }
148    
149        /**
150         * Gets the DyeColor with the given (wool) data value.
151         *
152         * @param data (wool) data value to fetch
153         * @return The {@link DyeColor} representing the given value, or null if
154         *     it doesn't exist
155         * @deprecated The name is misleading. It would imply {@link
156         *     Material#INK_SACK} but uses {@link Material#WOOL}
157         * @see #getByDyeData(byte)
158         * @see #getByWoolData(byte)
159         */
160        @Deprecated
161        public static DyeColor getByData(final byte data) {
162            return getByWoolData(data);
163        }
164    
165        /**
166         * Gets the DyeColor with the given wool data value.
167         *
168         * @param data Wool data value to fetch
169         * @return The {@link DyeColor} representing the given value, or null if
170         *     it doesn't exist
171         * @see #getByDyeData(byte)
172         * @deprecated Magic value
173         */
174        @Deprecated
175        public static DyeColor getByWoolData(final byte data) {
176            int i = 0xff & data;
177            if (i >= BY_WOOL_DATA.length) {
178                return null;
179            }
180            return BY_WOOL_DATA[i];
181        }
182    
183        /**
184         * Gets the DyeColor with the given dye data value.
185         *
186         * @param data Dye data value to fetch
187         * @return The {@link DyeColor} representing the given value, or null if
188         *     it doesn't exist
189         * @see #getByWoolData(byte)
190         * @deprecated Magic value
191         */
192        @Deprecated
193        public static DyeColor getByDyeData(final byte data) {
194            int i = 0xff & data;
195            if (i >= BY_DYE_DATA.length) {
196                return null;
197            }
198            return BY_DYE_DATA[i];
199        }
200    
201        /**
202         * Gets the DyeColor with the given color value.
203         *
204         * @param color Color value to get the dye by
205         * @return The {@link DyeColor} representing the given value, or null if
206         *     it doesn't exist
207         */
208        public static DyeColor getByColor(final Color color) {
209            return BY_COLOR.get(color);
210        }
211    
212        /**
213         * Gets the DyeColor with the given firework color value.
214         *
215         * @param color Color value to get dye by
216         * @return The {@link DyeColor} representing the given value, or null if
217         *     it doesn't exist
218         */
219        public static DyeColor getByFireworkColor(final Color color) {
220            return BY_FIREWORK.get(color);
221        }
222    
223        static {
224            BY_WOOL_DATA = values();
225            BY_DYE_DATA = values();
226            ImmutableMap.Builder<Color, DyeColor> byColor = ImmutableMap.builder();
227            ImmutableMap.Builder<Color, DyeColor> byFirework = ImmutableMap.builder();
228    
229            for (DyeColor color : values()) {
230                BY_WOOL_DATA[color.woolData & 0xff] = color;
231                BY_DYE_DATA[color.dyeData & 0xff] = color;
232                byColor.put(color.getColor(), color);
233                byFirework.put(color.getFireworkColor(), color);
234            }
235    
236            BY_COLOR = byColor.build();
237            BY_FIREWORK = byFirework.build();
238        }
239    }