SongodaCore/Compatibility/src/main/java/com/songoda/core/compatibility/CompatibleMaterial.java

3287 lines
98 KiB
Java

package com.songoda.core.compatibility;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.FallingBlock;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.Contract;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
/**
* Items that are compatible with server versions 1.7+
*/
public enum CompatibleMaterial {
/*
TODO: add another handler for getBlockItem() for materials and fallback materials
Legacy has some values not used in modern, eg:
DIODE_BLOCK_OFF(93, Diode.class),
DIODE_BLOCK_ON(94, Diode.class),
SPRUCE_DOOR_ITEM(427),
BIRCH_DOOR_ITEM(428),
JUNGLE_DOOR_ITEM(429),
ACACIA_DOOR_ITEM(430),
DARK_OAK_DOOR_ITEM(431),
*/
/* 1.19.3 */
ENDER_DRAGON_SPAWN_EGG(),
IRON_GOLEM_SPAWN_EGG(),
SNOW_GOLEM_SPAWN_EGG(),
WITHER_SPAWN_EGG(),
/* 1.19 */
ACACIA_CHEST_BOAT(),
ALLAY_SPAWN_EGG(),
BIRCH_CHEST_BOAT(),
DARK_OAK_CHEST_BOAT(),
DISC_FRAGMENT_5(),
ECHO_SHARD(),
FROGSPAWN(),
FROG_SPAWN_EGG(),
GOAT_HORN(),
JUNGLE_CHEST_BOAT(),
MANGROVE_BOAT(),
MANGROVE_BUTTON(),
MANGROVE_CHEST_BOAT(),
MANGROVE_DOOR(),
MANGROVE_FENCE(),
MANGROVE_FENCE_GATE(),
MANGROVE_LEAVES(),
MANGROVE_LOG(),
MANGROVE_PLANKS(),
MANGROVE_PRESSURE_PLATE(),
MANGROVE_PROPAGULE(),
MANGROVE_ROOTS(),
MANGROVE_SIGN(),
MANGROVE_SLAB(),
MANGROVE_STAIRS(),
MANGROVE_TRAPDOOR(),
MANGROVE_WALL_SIGN(),
MANGROVE_WOOD(),
MUD(),
MUDDY_MANGROVE_ROOTS(),
MUD_BRICKS(),
MUD_BRICK_SLAB(),
MUD_BRICK_STAIRS(),
MUD_BRICK_WALL(),
MUSIC_DISC_5(),
OAK_CHEST_BOAT(),
OCHRE_FROGLIGHT(),
PACKED_MUD(),
PEARLESCENT_FROGLIGHT(),
POTTED_MANGROVE_PROPAGULE(),
RECOVERY_COMPASS(),
REINFORCED_DEEPSLATE(),
SCULK(),
SCULK_CATALYST(),
SCULK_SHRIEKER(),
SCULK_VEIN(),
SPRUCE_CHEST_BOAT(),
STRIPPED_MANGROVE_LOG(),
STRIPPED_MANGROVE_WOOD(),
TADPOLE_BUCKET(),
TADPOLE_SPAWN_EGG(),
VERDANT_FROGLIGHT(),
WARDEN_SPAWN_EGG(),
/* 1.18 */
MUSIC_DISC_OTHERSIDE(),
/* 1.17 */
AMETHYST_BLOCK(),
AMETHYST_CLUSTER(),
AMETHYST_SHARD(),
AXOLOTL_BUCKET(),
AXOLOTL_SPAWN_EGG(),
AZALEA(),
AZALEA_LEAVES(),
BIG_DRIPLEAF(),
BIG_DRIPLEAF_STEM(),
BLACK_CANDLE(),
BLACK_CANDLE_CAKE(),
BLUE_CANDLE(),
BLUE_CANDLE_CAKE(),
BROWN_CANDLE(),
BROWN_CANDLE_CAKE(),
BUDDING_AMETHYST(),
BUNDLE(),
CALCITE(),
CANDLE(),
CANDLE_CAKE(),
CAVE_VINES(),
CAVE_VINES_PLANT(),
CHISELED_DEEPSLATE(),
COBBLED_DEEPSLATE(),
COBBLED_DEEPSLATE_SLAB(),
COBBLED_DEEPSLATE_STAIRS(),
COBBLED_DEEPSLATE_WALL(),
COPPER_BLOCK(),
COPPER_INGOT(),
COPPER_ORE(),
CRACKED_DEEPSLATE_BRICKS(),
CRACKED_DEEPSLATE_TILES(),
CUT_COPPER(),
CUT_COPPER_SLAB(),
CUT_COPPER_STAIRS(),
CYAN_CANDLE(),
CYAN_CANDLE_CAKE(),
DEEPSLATE(),
DEEPSLATE_BRICKS(),
DEEPSLATE_BRICK_SLAB(),
DEEPSLATE_BRICK_STAIRS(),
DEEPSLATE_BRICK_WALL(),
DEEPSLATE_COAL_ORE(),
DEEPSLATE_COPPER_ORE(),
DEEPSLATE_DIAMOND_ORE(),
DEEPSLATE_EMERALD_ORE(),
DEEPSLATE_GOLD_ORE(),
DEEPSLATE_IRON_ORE(),
DEEPSLATE_LAPIS_ORE(),
DEEPSLATE_REDSTONE_ORE(),
DEEPSLATE_TILES(),
DEEPSLATE_TILE_SLAB(),
DEEPSLATE_TILE_STAIRS(),
DEEPSLATE_TILE_WALL(),
DRIPSTONE_BLOCK(),
EXPOSED_COPPER(),
EXPOSED_CUT_COPPER(),
EXPOSED_CUT_COPPER_SLAB(),
EXPOSED_CUT_COPPER_STAIRS(),
FLOWERING_AZALEA(),
FLOWERING_AZALEA_LEAVES(),
GLOW_BERRIES(),
GLOW_INK_SAC(),
GLOW_ITEM_FRAME(),
GLOW_LICHEN(),
GLOW_SQUID_SPAWN_EGG(),
GOAT_SPAWN_EGG(),
GRAY_CANDLE(),
GRAY_CANDLE_CAKE(),
GREEN_CANDLE(),
GREEN_CANDLE_CAKE(),
HANGING_ROOTS(),
INFESTED_DEEPSLATE(),
LARGE_AMETHYST_BUD(),
LAVA_CAULDRON(),
LIGHT(),
LIGHTNING_ROD(),
LIGHT_BLUE_CANDLE(),
LIGHT_BLUE_CANDLE_CAKE(),
LIGHT_GRAY_CANDLE(),
LIGHT_GRAY_CANDLE_CAKE(),
LIME_CANDLE(),
LIME_CANDLE_CAKE(),
MAGENTA_CANDLE(),
MAGENTA_CANDLE_CAKE(),
MEDIUM_AMETHYST_BUD(),
MOSS_BLOCK(),
MOSS_CARPET(),
ORANGE_CANDLE(),
ORANGE_CANDLE_CAKE(),
OXIDIZED_COPPER(),
OXIDIZED_CUT_COPPER(),
OXIDIZED_CUT_COPPER_SLAB(),
OXIDIZED_CUT_COPPER_STAIRS(),
PINK_CANDLE(),
PINK_CANDLE_CAKE(),
POINTED_DRIPSTONE(),
POLISHED_DEEPSLATE(),
POLISHED_DEEPSLATE_SLAB(),
POLISHED_DEEPSLATE_STAIRS(),
POLISHED_DEEPSLATE_WALL(),
POTTED_AZALEA_BUSH(),
POTTED_FLOWERING_AZALEA_BUSH(),
POWDER_SNOW(),
POWDER_SNOW_BUCKET(),
POWDER_SNOW_CAULDRON(),
PURPLE_CANDLE(),
PURPLE_CANDLE_CAKE(),
RAW_COPPER(),
RAW_COPPER_BLOCK(),
RAW_GOLD(),
RAW_GOLD_BLOCK(),
RAW_IRON(),
RAW_IRON_BLOCK(),
RED_CANDLE(),
RED_CANDLE_CAKE(),
ROOTED_DIRT(),
SCULK_SENSOR(),
SMALL_AMETHYST_BUD(),
SMALL_DRIPLEAF(),
SMOOTH_BASALT(),
SPORE_BLOSSOM(),
SPYGLASS(),
TINTED_GLASS(),
TUFF(),
WATER_CAULDRON(),
WAXED_COPPER_BLOCK(),
WAXED_CUT_COPPER(),
WAXED_CUT_COPPER_SLAB(),
WAXED_CUT_COPPER_STAIRS(),
WAXED_EXPOSED_COPPER(),
WAXED_EXPOSED_CUT_COPPER(),
WAXED_EXPOSED_CUT_COPPER_SLAB(),
WAXED_EXPOSED_CUT_COPPER_STAIRS(),
WAXED_OXIDIZED_COPPER(),
WAXED_OXIDIZED_CUT_COPPER(),
WAXED_OXIDIZED_CUT_COPPER_SLAB(),
WAXED_OXIDIZED_CUT_COPPER_STAIRS(),
WAXED_WEATHERED_COPPER(),
WAXED_WEATHERED_CUT_COPPER(),
WAXED_WEATHERED_CUT_COPPER_SLAB(),
WAXED_WEATHERED_CUT_COPPER_STAIRS(),
WEATHERED_COPPER(),
WEATHERED_CUT_COPPER(),
WEATHERED_CUT_COPPER_SLAB(),
WEATHERED_CUT_COPPER_STAIRS(),
WHITE_CANDLE(),
WHITE_CANDLE_CAKE(),
YELLOW_CANDLE(),
YELLOW_CANDLE_CAKE(),
/* 1.16.2 */
PIGLIN_BRUTE_SPAWN_EGG(),
/* 1.16 */
ANCIENT_DEBRIS(),
BASALT(),
BLACKSTONE(),
BLACKSTONE_STAIRS(),
BLACKSTONE_WALL(),
BLACKSTONE_SLAB(),
BLASTSTONE_SLAB(),
CHAIN(),
CHISELED_NETHER_BRICKS(),
CHISELED_POLISHED_BLACKSTONE(),
CRACKED_NETHER_BRICKS(),
CRACKED_POLISHED_BLACKSTONE_BRICKS(),
CRIMSON_BUTTON(),
CRIMSON_DOOR(),
CRIMSON_FENCE(),
CRIMSON_FENCE_GATE(),
CRIMSON_FUNGUS(),
CRIMSON_HYPHAE(),
CRIMSON_NYLIUM(),
CRIMSON_PLANKS(),
CRIMSON_PRESSURE_PLATE(),
CRIMSON_ROOTS(),
CRIMSON_SIGN(),
CRIMSON_SLAB(),
CRIMSON_STAIRS(),
CRIMSON_STEM(),
CRIMSON_TRAPDOOR(),
CRIMSON_WALL_SIGN(),
CRYING_OBSIDIAN(),
GILDED_BLACKSTONE(),
HOGLIN_SPAWN_EGG(),
LODESTONE(),
MUSIC_DISC_PIGSTEP(),
NETHERITE_AXE(),
NETHERITE_BLOCK(),
NETHERITE_BOOTS(),
NETHERITE_CHESTPLATE(),
NETHERITE_HELMET(),
NETHERITE_HOE(),
NETHERITE_INGOT(),
NETHERITE_LEGGINGS(),
NETHERITE_PICKAXE(),
NETHERITE_SCRAP(),
NETHERITE_SHOVEL(),
NETHERITE_SWORD(),
NETHER_GOLD_ORE(),
NETHER_SPROUTS(),
PIGLIN_BANNER_PATTERN(),
PIGLIN_SPAWN_EGG(),
POLISHED_BASALT(),
POLISHED_BLACKSTONE(),
POLISHED_BLACKSTONE_BRICKS(),
POLISHED_BLACKSTONE_BRICK_SLAB(),
POLISHED_BLACKSTONE_BRICK_STAIRS(),
POLISHED_BLACKSTONE_BRICK_WALL(),
POLISHED_BLACKSTONE_BUTTON(),
POLISHED_BLACKSTONE_PRESSURE_PLATE(),
POLISHED_BLACKSTONE_SLAB(),
POLISHED_BLACKSTONE_STAIRS(),
POLISHED_BLACKSTONE_WALL(),
POTTED_CRIMSON_FUNGUS(),
POTTED_CRIMSON_ROOTS(),
POTTED_WARPED_FUNGUS(),
POTTED_WARPED_ROOTS(),
QUARTZ_BRICKS(),
RESPAWN_ANCHOR(),
SHROOMLIGHT(),
SOUL_CAMPFIRE(),
SOUL_FIRE(),
SOUL_LANTERN(),
SOUL_SOIL(),
SOUL_TORCH(),
SOUL_WALL_TORCH(),
STRIDER_SPAWN_EGG(),
STRIPPED_CRIMSON_HYPHAE(),
STRIPPED_CRIMSON_STEM(),
STRIPPED_WARPED_HYPHAE(),
STRIPPED_WARPED_STEM(),
TARGET(),
TWISTING_VINES(),
TWISTING_VINES_PLANT(),
WARPED_BUTTON(),
WARPED_DOOR(),
WARPED_FENCE(),
WARPED_FENCE_GATE(),
WARPED_FUNGUS(),
WARPED_FUNGUS_ON_A_STICK(),
WARPED_HYPHAE(),
WARPED_NYLIUM(),
WARPED_PLANKS(),
WARPED_PRESSURE_PLATE(),
WARPED_ROOTS(),
WARPED_SIGN(),
WARPED_SLAB(),
WARPED_STAIRS(),
WARPED_STEM(),
WARPED_TRAPDOOR(),
WARPED_WALL_SIGN(),
WARPED_WART_BLOCK(),
WEEPING_VINES(),
WEEPING_VINES_PLANT(),
ZOGLIN_SPAWN_EGG(),
ZOMBIFIED_PIGLIN_SPAWN_EGG(),
/* 1.15 */
BEE_SPAWN_EGG(),
BEE_NEST(),
BEEHIVE(),
HONEY_BLOCK(),
HONEY_BOTTLE(),
HONEYCOMB(),
HONEYCOMB_BLOCK(),
ACACIA_BOAT("BOAT_ACACIA"),
ACACIA_BUTTON(),
ACACIA_DOOR("ACACIA_DOOR_ITEM"),
ACACIA_FENCE(),
ACACIA_FENCE_GATE(),
ACACIA_LEAVES("LEAVES_2", (byte) 0),
ACACIA_LOG("LOG_2", (byte) 0),
ACACIA_PLANKS("WOOD", (byte) 4),
ACACIA_PRESSURE_PLATE(),
ACACIA_SAPLING("SAPLING", (byte) 4),
ACACIA_SIGN(ServerVersion.V1_14, null),
ACACIA_SLAB("WOOD_STEP", (byte) 4),
ACACIA_STAIRS,
ACACIA_TRAPDOOR(),
ACACIA_WALL_SIGN(),
ACACIA_WOOD("LOG_2", (byte) 12),
ACTIVATOR_RAIL,
AIR,
ALLIUM("RED_ROSE", (byte) 2),
ANDESITE("STONE", (byte) 5),
ANDESITE_SLAB(),
ANDESITE_STAIRS(),
ANDESITE_WALL(),
ANVIL("ANVIL", (byte) 0),
APPLE,
ARMOR_STAND(ServerVersion.V1_8, null),
ARROW,
ATTACHED_MELON_STEM("MELON_STEM"),
ATTACHED_PUMPKIN_STEM("PUMPKIN_STEM"),
AZURE_BLUET("RED_ROSE", (byte) 3),
BAKED_POTATO("BAKED_POTATO"),
BAMBOO(),
BAMBOO_SAPLING(),
BARREL(),
BARRIER(),
BAT_SPAWN_EGG("MONSTER_EGG", (byte) 65),
BEACON,
BEDROCK,
BEEF("RAW_BEEF"),
BEETROOT(), // the item
BEETROOTS("BEETROOT_BLOCK"), // the crop
BEETROOT_SEEDS(),
BEETROOT_SOUP(),
BELL(),
BIRCH_BOAT("BOAT_BIRCH"),
BIRCH_BUTTON(),
BIRCH_DOOR("BIRCH_DOOR_ITEM"),
BIRCH_FENCE(),
BIRCH_FENCE_GATE(),
BIRCH_LEAVES("LEAVES", (byte) 2),
BIRCH_LOG("LOG", (byte) 2),
BIRCH_PLANKS("WOOD", (byte) 2),
BIRCH_PRESSURE_PLATE(),
BIRCH_SAPLING("SAPLING", (byte) 2),
BIRCH_SIGN(),
BIRCH_SLAB("WOOD_STEP", (byte) 2),
BIRCH_STAIRS(),
BIRCH_TRAPDOOR(),
BIRCH_WALL_SIGN(),
BIRCH_WOOD("LOG", (byte) 14),
BLACK_BANNER("BANNER", (byte) 0),
BLACK_BED("BED", (byte) 15),
BLACK_CARPET("CARPET", (byte) 15),
BLACK_CONCRETE("CONCRETE", (byte) 15),
BLACK_CONCRETE_POWDER("CONCRETE_POWDER", (byte) 15),
BLACK_DYE(),
BLACK_GLAZED_TERRACOTTA(),
BLACK_SHULKER_BOX(),
BLACK_STAINED_GLASS("STAINED_GLASS", (byte) 15),
BLACK_STAINED_GLASS_PANE("STAINED_GLASS_PANE", (byte) 15),
BLACK_TERRACOTTA("STAINED_CLAY", (byte) 15),
BLACK_WALL_BANNER("WALL_BANNER", (byte) 0),
BLACK_WOOL("WOOL", (byte) 15),
BLAST_FURNACE,
BLAZE_POWDER,
BLAZE_ROD,
BLAZE_SPAWN_EGG("MONSTER_EGG", (byte) 61),
BLUE_BANNER("BANNER", (byte) 4),
BLUE_BED("BED", (byte) 11),
BLUE_CARPET("CARPET", (byte) 11),
BLUE_CONCRETE("CONCRETE", (byte) 11),
BLUE_CONCRETE_POWDER("CONCRETE_POWDER", (byte) 11),
BLUE_DYE(),
BLUE_GLAZED_TERRACOTTA(),
BLUE_ICE,
BLUE_ORCHID("RED_ROSE", (byte) 1),
BLUE_SHULKER_BOX(),
BLUE_STAINED_GLASS("STAINED_GLASS", (byte) 11),
BLUE_STAINED_GLASS_PANE("STAINED_GLASS_PANE", (byte) 11),
BLUE_TERRACOTTA("STAINED_CLAY", (byte) 11),
BLUE_WALL_BANNER("WALL_BANNER", (byte) 4),
BLUE_WOOL("WOOL", (byte) 11),
BONE,
BONE_BLOCK,
BONE_MEAL("INK_SACK", (byte) 15),
BOOK,
BOOKSHELF,
BOW,
BOWL,
BRAIN_CORAL,
BRAIN_CORAL_BLOCK,
BRAIN_CORAL_FAN,
BRAIN_CORAL_WALL_FAN,
BREAD,
BREWING_STAND("BREWING_STAND_ITEM"),
/**
* minecraft:brick (item)
*/
BRICK("CLAY_BRICK"),
/**
* minecraft:brick_block (block)
*/
BRICKS("BRICK"),
BRICK_SLAB("STEP", (byte) 4),
BRICK_STAIRS,
BRICK_WALL,
BROWN_BANNER("BANNER", (byte) 3),
BROWN_BED("BED", (byte) 12),
BROWN_CARPET("CARPET", (byte) 12),
BROWN_CONCRETE("CONCRETE", (byte) 12),
BROWN_CONCRETE_POWDER("CONCRETE_POWDER", (byte) 12),
BROWN_DYE(),
BROWN_GLAZED_TERRACOTTA(),
BROWN_MUSHROOM,
BROWN_MUSHROOM_BLOCK("HUGE_MUSHROOM_1"),
BROWN_SHULKER_BOX(),
BROWN_STAINED_GLASS("STAINED_GLASS", (byte) 12),
BROWN_STAINED_GLASS_PANE("STAINED_GLASS_PANE", (byte) 12),
BROWN_TERRACOTTA("STAINED_CLAY", (byte) 12),
BROWN_WALL_BANNER("WALL_BANNER", (byte) 3),
BROWN_WOOL("WOOL", (byte) 12),
BUBBLE_COLUMN,
BUBBLE_CORAL,
BUBBLE_CORAL_BLOCK,
BUBBLE_CORAL_FAN,
BUBBLE_CORAL_WALL_FAN,
BUCKET,
CACTUS,
CAKE,
CAMPFIRE,
CARROT("CARROT_ITEM"),
CARROTS("CARROT"), // totally makes sense, lol
CARROT_ON_A_STICK("CARROT_STICK"),
CARTOGRAPHY_TABLE,
CARVED_PUMPKIN("JACK_O_LANTERN"),
CAT_SPAWN_EGG(),
CAULDRON("CAULDRON_ITEM"),
CAVE_AIR(),
CAVE_SPIDER_SPAWN_EGG("MONSTER_EGG", (byte) 59),
CHAINMAIL_BOOTS,
CHAINMAIL_CHESTPLATE,
CHAINMAIL_HELMET,
CHAINMAIL_LEGGINGS,
CHAIN_COMMAND_BLOCK("COMMAND_CHAIN"),
CHARCOAL("COAL", (byte) 1),
CHEST,
CHEST_MINECART("STORAGE_MINECART"),
CHICKEN("RAW_CHICKEN"),
CHICKEN_SPAWN_EGG("MONSTER_EGG", (byte) 93),
CHIPPED_ANVIL("ANVIL", (byte) 1),
CHISELED_QUARTZ_BLOCK("QUARTZ_BLOCK", (byte) 1),
CHISELED_RED_SANDSTONE("RED_SANDSTONE", (byte) 1),
CHISELED_SANDSTONE("SANDSTONE", (byte) 1),
CHISELED_STONE_BRICKS("SMOOTH_BRICK", (byte) 3),
CHORUS_FLOWER,
CHORUS_FRUIT,
CHORUS_PLANT,
CLAY,
CLAY_BALL,
CLOCK("WATCH"),
COAL,
COAL_BLOCK,
COAL_ORE,
COARSE_DIRT("DIRT", (byte) 1),
COBBLESTONE,
COBBLESTONE_SLAB("STEP", (byte) 3),
COBBLESTONE_STAIRS,
COBBLESTONE_WALL("COBBLE_WALL"),
COBWEB("WEB"),
COCOA,
COCOA_BEANS("INK_SACK", (byte) 3),
COD("RAW_FISH", (byte) 0),
COD_BUCKET,
COD_SPAWN_EGG(),
COMMAND_BLOCK("COMMAND"),
COMMAND_BLOCK_MINECART("COMMAND_MINECART"),
COMPARATOR("REDSTONE_COMPARATOR"),
COMPASS,
COMPOSTER,
CONDUIT,
COOKED_BEEF,
COOKED_CHICKEN,
COOKED_COD("COOKED_FISH", (byte) 0),
COOKED_MUTTON,
COOKED_PORKCHOP("GRILLED_PORK"),
COOKED_RABBIT,
COOKED_SALMON("COOKED_FISH", (byte) 1),
COOKIE,
CORNFLOWER,
COW_SPAWN_EGG("MONSTER_EGG", (byte) 92),
CRACKED_STONE_BRICKS("SMOOTH_BRICK", (byte) 2),
CRAFTING_TABLE("WORKBENCH"),
CREEPER_BANNER_PATTERN,
CREEPER_HEAD("SKULL_ITEM", (byte) 4),
CREEPER_SPAWN_EGG("MONSTER_EGG", (byte) 50),
CREEPER_WALL_HEAD("SKULL", (byte) 4),
CROSSBOW,
CUT_RED_SANDSTONE,
CUT_RED_SANDSTONE_SLAB(),
CUT_SANDSTONE,
CUT_SANDSTONE_SLAB(),
CYAN_BANNER("BANNER", (byte) 6),
CYAN_BED("BED", (byte) 9),
CYAN_CARPET("CARPET", (byte) 9),
CYAN_CONCRETE("CONCRETE", (byte) 9),
CYAN_CONCRETE_POWDER("CONCRETE_POWDER", (byte) 9),
CYAN_DYE("INK_SACK", (byte) 6),
CYAN_GLAZED_TERRACOTTA(),
CYAN_SHULKER_BOX(),
CYAN_STAINED_GLASS("STAINED_GLASS", (byte) 9),
CYAN_STAINED_GLASS_PANE("STAINED_GLASS_PANE", (byte) 9),
CYAN_TERRACOTTA("STAINED_CLAY", (byte) 9),
CYAN_WALL_BANNER("WALL_BANNER", (byte) 6),
CYAN_WOOL("WOOL", (byte) 9),
DAMAGED_ANVIL("ANVIL", (byte) 2),
DANDELION("YELLOW_FLOWER"),
DARK_OAK_BOAT("BOAT_DARK_OAK"),
DARK_OAK_BUTTON(),
DARK_OAK_DOOR("DARK_OAK_DOOR_ITEM"),
DARK_OAK_FENCE(),
DARK_OAK_FENCE_GATE(),
DARK_OAK_LEAVES("LEAVES_2", (byte) 1),
DARK_OAK_LOG("LOG_2", (byte) 1),
DARK_OAK_PLANKS("WOOD", (byte) 5),
DARK_OAK_PRESSURE_PLATE(),
DARK_OAK_SAPLING("SAPLING", (byte) 5),
DARK_OAK_SIGN(),
DARK_OAK_SLAB("WOOD_STEP", (byte) 5),
DARK_OAK_STAIRS,
DARK_OAK_TRAPDOOR(),
DARK_OAK_WALL_SIGN(),
DARK_OAK_WOOD("LOG_2", (byte) 13),
DARK_PRISMARINE("PRISMARINE", (byte) 2),
DARK_PRISMARINE_SLAB(),
DARK_PRISMARINE_STAIRS,
DAYLIGHT_DETECTOR,
DEAD_BRAIN_CORAL,
DEAD_BRAIN_CORAL_BLOCK,
DEAD_BRAIN_CORAL_FAN,
DEAD_BRAIN_CORAL_WALL_FAN,
DEAD_BUBBLE_CORAL,
DEAD_BUBBLE_CORAL_BLOCK,
DEAD_BUBBLE_CORAL_FAN,
DEAD_BUBBLE_CORAL_WALL_FAN,
DEAD_BUSH("LONG_GRASS", (byte) 0),
DEAD_FIRE_CORAL,
DEAD_FIRE_CORAL_BLOCK,
DEAD_FIRE_CORAL_FAN,
DEAD_FIRE_CORAL_WALL_FAN,
DEAD_HORN_CORAL,
DEAD_HORN_CORAL_BLOCK,
DEAD_HORN_CORAL_FAN,
DEAD_HORN_CORAL_WALL_FAN,
DEAD_TUBE_CORAL,
DEAD_TUBE_CORAL_BLOCK,
DEAD_TUBE_CORAL_FAN,
DEAD_TUBE_CORAL_WALL_FAN,
DEBUG_STICK,
DETECTOR_RAIL,
DIAMOND,
DIAMOND_AXE,
DIAMOND_BLOCK,
DIAMOND_BOOTS,
DIAMOND_CHESTPLATE,
DIAMOND_HELMET,
DIAMOND_HOE,
DIAMOND_HORSE_ARMOR("DIAMOND_BARDING"),
DIAMOND_LEGGINGS,
DIAMOND_ORE,
DIAMOND_PICKAXE,
DIAMOND_SHOVEL("DIAMOND_SPADE"),
DIAMOND_SWORD,
DIORITE("STONE", (byte) 3),
DIORITE_SLAB(),
DIORITE_STAIRS,
DIORITE_WALL,
DIRT("DIRT", (byte) 0),
DISPENSER,
DOLPHIN_SPAWN_EGG(),
DONKEY_SPAWN_EGG(),
DRAGON_BREATH,
DRAGON_EGG,
DRAGON_HEAD("SKULL_ITEM", (byte) 5),
DRAGON_WALL_HEAD("SKULL", (byte) 5),
DRIED_KELP(),
DRIED_KELP_BLOCK(),
DROPPER,
DROWNED_SPAWN_EGG(),
EGG,
ELDER_GUARDIAN_SPAWN_EGG("MONSTER_EGG", (byte) 4),
ELYTRA,
EMERALD,
EMERALD_BLOCK,
EMERALD_ORE,
ENCHANTED_BOOK,
ENCHANTED_GOLDEN_APPLE("GOLDEN_APPLE", (byte) 1),
ENCHANTING_TABLE("ENCHANTMENT_TABLE"),
ENDERMAN_SPAWN_EGG("MONSTER_EGG", (byte) 58),
ENDERMITE_SPAWN_EGG("MONSTER_EGG", (byte) 67),
ENDER_CHEST,
ENDER_EYE("EYE_OF_ENDER"),
ENDER_PEARL,
END_CRYSTAL,
END_GATEWAY,
END_PORTAL("ENDER_PORTAL"),
END_PORTAL_FRAME("ENDER_PORTAL_FRAME"),
END_ROD,
END_STONE("ENDER_STONE"),
END_STONE_BRICKS("END_BRICKS"),
END_STONE_BRICK_SLAB(),
END_STONE_BRICK_STAIRS,
END_STONE_BRICK_WALL,
EVOKER_SPAWN_EGG("MONSTER_EGG", (byte) 34),
EXPERIENCE_BOTTLE("EXP_BOTTLE"),
FARMLAND("SOIL"),
FEATHER,
FERMENTED_SPIDER_EYE,
FERN("LONG_GRASS", (byte) 2),
FILLED_MAP,
FIRE,
FIREWORK_ROCKET("FIREWORK"),
FIREWORK_STAR("FIREWORK_CHARGE"),
FIRE_CHARGE("FIREBALL"),
FIRE_CORAL,
FIRE_CORAL_BLOCK,
FIRE_CORAL_FAN,
FIRE_CORAL_WALL_FAN,
FISHING_ROD,
FLETCHING_TABLE,
FLINT,
FLINT_AND_STEEL,
FLOWER_BANNER_PATTERN,
FLOWER_POT("FLOWER_POT_ITEM"),
FOX_SPAWN_EGG(),
FROSTED_ICE,
FURNACE,
FURNACE_MINECART("POWERED_MINECART"),
GHAST_SPAWN_EGG("MONSTER_EGG", (byte) 56),
GHAST_TEAR,
GLASS,
GLASS_BOTTLE,
GLASS_PANE("THIN_GLASS"),
GLISTERING_MELON_SLICE("SPECKLED_MELON"),
GLOBE_BANNER_PATTERN,
GLOWSTONE,
GLOWSTONE_DUST,
GOLDEN_APPLE,
GOLDEN_AXE("GOLD_AXE"),
GOLDEN_BOOTS("GOLD_BOOTS"),
GOLDEN_CARROT,
GOLDEN_CHESTPLATE("GOLD_CHESTPLATE"),
GOLDEN_HELMET("GOLD_HELMET"),
GOLDEN_HOE("GOLD_HOE"),
GOLDEN_HORSE_ARMOR("GOLD_BARDING"),
GOLDEN_LEGGINGS("GOLD_LEGGINGS"),
GOLDEN_PICKAXE("GOLD_PICKAXE"),
GOLDEN_SHOVEL("GOLD_SPADE"),
GOLDEN_SWORD("GOLD_SWORD"),
GOLD_BLOCK,
GOLD_INGOT,
GOLD_NUGGET,
GOLD_ORE,
GRANITE("STONE", (byte) 1),
GRANITE_SLAB(),
GRANITE_STAIRS,
GRANITE_WALL,
GRASS("LONG_GRASS", (byte) 1),
GRASS_BLOCK("GRASS"),
DIRT_PATH("GRASS_PATH"),
GRAVEL,
GRAY_BANNER("BANNER", (byte) 8),
GRAY_BED("BED", (byte) 7),
GRAY_CARPET("CARPET", (byte) 7),
GRAY_CONCRETE("CONCRETE", (byte) 7),
GRAY_CONCRETE_POWDER("CONCRETE_POWDER", (byte) 7),
GRAY_DYE("INK_SACK", (byte) 8),
GRAY_GLAZED_TERRACOTTA(),
GRAY_SHULKER_BOX(),
GRAY_STAINED_GLASS("STAINED_GLASS", (byte) 7),
GRAY_STAINED_GLASS_PANE("STAINED_GLASS_PANE", (byte) 7),
GRAY_TERRACOTTA("STAINED_CLAY", (byte) 7),
GRAY_WALL_BANNER("WALL_BANNER", (byte) 8),
GRAY_WOOL("WOOL", (byte) 7),
GREEN_BANNER("BANNER", (byte) 2),
GREEN_BED("BED", (byte) 13),
GREEN_CARPET("CARPET", (byte) 13),
GREEN_CONCRETE(ServerVersion.V1_13, "CONCRETE", (byte) 13),
GREEN_CONCRETE_POWDER(ServerVersion.V1_13, "CONCRETE_POWDER", (byte) 13),
GREEN_DYE(ServerVersion.V1_14, "CACTUS_GREEN", ServerVersion.V1_13, "INK_SACK", (byte) 2),
GREEN_GLAZED_TERRACOTTA(),
GREEN_SHULKER_BOX(),
GREEN_STAINED_GLASS("STAINED_GLASS", (byte) 13),
GREEN_STAINED_GLASS_PANE("STAINED_GLASS_PANE", (byte) 13),
GREEN_TERRACOTTA("STAINED_CLAY", (byte) 13),
GREEN_WALL_BANNER(ServerVersion.V1_13, "WALL_BANNER", (byte) 2),
GREEN_WOOL("WOOL", (byte) 13),
GRINDSTONE,
GUARDIAN_SPAWN_EGG("MONSTER_EGG", (byte) 68),
GUNPOWDER("SULPHUR"),
HAY_BLOCK,
HEART_OF_THE_SEA,
HEAVY_WEIGHTED_PRESSURE_PLATE("IRON_PLATE"),
HOPPER,
HOPPER_MINECART("HOPPER_MINECART"),
HORN_CORAL,
HORN_CORAL_BLOCK,
HORN_CORAL_FAN,
HORN_CORAL_WALL_FAN,
HORSE_SPAWN_EGG("MONSTER_EGG", (byte) 100),
HUSK_SPAWN_EGG("MONSTER_EGG", (byte) 23),
ICE,
INFESTED_CHISELED_STONE_BRICKS("MONSTER_EGGS", (byte) 5),
INFESTED_COBBLESTONE("MONSTER_EGGS", (byte) 1),
INFESTED_CRACKED_STONE_BRICKS("MONSTER_EGGS", (byte) 4),
INFESTED_MOSSY_STONE_BRICKS("MONSTER_EGGS", (byte) 3),
INFESTED_STONE("MONSTER_EGGS", (byte) 0),
INFESTED_STONE_BRICKS("MONSTER_EGGS", (byte) 2),
INK_SAC("INK_SACK", (byte) 0),
IRON_AXE,
IRON_BARS("IRON_FENCE"),
IRON_BLOCK,
IRON_BOOTS,
IRON_CHESTPLATE,
IRON_DOOR,
IRON_HELMET,
IRON_HOE,
IRON_HORSE_ARMOR("IRON_BARDING"),
IRON_INGOT,
IRON_LEGGINGS,
IRON_NUGGET,
IRON_ORE,
IRON_PICKAXE,
IRON_SHOVEL("IRON_SPADE"),
IRON_SWORD,
IRON_TRAPDOOR(),
ITEM_FRAME,
JACK_O_LANTERN,
JIGSAW,
JUKEBOX,
JUNGLE_BOAT("BOAT_JUNGLE"),
JUNGLE_BUTTON(),
JUNGLE_DOOR("JUNGLE_DOOR_ITEM"),
JUNGLE_FENCE(),
JUNGLE_FENCE_GATE(),
JUNGLE_LEAVES("LEAVES", (byte) 3),
JUNGLE_LOG("LOG", (byte) 3),
JUNGLE_PLANKS("WOOD", (byte) 3),
JUNGLE_PRESSURE_PLATE(),
JUNGLE_SAPLING("SAPLING", (byte) 3),
JUNGLE_SIGN(),
JUNGLE_SLAB("WOOD_STEP", (byte) 3),
JUNGLE_STAIRS("JUNGLE_WOOD_STAIRS"),
JUNGLE_TRAPDOOR(),
JUNGLE_WALL_SIGN(),
JUNGLE_WOOD("LOG", (byte) 15),
KELP,
KELP_PLANT,
KNOWLEDGE_BOOK,
LADDER,
LANTERN,
LAPIS_BLOCK,
LAPIS_LAZULI("INK_SACK", (byte) 4),
LAPIS_ORE,
LARGE_FERN("DOUBLE_PLANT", (byte) 3),
LAVA,
LAVA_BUCKET,
LEAD("LEASH"),
LEATHER,
LEATHER_BOOTS,
LEATHER_CHESTPLATE,
LEATHER_HELMET,
LEATHER_HORSE_ARMOR(),
LEATHER_LEGGINGS,
LECTERN,
LEVER,
LIGHT_BLUE_BANNER("BANNER", (byte) 12),
LIGHT_BLUE_BED("BED", (byte) 3),
LIGHT_BLUE_CARPET("CARPET", (byte) 3),
LIGHT_BLUE_CONCRETE("CONCRETE", (byte) 3),
LIGHT_BLUE_CONCRETE_POWDER("CONCRETE_POWDER", (byte) 3),
LIGHT_BLUE_DYE("INK_SACK", (byte) 12),
LIGHT_BLUE_GLAZED_TERRACOTTA(),
LIGHT_BLUE_SHULKER_BOX(),
LIGHT_BLUE_STAINED_GLASS("STAINED_GLASS", (byte) 3),
LIGHT_BLUE_STAINED_GLASS_PANE("STAINED_GLASS_PANE", (byte) 3),
LIGHT_BLUE_TERRACOTTA("STAINED_CLAY", (byte) 3),
LIGHT_BLUE_WALL_BANNER("WALL_BANNER", (byte) 12),
LIGHT_BLUE_WOOL("WOOL", (byte) 3),
LIGHT_GRAY_BANNER("BANNER", (byte) 7),
LIGHT_GRAY_BED("BED", (byte) 8),
LIGHT_GRAY_CARPET("CARPET", (byte) 8),
LIGHT_GRAY_CONCRETE("CONCRETE", (byte) 8),
LIGHT_GRAY_CONCRETE_POWDER("CONCRETE_POWDER", (byte) 8),
LIGHT_GRAY_DYE("INK_SACK", (byte) 7),
LIGHT_GRAY_GLAZED_TERRACOTTA("SILVER_GLAZED_TERRACOTTA"),
LIGHT_GRAY_SHULKER_BOX(ServerVersion.V1_11, "SILVER_SHULKER_BOX"),
LIGHT_GRAY_STAINED_GLASS("STAINED_GLASS", (byte) 8),
LIGHT_GRAY_STAINED_GLASS_PANE("STAINED_GLASS_PANE", (byte) 8), // this is nearly invisible in a chest, lol
LIGHT_GRAY_TERRACOTTA("STAINED_CLAY", (byte) 8),
LIGHT_GRAY_WALL_BANNER("WALL_BANNER", (byte) 7),
LIGHT_GRAY_WOOL("WOOL", (byte) 8),
LIGHT_WEIGHTED_PRESSURE_PLATE("GOLD_PLATE"),
LILAC("LONG_GRASS", (byte) 1),
LILY_OF_THE_VALLEY,
LILY_PAD("WATER_LILY"),
LIME_BANNER("BANNER", (byte) 10),
LIME_BED("BED", (byte) 5),
LIME_CARPET("CARPET", (byte) 5),
LIME_CONCRETE("CONCRETE", (byte) 5),
LIME_CONCRETE_POWDER("CONCRETE_POWDER", (byte) 5),
LIME_DYE("INK_SACK", (byte) 10),
LIME_GLAZED_TERRACOTTA(),
LIME_SHULKER_BOX(),
LIME_STAINED_GLASS("STAINED_GLASS", (byte) 5),
LIME_STAINED_GLASS_PANE("STAINED_GLASS_PANE", (byte) 5),
LIME_TERRACOTTA("STAINED_CLAY", (byte) 5),
LIME_WALL_BANNER("WALL_BANNER", (byte) 10),
LIME_WOOL("WOOL", (byte) 5),
LINGERING_POTION,
LLAMA_SPAWN_EGG("MONSTER_EGG", (byte) 103),
LOOM,
MAGENTA_BANNER("BANNER", (byte) 13),
MAGENTA_BED("BED", (byte) 2),
MAGENTA_CARPET("CARPET", (byte) 2),
MAGENTA_CONCRETE("CONCRETE", (byte) 2),
MAGENTA_CONCRETE_POWDER("CONCRETE_POWDER", (byte) 2),
MAGENTA_DYE("INK_SACK", (byte) 13),
MAGENTA_GLAZED_TERRACOTTA(),
MAGENTA_SHULKER_BOX(),
MAGENTA_STAINED_GLASS("STAINED_GLASS", (byte) 2),
MAGENTA_STAINED_GLASS_PANE("STAINED_GLASS_PANE", (byte) 2),
MAGENTA_TERRACOTTA("STAINED_CLAY", (byte) 2),
MAGENTA_WALL_BANNER("WALL_BANNER", (byte) 13),
MAGENTA_WOOL("WOOL", (byte) 2),
MAGMA_BLOCK("MAGMA"),
MAGMA_CREAM,
MAGMA_CUBE_SPAWN_EGG("MONSTER_EGG", (byte) 62),
MAP,
MELON("MELON_BLOCK"),
MELON_SEEDS,
MELON_SLICE("MELON"),
MELON_STEM,
MILK_BUCKET,
MINECART,
MOJANG_BANNER_PATTERN,
MOOSHROOM_SPAWN_EGG("MONSTER_EGG", (byte) 96),
MOSSY_COBBLESTONE,
MOSSY_COBBLESTONE_SLAB(),
MOSSY_COBBLESTONE_STAIRS,
MOSSY_COBBLESTONE_WALL,
MOSSY_STONE_BRICKS("SMOOTH_BRICK", (byte) 1),
MOSSY_STONE_BRICK_SLAB(),
MOSSY_STONE_BRICK_STAIRS,
MOSSY_STONE_BRICK_WALL,
MOVING_PISTON("PISTON_MOVING_PIECE"),
MULE_SPAWN_EGG("MONSTER_EGG", (byte) 32),
MUSHROOM_STEM("HUGE_MUSHROOM_1", (byte) 10), // also ("HUGE_MUSHROOM_2", (byte) 10)
MUSHROOM_STEW("MUSHROOM_SOUP"),
MUSIC_DISC_11("RECORD_11"),
MUSIC_DISC_13("GOLD_RECORD"),
MUSIC_DISC_BLOCKS("RECORD_3"),
MUSIC_DISC_CAT("GREEN_RECORD"),
MUSIC_DISC_CHIRP("RECORD_4"),
MUSIC_DISC_FAR("RECORD_5"),
MUSIC_DISC_MALL("RECORD_6"),
MUSIC_DISC_MELLOHI("RECORD_7"),
MUSIC_DISC_STAL("RECORD_8"),
MUSIC_DISC_STRAD("RECORD_9"),
MUSIC_DISC_WAIT("RECORD_12"),
MUSIC_DISC_WARD("RECORD_10"),
MUTTON,
MYCELIUM("MYCEL"),
NAME_TAG,
NAUTILUS_SHELL,
NETHERRACK,
NETHER_BRICK("NETHER_BRICK_ITEM"),
NETHER_BRICKS("NETHER_BRICK"),
NETHER_BRICK_FENCE("NETHER_FENCE"),
NETHER_BRICK_SLAB("STEP", (byte) 6),
NETHER_BRICK_STAIRS,
NETHER_BRICK_WALL,
NETHER_PORTAL("PORTAL"),
NETHER_QUARTZ_ORE("QUARTZ_ORE"),
NETHER_STAR,
NETHER_WART("NETHER_STALK"),
NETHER_WART_BLOCK,
NOTE_BLOCK,
OAK_BOAT("BOAT"),
OAK_BUTTON("WOOD_BUTTON"),
OAK_DOOR("WOOD_DOOR"), // TODO: legacy block id is WOODEN_DOOR
OAK_FENCE("FENCE"),
OAK_FENCE_GATE("FENCE_GATE"),
OAK_LEAVES("LEAVES", (byte) 0),
OAK_LOG("LOG", (byte) 0),
OAK_PLANKS("WOOD", (byte) 0),
OAK_PRESSURE_PLATE("WOOD_PLATE"),
OAK_SAPLING("SAPLING", (byte) 0),
OAK_SIGN(ServerVersion.V1_14, "SIGN"),
OAK_SLAB("WOOD_STEP", (byte) 0),
OAK_STAIRS("WOOD_STAIRS"),
OAK_TRAPDOOR("TRAP_DOOR"),
OAK_WALL_SIGN(ServerVersion.V1_14, "WALL_SIGN"),
OAK_WOOD("LOG", (byte) 12),
OBSERVER,
OBSIDIAN,
OCELOT_SPAWN_EGG("MONSTER_EGG", (byte) 98),
ORANGE_BANNER("BANNER", (byte) 14),
ORANGE_BED("BED", (byte) 1),
ORANGE_CARPET("CARPET", (byte) 1),
ORANGE_CONCRETE("CONCRETE", (byte) 1),
ORANGE_CONCRETE_POWDER("CONCRETE_POWDER", (byte) 1),
ORANGE_DYE("INK_SACK", (byte) 14),
ORANGE_GLAZED_TERRACOTTA(),
ORANGE_SHULKER_BOX(),
ORANGE_STAINED_GLASS("STAINED_GLASS", (byte) 1),
ORANGE_STAINED_GLASS_PANE("STAINED_GLASS_PANE", (byte) 1),
ORANGE_TERRACOTTA("STAINED_CLAY", (byte) 1),
ORANGE_TULIP("RED_ROSE", (byte) 5),
ORANGE_WALL_BANNER("WALL_BANNER", (byte) 14),
ORANGE_WOOL("WOOL", (byte) 1),
OXEYE_DAISY("RED_ROSE", (byte) 8),
PACKED_ICE,
PAINTING,
PANDA_SPAWN_EGG(),
PAPER,
PARROT_SPAWN_EGG("MONSTER_EGG", (byte) 105),
PEONY("DOUBLE_PLANT", (byte) 5),
PETRIFIED_OAK_SLAB("WOOD_STEP", (byte) 0),
PHANTOM_MEMBRANE(),
PHANTOM_SPAWN_EGG(),
PIG_SPAWN_EGG("MONSTER_EGG", (byte) 90),
PILLAGER_SPAWN_EGG(),
PINK_BANNER("BANNER", (byte) 9),
PINK_BED("BED", (byte) 6),
PINK_CARPET("CARPET", (byte) 6),
PINK_CONCRETE("CONCRETE", (byte) 6),
PINK_CONCRETE_POWDER("CONCRETE_POWDER", (byte) 6),
PINK_DYE("INK_SACK", (byte) 9),
PINK_GLAZED_TERRACOTTA(),
PINK_SHULKER_BOX(),
PINK_STAINED_GLASS("STAINED_GLASS", (byte) 6),
PINK_STAINED_GLASS_PANE("STAINED_GLASS_PANE", (byte) 6),
PINK_TERRACOTTA("STAINED_CLAY", (byte) 6),
PINK_TULIP("RED_ROSE", (byte) 7),
PINK_WALL_BANNER("WALL_BANNER", (byte) 9),
PINK_WOOL("WOOL", (byte) 6),
PISTON("PISTON_BASE"),
PISTON_HEAD("PISTON_EXTENSION"),
PLAYER_HEAD("SKULL_ITEM", (byte) 3),
PLAYER_WALL_HEAD("SKULL", (byte) 3),
PODZOL("DIRT", (byte) 2),
POISONOUS_POTATO,
POLAR_BEAR_SPAWN_EGG("MONSTER_EGG", (byte) 102),
POLISHED_ANDESITE("STONE", (byte) 6),
POLISHED_ANDESITE_SLAB(),
POLISHED_ANDESITE_STAIRS,
POLISHED_DIORITE("STONE", (byte) 4),
POLISHED_DIORITE_SLAB(),
POLISHED_DIORITE_STAIRS,
POLISHED_GRANITE("STONE", (byte) 2),
POLISHED_GRANITE_SLAB(),
POLISHED_GRANITE_STAIRS,
POPPED_CHORUS_FRUIT,
POPPY("RED_ROSE", (byte) 0),
PORKCHOP("PORK"),
POTATO("POTATO_ITEM"),
POTATOES("POTATO"),
POTION,
POTTED_ACACIA_SAPLING,
POTTED_ALLIUM,
POTTED_AZURE_BLUET,
POTTED_BAMBOO,
POTTED_BIRCH_SAPLING,
POTTED_BLUE_ORCHID,
POTTED_BROWN_MUSHROOM,
POTTED_CACTUS,
POTTED_CORNFLOWER,
POTTED_DANDELION,
POTTED_DARK_OAK_SAPLING,
POTTED_DEAD_BUSH,
POTTED_FERN,
POTTED_JUNGLE_SAPLING,
POTTED_LILY_OF_THE_VALLEY,
POTTED_OAK_SAPLING,
POTTED_ORANGE_TULIP,
POTTED_OXEYE_DAISY,
POTTED_PINK_TULIP,
POTTED_POPPY,
POTTED_RED_MUSHROOM,
POTTED_RED_TULIP,
POTTED_SPRUCE_SAPLING,
POTTED_WHITE_TULIP,
POTTED_WITHER_ROSE,
POWERED_RAIL,
PRISMARINE("PRISMARINE", (byte) 0),
PRISMARINE_BRICKS("PRISMARINE", (byte) 1),
PRISMARINE_BRICK_SLAB(),
PRISMARINE_BRICK_STAIRS,
PRISMARINE_CRYSTALS,
PRISMARINE_SHARD,
PRISMARINE_SLAB(),
PRISMARINE_STAIRS,
PRISMARINE_WALL,
PUFFERFISH("RAW_FISH", (byte) 3),
PUFFERFISH_BUCKET,
PUFFERFISH_SPAWN_EGG(),
PUMPKIN,
PUMPKIN_PIE,
PUMPKIN_SEEDS,
PUMPKIN_STEM,
PURPLE_BANNER("BANNER", (byte) 5),
PURPLE_BED("BED", (byte) 10),
PURPLE_CARPET("CARPET", (byte) 10),
PURPLE_CONCRETE("CONCRETE", (byte) 10),
PURPLE_CONCRETE_POWDER("CONCRETE_POWDER", (byte) 10),
PURPLE_DYE("INK_SACK", (byte) 5),
PURPLE_GLAZED_TERRACOTTA(),
PURPLE_SHULKER_BOX(),
PURPLE_STAINED_GLASS("STAINED_GLASS", (byte) 10),
PURPLE_STAINED_GLASS_PANE("STAINED_GLASS_PANE", (byte) 10),
PURPLE_TERRACOTTA("STAINED_CLAY", (byte) 10),
PURPLE_WALL_BANNER("WALL_BANNER", (byte) 5),
PURPLE_WOOL("WOOL", (byte) 10),
PURPUR_BLOCK,
PURPUR_PILLAR,
PURPUR_SLAB(),
PURPUR_STAIRS,
QUARTZ,
QUARTZ_BLOCK("QUARTZ_BLOCK", (byte) 0),
QUARTZ_PILLAR("QUARTZ_BLOCK", (byte) 2),
QUARTZ_SLAB("STEP", (byte) 7),
QUARTZ_STAIRS,
RABBIT,
RABBIT_FOOT,
RABBIT_HIDE,
RABBIT_SPAWN_EGG("MONSTER_EGG", (byte) 101),
RABBIT_STEW,
RAIL("RAILS"),
RAVAGER_SPAWN_EGG(),
REDSTONE,
REDSTONE_BLOCK,
REDSTONE_LAMP("REDSTONE_LAMP_OFF"),
REDSTONE_ORE,
REDSTONE_TORCH("REDSTONE_TORCH_ON"),
REDSTONE_WALL_TORCH,
REDSTONE_WIRE,
RED_BANNER("BANNER", (byte) 1),
RED_BED("BED", (byte) 14),
RED_CARPET("CARPET", (byte) 14),
RED_CONCRETE("CONCRETE", (byte) 14),
RED_CONCRETE_POWDER("CONCRETE_POWDER", (byte) 14),
RED_DYE(ServerVersion.V1_14, "ROSE_RED", ServerVersion.V1_13, "INK_SACK", (byte) 1),
RED_GLAZED_TERRACOTTA(),
RED_MUSHROOM,
RED_MUSHROOM_BLOCK("HUGE_MUSHROOM_2"),
RED_NETHER_BRICKS("RED_NETHER_BRICK"),
RED_NETHER_BRICK_SLAB(),
RED_NETHER_BRICK_STAIRS,
RED_NETHER_BRICK_WALL,
RED_SAND("SAND", (byte) 1),
RED_SANDSTONE("RED_SANDSTONE", (byte) 0),
RED_SANDSTONE_SLAB("STONE_SLAB2", (byte) 0),
RED_SANDSTONE_STAIRS,
RED_SANDSTONE_WALL,
RED_SHULKER_BOX(),
RED_STAINED_GLASS("STAINED_GLASS", (byte) 14),
RED_STAINED_GLASS_PANE("STAINED_GLASS_PANE", (byte) 14),
RED_TERRACOTTA("STAINED_CLAY", (byte) 14),
RED_TULIP("RED_ROSE", (byte) 4),
RED_WALL_BANNER("WALL_BANNER", (byte) 1),
RED_WOOL("WOOL", (byte) 14),
REPEATER("DIODE"),
REPEATING_COMMAND_BLOCK("COMMAND_REPEATING"),
ROSE_BUSH("DOUBLE_PLANT", (byte) 4),
ROTTEN_FLESH,
SADDLE,
SALMON("RAW_FISH", (byte) 1),
SALMON_BUCKET,
SALMON_SPAWN_EGG(),
SAND("SAND", (byte) 0),
SANDSTONE("SANDSTONE", (byte) 0),
SANDSTONE_SLAB("STEP", (byte) 1),
SANDSTONE_STAIRS,
SANDSTONE_WALL,
SCAFFOLDING,
SCUTE,
SEAGRASS,
SEA_LANTERN,
SEA_PICKLE,
SHEARS,
SHEEP_SPAWN_EGG("MONSTER_EGG", (byte) 91),
SHIELD,
SHULKER_BOX(),
SHULKER_SHELL(),
SHULKER_SPAWN_EGG("MONSTER_EGG", (byte) 69),
SILVERFISH_SPAWN_EGG("MONSTER_EGG", (byte) 60),
SKELETON_HORSE_SPAWN_EGG("MONSTER_EGG", (byte) 28),
SKELETON_SKULL("SKULL_ITEM", (byte) 0),
SKELETON_SPAWN_EGG("MONSTER_EGG", (byte) 51),
SKELETON_WALL_SKULL("SKULL", (byte) 0),
SKULL_BANNER_PATTERN,
SLIME_BALL,
SLIME_BLOCK,
SLIME_SPAWN_EGG("MONSTER_EGG", (byte) 55),
SMITHING_TABLE,
SMOKER,
SMOOTH_QUARTZ,
SMOOTH_QUARTZ_SLAB(),
SMOOTH_QUARTZ_STAIRS,
SMOOTH_RED_SANDSTONE("RED_SANDSTONE", (byte) 2),
SMOOTH_RED_SANDSTONE_SLAB("STONE_SLAB2", (byte) 0),
SMOOTH_RED_SANDSTONE_STAIRS,
SMOOTH_SANDSTONE("SANDSTONE", (byte) 2),
SMOOTH_SANDSTONE_SLAB(),
SMOOTH_SANDSTONE_STAIRS,
SMOOTH_STONE,
SMOOTH_STONE_SLAB(),
SNOW,
SNOWBALL("SNOW_BALL"),
SNOW_BLOCK,
SOUL_SAND,
SPAWNER("MOB_SPAWNER"),
SPECTRAL_ARROW,
SPIDER_EYE,
SPIDER_SPAWN_EGG("MONSTER_EGG", (byte) 52),
SPLASH_POTION("POTION"), // legacy uses data to make the specific potions and splash variants
SPONGE("SPONGE", (byte) 0),
SPRUCE_BOAT("BOAT_SPRUCE"),
SPRUCE_BUTTON(),
SPRUCE_DOOR("SPRUCE_DOOR_ITEM"),
SPRUCE_FENCE(),
SPRUCE_FENCE_GATE(),
SPRUCE_LEAVES("LEAVES", (byte) 1),
SPRUCE_LOG("LOG", (byte) 1),
SPRUCE_PLANKS("WOOD", (byte) 1),
SPRUCE_PRESSURE_PLATE(),
SPRUCE_SAPLING("SAPLING", (byte) 1),
SPRUCE_SIGN(),
SPRUCE_SLAB("WOOD_STEP", (byte) 1),
SPRUCE_STAIRS("SPRUCE_WOOD_STAIRS"),
SPRUCE_TRAPDOOR(),
SPRUCE_WALL_SIGN(),
SPRUCE_WOOD("LOG", (byte) 13),
SQUID_SPAWN_EGG("MONSTER_EGG", (byte) 94),
STICK,
STICKY_PISTON("PISTON_STICKY_BASE"),
STONE(),
STONECUTTER,
STONE_AXE,
/**
* minecraft:stonebrick
*/
STONE_BRICKS("SMOOTH_BRICK", (byte) 0),
STONE_BRICK_SLAB("STEP", (byte) 5),
STONE_BRICK_STAIRS("SMOOTH_STAIRS"),
STONE_BRICK_WALL(),
STONE_BUTTON,
STONE_HOE,
STONE_PICKAXE,
STONE_PRESSURE_PLATE("STONE_PLATE"),
STONE_SHOVEL("STONE_SPADE"),
STONE_SLAB("STEP", (byte) 0),
STONE_STAIRS(),
STONE_SWORD,
STRAY_SPAWN_EGG("MONSTER_EGG", (byte) 6),
STRING,
STRIPPED_ACACIA_LOG,
STRIPPED_ACACIA_WOOD,
STRIPPED_BIRCH_LOG,
STRIPPED_BIRCH_WOOD,
STRIPPED_DARK_OAK_LOG,
STRIPPED_DARK_OAK_WOOD,
STRIPPED_JUNGLE_LOG,
STRIPPED_JUNGLE_WOOD,
STRIPPED_OAK_LOG,
STRIPPED_OAK_WOOD,
STRIPPED_SPRUCE_LOG,
STRIPPED_SPRUCE_WOOD,
STRUCTURE_BLOCK,
STRUCTURE_VOID,
SUGAR,
SUGAR_CANE,
SUNFLOWER("DOUBLE_PLANT", (byte) 0),
SUSPICIOUS_STEW,
SWEET_BERRIES,
SWEET_BERRY_BUSH,
TALL_GRASS("DOUBLE_PLANT", (byte) 2),
TALL_SEAGRASS,
TERRACOTTA("HARD_CLAY"),
TIPPED_ARROW,
TNT,
TNT_MINECART("EXPLOSIVE_MINECART"),
TORCH,
TOTEM_OF_UNDYING("TOTEM"),
TRADER_LLAMA_SPAWN_EGG(),
TRAPPED_CHEST,
TRIDENT,
TRIPWIRE,
TRIPWIRE_HOOK,
TROPICAL_FISH("RAW_FISH", (byte) 2), // (aka clownfish)
TROPICAL_FISH_BUCKET,
TROPICAL_FISH_SPAWN_EGG(),
TUBE_CORAL,
TUBE_CORAL_BLOCK,
TUBE_CORAL_FAN,
TUBE_CORAL_WALL_FAN,
TURTLE_EGG,
TURTLE_HELMET,
TURTLE_SPAWN_EGG(),
VEX_SPAWN_EGG("MONSTER_EGG", (byte) 35),
VILLAGER_SPAWN_EGG("MONSTER_EGG", (byte) 120),
VINDICATOR_SPAWN_EGG("MONSTER_EGG", (byte) 36),
VINE,
VOID_AIR,
WALL_TORCH,
WANDERING_TRADER_SPAWN_EGG(),
WATER,
WATER_BUCKET,
WET_SPONGE("SPONGE", (byte) 1),
WHEAT,
WHEAT_SEEDS("SEEDS"),
WHITE_BANNER("BANNER", (byte) 15),
WHITE_BED("BED", (byte) 0),
WHITE_CARPET("CARPET", (byte) 0),
WHITE_CONCRETE("CONCRETE", (byte) 0),
WHITE_CONCRETE_POWDER("CONCRETE", (byte) 0),
WHITE_DYE("INK_SACK", (byte) 15),
WHITE_GLAZED_TERRACOTTA(),
WHITE_SHULKER_BOX(),
WHITE_STAINED_GLASS("STAINED_GLASS", (byte) 0),
WHITE_STAINED_GLASS_PANE("STAINED_GLASS_PANE", (byte) 0),
WHITE_TERRACOTTA("STAINED_CLAY", (byte) 0),
WHITE_TULIP("RED_ROSE", (byte) 6),
WHITE_WALL_BANNER("WALL_BANNER", (byte) 15),
WHITE_WOOL("WOOL", (byte) 0),
WITCH_SPAWN_EGG("MONSTER_EGG", (byte) 66),
WITHER_ROSE,
WITHER_SKELETON_SKULL("SKULL_ITEM", (byte) 1),
WITHER_SKELETON_SPAWN_EGG("MONSTER_EGG", (byte) 5),
WITHER_SKELETON_WALL_SKULL("SKULL", (byte) 1),
WOLF_SPAWN_EGG("MONSTER_EGG", (byte) 95),
WOODEN_AXE("WOOD_AXE"),
WOODEN_HOE("WOOD_HOE"),
WOODEN_PICKAXE("WOOD_PICKAXE"),
WOODEN_SHOVEL("WOOD_SPADE"),
WOODEN_SWORD("WOOD_SWORD"),
WRITABLE_BOOK("BOOK_AND_QUILL"),
WRITTEN_BOOK,
YELLOW_BANNER("BANNER", (byte) 11),
YELLOW_BED("BED", (byte) 4),
YELLOW_CARPET("CARPET", (byte) 4),
YELLOW_CONCRETE("CONCRETE", (byte) 4),
YELLOW_CONCRETE_POWDER("CONCRETE", (byte) 4),
YELLOW_DYE(ServerVersion.V1_14, "DANDELION_YELLOW", ServerVersion.V1_13, "INK_SACK", (byte) 11),
YELLOW_GLAZED_TERRACOTTA(),
YELLOW_SHULKER_BOX(),
YELLOW_STAINED_GLASS("STAINED_GLASS", (byte) 4),
YELLOW_STAINED_GLASS_PANE("STAINED_GLASS_PANE", (byte) 4),
YELLOW_TERRACOTTA("STAINED_CLAY", (byte) 4),
YELLOW_WALL_BANNER("WALL_BANNER", (byte) 11),
YELLOW_WOOL("WOOL", (byte) 4),
ZOMBIE_HEAD("SKULL_ITEM", (byte) 2),
ZOMBIE_HORSE_SPAWN_EGG("MONSTER_EGG", (byte) 29),
ZOMBIE_PIGMAN_SPAWN_EGG("MONSTER_EGG", (byte) 57), // FIXME: The name changed in newer versions (nether update maybe?)
ZOMBIE_SPAWN_EGG("MONSTER_EGG", (byte) 54),
ZOMBIE_VILLAGER_SPAWN_EGG("MONSTER_EGG", (byte) 27),
ZOMBIE_WALL_HEAD("SKULL", (byte) 2),
;
private final String modern, modern2, legacy;
private final LegacyMaterialAnalouge compatibleMaterial;
private final LegacyMaterialBlockType legacyBlockMaterial;
private final boolean legacyRequiresData;
// some materials (I'm looking at you, GREEN_DYE) have changed ID more than once
// minVersion is the min for modern, and minVersion2 is min to use legacyCompat1
private final ServerVersion minVersion, minVersion2;
private final byte legacyData;
private final Material material;
private final Byte data;
// quick test to see if our version is < 1.13
protected static final boolean useLegacy = ServerVersion.isServerVersionBelow(ServerVersion.V1_13);
// map to speed up name->material lookups
private static final Map<String, CompatibleMaterial> lookupMap = new HashMap<>();
static {
for (CompatibleMaterial m : values()) {
if (m.isRecycled()) {
lookupMap.put(m.legacy, m);
continue;
}
lookupMap.put(m.name(), m);
if (!m.usesCompatibility()) {
lookupMap.put(m.material + ":" + (m.data == null ? "" : m.data), m);
}
}
for (CompatibleMaterial m : values()) {
if (!m.usesCompatibility()) {
if (m.legacy != null && !lookupMap.containsKey(m.legacy)) {
lookupMap.put(m.legacy, m);
}
if (m.modern2 != null && !lookupMap.containsKey(m.modern2)) {
lookupMap.put(m.modern2, m);
}
if (m.legacyBlockMaterial != null && !lookupMap.containsKey(m.legacyBlockMaterial.blockMaterialName)) {
lookupMap.put(m.legacyBlockMaterial.blockMaterialName, m);
}
if (m.legacyBlockMaterial != null && !lookupMap.containsKey(m.legacyBlockMaterial.alternateBlockMaterialName)) {
lookupMap.put(m.legacyBlockMaterial.alternateBlockMaterialName, m);
}
}
}
}
CompatibleMaterial() {
this(ServerVersion.UNKNOWN, null, null);
}
CompatibleMaterial(String legacy) {
this(ServerVersion.V1_13, null, null, legacy, null);
}
CompatibleMaterial(String legacy, byte legacyData) {
this(ServerVersion.V1_13, null, null, legacy, legacyData);
}
CompatibleMaterial(ServerVersion modernMinimum, String legacy) {
this(modernMinimum, null, null, legacy, null);
}
CompatibleMaterial(ServerVersion modernMinimum, String legacy, Byte legacyData) {
this(modernMinimum, null, null, legacy, legacyData);
}
CompatibleMaterial(ServerVersion modernMinimum, String modern2, ServerVersion modern2Minimum, String legacyMaterial, Byte legacyData) {
this.modern = name();
this.modern2 = modern2;
this.minVersion = modernMinimum;
this.minVersion2 = modern2Minimum;
this.legacy = legacyMaterial;
this.legacyData = legacyData == null ? 0 : legacyData;
this.legacyRequiresData = legacyData != null;
this.compatibleMaterial = LegacyMaterialAnalouge.lookupAnalouge(modern);
if (compatibleMaterial != null && ServerVersion.isServerVersionBelow(compatibleMaterial.versionLessThan)) {
// server older than this item: use a proxy
material = compatibleMaterial.material;
data = compatibleMaterial.data;
} else if (ServerVersion.isServerVersionAtLeast(minVersion)) {
material = Material.getMaterial(modern);
data = null;
} else if (modern2 != null && ServerVersion.isServerVersionAtLeast(minVersion2)) {
material = Material.getMaterial(modern2);
data = null;
} else if (legacyMaterial != null && (compatibleMaterial == null || ServerVersion.isServerVersionAtLeast(compatibleMaterial.versionLessThan))) {
// we're using a server that has the legacy value available
material = Material.getMaterial(legacyMaterial);
data = legacyRequiresData ? this.legacyData : null;
} else if (compatibleMaterial != null) {
// no match: use a proxy
material = compatibleMaterial.material;
data = compatibleMaterial.data;
} else {
material = null;
data = null;
}
if (material != null && ServerVersion.isServerVersionBelow(ServerVersion.V1_13) && (compatibleMaterial == null || material != compatibleMaterial.material)) {
legacyBlockMaterial = LegacyMaterialBlockType.getMaterial(this.modern);
} else {
legacyBlockMaterial = null;
}
}
/**
* @return the Bukkit Material for this material
*/
public Material getMaterial() {
return material;
}
/**
* @return the Bukkit Material required to create a block
*/
public Material getBlockMaterial() {
return legacyBlockMaterial != null ? legacyBlockMaterial.getBlockMaterial() : (isBlock() ? material : AIR.material);
}
/**
* @return an item that resembles this material for the current server version
*/
public ItemStack getItem() {
return getItem(1);
}
/**
* @param amount the amount to return
*
* @return an item that resembles this material for the current server version
*/
public ItemStack getItem(int amount) {
if (usesCompatibility()) {
return compatibleMaterial.getItem();
}
return data != null ? new ItemStack(material, amount, data) : new ItemStack(material);
}
/**
* Does this material need to use a legacy fallback?
*/
public boolean usesLegacy() {
return legacy != null && ServerVersion.isServerVersionBelow(minVersion);
}
/**
* Does this material need to use a fallback item on this server?
*/
public boolean usesCompatibility() {
return compatibleMaterial != null && material == compatibleMaterial.material;
//return compatibleMaterial != null && ServerVersion.isServerVersionBelow(compatibleMaterial.versionLessThan);
}
/**
* Is this item reused in later versions of Minecraft?
*/
public boolean isRecycled() {
return usesLegacy() && this == CompatibleMaterial.GRASS;
}
/**
* Get the legacy data value for this material if there is one, or -1 if none
*/
public byte getData() {
return data != null ? data : -1;
}
/**
* Check if current material requires a data value.
*
* @return true if server is legacy and this item requires data to be defined.
*/
public boolean usesData() {
return data != null;
}
/**
* Lookup a Material by its modern id name. <br />
* This also can grab materials by their legacy, but only if there is no
* modern material by that name.
*
* @param name item to lookup
*
* @return LegacyMaterial or null if none found
*/
public static CompatibleMaterial getMaterial(String name) {
return getMaterial(name, null);
}
/**
* Lookup a Material by its modern id name. <br />
* This also can grab materials by their legacy, but only if there is no
* modern material by that name.
*
* @param name item to lookup
* @param def default item if this is not a valid material
*
* @return LegacyMaterial or null if none found
*/
@Contract("_, !null -> !null")
public static CompatibleMaterial getMaterial(String name, CompatibleMaterial def) {
return name == null ? def : lookupMap.getOrDefault(name.toUpperCase(), def);
}
/**
* Lookup a Material by bukkit material.
*
* @param mat item to lookup
*
* @return LegacyMaterial or null if none found
*/
public static CompatibleMaterial getMaterial(Material mat) {
if (mat == null) {
return null;
}
if (useLegacy) {
CompatibleMaterial compatibleMaterial = lookupMap.get(mat.name() + ":0");
if (compatibleMaterial != null) {
return compatibleMaterial;
}
}
return lookupMap.get(mat.name());
}
/**
* Lookup a Material by ItemStack.
*
* @param item item to lookup
*
* @return LegacyMaterial or null if none found
*/
public static CompatibleMaterial getMaterial(ItemStack item) {
if (item == null) {
return null;
}
String key = item.getType() + ":";
CompatibleMaterial m = lookupMap.get(key);
return m != null ? m : lookupMap.get(key + item.getDurability());
}
/**
* Lookup a Material by Block, corrected for legacy
*
* @param block block to check
*
* @return LegacyMaterial or null if none found
*/
public static CompatibleMaterial getMaterial(Block block) {
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_13)) { // Flattening
return CompatibleMaterial.getMaterialFromNewBlock(block);
} else { // Pre-Flattening
if (block != null) {
if (block.getData() != 0) {
for (CompatibleMaterial cm : CompatibleMaterial.values()) {
if (cm.isValidItem() && !cm.usesCompatibility() && cm.getMaterial() != null && cm.getMaterial().equals(block.getType())) {
if (cm.getData() == block.getData()) {
return cm;
}
}
}
}
return CompatibleMaterial.getMaterialFromNewBlock(block);
}
}
return null;
}
private static Method methodGetBlockData;
static {
if (ServerVersion.isServerVersionAtOrBelow(ServerVersion.V1_12)) {
try {
methodGetBlockData = FallingBlock.class.getDeclaredMethod("getBlockData");
} catch (NoSuchMethodException ex) {
ex.printStackTrace();
}
}
}
/**
* Lookup a Material by FallingBlock, corrected for legacy
*
* @param block falling block to check
*
* @return LegacyMaterial or null if none found
*/
public static CompatibleMaterial getMaterial(FallingBlock block) {
if (block == null) {
return null;
}
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_13)) {
return getMaterial(block.getBlockData().getMaterial());
}
try {
return getMaterial(block.getMaterial(), (byte) methodGetBlockData.invoke(block));
} catch (IllegalAccessException | InvocationTargetException ex) {
ex.printStackTrace();
}
return null;
}
/**
* Lookup a Material by Material and data, corrected for legacy
*
* @param mat material to check
* @param data data of the block
*
* @return LegacyMaterial or null if none found
*/
public static CompatibleMaterial getMaterial(Material mat, byte data) {
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_13)) { // Flattening
return CompatibleMaterial.getMaterial(mat);
}
// Pre-Flattening
if (mat != null) {
if (data != 0) {
for (CompatibleMaterial cm : CompatibleMaterial.values()) {
if (cm.getMaterial() != null && cm.getMaterial().equals(mat) && cm.getData() == data) {
return cm;
}
}
}
return CompatibleMaterial.getMaterial(mat);
}
return null;
}
private static CompatibleMaterial getMaterialFromNewBlock(Block block) {
if (block == null) {
return null;
}
Material mat = block.getType();
if (useLegacy) {
LegacyMaterialBlockType legacyBlock = LegacyMaterialBlockType.getFromLegacy(mat.name(), block.getData());
if (legacyBlock != null) {
return lookupMap.get(legacyBlock.name());
}
CompatibleMaterial withData = lookupMap.get(mat.name() + ":" + block.getData());
return withData == null ? lookupMap.get(mat.name()) : withData;
}
return lookupMap.get(mat.name());
}
/**
* Lookup a Block Material by its modern id name. <br />
* This also can grab materials by their legacy, but only if there is no
* modern material by that name.
*
* @param name item to lookup
*
* @return LegacyMaterial or null if none found
*/
public static CompatibleMaterial getBlockMaterial(String name) {
if (name == null) {
return null;
}
if (useLegacy) {
LegacyMaterialBlockType legacyBlock = LegacyMaterialBlockType.getFromLegacy(name.toUpperCase());
if (legacyBlock != null) {
return lookupMap.get(legacyBlock.name());
}
}
return lookupMap.get(name.toUpperCase());
}
/**
* Lookup a Block Material by its modern id name. <br />
* This also can grab materials by their legacy, but only if there is no
* modern material by that name.
*
* @param name item to lookup
* @param def default item if this is not a valid material
*
* @return LegacyMaterial or null if none found
*/
public static CompatibleMaterial getBlockMaterial(String name, CompatibleMaterial def) {
if (name == null) {
return def;
}
if (useLegacy) {
LegacyMaterialBlockType legacyBlock = LegacyMaterialBlockType.getFromLegacy(name.toUpperCase());
if (legacyBlock != null) {
return lookupMap.get(legacyBlock.name());
}
}
return lookupMap.getOrDefault(name.toUpperCase(), def);
}
/**
* Lookup a Block Material by bukkit material.
*
* @param mat item to lookup
*
* @return LegacyMaterial or null if none found
*/
public static CompatibleMaterial getBlockMaterial(Material mat) {
if (mat == null) {
return null;
}
if (useLegacy) {
LegacyMaterialBlockType legacyBlock = LegacyMaterialBlockType.getFromLegacy(mat.name());
if (legacyBlock != null) {
return lookupMap.get(legacyBlock.name());
}
}
return lookupMap.get(mat.name());
}
static LinkedHashSet<CompatibleMaterial> all = null;
public static Set<CompatibleMaterial> getAllValidItemMaterials() {
if (all == null) {
all = new LinkedHashSet<>();
for (CompatibleMaterial mat : values()) {
if (mat.isValidItem() && !mat.usesCompatibility()) {
all.add(mat);
}
}
}
return Collections.unmodifiableSet(all);
}
/**
* Lookup a Legacy Material by its modern id name and return its associated
* Item. <br />
* This also can grab materials by their legacy, but only if there is no
* modern material by that name.
*
* @param name item to lookup
*
* @return ItemStack for this material, or null if none found
*/
public static ItemStack getItem(String name) {
if (name == null) {
return null;
}
CompatibleMaterial m = lookupMap.get(name.toUpperCase());
if (m != null) {
return m.getItem();
}
Material mat = Material.getMaterial(name);
return mat != null ? new ItemStack(mat) : null;
}
private static Method methodSetData;
static {
if (ServerVersion.isServerVersionAtOrBelow(ServerVersion.V1_12)) {
try {
methodSetData = Block.class.getDeclaredMethod("setData", byte.class);
} catch (NoSuchMethodException ex) {
ex.printStackTrace();
}
}
}
/**
* Apply the current material to a block.
*
* @param block the block to apply the material to.
*/
public void applyToBlock(Block block) {
if (block == null) return;
block.setType(material);
if (data != null && data != -1 && ServerVersion.isServerVersionAtOrBelow(ServerVersion.V1_12)) {
try {
methodSetData.invoke(block, data);
} catch (IllegalAccessException | InvocationTargetException ex) {
ex.printStackTrace();
}
}
}
/**
* Check to see if an item matches this specific material type
*
* @param item Item to check
*
* @return true if material of the ItemStack matches this item, corrected for legacy data
*/
public boolean matches(ItemStack item) {
return item != null &&
!usesCompatibility() && item.getType() == material &&
// eons ago, ItemStack.getData() would return a byte. 1.7 doesn't, though.
(data == null || item.getDurability() == data);
}
/**
* Some blocks change to other materials when placed down. This checks to
* see if this one is one of those.
*/
public boolean hasDifferentBlockItem() {
switch (this) {
case STRING:
return true;
case ACACIA_DOOR:
case BIRCH_DOOR:
case DARK_OAK_DOOR:
case JUNGLE_DOOR:
case SPRUCE_DOOR:
case IRON_DOOR:
case OAK_DOOR:
case ACACIA_SIGN:
case BIRCH_SIGN:
case DARK_OAK_SIGN:
case JUNGLE_SIGN:
case OAK_SIGN:
case SPRUCE_SIGN:
case BLACK_BANNER:
case BLUE_BANNER:
case BROWN_BANNER:
case CYAN_BANNER:
case GRAY_BANNER:
case GREEN_BANNER:
case LIGHT_BLUE_BANNER:
case LIGHT_GRAY_BANNER:
case LIME_BANNER:
case MAGENTA_BANNER:
case ORANGE_BANNER:
case PINK_BANNER:
case PURPLE_BANNER:
case RED_BANNER:
case WHITE_BANNER:
case YELLOW_BANNER:
case BLACK_BED:
case BLUE_BED:
case BROWN_BED:
case CYAN_BED:
case GRAY_BED:
case GREEN_BED:
case LIGHT_BLUE_BED:
case LIGHT_GRAY_BED:
case LIME_BED:
case MAGENTA_BED:
case ORANGE_BED:
case PINK_BED:
case PURPLE_BED:
case RED_BED:
case WHITE_BED:
case YELLOW_BED:
case REDSTONE:
case REPEATER:
case SUGAR_CANE:
case CAKE:
case COMPARATOR:
return usesLegacy();
default:
return false;
}
}
/**
* Check to see if this is a material that can exist as a block
*/
public boolean isBlock() {
return material != null && material.isBlock();
}
/**
* Check to see if this is an item that can be consumed to restore hunger
*/
public boolean isEdible() {
return material != null && material.isEdible();
}
/**
* Check if the material is a block and can be built on
*/
public boolean isSolid() {
return material != null && material.isSolid();
}
/**
* Check if the material is a block and does not block any light
*
* @return True if this material is a block and does not block any light
*
* @see Material#isTransparent()
* @deprecated currently does not have an implementation which is well
* linked to the underlying server. Contributions welcome.
*/
@Deprecated
public boolean isTransparent() {
return material != null && material.isTransparent();
}
/**
* Check if the material is a block and can catch fire
*/
public boolean isFlammable() {
return material != null && material.isFlammable();
}
/**
* Check if the material is a block and can be destroyed by burning
*/
public boolean isBurnable() {
return material != null && material.isBurnable();
}
/**
* Checks if this Material can be used as fuel in a Furnace
*/
public boolean isFuel() {
// this function is not implemented in some older versions, so we need this here...
switch (this) {
case ACACIA_BOAT:
case ACACIA_BUTTON:
case ACACIA_DOOR:
case ACACIA_FENCE:
case ACACIA_FENCE_GATE:
case ACACIA_LOG:
case ACACIA_PLANKS:
case ACACIA_PRESSURE_PLATE:
case ACACIA_SAPLING:
case ACACIA_SIGN:
case ACACIA_SLAB:
case ACACIA_STAIRS:
case ACACIA_TRAPDOOR:
case ACACIA_WOOD:
case AZALEA:
case BAMBOO:
case BARREL:
case BIRCH_BOAT:
case BIRCH_BUTTON:
case BIRCH_DOOR:
case BIRCH_FENCE:
case BIRCH_FENCE_GATE:
case BIRCH_LOG:
case BIRCH_PLANKS:
case BIRCH_PRESSURE_PLATE:
case BIRCH_SAPLING:
case BIRCH_SIGN:
case BIRCH_SLAB:
case BIRCH_STAIRS:
case BIRCH_TRAPDOOR:
case BIRCH_WOOD:
case BLACK_BANNER:
case BLACK_CARPET:
case BLACK_WOOL:
case BLAZE_ROD:
case BLUE_BANNER:
case BLUE_CARPET:
case BLUE_WOOL:
case BOOKSHELF:
case BOW:
case BOWL:
case BROWN_BANNER:
case BROWN_CARPET:
case BROWN_WOOL:
case CARTOGRAPHY_TABLE:
case CHARCOAL:
case CHEST:
case COAL:
case COAL_BLOCK:
case COMPOSTER:
case CRAFTING_TABLE:
case CROSSBOW:
case CYAN_BANNER:
case CYAN_CARPET:
case CYAN_WOOL:
case DARK_OAK_BOAT:
case DARK_OAK_BUTTON:
case DARK_OAK_DOOR:
case DARK_OAK_FENCE:
case DARK_OAK_FENCE_GATE:
case DARK_OAK_LOG:
case DARK_OAK_PLANKS:
case DARK_OAK_PRESSURE_PLATE:
case DARK_OAK_SAPLING:
case DARK_OAK_SIGN:
case DARK_OAK_SLAB:
case DARK_OAK_STAIRS:
case DARK_OAK_TRAPDOOR:
case DARK_OAK_WOOD:
case DAYLIGHT_DETECTOR:
case DEAD_BUSH:
case DRIED_KELP_BLOCK:
case FISHING_ROD:
case FLETCHING_TABLE:
case FLOWERING_AZALEA:
case GRAY_BANNER:
case GRAY_CARPET:
case GRAY_WOOL:
case GREEN_BANNER:
case GREEN_CARPET:
case GREEN_WOOL:
case JUKEBOX:
case JUNGLE_BOAT:
case JUNGLE_BUTTON:
case JUNGLE_DOOR:
case JUNGLE_FENCE:
case JUNGLE_FENCE_GATE:
case JUNGLE_LOG:
case JUNGLE_PLANKS:
case JUNGLE_PRESSURE_PLATE:
case JUNGLE_SAPLING:
case JUNGLE_SIGN:
case JUNGLE_SLAB:
case JUNGLE_STAIRS:
case JUNGLE_TRAPDOOR:
case JUNGLE_WOOD:
case LADDER:
case LAVA_BUCKET:
case LECTERN:
case LIGHT_BLUE_BANNER:
case LIGHT_BLUE_CARPET:
case LIGHT_BLUE_WOOL:
case LIGHT_GRAY_BANNER:
case LIGHT_GRAY_CARPET:
case LIGHT_GRAY_WOOL:
case LIME_BANNER:
case LIME_CARPET:
case LIME_WOOL:
case LOOM:
case MAGENTA_BANNER:
case MAGENTA_CARPET:
case MAGENTA_WOOL:
case NOTE_BLOCK:
case OAK_BOAT:
case OAK_BUTTON:
case OAK_DOOR:
case OAK_FENCE:
case OAK_FENCE_GATE:
case OAK_LOG:
case OAK_PLANKS:
case OAK_PRESSURE_PLATE:
case OAK_SAPLING:
case OAK_SIGN:
case OAK_SLAB:
case OAK_STAIRS:
case OAK_TRAPDOOR:
case OAK_WOOD:
case ORANGE_BANNER:
case ORANGE_CARPET:
case ORANGE_WOOL:
case PINK_BANNER:
case PINK_CARPET:
case PINK_WOOL:
case PURPLE_BANNER:
case PURPLE_CARPET:
case PURPLE_WOOL:
case RED_BANNER:
case RED_CARPET:
case RED_WOOL:
case SCAFFOLDING:
case SMITHING_TABLE:
case SPRUCE_BOAT:
case SPRUCE_BUTTON:
case SPRUCE_DOOR:
case SPRUCE_FENCE:
case SPRUCE_FENCE_GATE:
case SPRUCE_LOG:
case SPRUCE_PLANKS:
case SPRUCE_PRESSURE_PLATE:
case SPRUCE_SAPLING:
case SPRUCE_SIGN:
case SPRUCE_SLAB:
case SPRUCE_STAIRS:
case SPRUCE_TRAPDOOR:
case SPRUCE_WOOD:
case STICK:
case STRIPPED_ACACIA_LOG:
case STRIPPED_ACACIA_WOOD:
case STRIPPED_BIRCH_LOG:
case STRIPPED_BIRCH_WOOD:
case STRIPPED_DARK_OAK_LOG:
case STRIPPED_DARK_OAK_WOOD:
case STRIPPED_JUNGLE_LOG:
case STRIPPED_JUNGLE_WOOD:
case STRIPPED_OAK_LOG:
case STRIPPED_OAK_WOOD:
case STRIPPED_SPRUCE_LOG:
case STRIPPED_SPRUCE_WOOD:
case TRAPPED_CHEST:
case WHITE_BANNER:
case WHITE_CARPET:
case WHITE_WOOL:
case WOODEN_AXE:
case WOODEN_HOE:
case WOODEN_PICKAXE:
case WOODEN_SHOVEL:
case WOODEN_SWORD:
case YELLOW_BANNER:
case YELLOW_CARPET:
case YELLOW_WOOL:
return true;
default:
return false;
}
}
/**
* Get the result of putting this item
* into a furnace.
* <p>
* return
*/
public CompatibleMaterial getBurnResult() {
switch (this) {
case PORKCHOP:
return COOKED_PORKCHOP;
case BEEF:
return COOKED_BEEF;
case CHICKEN:
return COOKED_CHICKEN;
case COD:
return COOKED_COD;
case SALMON:
return COOKED_SALMON;
case POTATO:
return BAKED_POTATO;
case MUTTON:
return COOKED_MUTTON;
case RABBIT:
return COOKED_RABBIT;
case KELP:
return DRIED_KELP;
case RAW_IRON:
case IRON_ORE:
case DEEPSLATE_IRON_ORE:
return IRON_INGOT;
case RAW_GOLD:
case GOLD_ORE:
case DEEPSLATE_GOLD_ORE:
return GOLD_INGOT;
case DIAMOND_ORE:
case DEEPSLATE_DIAMOND_ORE:
return DIAMOND;
case LAPIS_ORE:
case DEEPSLATE_LAPIS_ORE:
return LAPIS_LAZULI;
case REDSTONE_ORE:
case DEEPSLATE_REDSTONE_ORE:
return REDSTONE;
case COAL_ORE:
case DEEPSLATE_COAL_ORE:
return COAL;
case EMERALD_ORE:
case DEEPSLATE_EMERALD_ORE:
return EMERALD;
case NETHER_QUARTZ_ORE:
return QUARTZ;
case RAW_COPPER:
case COPPER_ORE:
case DEEPSLATE_COPPER_ORE:
return COPPER_INGOT;
case SAND:
case RED_SAND:
return GLASS;
case COBBLESTONE:
return STONE;
case SANDSTONE:
return SMOOTH_SANDSTONE;
case RED_SANDSTONE:
return SMOOTH_RED_SANDSTONE;
case STONE:
return SMOOTH_STONE;
case QUARTZ_BLOCK:
return SMOOTH_QUARTZ;
case CLAY_BALL:
return BRICK;
case NETHERRACK:
return NETHER_BRICK;
case CLAY:
return BRICKS;
case STONE_BRICKS:
return CRACKED_STONE_BRICKS;
case WHITE_TERRACOTTA:
return WHITE_GLAZED_TERRACOTTA;
case ORANGE_TERRACOTTA:
return ORANGE_GLAZED_TERRACOTTA;
case MAGENTA_TERRACOTTA:
return MAGENTA_GLAZED_TERRACOTTA;
case LIGHT_BLUE_TERRACOTTA:
return LIGHT_BLUE_GLAZED_TERRACOTTA;
case YELLOW_TERRACOTTA:
return YELLOW_GLAZED_TERRACOTTA;
case LIME_TERRACOTTA:
return LIME_GLAZED_TERRACOTTA;
case PINK_TERRACOTTA:
return PINK_GLAZED_TERRACOTTA;
case GRAY_TERRACOTTA:
return GRAY_GLAZED_TERRACOTTA;
case LIGHT_GRAY_TERRACOTTA:
return LIGHT_GRAY_GLAZED_TERRACOTTA;
case CYAN_TERRACOTTA:
return CYAN_GLAZED_TERRACOTTA;
case PURPLE_TERRACOTTA:
return PURPLE_GLAZED_TERRACOTTA;
case BLUE_TERRACOTTA:
return BLUE_GLAZED_TERRACOTTA;
case BROWN_TERRACOTTA:
return BROWN_GLAZED_TERRACOTTA;
case GREEN_TERRACOTTA:
return GREEN_GLAZED_TERRACOTTA;
case RED_TERRACOTTA:
return RED_GLAZED_TERRACOTTA;
case BLACK_TERRACOTTA:
return BLACK_GLAZED_TERRACOTTA;
case IRON_SWORD:
case IRON_PICKAXE:
case IRON_AXE:
case IRON_SHOVEL:
case IRON_HOE:
case IRON_HELMET:
case IRON_CHESTPLATE:
case IRON_LEGGINGS:
case IRON_BOOTS:
case IRON_HORSE_ARMOR:
case CHAINMAIL_HELMET:
case CHAINMAIL_CHESTPLATE:
case CHAINMAIL_LEGGINGS:
case CHAINMAIL_BOOTS:
return IRON_NUGGET;
case GOLDEN_SWORD:
case GOLDEN_PICKAXE:
case GOLDEN_AXE:
case GOLDEN_SHOVEL:
case GOLDEN_HOE:
case GOLDEN_HELMET:
case GOLDEN_CHESTPLATE:
case GOLDEN_LEGGINGS:
case GOLDEN_BOOTS:
case GOLDEN_HORSE_ARMOR:
return GOLD_NUGGET;
case CACTUS:
return GREEN_DYE;
case SEA_PICKLE:
return LIME_DYE;
case OAK_LOG:
case BIRCH_LOG:
case ACACIA_LOG:
case DARK_OAK_LOG:
case JUNGLE_LOG:
case SPRUCE_LOG:
case STRIPPED_ACACIA_LOG:
case STRIPPED_BIRCH_LOG:
case STRIPPED_DARK_OAK_LOG:
case STRIPPED_JUNGLE_LOG:
case STRIPPED_OAK_LOG:
case STRIPPED_SPRUCE_LOG:
case ACACIA_WOOD:
case BIRCH_WOOD:
case JUNGLE_WOOD:
case OAK_WOOD:
case SPRUCE_WOOD:
case STRIPPED_ACACIA_WOOD:
case STRIPPED_BIRCH_WOOD:
case STRIPPED_DARK_OAK_WOOD:
case STRIPPED_JUNGLE_WOOD:
case STRIPPED_OAK_WOOD:
case STRIPPED_SPRUCE_WOOD:
return CHARCOAL;
case CHORUS_FRUIT:
return POPPED_CHORUS_FRUIT;
default:
return null;
}
}
/**
* Check if the material is air
*/
public boolean isAir() {
switch (this) {
case AIR:
case CAVE_AIR:
case VOID_AIR:
return true;
default:
return false;
}
}
/**
* Check if the material is water
*/
public boolean isWater() {
return this == CompatibleMaterial.WATER;
}
/**
* Get the EntityType of the monster spawn egg.
*/
public EntityType getEggType() {
String entityName = this.name().replace("_SPAWN_EGG", "");
if (entityName.equals("MOOSHROOM")) {
entityName = "MUSHROOM_COW";
} else if (entityName.equals("ZOMBIE_PIGMAN")) {
entityName = "PIG_ZOMBIE";
}
try {
return EntityType.valueOf(entityName);
} catch (IllegalArgumentException ignore) {
}
return null;
}
/**
* Check if the material is a block and completely blocks vision
*/
public boolean isOccluding() {
return material != null && material.isOccluding();
}
/**
* @return True if this material is affected by gravity.
*/
public boolean hasGravity() {
return material != null && material.hasGravity();
}
/**
* Checks if this Material is an obtainable item.
*/
public boolean isItem() {
// this function is not implemented in some older versions, so we need this here...
switch (this) {
case ACACIA_WALL_SIGN:
case ATTACHED_MELON_STEM:
case ATTACHED_PUMPKIN_STEM:
case BAMBOO_SAPLING:
case BEETROOTS:
case BIG_DRIPLEAF_STEM:
case BIRCH_WALL_SIGN:
case BLACK_CANDLE_CAKE:
case BLACK_WALL_BANNER:
case BLUE_CANDLE_CAKE:
case BLUE_WALL_BANNER:
case BRAIN_CORAL_WALL_FAN:
case BROWN_CANDLE_CAKE:
case BROWN_WALL_BANNER:
case BUBBLE_COLUMN:
case BUBBLE_CORAL_WALL_FAN:
case CANDLE_CAKE:
case CARROTS:
case CAVE_AIR:
case CAVE_VINES:
case CAVE_VINES_PLANT:
case COCOA:
case CREEPER_WALL_HEAD:
case CRIMSON_WALL_SIGN:
case CYAN_CANDLE_CAKE:
case CYAN_WALL_BANNER:
case DARK_OAK_WALL_SIGN:
case DEAD_BRAIN_CORAL_WALL_FAN:
case DEAD_BUBBLE_CORAL_WALL_FAN:
case DEAD_FIRE_CORAL_WALL_FAN:
case DEAD_HORN_CORAL_WALL_FAN:
case DEAD_TUBE_CORAL_WALL_FAN:
case DRAGON_WALL_HEAD:
case END_GATEWAY:
case END_PORTAL:
case FIRE:
case FIRE_CORAL_WALL_FAN:
case FROSTED_ICE:
case GRAY_CANDLE_CAKE:
case GRAY_WALL_BANNER:
case GREEN_CANDLE_CAKE:
case GREEN_WALL_BANNER:
case HORN_CORAL_WALL_FAN:
case JUNGLE_WALL_SIGN:
case KELP_PLANT:
case LAVA:
case LAVA_CAULDRON:
case LIGHT_BLUE_CANDLE_CAKE:
case LIGHT_BLUE_WALL_BANNER:
case LIGHT_GRAY_CANDLE_CAKE:
case LIGHT_GRAY_WALL_BANNER:
case LIME_CANDLE_CAKE:
case LIME_WALL_BANNER:
case MAGENTA_CANDLE_CAKE:
case MAGENTA_WALL_BANNER:
case MELON_STEM:
case MOVING_PISTON:
case NETHER_PORTAL:
case OAK_WALL_SIGN:
case ORANGE_CANDLE_CAKE:
case ORANGE_WALL_BANNER:
case PINK_CANDLE_CAKE:
case PINK_WALL_BANNER:
case PISTON_HEAD:
case PLAYER_WALL_HEAD:
case POTATOES:
case POTTED_ACACIA_SAPLING:
case POTTED_ALLIUM:
case POTTED_AZALEA_BUSH:
case POTTED_AZURE_BLUET:
case POTTED_BAMBOO:
case POTTED_BIRCH_SAPLING:
case POTTED_BLUE_ORCHID:
case POTTED_BROWN_MUSHROOM:
case POTTED_CACTUS:
case POTTED_CORNFLOWER:
case POTTED_CRIMSON_FUNGUS:
case POTTED_CRIMSON_ROOTS:
case POTTED_DANDELION:
case POTTED_DARK_OAK_SAPLING:
case POTTED_DEAD_BUSH:
case POTTED_FERN:
case POTTED_FLOWERING_AZALEA_BUSH:
case POTTED_JUNGLE_SAPLING:
case POTTED_LILY_OF_THE_VALLEY:
case POTTED_OAK_SAPLING:
case POTTED_ORANGE_TULIP:
case POTTED_OXEYE_DAISY:
case POTTED_PINK_TULIP:
case POTTED_POPPY:
case POTTED_RED_MUSHROOM:
case POTTED_RED_TULIP:
case POTTED_SPRUCE_SAPLING:
case POTTED_WARPED_FUNGUS:
case POTTED_WARPED_ROOTS:
case POTTED_WHITE_TULIP:
case POTTED_WITHER_ROSE:
case POWDER_SNOW:
case POWDER_SNOW_CAULDRON:
case PUMPKIN_STEM:
case PURPLE_CANDLE_CAKE:
case PURPLE_WALL_BANNER:
case REDSTONE_WALL_TORCH:
case REDSTONE_WIRE:
case RED_CANDLE_CAKE:
case RED_WALL_BANNER:
case SKELETON_WALL_SKULL:
case SOUL_FIRE:
case SOUL_WALL_TORCH:
case SPRUCE_WALL_SIGN:
case SWEET_BERRY_BUSH:
case TALL_SEAGRASS:
case TRIPWIRE:
case TUBE_CORAL_WALL_FAN:
case TWISTING_VINES_PLANT:
case VOID_AIR:
case WALL_TORCH:
case WARPED_WALL_SIGN:
case WATER:
case WATER_CAULDRON:
case WEEPING_VINES_PLANT:
case WHITE_CANDLE_CAKE:
case WHITE_WALL_BANNER:
case WITHER_SKELETON_WALL_SKULL:
case YELLOW_CANDLE_CAKE:
case YELLOW_WALL_BANNER:
case ZOMBIE_WALL_HEAD:
return false;
default:
return true;
}
}
/**
* Checks if this Material can be interacted with. <br />
* This method will return true if there is at least one state in which
* additional interact handling is performed for the material.
*/
public boolean isInteractable() {
// this function is not implemented in some older versions, so we need this here...
switch (this) {
case ACACIA_BUTTON:
case ACACIA_DOOR:
case ACACIA_FENCE:
case ACACIA_FENCE_GATE:
case ACACIA_SIGN:
case ACACIA_STAIRS:
case ACACIA_TRAPDOOR:
case ACACIA_WALL_SIGN:
case ANDESITE_STAIRS:
case ANVIL:
case BARREL:
case BEACON:
case BEEHIVE:
case BEE_NEST:
case BELL:
case BIRCH_BUTTON:
case BIRCH_DOOR:
case BIRCH_FENCE:
case BIRCH_FENCE_GATE:
case BIRCH_SIGN:
case BIRCH_STAIRS:
case BIRCH_TRAPDOOR:
case BIRCH_WALL_SIGN:
case BLACKSTONE_STAIRS:
case BLACK_BED:
case BLACK_CANDLE:
case BLACK_CANDLE_CAKE:
case BLACK_SHULKER_BOX:
case BLAST_FURNACE:
case BLUE_BED:
case BLUE_CANDLE:
case BLUE_CANDLE_CAKE:
case BLUE_SHULKER_BOX:
case BREWING_STAND:
case BRICK_STAIRS:
case BROWN_BED:
case BROWN_CANDLE:
case BROWN_CANDLE_CAKE:
case BROWN_SHULKER_BOX:
case CAKE:
case CAMPFIRE:
case CANDLE:
case CANDLE_CAKE:
case CARTOGRAPHY_TABLE:
case CAULDRON:
case CAVE_VINES:
case CAVE_VINES_PLANT:
case CHAIN_COMMAND_BLOCK:
case CHEST:
case CHIPPED_ANVIL:
case COBBLED_DEEPSLATE_STAIRS:
case COBBLESTONE_STAIRS:
case COMMAND_BLOCK:
case COMPARATOR:
case COMPOSTER:
case CRAFTING_TABLE:
case CRIMSON_BUTTON:
case CRIMSON_DOOR:
case CRIMSON_FENCE:
case CRIMSON_FENCE_GATE:
case CRIMSON_SIGN:
case CRIMSON_STAIRS:
case CRIMSON_TRAPDOOR:
case CRIMSON_WALL_SIGN:
case CUT_COPPER_STAIRS:
case CYAN_BED:
case CYAN_CANDLE:
case CYAN_CANDLE_CAKE:
case CYAN_SHULKER_BOX:
case DAMAGED_ANVIL:
case DARK_OAK_BUTTON:
case DARK_OAK_DOOR:
case DARK_OAK_FENCE:
case DARK_OAK_FENCE_GATE:
case DARK_OAK_SIGN:
case DARK_OAK_STAIRS:
case DARK_OAK_TRAPDOOR:
case DARK_OAK_WALL_SIGN:
case DARK_PRISMARINE_STAIRS:
case DAYLIGHT_DETECTOR:
case DEEPSLATE_BRICK_STAIRS:
case DEEPSLATE_REDSTONE_ORE:
case DEEPSLATE_TILE_STAIRS:
case DIORITE_STAIRS:
case DISPENSER:
case DRAGON_EGG:
case DROPPER:
case ENCHANTING_TABLE:
case ENDER_CHEST:
case END_STONE_BRICK_STAIRS:
case EXPOSED_CUT_COPPER_STAIRS:
case FLETCHING_TABLE:
case FLOWER_POT:
case FURNACE:
case GRANITE_STAIRS:
case GRAY_BED:
case GRAY_CANDLE:
case GRAY_CANDLE_CAKE:
case GRAY_SHULKER_BOX:
case GREEN_BED:
case GREEN_CANDLE:
case GREEN_CANDLE_CAKE:
case GREEN_SHULKER_BOX:
case GRINDSTONE:
case HOPPER:
case IRON_DOOR:
case IRON_TRAPDOOR:
case JIGSAW:
case JUKEBOX:
case JUNGLE_BUTTON:
case JUNGLE_DOOR:
case JUNGLE_FENCE:
case JUNGLE_FENCE_GATE:
case JUNGLE_SIGN:
case JUNGLE_STAIRS:
case JUNGLE_TRAPDOOR:
case JUNGLE_WALL_SIGN:
case LAVA_CAULDRON:
case LECTERN:
case LEVER:
case LIGHT:
case LIGHT_BLUE_BED:
case LIGHT_BLUE_CANDLE:
case LIGHT_BLUE_CANDLE_CAKE:
case LIGHT_BLUE_SHULKER_BOX:
case LIGHT_GRAY_BED:
case LIGHT_GRAY_CANDLE:
case LIGHT_GRAY_CANDLE_CAKE:
case LIGHT_GRAY_SHULKER_BOX:
case LIME_BED:
case LIME_CANDLE:
case LIME_CANDLE_CAKE:
case LIME_SHULKER_BOX:
case LOOM:
case MAGENTA_BED:
case MAGENTA_CANDLE:
case MAGENTA_CANDLE_CAKE:
case MAGENTA_SHULKER_BOX:
case MOSSY_COBBLESTONE_STAIRS:
case MOSSY_STONE_BRICK_STAIRS:
case MOVING_PISTON:
case NETHER_BRICK_FENCE:
case NETHER_BRICK_STAIRS:
case NOTE_BLOCK:
case OAK_BUTTON:
case OAK_DOOR:
case OAK_FENCE:
case OAK_FENCE_GATE:
case OAK_SIGN:
case OAK_STAIRS:
case OAK_TRAPDOOR:
case OAK_WALL_SIGN:
case ORANGE_BED:
case ORANGE_CANDLE:
case ORANGE_CANDLE_CAKE:
case ORANGE_SHULKER_BOX:
case OXIDIZED_CUT_COPPER_STAIRS:
case PINK_BED:
case PINK_CANDLE:
case PINK_CANDLE_CAKE:
case PINK_SHULKER_BOX:
case POLISHED_ANDESITE_STAIRS:
case POLISHED_BLACKSTONE_BRICK_STAIRS:
case POLISHED_BLACKSTONE_BUTTON:
case POLISHED_BLACKSTONE_STAIRS:
case POLISHED_DEEPSLATE_STAIRS:
case POLISHED_DIORITE_STAIRS:
case POLISHED_GRANITE_STAIRS:
case POTTED_ACACIA_SAPLING:
case POTTED_ALLIUM:
case POTTED_AZALEA_BUSH:
case POTTED_AZURE_BLUET:
case POTTED_BAMBOO:
case POTTED_BIRCH_SAPLING:
case POTTED_BLUE_ORCHID:
case POTTED_BROWN_MUSHROOM:
case POTTED_CACTUS:
case POTTED_CORNFLOWER:
case POTTED_CRIMSON_FUNGUS:
case POTTED_CRIMSON_ROOTS:
case POTTED_DANDELION:
case POTTED_DARK_OAK_SAPLING:
case POTTED_DEAD_BUSH:
case POTTED_FERN:
case POTTED_FLOWERING_AZALEA_BUSH:
case POTTED_JUNGLE_SAPLING:
case POTTED_LILY_OF_THE_VALLEY:
case POTTED_OAK_SAPLING:
case POTTED_ORANGE_TULIP:
case POTTED_OXEYE_DAISY:
case POTTED_PINK_TULIP:
case POTTED_POPPY:
case POTTED_RED_MUSHROOM:
case POTTED_RED_TULIP:
case POTTED_SPRUCE_SAPLING:
case POTTED_WARPED_FUNGUS:
case POTTED_WARPED_ROOTS:
case POTTED_WHITE_TULIP:
case POTTED_WITHER_ROSE:
case POWDER_SNOW_CAULDRON:
case PRISMARINE_BRICK_STAIRS:
case PRISMARINE_STAIRS:
case PUMPKIN:
case PURPLE_BED:
case PURPLE_CANDLE:
case PURPLE_CANDLE_CAKE:
case PURPLE_SHULKER_BOX:
case PURPUR_STAIRS:
case QUARTZ_STAIRS:
case REDSTONE_ORE:
case REDSTONE_WIRE:
case RED_BED:
case RED_CANDLE:
case RED_CANDLE_CAKE:
case RED_NETHER_BRICK_STAIRS:
case RED_SANDSTONE_STAIRS:
case RED_SHULKER_BOX:
case REPEATER:
case REPEATING_COMMAND_BLOCK:
case RESPAWN_ANCHOR:
case SANDSTONE_STAIRS:
case SHULKER_BOX:
case SMITHING_TABLE:
case SMOKER:
case SMOOTH_QUARTZ_STAIRS:
case SMOOTH_RED_SANDSTONE_STAIRS:
case SMOOTH_SANDSTONE_STAIRS:
case SOUL_CAMPFIRE:
case SPRUCE_BUTTON:
case SPRUCE_DOOR:
case SPRUCE_FENCE:
case SPRUCE_FENCE_GATE:
case SPRUCE_SIGN:
case SPRUCE_STAIRS:
case SPRUCE_TRAPDOOR:
case SPRUCE_WALL_SIGN:
case STONECUTTER:
case STONE_BRICK_STAIRS:
case STONE_BUTTON:
case STONE_STAIRS:
case STRUCTURE_BLOCK:
case SWEET_BERRY_BUSH:
case TNT:
case TRAPPED_CHEST:
case WARPED_BUTTON:
case WARPED_DOOR:
case WARPED_FENCE:
case WARPED_FENCE_GATE:
case WARPED_SIGN:
case WARPED_STAIRS:
case WARPED_TRAPDOOR:
case WARPED_WALL_SIGN:
case WATER_CAULDRON:
case WAXED_CUT_COPPER_STAIRS:
case WAXED_EXPOSED_CUT_COPPER_STAIRS:
case WAXED_OXIDIZED_CUT_COPPER_STAIRS:
case WAXED_WEATHERED_CUT_COPPER_STAIRS:
case WEATHERED_CUT_COPPER_STAIRS:
case WHITE_BED:
case WHITE_CANDLE:
case WHITE_CANDLE_CAKE:
case WHITE_SHULKER_BOX:
case YELLOW_BED:
case YELLOW_CANDLE:
case YELLOW_CANDLE_CAKE:
case YELLOW_SHULKER_BOX:
return true;
default:
return false;
}
}
/**
* @return true if this material is valid as an item
*/
public boolean isValidItem() {
switch (this) {
case ACACIA_WALL_SIGN:
case AIR:
case ATTACHED_MELON_STEM:
case ATTACHED_PUMPKIN_STEM:
case BAMBOO_SAPLING:
case BEETROOTS:
case BIRCH_WALL_SIGN:
case BLACK_WALL_BANNER:
case BLUE_WALL_BANNER:
case BRAIN_CORAL_WALL_FAN:
case BROWN_WALL_BANNER:
case BUBBLE_COLUMN:
case BUBBLE_CORAL_WALL_FAN:
case CARROTS:
case CAVE_AIR:
case COCOA:
case CREEPER_WALL_HEAD:
case CYAN_WALL_BANNER:
case DARK_OAK_WALL_SIGN:
case DEAD_BRAIN_CORAL_WALL_FAN:
case DEAD_BUBBLE_CORAL_WALL_FAN:
case DEAD_FIRE_CORAL_WALL_FAN:
case DEAD_HORN_CORAL_WALL_FAN:
case DEAD_TUBE_CORAL_WALL_FAN:
case DRAGON_WALL_HEAD:
case END_GATEWAY:
case END_PORTAL:
case FARMLAND:
case FIRE: // used to be able to in older versions
case FIRE_CORAL_WALL_FAN:
case FROSTED_ICE:
case GRAY_WALL_BANNER:
case GREEN_WALL_BANNER:
case HORN_CORAL_WALL_FAN:
case JUNGLE_WALL_SIGN:
case KELP_PLANT:
case LAVA:
case LIGHT_BLUE_WALL_BANNER:
case LIGHT_GRAY_WALL_BANNER:
case LIME_WALL_BANNER:
case MAGENTA_WALL_BANNER:
case MELON_STEM:
case MOVING_PISTON:
case NETHER_PORTAL:
case OAK_WALL_SIGN:
case ORANGE_WALL_BANNER:
case PINK_WALL_BANNER:
case PISTON_HEAD:
case PLAYER_WALL_HEAD:
case POTATOES:
case POTTED_ACACIA_SAPLING:
case POTTED_ALLIUM:
case POTTED_AZURE_BLUET:
case POTTED_BAMBOO:
case POTTED_BIRCH_SAPLING:
case POTTED_BLUE_ORCHID:
case POTTED_BROWN_MUSHROOM:
case POTTED_CACTUS:
case POTTED_CORNFLOWER:
case POTTED_DANDELION:
case POTTED_DARK_OAK_SAPLING:
case POTTED_DEAD_BUSH:
case POTTED_FERN:
case POTTED_JUNGLE_SAPLING:
case POTTED_LILY_OF_THE_VALLEY:
case POTTED_OAK_SAPLING:
case POTTED_ORANGE_TULIP:
case POTTED_OXEYE_DAISY:
case POTTED_PINK_TULIP:
case POTTED_POPPY:
case POTTED_RED_MUSHROOM:
case POTTED_RED_TULIP:
case POTTED_SPRUCE_SAPLING:
case POTTED_WHITE_TULIP:
case POTTED_WITHER_ROSE:
case PUMPKIN_STEM:
case PURPLE_WALL_BANNER:
case REDSTONE_WALL_TORCH:
case REDSTONE_WIRE:
case RED_WALL_BANNER:
case SKELETON_WALL_SKULL:
case SPRUCE_WALL_SIGN:
case SWEET_BERRY_BUSH:
case TALL_SEAGRASS:
case TRIPWIRE:
case TUBE_CORAL_WALL_FAN:
case VOID_AIR:
case WALL_TORCH:
case WATER:
case WHITE_WALL_BANNER:
case WITHER_SKELETON_WALL_SKULL:
return false;
default:
break;
}
if (ServerVersion.isServerVersionAtOrBelow(ServerVersion.V1_12)) {
switch (this) {
case ACACIA_WOOD:
case BIRCH_WOOD:
case DARK_OAK_WOOD:
case JUNGLE_WOOD:
case OAK_WOOD:
case SPRUCE_WOOD:
case STRIPPED_ACACIA_WOOD:
case STRIPPED_BIRCH_WOOD:
case STRIPPED_DARK_OAK_WOOD:
case STRIPPED_JUNGLE_WOOD:
case STRIPPED_OAK_WOOD:
case STRIPPED_SPRUCE_WOOD:
return false;
default:
break;
}
}
return true;
}
/**
* @return true if this material is a valid brewing stand ingredient
*/
public boolean isBrewingStandIngredient() {
switch (this) {
case NETHER_WART:
case REDSTONE:
case GLOWSTONE_DUST:
case FERMENTED_SPIDER_EYE:
case GUNPOWDER:
case DRAGON_BREATH:
case SUGAR:
case RABBIT_FOOT:
case GLISTERING_MELON_SLICE:
case SPIDER_EYE:
case PUFFERFISH:
case MAGMA_CREAM:
case GOLDEN_CARROT:
case BLAZE_POWDER:
case GHAST_TEAR:
case TURTLE_HELMET:
case PHANTOM_MEMBRANE:
return true;
}
return false;
}
/**
* @return true if this material is food that can be cooked and is in its cooked state
*/
public boolean isCooked() {
switch (this) {
case BAKED_POTATO:
case COOKED_BEEF:
case COOKED_CHICKEN:
case COOKED_COD:
case COOKED_MUTTON:
case COOKED_PORKCHOP:
case COOKED_RABBIT:
case COOKED_SALMON:
case DRIED_KELP:
return true;
default:
return false;
}
}
/**
* @return true if this material is food that can be cooked and is in its raw state
*/
public boolean isRaw() {
switch (this) {
case BEEF:
case CHICKEN:
case COD:
case KELP: // not edible, but is the raw state of DRIED_KELP
case MUTTON:
case PORKCHOP:
case POTATO:
case RABBIT:
case SALMON:
return true;
default:
return false;
}
}
/**
* @return true if this material is two blocks tall
*/
public boolean isTall() {
switch (this) {
case SUNFLOWER:
case LILAC:
case LARGE_FERN:
case ROSE_BUSH:
case PEONY:
case TALL_GRASS:
return true;
default:
return false;
}
}
/**
* Note: If using this on a legacy server without #getBlockMaterial
* you may run into issues.
*
* @return true if this is a block that has a growth state
*/
public boolean isCrop() {
switch (this) {
case BEETROOTS:
case CACTUS:
case CARROTS:
case CHORUS_FLOWER:
// FROSTED_ICE is Ageable, but not a crop
case KELP:
case MELON_STEM:
case NETHER_WART:
case POTATOES:
case PUMPKIN_STEM:
case SUGAR_CANE:
case WHEAT:
return true;
default:
return false;
}
}
/**
* @return the yield of this crop.
*/
public CompatibleMaterial getCropYield() {
switch (this) {
case BEETROOTS:
return BEETROOT;
case CACTUS:
return CACTUS;
case CARROTS:
return CARROT;
case CHORUS_FLOWER:
return CHORUS_PLANT;
case KELP:
return KELP;
case MELON_STEM:
return MELON;
case NETHER_WART:
return NETHER_WART;
case POTATOES:
return POTATO;
case PUMPKIN_STEM:
return PUMPKIN;
case SUGAR_CANE:
return SUGAR_CANE;
case WHEAT:
return WHEAT;
default:
return null;
}
}
/**
* @return the seed of this crop.
*/
public CompatibleMaterial getCropSeed() {
switch (this) {
case BEETROOTS:
return BEETROOT_SEEDS;
case CACTUS:
return CACTUS;
case CARROTS:
return CARROT;
case CHORUS_PLANT:
return CHORUS_FLOWER;
case KELP:
return KELP;
case MELON_STEM:
return MELON_SEEDS;
case NETHER_WART:
return NETHER_WART;
case POTATOES:
return POTATO;
case PUMPKIN_STEM:
return PUMPKIN_SEEDS;
case SUGAR_CANE:
return SUGAR_CANE;
case WHEAT:
return WHEAT_SEEDS;
default:
return null;
}
}
public static CompatibleMaterial getSpawnEgg(EntityType type) {
if (type == EntityType.MUSHROOM_COW) {
return MOOSHROOM_SPAWN_EGG;
}
if (ServerVersion.isServerVersionBelow(ServerVersion.V1_16) && type == EntityType.valueOf("PIG_ZOMBIE")) {
return ZOMBIE_PIGMAN_SPAWN_EGG;
}
return lookupMap.get(type.name() + "_SPAWN_EGG");
}
public static CompatibleMaterial getGlassPaneColor(int color) {
switch (color) {
case 0:
return WHITE_STAINED_GLASS_PANE;
case 1:
return ORANGE_STAINED_GLASS_PANE;
case 2:
return MAGENTA_STAINED_GLASS_PANE;
case 3:
return LIGHT_BLUE_STAINED_GLASS_PANE;
case 4:
return YELLOW_STAINED_GLASS_PANE;
case 5:
return LIME_STAINED_GLASS_PANE;
case 6:
return PINK_STAINED_GLASS_PANE;
case 7:
return GRAY_STAINED_GLASS_PANE;
case 8:
return LIGHT_GRAY_STAINED_GLASS_PANE;
case 9:
return CYAN_STAINED_GLASS_PANE;
case 10:
return PURPLE_STAINED_GLASS_PANE;
case 11:
return BLUE_STAINED_GLASS_PANE;
case 12:
return BROWN_STAINED_GLASS_PANE;
case 13:
return GREEN_STAINED_GLASS_PANE;
case 14:
return RED_STAINED_GLASS_PANE;
case 15:
return BLACK_STAINED_GLASS_PANE;
default:
return WHITE_STAINED_GLASS;
}
}
public static CompatibleMaterial getGlassColor(int color) {
switch (color) {
case 0:
return WHITE_STAINED_GLASS;
case 1:
return ORANGE_STAINED_GLASS;
case 2:
return MAGENTA_STAINED_GLASS;
case 3:
return LIGHT_BLUE_STAINED_GLASS;
case 4:
return YELLOW_STAINED_GLASS;
case 5:
return LIME_STAINED_GLASS;
case 6:
return PINK_STAINED_GLASS;
case 7:
return GRAY_STAINED_GLASS;
case 8:
return LIGHT_GRAY_STAINED_GLASS;
case 9:
return CYAN_STAINED_GLASS;
case 10:
return PURPLE_STAINED_GLASS;
case 11:
return BLUE_STAINED_GLASS;
case 12:
return BROWN_STAINED_GLASS;
case 13:
return GREEN_STAINED_GLASS;
case 14:
return RED_STAINED_GLASS;
case 15:
return BLACK_STAINED_GLASS;
default:
return WHITE_STAINED_GLASS;
}
}
public static CompatibleMaterial getWoolColor(int color) {
switch (color) {
case 0:
return WHITE_WOOL;
case 1:
return ORANGE_WOOL;
case 2:
return MAGENTA_WOOL;
case 3:
return LIGHT_BLUE_WOOL;
case 4:
return YELLOW_WOOL;
case 5:
return LIME_WOOL;
case 6:
return PINK_WOOL;
case 7:
return GRAY_WOOL;
case 8:
return LIGHT_GRAY_WOOL;
case 9:
return CYAN_WOOL;
case 10:
return PURPLE_WOOL;
case 11:
return BLUE_WOOL;
case 12:
return BROWN_WOOL;
case 13:
return GREEN_WOOL;
case 14:
return RED_WOOL;
case 15:
return BLACK_WOOL;
default:
return WHITE_WOOL;
}
}
public static CompatibleMaterial getDyeColor(int color) {
switch (color) {
case 0:
return BLACK_DYE;
case 1:
return RED_DYE;
case 2:
return GREEN_DYE;
case 3:
return BROWN_DYE;
case 4:
return BLUE_DYE;
case 5:
return PURPLE_DYE;
case 6:
return CYAN_DYE;
case 7:
return LIGHT_GRAY_DYE;
case 8:
return GRAY_DYE;
case 9:
return PINK_DYE;
case 10:
return LIME_DYE;
case 11:
return YELLOW_DYE;
case 12:
return LIGHT_BLUE_DYE;
case 13:
return MAGENTA_DYE;
case 14:
return ORANGE_DYE;
case 15:
return WHITE_DYE;
default:
return WHITE_DYE;
}
}
}