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 }