001    package org.bukkit;
002    
003    import java.lang.reflect.Constructor;
004    import java.util.Map;
005    
006    import org.apache.commons.lang.Validate;
007    import org.bukkit.map.MapView;
008    import org.bukkit.material.Bed;
009    import org.bukkit.material.Button;
010    import org.bukkit.material.Cake;
011    import org.bukkit.material.Cauldron;
012    import org.bukkit.material.Chest;
013    import org.bukkit.material.Coal;
014    import org.bukkit.material.CocoaPlant;
015    import org.bukkit.material.Command;
016    import org.bukkit.material.Crops;
017    import org.bukkit.material.DetectorRail;
018    import org.bukkit.material.Diode;
019    import org.bukkit.material.Dispenser;
020    import org.bukkit.material.Door;
021    import org.bukkit.material.Dye;
022    import org.bukkit.material.EnderChest;
023    import org.bukkit.material.FlowerPot;
024    import org.bukkit.material.Furnace;
025    import org.bukkit.material.Gate;
026    import org.bukkit.material.Ladder;
027    import org.bukkit.material.Lever;
028    import org.bukkit.material.LongGrass;
029    import org.bukkit.material.MaterialData;
030    import org.bukkit.material.MonsterEggs;
031    import org.bukkit.material.Mushroom;
032    import org.bukkit.material.NetherWarts;
033    import org.bukkit.material.PistonBaseMaterial;
034    import org.bukkit.material.PistonExtensionMaterial;
035    import org.bukkit.material.PoweredRail;
036    import org.bukkit.material.PressurePlate;
037    import org.bukkit.material.Pumpkin;
038    import org.bukkit.material.Rails;
039    import org.bukkit.material.RedstoneTorch;
040    import org.bukkit.material.RedstoneWire;
041    import org.bukkit.material.Sandstone;
042    import org.bukkit.material.Sign;
043    import org.bukkit.material.Skull;
044    import org.bukkit.material.SmoothBrick;
045    import org.bukkit.material.SpawnEgg;
046    import org.bukkit.material.Stairs;
047    import org.bukkit.material.Step;
048    import org.bukkit.material.Torch;
049    import org.bukkit.material.TrapDoor;
050    import org.bukkit.material.Tree;
051    import org.bukkit.material.Tripwire;
052    import org.bukkit.material.TripwireHook;
053    import org.bukkit.material.Vine;
054    import org.bukkit.material.WoodenStep;
055    import org.bukkit.material.Wool;
056    import org.bukkit.potion.Potion;
057    import org.bukkit.util.Java15Compat;
058    
059    import com.google.common.collect.Maps;
060    
061    /**
062     * An enum of all material IDs accepted by the official server and client
063     */
064    public enum Material {
065        AIR(0, 0),
066        STONE(1),
067        GRASS(2),
068        DIRT(3),
069        COBBLESTONE(4),
070        WOOD(5, Tree.class),
071        SAPLING(6, Tree.class),
072        BEDROCK(7),
073        WATER(8, MaterialData.class),
074        STATIONARY_WATER(9, MaterialData.class),
075        LAVA(10, MaterialData.class),
076        STATIONARY_LAVA(11, MaterialData.class),
077        SAND(12),
078        GRAVEL(13),
079        GOLD_ORE(14),
080        IRON_ORE(15),
081        COAL_ORE(16),
082        LOG(17, Tree.class),
083        LEAVES(18, Tree.class),
084        SPONGE(19),
085        GLASS(20),
086        LAPIS_ORE(21),
087        LAPIS_BLOCK(22),
088        DISPENSER(23, Dispenser.class),
089        SANDSTONE(24, Sandstone.class),
090        NOTE_BLOCK(25),
091        BED_BLOCK(26, Bed.class),
092        POWERED_RAIL(27, PoweredRail.class),
093        DETECTOR_RAIL(28, DetectorRail.class),
094        PISTON_STICKY_BASE(29, PistonBaseMaterial.class),
095        WEB(30),
096        LONG_GRASS(31, LongGrass.class),
097        DEAD_BUSH(32),
098        PISTON_BASE(33, PistonBaseMaterial.class),
099        PISTON_EXTENSION(34, PistonExtensionMaterial.class),
100        WOOL(35, Wool.class),
101        PISTON_MOVING_PIECE(36),
102        YELLOW_FLOWER(37),
103        RED_ROSE(38),
104        BROWN_MUSHROOM(39),
105        RED_MUSHROOM(40),
106        GOLD_BLOCK(41),
107        IRON_BLOCK(42),
108        DOUBLE_STEP(43, Step.class),
109        STEP(44, Step.class),
110        BRICK(45),
111        TNT(46),
112        BOOKSHELF(47),
113        MOSSY_COBBLESTONE(48),
114        OBSIDIAN(49),
115        TORCH(50, Torch.class),
116        FIRE(51),
117        MOB_SPAWNER(52),
118        WOOD_STAIRS(53, Stairs.class),
119        CHEST(54, Chest.class),
120        REDSTONE_WIRE(55, RedstoneWire.class),
121        DIAMOND_ORE(56),
122        DIAMOND_BLOCK(57),
123        WORKBENCH(58),
124        CROPS(59, Crops.class),
125        SOIL(60, MaterialData.class),
126        FURNACE(61, Furnace.class),
127        BURNING_FURNACE(62, Furnace.class),
128        SIGN_POST(63, 64, Sign.class),
129        WOODEN_DOOR(64, Door.class),
130        LADDER(65, Ladder.class),
131        RAILS(66, Rails.class),
132        COBBLESTONE_STAIRS(67, Stairs.class),
133        WALL_SIGN(68, 64, Sign.class),
134        LEVER(69, Lever.class),
135        STONE_PLATE(70, PressurePlate.class),
136        IRON_DOOR_BLOCK(71, Door.class),
137        WOOD_PLATE(72, PressurePlate.class),
138        REDSTONE_ORE(73),
139        GLOWING_REDSTONE_ORE(74),
140        REDSTONE_TORCH_OFF(75, RedstoneTorch.class),
141        REDSTONE_TORCH_ON(76, RedstoneTorch.class),
142        STONE_BUTTON(77, Button.class),
143        SNOW(78),
144        ICE(79),
145        SNOW_BLOCK(80),
146        CACTUS(81, MaterialData.class),
147        CLAY(82),
148        SUGAR_CANE_BLOCK(83, MaterialData.class),
149        JUKEBOX(84),
150        FENCE(85),
151        PUMPKIN(86, Pumpkin.class),
152        NETHERRACK(87),
153        SOUL_SAND(88),
154        GLOWSTONE(89),
155        PORTAL(90),
156        JACK_O_LANTERN(91, Pumpkin.class),
157        CAKE_BLOCK(92, 64, Cake.class),
158        DIODE_BLOCK_OFF(93, Diode.class),
159        DIODE_BLOCK_ON(94, Diode.class),
160        @Deprecated
161        LOCKED_CHEST(95),
162        STAINED_GLASS(95),
163        TRAP_DOOR(96, TrapDoor.class),
164        MONSTER_EGGS(97, MonsterEggs.class),
165        SMOOTH_BRICK(98, SmoothBrick.class),
166        HUGE_MUSHROOM_1(99, Mushroom.class),
167        HUGE_MUSHROOM_2(100, Mushroom.class),
168        IRON_FENCE(101),
169        THIN_GLASS(102),
170        MELON_BLOCK(103),
171        PUMPKIN_STEM(104, MaterialData.class),
172        MELON_STEM(105, MaterialData.class),
173        VINE(106, Vine.class),
174        FENCE_GATE(107, Gate.class),
175        BRICK_STAIRS(108, Stairs.class),
176        SMOOTH_STAIRS(109, Stairs.class),
177        MYCEL(110),
178        WATER_LILY(111),
179        NETHER_BRICK(112),
180        NETHER_FENCE(113),
181        NETHER_BRICK_STAIRS(114, Stairs.class),
182        NETHER_WARTS(115, NetherWarts.class),
183        ENCHANTMENT_TABLE(116),
184        BREWING_STAND(117, MaterialData.class),
185        CAULDRON(118, Cauldron.class),
186        ENDER_PORTAL(119),
187        ENDER_PORTAL_FRAME(120),
188        ENDER_STONE(121),
189        DRAGON_EGG(122),
190        REDSTONE_LAMP_OFF(123),
191        REDSTONE_LAMP_ON(124),
192        WOOD_DOUBLE_STEP(125, WoodenStep.class),
193        WOOD_STEP(126, WoodenStep.class),
194        COCOA(127, CocoaPlant.class),
195        SANDSTONE_STAIRS(128, Stairs.class),
196        EMERALD_ORE(129),
197        ENDER_CHEST(130, EnderChest.class),
198        TRIPWIRE_HOOK(131, TripwireHook.class),
199        TRIPWIRE(132, Tripwire.class),
200        EMERALD_BLOCK(133),
201        SPRUCE_WOOD_STAIRS(134, Stairs.class),
202        BIRCH_WOOD_STAIRS(135, Stairs.class),
203        JUNGLE_WOOD_STAIRS(136, Stairs.class),
204        COMMAND(137, Command.class),
205        BEACON(138),
206        COBBLE_WALL(139),
207        FLOWER_POT(140, FlowerPot.class),
208        CARROT(141),
209        POTATO(142),
210        WOOD_BUTTON(143, Button.class),
211        SKULL(144, Skull.class),
212        ANVIL(145),
213        TRAPPED_CHEST(146),
214        GOLD_PLATE(147),
215        IRON_PLATE(148),
216        REDSTONE_COMPARATOR_OFF(149),
217        REDSTONE_COMPARATOR_ON(150),
218        DAYLIGHT_DETECTOR(151),
219        REDSTONE_BLOCK(152),
220        QUARTZ_ORE(153),
221        HOPPER(154),
222        QUARTZ_BLOCK(155),
223        QUARTZ_STAIRS(156, Stairs.class),
224        ACTIVATOR_RAIL(157, PoweredRail.class),
225        DROPPER(158, Dispenser.class),
226        STAINED_CLAY(159),
227        STAINED_GLASS_PANE(160),
228        LEAVES_2(161),
229        LOG_2(162),
230        ACACIA_STAIRS(163, Stairs.class),
231        DARK_OAK_STAIRS(164, Stairs.class),
232        HAY_BLOCK(170),
233        CARPET(171),
234        HARD_CLAY(172),
235        COAL_BLOCK(173),
236        PACKED_ICE(174),
237        DOUBLE_PLANT(175),
238        // ----- Item Separator -----
239        IRON_SPADE(256, 1, 250),
240        IRON_PICKAXE(257, 1, 250),
241        IRON_AXE(258, 1, 250),
242        FLINT_AND_STEEL(259, 1, 64),
243        APPLE(260),
244        BOW(261, 1, 384),
245        ARROW(262),
246        COAL(263, Coal.class),
247        DIAMOND(264),
248        IRON_INGOT(265),
249        GOLD_INGOT(266),
250        IRON_SWORD(267, 1, 250),
251        WOOD_SWORD(268, 1, 59),
252        WOOD_SPADE(269, 1, 59),
253        WOOD_PICKAXE(270, 1, 59),
254        WOOD_AXE(271, 1, 59),
255        STONE_SWORD(272, 1, 131),
256        STONE_SPADE(273, 1, 131),
257        STONE_PICKAXE(274, 1, 131),
258        STONE_AXE(275, 1, 131),
259        DIAMOND_SWORD(276, 1, 1561),
260        DIAMOND_SPADE(277, 1, 1561),
261        DIAMOND_PICKAXE(278, 1, 1561),
262        DIAMOND_AXE(279, 1, 1561),
263        STICK(280),
264        BOWL(281),
265        MUSHROOM_SOUP(282, 1),
266        GOLD_SWORD(283, 1, 32),
267        GOLD_SPADE(284, 1, 32),
268        GOLD_PICKAXE(285, 1, 32),
269        GOLD_AXE(286, 1, 32),
270        STRING(287),
271        FEATHER(288),
272        SULPHUR(289),
273        WOOD_HOE(290, 1, 59),
274        STONE_HOE(291, 1, 131),
275        IRON_HOE(292, 1, 250),
276        DIAMOND_HOE(293, 1, 1561),
277        GOLD_HOE(294, 1, 32),
278        SEEDS(295),
279        WHEAT(296),
280        BREAD(297),
281        LEATHER_HELMET(298, 1, 55),
282        LEATHER_CHESTPLATE(299, 1, 80),
283        LEATHER_LEGGINGS(300, 1, 75),
284        LEATHER_BOOTS(301, 1, 65),
285        CHAINMAIL_HELMET(302, 1, 165),
286        CHAINMAIL_CHESTPLATE(303, 1, 240),
287        CHAINMAIL_LEGGINGS(304, 1, 225),
288        CHAINMAIL_BOOTS(305, 1, 195),
289        IRON_HELMET(306, 1, 165),
290        IRON_CHESTPLATE(307, 1, 240),
291        IRON_LEGGINGS(308, 1, 225),
292        IRON_BOOTS(309, 1, 195),
293        DIAMOND_HELMET(310, 1, 363),
294        DIAMOND_CHESTPLATE(311, 1, 528),
295        DIAMOND_LEGGINGS(312, 1, 495),
296        DIAMOND_BOOTS(313, 1, 429),
297        GOLD_HELMET(314, 1, 77),
298        GOLD_CHESTPLATE(315, 1, 112),
299        GOLD_LEGGINGS(316, 1, 105),
300        GOLD_BOOTS(317, 1, 91),
301        FLINT(318),
302        PORK(319),
303        GRILLED_PORK(320),
304        PAINTING(321),
305        GOLDEN_APPLE(322),
306        SIGN(323, 16),
307        WOOD_DOOR(324, 1),
308        BUCKET(325, 16),
309        WATER_BUCKET(326, 1),
310        LAVA_BUCKET(327, 1),
311        MINECART(328, 1),
312        SADDLE(329, 1),
313        IRON_DOOR(330, 1),
314        REDSTONE(331),
315        SNOW_BALL(332, 16),
316        BOAT(333, 1),
317        LEATHER(334),
318        MILK_BUCKET(335, 1),
319        CLAY_BRICK(336),
320        CLAY_BALL(337),
321        SUGAR_CANE(338),
322        PAPER(339),
323        BOOK(340),
324        SLIME_BALL(341),
325        STORAGE_MINECART(342, 1),
326        POWERED_MINECART(343, 1),
327        EGG(344, 16),
328        COMPASS(345),
329        FISHING_ROD(346, 1, 64),
330        WATCH(347),
331        GLOWSTONE_DUST(348),
332        RAW_FISH(349),
333        COOKED_FISH(350),
334        INK_SACK(351, Dye.class),
335        BONE(352),
336        SUGAR(353),
337        CAKE(354, 1),
338        BED(355, 1),
339        DIODE(356),
340        COOKIE(357),
341        /**
342         * @see MapView
343         */
344        MAP(358, MaterialData.class),
345        SHEARS(359, 1, 238),
346        MELON(360),
347        PUMPKIN_SEEDS(361),
348        MELON_SEEDS(362),
349        RAW_BEEF(363),
350        COOKED_BEEF(364),
351        RAW_CHICKEN(365),
352        COOKED_CHICKEN(366),
353        ROTTEN_FLESH(367),
354        ENDER_PEARL(368, 16),
355        BLAZE_ROD(369),
356        GHAST_TEAR(370),
357        GOLD_NUGGET(371),
358        NETHER_STALK(372),
359        /**
360         * @see Potion
361         */
362        POTION(373, 1, MaterialData.class),
363        GLASS_BOTTLE(374),
364        SPIDER_EYE(375),
365        FERMENTED_SPIDER_EYE(376),
366        BLAZE_POWDER(377),
367        MAGMA_CREAM(378),
368        BREWING_STAND_ITEM(379),
369        CAULDRON_ITEM(380),
370        EYE_OF_ENDER(381),
371        SPECKLED_MELON(382),
372        MONSTER_EGG(383, 64, SpawnEgg.class),
373        EXP_BOTTLE(384, 64),
374        FIREBALL(385, 64),
375        BOOK_AND_QUILL(386, 1),
376        WRITTEN_BOOK(387, 16),
377        EMERALD(388, 64),
378        ITEM_FRAME(389),
379        FLOWER_POT_ITEM(390),
380        CARROT_ITEM(391),
381        POTATO_ITEM(392),
382        BAKED_POTATO(393),
383        POISONOUS_POTATO(394),
384        EMPTY_MAP(395),
385        GOLDEN_CARROT(396),
386        SKULL_ITEM(397),
387        CARROT_STICK(398, 1, 25),
388        NETHER_STAR(399),
389        PUMPKIN_PIE(400),
390        FIREWORK(401),
391        FIREWORK_CHARGE(402),
392        ENCHANTED_BOOK(403, 1),
393        REDSTONE_COMPARATOR(404),
394        NETHER_BRICK_ITEM(405),
395        QUARTZ(406),
396        EXPLOSIVE_MINECART(407, 1),
397        HOPPER_MINECART(408, 1),
398        IRON_BARDING(417, 1),
399        GOLD_BARDING(418, 1),
400        DIAMOND_BARDING(419, 1),
401        LEASH(420),
402        NAME_TAG(421),
403        COMMAND_MINECART(422, 1),
404        GOLD_RECORD(2256, 1),
405        GREEN_RECORD(2257, 1),
406        RECORD_3(2258, 1),
407        RECORD_4(2259, 1),
408        RECORD_5(2260, 1),
409        RECORD_6(2261, 1),
410        RECORD_7(2262, 1),
411        RECORD_8(2263, 1),
412        RECORD_9(2264, 1),
413        RECORD_10(2265, 1),
414        RECORD_11(2266, 1),
415        RECORD_12(2267, 1),
416        ;
417    
418        private final int id;
419        private final Constructor<? extends MaterialData> ctor;
420        private static Material[] byId = new Material[383];
421        private final static Map<String, Material> BY_NAME = Maps.newHashMap();
422        private final int maxStack;
423        private final short durability;
424    
425        private Material(final int id) {
426            this(id, 64);
427        }
428    
429        private Material(final int id, final int stack) {
430            this(id, stack, MaterialData.class);
431        }
432    
433        private Material(final int id, final int stack, final int durability) {
434            this(id, stack, durability, MaterialData.class);
435        }
436    
437        private Material(final int id, final Class<? extends MaterialData> data) {
438            this(id, 64, data);
439        }
440    
441        private Material(final int id, final int stack, final Class<? extends MaterialData> data) {
442            this(id, stack, 0, data);
443        }
444    
445        private Material(final int id, final int stack, final int durability, final Class<? extends MaterialData> data) {
446            this.id = id;
447            this.durability = (short) durability;
448            this.maxStack = stack;
449            // try to cache the constructor for this material
450            try {
451                this.ctor = data.getConstructor(int.class, byte.class);
452            } catch (NoSuchMethodException ex) {
453                throw new AssertionError(ex);
454            } catch (SecurityException ex) {
455                throw new AssertionError(ex);
456            }
457        }
458    
459        /**
460         * Gets the item ID or block ID of this Material
461         *
462         * @return ID of this material
463         * @deprecated Magic value
464         */
465        @Deprecated
466        public int getId() {
467            return id;
468        }
469    
470        /**
471         * Gets the maximum amount of this material that can be held in a stack
472         *
473         * @return Maximum stack size for this material
474         */
475        public int getMaxStackSize() {
476            return maxStack;
477        }
478    
479        /**
480         * Gets the maximum durability of this material
481         *
482         * @return Maximum durability for this material
483         */
484        public short getMaxDurability() {
485            return durability;
486        }
487    
488        /**
489         * Gets the MaterialData class associated with this Material
490         *
491         * @return MaterialData associated with this Material
492         */
493        public Class<? extends MaterialData> getData() {
494            return ctor.getDeclaringClass();
495        }
496    
497        /**
498         * Constructs a new MaterialData relevant for this Material, with the
499         * given initial data
500         *
501         * @param raw Initial data to construct the MaterialData with
502         * @return New MaterialData with the given data
503         * @deprecated Magic value
504         */
505        @Deprecated
506        public MaterialData getNewData(final byte raw) {
507            try {
508                return ctor.newInstance(id, raw);
509            } catch (InstantiationException ex) {
510                final Throwable t = ex.getCause();
511                if (t instanceof RuntimeException) {
512                    throw (RuntimeException) t;
513                }
514                if (t instanceof Error) {
515                    throw (Error) t;
516                }
517                throw new AssertionError(t);
518            } catch (Throwable t) {
519                throw new AssertionError(t);
520            }
521        }
522    
523        /**
524         * Checks if this Material is a placable block
525         *
526         * @return true if this material is a block
527         */
528        public boolean isBlock() {
529            return id < 256;
530        }
531    
532        /**
533         * Checks if this Material is edible.
534         *
535         * @return true if this Material is edible.
536         */
537        public boolean isEdible() {
538            switch (this) {
539                case BREAD:
540                case CARROT_ITEM:
541                case BAKED_POTATO:
542                case POTATO_ITEM:
543                case POISONOUS_POTATO:
544                case GOLDEN_CARROT:
545                case PUMPKIN_PIE:
546                case COOKIE:
547                case MELON:
548                case MUSHROOM_SOUP:
549                case RAW_CHICKEN:
550                case COOKED_CHICKEN:
551                case RAW_BEEF:
552                case COOKED_BEEF:
553                case RAW_FISH:
554                case COOKED_FISH:
555                case PORK:
556                case GRILLED_PORK:
557                case APPLE:
558                case GOLDEN_APPLE:
559                case ROTTEN_FLESH:
560                case SPIDER_EYE:
561                    return true;
562                default:
563                    return false;
564            }
565        }
566    
567        /**
568         * Attempts to get the Material with the given ID
569         *
570         * @param id ID of the material to get
571         * @return Material if found, or null
572         * @deprecated Magic value
573         */
574        @Deprecated
575        public static Material getMaterial(final int id) {
576            if (byId.length > id && id >= 0) {
577                return byId[id];
578            } else {
579                return null;
580            }
581        }
582    
583        /**
584         * Attempts to get the Material with the given name.
585         * <p>
586         * This is a normal lookup, names must be the precise name they are given
587         * in the enum.
588         *
589         * @param name Name of the material to get
590         * @return Material if found, or null
591         */
592        public static Material getMaterial(final String name) {
593            return BY_NAME.get(name);
594        }
595    
596        /**
597         * Attempts to match the Material with the given name.
598         * <p>
599         * This is a match lookup; names will be converted to uppercase, then
600         * stripped of special characters in an attempt to format it like the
601         * enum.
602         * <p>
603         * Using this for match by ID is deprecated.
604         *
605         * @param name Name of the material to get
606         * @return Material if found, or null
607         */
608        public static Material matchMaterial(final String name) {
609            Validate.notNull(name, "Name cannot be null");
610    
611            Material result = null;
612    
613            try {
614                result = getMaterial(Integer.parseInt(name));
615            } catch (NumberFormatException ex) {}
616    
617            if (result == null) {
618                String filtered = name.toUpperCase();
619    
620                filtered = filtered.replaceAll("\\s+", "_").replaceAll("\\W", "");
621                result = BY_NAME.get(filtered);
622            }
623    
624            return result;
625        }
626    
627        static {
628            for (Material material : values()) {
629                if (byId.length > material.id) {
630                    byId[material.id] = material;
631                } else {
632                    byId = Java15Compat.Arrays_copyOfRange(byId, 0, material.id + 2);
633                    byId[material.id] = material;
634                }
635                BY_NAME.put(material.name(), material);
636            }
637        }
638    
639        /**
640         * @return True if this material represents a playable music disk.
641         */
642        public boolean isRecord() {
643            return id >= GOLD_RECORD.id && id <= RECORD_12.id;
644        }
645    
646        /**
647         * Check if the material is a block and solid (cannot be passed through by
648         * a player)
649         *
650         * @return True if this material is a block and solid
651         */
652        public boolean isSolid() {
653            if (!isBlock() || id == 0) {
654                return false;
655            }
656            switch (this) {
657                case STONE:
658                case GRASS:
659                case DIRT:
660                case COBBLESTONE:
661                case WOOD:
662                case BEDROCK:
663                case SAND:
664                case GRAVEL:
665                case GOLD_ORE:
666                case IRON_ORE:
667                case COAL_ORE:
668                case LOG:
669                case LEAVES:
670                case SPONGE:
671                case GLASS:
672                case LAPIS_ORE:
673                case LAPIS_BLOCK:
674                case DISPENSER:
675                case SANDSTONE:
676                case NOTE_BLOCK:
677                case BED_BLOCK:
678                case PISTON_STICKY_BASE:
679                case PISTON_BASE:
680                case PISTON_EXTENSION:
681                case WOOL:
682                case PISTON_MOVING_PIECE:
683                case GOLD_BLOCK:
684                case IRON_BLOCK:
685                case DOUBLE_STEP:
686                case STEP:
687                case BRICK:
688                case TNT:
689                case BOOKSHELF:
690                case MOSSY_COBBLESTONE:
691                case OBSIDIAN:
692                case MOB_SPAWNER:
693                case WOOD_STAIRS:
694                case CHEST:
695                case DIAMOND_ORE:
696                case DIAMOND_BLOCK:
697                case WORKBENCH:
698                case SOIL:
699                case FURNACE:
700                case BURNING_FURNACE:
701                case SIGN_POST:
702                case WOODEN_DOOR:
703                case COBBLESTONE_STAIRS:
704                case WALL_SIGN:
705                case STONE_PLATE:
706                case IRON_DOOR_BLOCK:
707                case WOOD_PLATE:
708                case REDSTONE_ORE:
709                case GLOWING_REDSTONE_ORE:
710                case ICE:
711                case SNOW_BLOCK:
712                case CACTUS:
713                case CLAY:
714                case JUKEBOX:
715                case FENCE:
716                case PUMPKIN:
717                case NETHERRACK:
718                case SOUL_SAND:
719                case GLOWSTONE:
720                case JACK_O_LANTERN:
721                case CAKE_BLOCK:
722                case LOCKED_CHEST:
723                case STAINED_GLASS:
724                case TRAP_DOOR:
725                case MONSTER_EGGS:
726                case SMOOTH_BRICK:
727                case HUGE_MUSHROOM_1:
728                case HUGE_MUSHROOM_2:
729                case IRON_FENCE:
730                case THIN_GLASS:
731                case MELON_BLOCK:
732                case FENCE_GATE:
733                case BRICK_STAIRS:
734                case SMOOTH_STAIRS:
735                case MYCEL:
736                case NETHER_BRICK:
737                case NETHER_FENCE:
738                case NETHER_BRICK_STAIRS:
739                case ENCHANTMENT_TABLE:
740                case BREWING_STAND:
741                case CAULDRON:
742                case ENDER_PORTAL_FRAME:
743                case ENDER_STONE:
744                case DRAGON_EGG:
745                case REDSTONE_LAMP_OFF:
746                case REDSTONE_LAMP_ON:
747                case WOOD_DOUBLE_STEP:
748                case WOOD_STEP:
749                case SANDSTONE_STAIRS:
750                case EMERALD_ORE:
751                case ENDER_CHEST:
752                case EMERALD_BLOCK:
753                case SPRUCE_WOOD_STAIRS:
754                case BIRCH_WOOD_STAIRS:
755                case JUNGLE_WOOD_STAIRS:
756                case COMMAND:
757                case BEACON:
758                case COBBLE_WALL:
759                case ANVIL:
760                case TRAPPED_CHEST:
761                case GOLD_PLATE:
762                case IRON_PLATE:
763                case DAYLIGHT_DETECTOR:
764                case REDSTONE_BLOCK:
765                case QUARTZ_ORE:
766                case HOPPER:
767                case QUARTZ_BLOCK:
768                case QUARTZ_STAIRS:
769                case DROPPER:
770                case STAINED_CLAY:
771                case HAY_BLOCK:
772                case HARD_CLAY:
773                case COAL_BLOCK:
774                case STAINED_GLASS_PANE:
775                case LEAVES_2:
776                case LOG_2:
777                case ACACIA_STAIRS:
778                case DARK_OAK_STAIRS:
779                case PACKED_ICE:
780                    return true;
781                default:
782                    return false;
783            }
784        }
785    
786        /**
787         * Check if the material is a block and does not block any light
788         *
789         * @return True if this material is a block and does not block any light
790         */
791        public boolean isTransparent() {
792            if (!isBlock()) {
793                return false;
794            }
795            switch (this) {
796                case AIR:
797                case SAPLING:
798                case POWERED_RAIL:
799                case DETECTOR_RAIL:
800                case LONG_GRASS:
801                case DEAD_BUSH:
802                case YELLOW_FLOWER:
803                case RED_ROSE:
804                case BROWN_MUSHROOM:
805                case RED_MUSHROOM:
806                case TORCH:
807                case FIRE:
808                case REDSTONE_WIRE:
809                case CROPS:
810                case LADDER:
811                case RAILS:
812                case LEVER:
813                case REDSTONE_TORCH_OFF:
814                case REDSTONE_TORCH_ON:
815                case STONE_BUTTON:
816                case SNOW:
817                case SUGAR_CANE_BLOCK:
818                case PORTAL:
819                case DIODE_BLOCK_OFF:
820                case DIODE_BLOCK_ON:
821                case PUMPKIN_STEM:
822                case MELON_STEM:
823                case VINE:
824                case WATER_LILY:
825                case NETHER_WARTS:
826                case ENDER_PORTAL:
827                case COCOA:
828                case TRIPWIRE_HOOK:
829                case TRIPWIRE:
830                case FLOWER_POT:
831                case CARROT:
832                case POTATO:
833                case WOOD_BUTTON:
834                case SKULL:
835                case REDSTONE_COMPARATOR_OFF:
836                case REDSTONE_COMPARATOR_ON:
837                case ACTIVATOR_RAIL:
838                case CARPET:
839                case DOUBLE_PLANT:
840                    return true;
841                default:
842                    return false;
843            }
844        }
845    
846        /**
847         * Check if the material is a block and can catch fire
848         *
849         * @return True if this material is a block and can catch fire
850         */
851        public boolean isFlammable() {
852            if (!isBlock()) {
853                return false;
854            }
855            switch (this) {
856                case WOOD:
857                case LOG:
858                case LEAVES:
859                case NOTE_BLOCK:
860                case BED_BLOCK:
861                case LONG_GRASS:
862                case DEAD_BUSH:
863                case WOOL:
864                case TNT:
865                case BOOKSHELF:
866                case WOOD_STAIRS:
867                case CHEST:
868                case WORKBENCH:
869                case SIGN_POST:
870                case WOODEN_DOOR:
871                case WALL_SIGN:
872                case WOOD_PLATE:
873                case JUKEBOX:
874                case FENCE:
875                case TRAP_DOOR:
876                case HUGE_MUSHROOM_1:
877                case HUGE_MUSHROOM_2:
878                case VINE:
879                case FENCE_GATE:
880                case WOOD_DOUBLE_STEP:
881                case WOOD_STEP:
882                case SPRUCE_WOOD_STAIRS:
883                case BIRCH_WOOD_STAIRS:
884                case JUNGLE_WOOD_STAIRS:
885                case TRAPPED_CHEST:
886                case DAYLIGHT_DETECTOR:
887                case CARPET:
888                case LEAVES_2:
889                case LOG_2:
890                case ACACIA_STAIRS:
891                case DARK_OAK_STAIRS:
892                    return true;
893                default:
894                    return false;
895            }
896        }
897    
898        /**
899         * Check if the material is a block and can burn away
900         *
901         * @return True if this material is a block and can burn away
902         */
903        public boolean isBurnable() {
904            if (!isBlock()) {
905                return false;
906            }
907            switch (this) {
908                case WOOD:
909                case LOG:
910                case LEAVES:
911                case LONG_GRASS:
912                case WOOL:
913                case YELLOW_FLOWER:
914                case RED_ROSE:
915                case TNT:
916                case BOOKSHELF:
917                case WOOD_STAIRS:
918                case FENCE:
919                case VINE:
920                case WOOD_DOUBLE_STEP:
921                case WOOD_STEP:
922                case SPRUCE_WOOD_STAIRS:
923                case BIRCH_WOOD_STAIRS:
924                case JUNGLE_WOOD_STAIRS:
925                case HAY_BLOCK:
926                case COAL_BLOCK:
927                case LEAVES_2:
928                case LOG_2:
929                case CARPET:
930                case DOUBLE_PLANT:
931                    return true;
932                default:
933                    return false;
934            }
935        }
936    
937        /**
938         * Check if the material is a block and completely blocks vision
939         *
940         * @return True if this material is a block and completely blocks vision
941         */
942        public boolean isOccluding() {
943            if (!isBlock()) {
944                return false;
945            }
946            switch (this) {
947                case STONE:
948                case GRASS:
949                case DIRT:
950                case COBBLESTONE:
951                case WOOD:
952                case BEDROCK:
953                case SAND:
954                case GRAVEL:
955                case GOLD_ORE:
956                case IRON_ORE:
957                case COAL_ORE:
958                case LOG:
959                case SPONGE:
960                case LAPIS_ORE:
961                case LAPIS_BLOCK:
962                case DISPENSER:
963                case SANDSTONE:
964                case NOTE_BLOCK:
965                case WOOL:
966                case GOLD_BLOCK:
967                case IRON_BLOCK:
968                case DOUBLE_STEP:
969                case BRICK:
970                case BOOKSHELF:
971                case MOSSY_COBBLESTONE:
972                case OBSIDIAN:
973                case MOB_SPAWNER:
974                case DIAMOND_ORE:
975                case DIAMOND_BLOCK:
976                case WORKBENCH:
977                case FURNACE:
978                case BURNING_FURNACE:
979                case REDSTONE_ORE:
980                case GLOWING_REDSTONE_ORE:
981                case SNOW_BLOCK:
982                case CLAY:
983                case JUKEBOX:
984                case PUMPKIN:
985                case NETHERRACK:
986                case SOUL_SAND:
987                case JACK_O_LANTERN:
988                case MONSTER_EGGS:
989                case SMOOTH_BRICK:
990                case HUGE_MUSHROOM_1:
991                case HUGE_MUSHROOM_2:
992                case MELON_BLOCK:
993                case MYCEL:
994                case NETHER_BRICK:
995                case ENDER_PORTAL_FRAME:
996                case ENDER_STONE:
997                case REDSTONE_LAMP_OFF:
998                case REDSTONE_LAMP_ON:
999                case WOOD_DOUBLE_STEP:
1000                case EMERALD_ORE:
1001                case EMERALD_BLOCK:
1002                case COMMAND:
1003                case QUARTZ_ORE:
1004                case QUARTZ_BLOCK:
1005                case DROPPER:
1006                case STAINED_CLAY:
1007                case HAY_BLOCK:
1008                case HARD_CLAY:
1009                case COAL_BLOCK:
1010                case LOG_2:
1011                case PACKED_ICE:
1012                    return true;
1013                default:
1014                    return false;
1015            }
1016        }
1017    
1018        /**
1019         * @return True if this material is affected by gravity.
1020         */
1021        public boolean hasGravity() {
1022            if (!isBlock()) {
1023                return false;
1024            }
1025            switch (this) {
1026                case SAND:
1027                case GRAVEL:
1028                case ANVIL:
1029                    return true;
1030                default:
1031                    return false;
1032            }
1033        }
1034    }