001/*
002 * Trident - A Multithreaded Server Alternative
003 * Copyright 2014 The TridentSDK Team
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 *    http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017
018package net.tridentsdk.base;
019
020import com.google.common.collect.Maps;
021import net.tridentsdk.effect.sound.SoundEffectType;
022
023import java.util.Collections;
024import java.util.EnumSet;
025import java.util.HashMap;
026import java.util.Map;
027import java.util.regex.Pattern;
028
029/**
030 * Enumeration of possible substances in minecraft
031 *
032 * @author The TridentSDK Team
033 * @since 0.3-alpha-DP
034 */
035public enum Substance {
036    /**
037     * Blocks
038     */
039    AIR("0"),
040    STONE("1"),
041    GRASS("2"),
042    DIRT("3"),
043    COBBLESTONE("4"),
044    WOOD("5"),
045    SAPLING("6"),
046    BEDROCK("7"),
047    WATER("8"),
048    STATIONARY_WATER("9"),
049    LAVA("10"),
050    STATIONARY_LAVA("11"),
051    SAND("12"),
052    GRAVEL("13"),
053    GOLD_ORE("14"),
054    IRON_ORE("15"),
055    COAL_ORE("16"),
056    LOG("17"),
057    LEAVES("18"),
058    SPONGE("19"),
059    GLASS("20"),
060    LAPIS_ORE("21"),
061    LAPIS_BLOCK("22"),
062    DISPENSER("23"),
063    SANDSTONE("24"),
064    NOTE_BLOCK("25"),
065    BED_BLOCK("26"),
066    POWERED_RAIL("27"),
067    DETECTOR_RAIL("28"),
068    PISTON_STICKY_BASE("29"),
069    WEB("30"),
070    LONG_GRASS("31"),
071    DEAD_BUSH("32"),
072    PISTON_BASE("33"),
073    PISTON_EXTENSION("34"),
074    WOOL("35"),
075    PISTON_MOVING_PIECE("36"),
076    YELLOW_FLOWER("37"),
077    RED_ROSE("38"),
078    BROWN_MUSHROOM("39"),
079    RED_MUSHROOM("40"),
080    GOLD_BLOCK("41"),
081    IRON_BLOCK("42"),
082    DOUBLE_STEP("43"),
083    STEP("44"),
084    BRICK("45"),
085    TNT("46"),
086    BOOKSHELF("47"),
087    MOSSY_COBBLESTONE("48"),
088    OBSIDIAN("49"),
089    TORCH("50"),
090    FIRE("51"),
091    MOB_SPAWNER("52"),
092    WOOD_STAIRS("53"),
093    CHEST("54"),
094    REDSTONE_WIRE("55"),
095    DIAMOND_ORE("56"),
096    DIAMOND_BLOCK("57"),
097    WORKBENCH("58"),
098    CROPS("59"),
099    SOIL("60"),
100    FURNACE("61"),
101    BURNING_FURNACE("62"),
102    SIGN_POST("63"),
103    WOODEN_DOOR("64"),
104    LADDER("65"),
105    RAILS("66"),
106    COBBLESTONE_STAIRS("67"),
107    WALL_SIGN("68"),
108    LEVER("69"),
109    STONE_PLATE("70"),
110    IRON_DOOR_BLOCK("71"),
111    WOOD_PLATE("72"),
112    REDSTONE_ORE("73"),
113    GLOWING_REDSTONE_ORE("74"),
114    REDSTONE_TORCH_OFF("75"),
115    REDSTONE_TORCH_ON("76"),
116    STONE_BUTTON("77"),
117    SNOW("78"),
118    ICE("79"),
119    SNOW_BLOCK("80"),
120    CACTUS("81"),
121    CLAY("82"),
122    SUGAR_CANE_BLOCK("83"),
123    JUKEBOX("84"),
124    FENCE("85"),
125    PUMPKIN("86"),
126    NETHERRACK("87"),
127    SOUL_SAND("88"),
128    GLOWSTONE("89"),
129    PORTAL("90"),
130    JACK_O_LANTERN("91"),
131    CAKE_BLOCK("92"),
132    DIODE_BLOCK_OFF("93"),
133    DIODE_BLOCK_ON("94"),
134    STAINED_GLASS("95"),
135    TRAP_DOOR("96"),
136    MONSTER_EGGS("97"),
137    SMOOTH_BRICK("98"),
138    HUGE_MUSHROOM_1("99"),
139    HUGE_MUSHROOM_2("100"),
140    IRON_FENCE("101"),
141    THIN_GLASS("102"),
142    MELON_BLOCK("103"),
143    PUMPKIN_STEM("104"),
144    MELON_STEM("105"),
145    VINE("106"),
146    FENCE_GATE("107"),
147    BRICK_STAIRS("108"),
148    SMOOTH_STAIRS("109"),
149    MYCEL("110"),
150    WATER_LILY("111"),
151    NETHER_BRICK("112"),
152    NETHER_FENCE("113"),
153    NETHER_BRICK_STAIRS("114"),
154    NETHER_WARTS("115"),
155    ENCHANTMENT_TABLE("116"),
156    BREWING_STAND("117"),
157    CAULDRON("118"),
158    ENDER_PORTAL("119"),
159    ENDER_PORTAL_FRAME("120"),
160    ENDER_STONE("121"),
161    DRAGON_EGG("122"),
162    REDSTONE_LAMP_OFF("123"),
163    REDSTONE_LAMP_ON("124"),
164    WOOD_DOUBLE_STEP("125"),
165    WOOD_STEP("126"),
166    COCOA("127"),
167    SANDSTONE_STAIRS("128"),
168    EMERALD_ORE("129"),
169    ENDER_CHEST("130"),
170    TRIPWIRE_HOOK("131"),
171    TRIPWIRE("132"),
172    EMERALD_BLOCK("133"),
173    SPRUCE_WOOD_STAIRS("134"),
174    BIRCH_WOOD_STAIRS("135"),
175    JUNGLE_WOOD_STAIRS("136"),
176    COMMAND("137"),
177    BEACON("138"),
178    COBBLE_WALL("139"),
179    FLOWER_POT("140"),
180    CARROT("141"),
181    POTATO("142"),
182    WOOD_BUTTON("143"),
183    SKULL("144"),
184    ANVIL("145"),
185    TRAPPED_CHEST("146"),
186    GOLD_PLATE("147"),
187    IRON_PLATE("148"),
188    REDSTONE_COMPARATOR_OFF("149"),
189    REDSTONE_COMPARATOR_ON("150"),
190    DAYLIGHT_DETECTOR("151"),
191    REDSTONE_BLOCK("152"),
192    QUARTZ_ORE("153"),
193    HOPPER("154"),
194    QUARTZ_BLOCK("155"),
195    QUARTZ_STAIRS("156"),
196    ACTIVATOR_RAIL("157"),
197    DROPPER("158"),
198    STAINED_CLAY("159"),
199    STAINED_GLASS_PANE("160"),
200    LEAVES_2("161"),
201    LOG_2("162"),
202    ACACIA_STAIRS("163"),
203    DARK_OAK_STAIRS("164"),
204    SLIME_BLOCK("165"),
205    BARRIER("166"),
206    IRON_TRAP_DOOR("167"),
207    PRISMARINE("168"),
208    SEA_LANTERN("169"),
209    HAY_BLOCK("170"),
210    CARPET("171"),
211    HARD_CLAY("172"),
212    COAL_BLOCK("173"),
213    PACKED_ICE("174"),
214    DOUBLE_PLANT("175"),
215    STANDING_BANNER("176"),
216    WALL_BANNER("177"),
217    DAYLIGHT_DETECTOR_INVERTED("178"),
218    RED_SANDSTONE("179"),
219    RED_SANDSTONE_STAIRS("180"),
220    DOUBLE_STEP_2("181"),
221    STEP_2("182"),
222    SPRUCE_FENCE_GATE("183"),
223    BIRCH_FENCE_GATE("184"),
224    JUNGLE_FENCE_GATE("185"),
225    DARK_OAK_FENCE_GATE("186"),
226    ACACIA_FENCE_GATE("187"),
227    SPRUCE_FENCE("188"),
228    BIRCH_FENCE("189"),
229    JUNGLE_FENCE("190"),
230    DARK_OAK_FENCE("191"),
231    ACACIA_FENCE("192"),
232    /**
233     * Items
234     */
235    IRON_SPADE("256", 1),
236    IRON_PICKAXE("257", 1),
237    IRON_AXE("258", 1),
238    FLINT_AND_STEEL("259", 1),
239    APPLE("260"),
240    BOW("261", 1),
241    ARROW("262"),
242    COAL("263"),
243    DIAMOND("264"),
244    IRON_INGOT("265"),
245    GOLD_INGOT("266"),
246    IRON_SWORD("267", 1),
247    WOOD_SWORD("268", 1),
248    WOOD_SPADE("269", 1),
249    WOOD_PICKAXE("270", 1),
250    WOOD_AXE("271", 1),
251    STONE_SWORD("272", 1),
252    STONE_SPADE("273", 1),
253    STONE_PICKAXE("274", 1),
254    STONE_AXE("275", 1),
255    DIAMOND_SWORD("276", 1),
256    DIAMOND_SPADE("277", 1),
257    DIAMOND_PICKAXE("278", 1),
258    DIAMOND_AXE("279", 1),
259    STICK("280"),
260    BOWL("281"),
261    MUSHROOM_SOUP("282"),
262    GOLD_SWORD("283", 1),
263    GOLD_SPADE("284", 1),
264    GOLD_PICKAXE("285", 1),
265    GOLD_AXE("286", 1),
266    STRING("287"),
267    FEATHER("288"),
268    SULPHUR("289"),
269    WOOD_HOE("290", 1),
270    STONE_HOE("291", 1),
271    IRON_HOE("292", 1),
272    DIAMOND_HOE("293", 1),
273    GOLD_HOE("294", 1),
274    SEEDS("295"),
275    WHEAT("296"),
276    BREAD("297"),
277    LEATHER_HELMET("298", 1),
278    LEATHER_CHESTPLATE("299", 1),
279    LEATHER_LEGGINGS("300", 1),
280    LEATHER_BOOTS("301", 1),
281    CHAINMAIL_HELMET("302", 1),
282    CHAINMAIL_CHESTPLATE("303", 1),
283    CHAINMAIL_LEGGINGS("304", 1),
284    CHAINMAIL_BOOTS("305", 1),
285    IRON_HELMET("306", 1),
286    IRON_CHESTPLATE("307", 1),
287    IRON_LEGGINGS("308", 1),
288    IRON_BOOTS("309", 1),
289    DIAMOND_HELMET("310", 1),
290    DIAMOND_CHESTPLATE("311", 1),
291    DIAMOND_LEGGINGS("312", 1),
292    DIAMOND_BOOTS("313", 1),
293    GOLD_HELMET("314", 1),
294    GOLD_CHESTPLATE("315", 1),
295    GOLD_LEGGINGS("316", 1),
296    GOLD_BOOTS("317", 1),
297    FLINT("318"),
298    PORK("319"),
299    GRILLED_PORK("320"),
300    PAINTING("321"),                // Can place
301    GOLDEN_APPLE("322"),
302    SIGN("323", 16),                // Can place
303    WOOD_DOOR("324"),               // Can place
304    BUCKET("325", 16),
305    WATER_BUCKET("326", 1),         // Can place
306    LAVA_BUCKET("327", 1),          // Can place
307    MINECART("328", 1),             // Can spawn
308    SADDLE("329", 1),
309    IRON_DOOR("330", 1),            // Can place
310    REDSTONE("331"),                // Can place
311    SNOW_BALL("332", 16),           // Can spawn
312    BOAT("333", 1),                 // Can spawn
313    LEATHER("334"),
314    MILK_BUCKET("335", 1),
315    CLAY_BRICK("336"),
316    CLAY_BALL("337"),
317    SUGAR_CANE("338"),              // Can place
318    PAPER("339"),
319    BOOK("340"),
320    SLIME_BALL("341"),
321    STORAGE_MINECART("342", 1),     // Can spawn
322    POWERED_MINECART("343", 1),     // Can spawn
323    EGG("344", 16),                 // Can spawn
324    COMPASS("345"),
325    FISHING_ROD("346", 1),          // Can spawn
326    WATCH("347"),
327    GLOWSTONE_DUST("348"),
328    RAW_FISH("349"),
329    COOKED_FISH("350"),
330    INK_SACK("351"),
331    BONE("352"),
332    SUGAR("353"),
333    CAKE("354", 1),                 // Can place
334    BED("355", 1),                  // Can place
335    DIODE("356"),                   // Can place
336    COOKIE("357"),
337    MAP("358"),
338    SHEARS("359", 1),
339    MELON("360"),                   // Can place
340    PUMPKIN_SEEDS("361"),
341    MELON_SEEDS("362"),
342    RAW_BEEF("363"),
343    COOKED_BEEF("364"),
344    RAW_CHICKEN("365"),
345    COOKED_CHICKEN("366"),
346    ROTTEN_FLESH("367"),
347    ENDER_PEARL("368", 16),         // Can spawn
348    BLAZE_ROD("369"),
349    GHAST_TEAR("370"),
350    GOLD_NUGGET("371"),
351    POTION("373", 1),               // Can spawn
352    GLASS_BOTTLE("374"),
353    SPIDER_EYE("375"),
354    FERMENTED_SPIDER_EYE("376"),
355    BLAZE_POWDER("377"),
356    MAGMA_CREAM("378"),
357    BREWING_STAND_ITEM("379"),
358    CAULDRON_ITEM("380"),           // Can place?
359    EYE_OF_ENDER("381"),            // Can spawn
360    SPECKLED_MELON("382"),
361    MONSTER_EGG("383"),             // Can spawn
362    EXP_BOTTLE("384"),              // Can spawn
363    FIREBALL("385"),
364    BOOK_AND_QUILL("386", 1),
365    WRITTEN_BOOK("387", 16),
366    EMERALD("388"),
367    ITEM_FRAME("389"),              // Can spawn
368    FLOWER_POT_ITEM("390"),         // Applyable
369    CARROT_ITEM("391"),
370    POTATO_ITEM("392"),
371    BAKED_POTATO("393"),
372    POISONOUS_POTATO("394"),
373    EMPTY_MAP("395"),
374    GOLDEN_CARROT("396"),
375    SKULL_ITEM("397"),              // Can place
376    CARROT_STICK("398", 1),
377    NETHER_STAR("399"),
378    PUMPKIN_PIE("400"),
379    FIREWORK("401"),                // Can spawn
380    FIREWORK_CHARGE("402"),
381    ENCHANTED_BOOK("403", 1),
382    REDSTONE_COMPARATOR("404"),     // Can place
383    NETHER_BRICK_ITEM("405"),
384    QUARTZ("406"),
385    EXPLOSIVE_MINECART("407", 1),   // Can spawn
386    HOPPER_MINECART("408", 1),      // Can spawn
387    PRISMARINE_SHARD("409"),
388    PRISMARINE_CRYSTALS("410"),
389    RABBIT("411"),
390    COOKED_RABBIT("412"),
391    RABBIT_STEW("413", 1),
392    RABBIT_FOOT("414"),
393    RABBIT_HIDE("415"),
394    ARMOR_STAND("416"),
395    IRON_BARDING("417", 1),
396    GOLD_BARDING("418", 1),
397    DIAMOND_BARDING("419", 1),
398    LEASH("420"),
399    NAME_TAG("421"),
400    COMMAND_MINECART("422", 1),     // Can spawn
401    MUTTON("423"),
402    COOKED_MUTTON("424"),
403    BANNER("425"),                  // Can place?
404    SPRUCE_DOOR("427"),             // Can place
405    BIRCH_DOOR("428"),              // Can place
406    JUNGLE_DOOR("429"),             // Can place
407    ACACIA_DOOR("430"),             // Can place
408    DARK_OAK_DOOR("431"),           // Can place
409    SHIELD("442", 1),
410    GOLD_RECORD("2256", 1),
411    GREEN_RECORD("2257", 1),
412    RECORD_3("2258", 1),
413    RECORD_4("2259", 1),
414    RECORD_5("2260", 1),
415    RECORD_6("2261", 1),
416    RECORD_7("2262", 1),
417    RECORD_8("2263", 1),
418    RECORD_9("2264", 1),
419    RECORD_10("2265", 1),
420    RECORD_11("2266", 1),
421    RECORD_12("2267", 1);
422
423    private final Pattern PATTERN = Pattern.compile("_");
424    private final String id;
425    private final String data;
426    private final int maxStack;
427    private final int idInt;
428    private final String replaced;
429
430    private static final Map<Integer, Substance> ids;
431
432    static {
433        HashMap<Integer, Substance> builder = Maps.newHashMap();
434        for (Substance substance: EnumSet.allOf(Substance.class)) {
435            builder.put(substance.idInt, substance);
436        }
437        ids = Collections.unmodifiableMap(builder);
438    }
439
440    Substance(String id, int stack, String data) {
441        this.id = id;
442        this.maxStack = stack;
443        this.data = data;
444        this.replaced = PATTERN.matcher(id).replaceAll(" ");
445
446        this.idInt = Integer.parseInt(id);
447    }
448
449    Substance(String id, int stack) {
450        this(id, stack, "");
451    }
452
453    Substance(String id) {
454        this(id, 64, "");
455    }
456
457    /**
458     * Matches a Material from a String
459     *
460     * @param id String to be matched
461     * @return Material which was matched using id
462     */
463    public static Substance fromStringId(String id) {
464        for (Substance mat : Substance.values()) {
465            if (mat.replaced.equalsIgnoreCase(id))
466                return mat;
467        }
468
469        return null;
470    }
471
472    /**
473     * Returns the substance that associated with a given id
474     *
475     * <p>Should be the favored method for getting a substance</p>
476     * <p>E.g. fromId(1) will return Substance.STONE</p>
477     *
478     * @param id
479     * @return
480     */
481    public static Substance fromId(int id) {
482        return ids.get(id);
483    }
484
485    /**
486     * Gets the block ID of the Material
487     *
488     * @return ID of the Material
489     */
490    public String idString() {
491        return this.id;
492    }
493
494    /**
495     * Returns the Id of this substance
496     * @return the id of this substance
497     */
498    public int id() {
499        return idInt;
500    }
501
502    /**
503     * Gets data of this Material
504     *
505     * @return Data of this Material
506     */
507    public String data() {
508        return this.data;
509    }
510
511    /**
512     * Checks if the substance is a block
513     *
514     * @return True if the substance is a block
515     */
516    public boolean isBlock() {
517        return Integer.parseInt(this.id) < 255;
518    }
519
520    /**
521     * Check the maximum size of a stack for this Material
522     *
523     * @return The maximum size of a stack for this Material
524     */
525    public int maxStackSize() {
526        return this.maxStack;
527    }
528
529    /**
530     * Checks if the substance is edible or not
531     *
532     * @return True if the substance is edible
533     */
534    public boolean isEdible() {
535        switch (this) {
536            case BREAD:
537            case CARROT_ITEM:
538            case BAKED_POTATO:
539            case POTATO_ITEM:
540            case POISONOUS_POTATO:
541            case GOLDEN_CARROT:
542            case PUMPKIN_PIE:
543            case COOKIE:
544            case MELON:
545            case MUSHROOM_SOUP:
546            case RAW_CHICKEN:
547            case COOKED_CHICKEN:
548            case RAW_BEEF:
549            case COOKED_BEEF:
550            case RAW_FISH:
551            case COOKED_FISH:
552            case PORK:
553            case GRILLED_PORK:
554            case APPLE:
555            case GOLDEN_APPLE:
556            case ROTTEN_FLESH:
557            case SPIDER_EYE:
558            case RABBIT:
559            case COOKED_RABBIT:
560            case RABBIT_STEW:
561            case MUTTON:
562            case COOKED_MUTTON:
563            case POTION:
564                return true;
565            default:
566                return false;
567        }
568    }
569
570    /**
571     * Check if a item is a disc (record)
572     *
573     * @return True if the item is a disc (record)
574     */
575    public boolean isDisc() {
576        return !this.isBlock() && this.idInt >= 2256;
577    }
578
579    /**
580     * Check if a item is wearable (armor)
581     *
582     * @return True if the item is wearable (armor)
583     */
584    public boolean isWearable() {
585        if (this.isBlock() && this != PUMPKIN) {
586            return false;
587        }
588
589        switch (this) {
590            case PUMPKIN:
591            case LEATHER_HELMET:
592            case LEATHER_CHESTPLATE:
593            case LEATHER_LEGGINGS:
594            case LEATHER_BOOTS:
595            case CHAINMAIL_HELMET:
596            case CHAINMAIL_CHESTPLATE:
597            case CHAINMAIL_LEGGINGS:
598            case CHAINMAIL_BOOTS:
599            case IRON_HELMET:
600            case IRON_CHESTPLATE:
601            case IRON_LEGGINGS:
602            case IRON_BOOTS:
603            case DIAMOND_HELMET:
604            case DIAMOND_CHESTPLATE:
605            case DIAMOND_LEGGINGS:
606            case DIAMOND_BOOTS:
607            case GOLD_HELMET:
608            case GOLD_CHESTPLATE:
609            case GOLD_LEGGINGS:
610            case GOLD_BOOTS:
611                return true;
612            default:
613                return false;
614        }
615    }
616
617    /**
618     * Check if a block is solid.
619     *
620     * @return True if the block is solid
621     */
622    public boolean isSolid() {
623        if (!this.isBlock()) {
624            return false;
625        }
626
627        switch (this) {
628            case AIR:
629            case SAPLING:
630            case WATER:
631            case STATIONARY_WATER:
632            case LAVA:
633            case STATIONARY_LAVA:
634            case POWERED_RAIL:
635            case DETECTOR_RAIL:
636            case LONG_GRASS:
637            case DEAD_BUSH:
638            case YELLOW_FLOWER:
639            case RED_ROSE:
640            case TORCH:
641            case FIRE:
642            case REDSTONE_WIRE:
643            case CROPS:
644            case SIGN_POST:
645            case RAILS:
646            case WALL_SIGN:
647            case LEVER:
648            case STONE_PLATE:
649            case WOOD_PLATE:
650            case REDSTONE_TORCH_OFF:
651            case REDSTONE_TORCH_ON:
652            case STONE_BUTTON:
653            case SUGAR_CANE_BLOCK:
654            case PORTAL:
655            case TRIPWIRE_HOOK:
656            case TRIPWIRE:
657            case CARROT:
658            case POTATO:
659            case WOOD_BUTTON:
660            case GOLD_PLATE:
661            case IRON_PLATE:
662            case ACTIVATOR_RAIL:
663            case DOUBLE_PLANT:
664                return false;
665            default:
666                return true;
667        }
668    }
669
670    /**
671     * Check if a block is flammable or not
672     *
673     * @return True if a block is flammable
674     */
675    public boolean isFlammable() {
676        if (!this.isBlock()) {
677            return false;
678        }
679
680        switch (this) {
681            case WOOD:
682            case LOG:
683            case LEAVES:
684            case NOTE_BLOCK:
685            case BED_BLOCK:
686            case LONG_GRASS:
687            case DEAD_BUSH:
688            case WOOL:
689            case TNT:
690            case BOOKSHELF:
691            case WOOD_STAIRS:
692            case CHEST:
693            case WORKBENCH:
694            case SIGN_POST:
695            case WOODEN_DOOR:
696            case WALL_SIGN:
697            case WOOD_PLATE:
698            case JUKEBOX:
699            case FENCE:
700            case TRAP_DOOR:
701            case HUGE_MUSHROOM_1:
702            case HUGE_MUSHROOM_2:
703            case VINE:
704            case FENCE_GATE:
705            case WOOD_DOUBLE_STEP:
706            case WOOD_STEP:
707            case SPRUCE_WOOD_STAIRS:
708            case BIRCH_WOOD_STAIRS:
709            case JUNGLE_WOOD_STAIRS:
710            case HAY_BLOCK:
711            case COAL_BLOCK:
712            case TRAPPED_CHEST:
713            case DAYLIGHT_DETECTOR:
714            case CARPET:
715            case DOUBLE_PLANT:
716            case LEAVES_2:
717            case LOG_2:
718            case ACACIA_STAIRS:
719            case DARK_OAK_STAIRS:
720            case SPRUCE_FENCE_GATE:
721            case BIRCH_FENCE_GATE:
722            case JUNGLE_FENCE_GATE:
723            case DARK_OAK_FENCE_GATE:
724            case ACACIA_FENCE_GATE:
725            case SPRUCE_FENCE:
726            case BIRCH_FENCE:
727            case JUNGLE_FENCE:
728            case DARK_OAK_FENCE:
729            case ACACIA_FENCE:
730                return true;
731            default:
732                return false;
733        }
734    }
735
736    /**
737     * Check if a block can burn away
738     *
739     * @return True if a block can burn away
740     */
741    public boolean isBurnable() {
742        if (!this.isBlock()) {
743            return false;
744        }
745
746        switch (this) {
747            case WOOD:
748            case LOG:
749            case LEAVES:
750            case LONG_GRASS:
751            case WOOL:
752            case YELLOW_FLOWER:
753            case RED_ROSE:
754            case TNT:
755            case BOOKSHELF:
756            case WOOD_STAIRS:
757            case FENCE:
758            case VINE:
759            case FENCE_GATE:
760            case WOOD_DOUBLE_STEP:
761            case WOOD_STEP:
762            case SPRUCE_WOOD_STAIRS:
763            case BIRCH_WOOD_STAIRS:
764            case JUNGLE_WOOD_STAIRS:
765            case HAY_BLOCK:
766            case COAL_BLOCK:
767            case LEAVES_2:
768            case LOG_2:
769            case CARPET:
770            case DOUBLE_PLANT:
771            case ACACIA_STAIRS:
772            case DARK_OAK_STAIRS:
773            case SPRUCE_FENCE_GATE:
774            case BIRCH_FENCE_GATE:
775            case JUNGLE_FENCE_GATE:
776            case DARK_OAK_FENCE_GATE:
777            case ACACIA_FENCE_GATE:
778            case SPRUCE_FENCE:
779            case BIRCH_FENCE:
780            case JUNGLE_FENCE:
781            case DARK_OAK_FENCE:
782            case ACACIA_FENCE:
783                return true;
784            default:
785                return false;
786        }
787    }
788
789    /**
790     * Returns whether or not the item is a weapon
791     *
792     * @return {@code true} if it is a weapon
793     */
794    public boolean isWeapon() {
795        if (isBlock()) return false;
796
797        switch (this) {
798            case WOOD_SWORD:
799            case STONE_SWORD:
800            case GOLD_SWORD:
801            case IRON_SWORD:
802            case DIAMOND_SWORD:
803            case BOW:
804                return true;
805            default:
806                return false;
807        }
808    }
809
810    /**
811     * Gets if a block is affected by gravity, and falls when you place it.
812     *
813     * @return True if the block is affected by gravity, and falls when you place it.
814     */
815    public boolean hasGravity() {
816        if (!this.isBlock()) {
817            return false;
818        }
819
820        switch (this) {
821            case SAND:
822            case ANVIL:
823            case GRAVEL:
824                return true;
825            default:
826                return false;
827        }
828    }
829
830    /**
831     * Returns the break sound of the block
832     *
833     * @return The break sound of the block
834     */
835    public SoundEffectType breakSound(){
836        if(!this.isBlock()){
837            return null;
838        }
839
840        switch(this){
841            case WOOL:
842            case CACTUS:
843            case CAKE_BLOCK:
844            case CARPET:
845                return SoundEffectType.DIG_CLOTH;
846            case GRASS:
847            case SPONGE:
848            case LEAVES:
849            case LEAVES_2:
850            case LONG_GRASS:
851            case SAPLING:
852            case DEAD_BUSH:
853            case YELLOW_FLOWER:
854            case RED_ROSE:
855            case DOUBLE_PLANT:
856            case BROWN_MUSHROOM:
857            case RED_MUSHROOM:
858            case TNT:
859            case CROPS:
860            case SUGAR_CANE_BLOCK:
861            case VINE:
862            case MYCEL:
863            case WATER_LILY:
864            case HAY_BLOCK:
865                return SoundEffectType.DIG_GRASS;
866            case DIRT:
867            case GRAVEL:
868            case SOIL:
869            case CLAY:
870                return SoundEffectType.DIG_GRAVEL;
871            case SAND:
872            case SOUL_SAND:
873                return SoundEffectType.DIG_SAND;
874            case SNOW:
875            case SNOW_BLOCK:
876                return SoundEffectType.DIG_SNOW;
877            case WOOD:
878            case LOG:
879            case LOG_2:
880            case BED_BLOCK:
881            case BOOKSHELF:
882            case TORCH:
883            case FIRE:
884            case ACACIA_STAIRS:
885            case BIRCH_WOOD_STAIRS:
886            case DARK_OAK_STAIRS:
887            case JUNGLE_WOOD_STAIRS:
888            case SPRUCE_WOOD_STAIRS:
889            case WOOD_STAIRS:
890            case CHEST:
891            case WORKBENCH:
892            case LADDER:
893            case SIGN_POST:
894            case WALL_SIGN:
895            case LEVER:
896            case WOOD_PLATE:
897            case REDSTONE_TORCH_OFF:
898            case REDSTONE_TORCH_ON:
899            case FENCE:
900            case ACACIA_FENCE:
901            case BIRCH_FENCE:
902            case DARK_OAK_FENCE:
903            case JUNGLE_FENCE:
904            case SPRUCE_FENCE:
905            case ACACIA_FENCE_GATE:
906            case BIRCH_FENCE_GATE:
907            case DARK_OAK_FENCE_GATE:
908            case FENCE_GATE:
909            case JUNGLE_FENCE_GATE:
910            case SPRUCE_FENCE_GATE:
911            case PUMPKIN:
912            case PUMPKIN_STEM:
913            case MELON_BLOCK:
914            case MELON_STEM:
915            case JACK_O_LANTERN:
916            case DIODE_BLOCK_ON:
917            case DIODE_BLOCK_OFF:
918            case TRAP_DOOR:
919            case HUGE_MUSHROOM_1:
920            case HUGE_MUSHROOM_2:
921            case WOOD_STEP:
922            case WOOD_DOUBLE_STEP:
923            case COCOA:
924            case WOOD_BUTTON:
925            case GOLD_PLATE:
926            case IRON_PLATE:
927            case STONE_PLATE:
928            case REDSTONE_COMPARATOR_OFF:
929            case REDSTONE_COMPARATOR_ON:
930            case DAYLIGHT_DETECTOR:
931            case DAYLIGHT_DETECTOR_INVERTED:
932            case STANDING_BANNER:
933            case WALL_BANNER:
934            case ACACIA_DOOR:
935            case BIRCH_DOOR:
936            case DARK_OAK_DOOR:
937            case JUNGLE_DOOR:
938            case SPRUCE_DOOR:
939            case WOOD_DOOR:
940            case WOODEN_DOOR:
941                return SoundEffectType.DIG_WOOD;
942            case GLASS:
943            case ICE:
944            case PACKED_ICE:
945            case GLOWSTONE:
946            case PORTAL:
947            case STAINED_GLASS:
948            case THIN_GLASS:
949            case STAINED_GLASS_PANE:
950            case SEA_LANTERN:
951                return SoundEffectType.DIG_GLASS;
952            default:
953                return SoundEffectType.DIG_STONE;
954        }
955    }
956
957    public char asExtended () {
958        return (char) (this.idInt << 4);
959    }
960
961    /**
962     * Returns the place sound of the block
963     *
964     * @return The place sound of the block
965     */
966    public SoundEffectType placeSound(){
967        if(!this.isBlock()){
968            return null;
969        }
970
971        switch(this){
972            case CROPS:
973            case WATER_LILY:
974            case REDSTONE_WIRE:
975            case IRON_DOOR:
976            case NETHER_WARTS:
977            case BED_BLOCK:
978            case PUMPKIN_STEM:
979            case MELON_STEM:
980            case COCOA:
981            case WALL_BANNER:
982            case STANDING_BANNER:
983            case ACACIA_DOOR:
984            case BIRCH_DOOR:
985            case DARK_OAK_DOOR:
986            case JUNGLE_DOOR:
987            case SPRUCE_DOOR:
988            case WOOD_DOOR:
989            case WOODEN_DOOR:
990                return null;
991            case WOOL:
992            case CACTUS:
993            case CAKE_BLOCK:
994            case CARPET:
995                return SoundEffectType.DIG_CLOTH;
996            case GRASS:
997            case SPONGE:
998            case LEAVES:
999            case LEAVES_2:
1000            case LONG_GRASS:
1001            case SAPLING:
1002            case DEAD_BUSH:
1003            case YELLOW_FLOWER:
1004            case RED_ROSE:
1005            case DOUBLE_PLANT:
1006            case BROWN_MUSHROOM:
1007            case RED_MUSHROOM:
1008            case TNT:
1009            case SUGAR_CANE_BLOCK:
1010            case VINE:
1011            case MYCEL:
1012            case HAY_BLOCK:
1013                return SoundEffectType.DIG_GRASS;
1014            case DIRT:
1015            case GRAVEL:
1016            case SOIL:
1017            case CLAY:
1018                return SoundEffectType.DIG_GRAVEL;
1019            case SAND:
1020            case SOUL_SAND:
1021                return SoundEffectType.DIG_SAND;
1022            case SNOW:
1023            case SNOW_BLOCK:
1024                return SoundEffectType.DIG_SNOW;
1025            case WOOD:
1026            case LOG:
1027            case LOG_2:
1028            case BOOKSHELF:
1029            case TORCH:
1030            case FIRE:
1031            case ACACIA_STAIRS:
1032            case BIRCH_WOOD_STAIRS:
1033            case DARK_OAK_STAIRS:
1034            case JUNGLE_WOOD_STAIRS:
1035            case SPRUCE_WOOD_STAIRS:
1036            case WOOD_STAIRS:
1037            case CHEST:
1038            case WORKBENCH:
1039            case LADDER:
1040            case SIGN_POST:
1041            case WALL_SIGN:
1042            case LEVER:
1043            case WOOD_PLATE:
1044            case REDSTONE_TORCH_OFF:
1045            case REDSTONE_TORCH_ON:
1046            case FENCE:
1047            case ACACIA_FENCE:
1048            case BIRCH_FENCE:
1049            case DARK_OAK_FENCE:
1050            case JUNGLE_FENCE:
1051            case SPRUCE_FENCE:
1052            case ACACIA_FENCE_GATE:
1053            case BIRCH_FENCE_GATE:
1054            case DARK_OAK_FENCE_GATE:
1055            case FENCE_GATE:
1056            case JUNGLE_FENCE_GATE:
1057            case SPRUCE_FENCE_GATE:
1058            case PUMPKIN:
1059            case MELON_BLOCK:
1060            case JACK_O_LANTERN:
1061            case DIODE_BLOCK_ON:
1062            case DIODE_BLOCK_OFF:
1063            case TRAP_DOOR:
1064            case HUGE_MUSHROOM_1:
1065            case HUGE_MUSHROOM_2:
1066            case WOOD_STEP:
1067            case WOOD_DOUBLE_STEP:
1068            case WOOD_BUTTON:
1069            case GOLD_PLATE:
1070            case IRON_PLATE:
1071            case STONE_PLATE:
1072            case REDSTONE_COMPARATOR_OFF:
1073            case REDSTONE_COMPARATOR_ON:
1074            case DAYLIGHT_DETECTOR:
1075            case DAYLIGHT_DETECTOR_INVERTED:
1076                return SoundEffectType.DIG_WOOD;
1077            case GLASS:
1078            case ICE:
1079            case PACKED_ICE:
1080            case GLOWSTONE:
1081            case PORTAL:
1082            case STAINED_GLASS:
1083            case THIN_GLASS:
1084            case STAINED_GLASS_PANE:
1085            case SEA_LANTERN:
1086                return SoundEffectType.STEP_STONE;
1087            case ANVIL:
1088                return SoundEffectType.RANDOM_ANVIL_LAND;
1089            default:
1090                return SoundEffectType.DIG_STONE;
1091        }
1092    }
1093
1094    public boolean isFunctional(){
1095        switch(this){
1096            case DISPENSER:
1097            case NOTE_BLOCK:
1098            case BED_BLOCK:
1099            case CHEST:
1100            case WORKBENCH:
1101            case FURNACE:
1102            case BURNING_FURNACE:
1103            case LEVER:
1104            case WOOD_BUTTON:
1105            case STONE_BUTTON:
1106            case ACACIA_DOOR:
1107            case BIRCH_DOOR:
1108            case DARK_OAK_DOOR:
1109            case JUNGLE_DOOR:
1110            case SPRUCE_DOOR:
1111            case WOOD_DOOR:
1112            case WOODEN_DOOR:
1113            case TRAP_DOOR:
1114            case DIODE_BLOCK_OFF:
1115            case DIODE_BLOCK_ON:
1116            case ANVIL:
1117            case DROPPER:
1118            case ACACIA_FENCE_GATE:
1119            case BIRCH_FENCE_GATE:
1120            case DARK_OAK_FENCE_GATE:
1121            case FENCE_GATE:
1122            case JUNGLE_FENCE_GATE:
1123            case SPRUCE_FENCE_GATE:
1124            case HOPPER:
1125            case REDSTONE_COMPARATOR_ON:
1126            case REDSTONE_COMPARATOR_OFF:
1127            case ENCHANTMENT_TABLE:
1128            case TRAPPED_CHEST:
1129            case ENDER_CHEST:
1130                return true;
1131            default:
1132                return false;
1133        }
1134    }
1135
1136    public boolean canBeReplaced(){
1137        switch(this){
1138            case LONG_GRASS:
1139            case DEAD_BUSH:
1140            case SNOW:
1141                return true;
1142            default:
1143                return false;
1144        }
1145    }
1146
1147}