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