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 }