org.diorite.material.Material.java Source code

Java tutorial

Introduction

Here is the source code for org.diorite.material.Material.java

Source

/*
 * The MIT License (MIT)
 *
 * Copyright (c) 2016. Diorite (by Bartomiej Mazur (aka GotoFinal))
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

package org.diorite.material;

import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

import org.diorite.cfg.magic.MagicNumbers;
import org.diorite.inventory.item.meta.ItemMeta;
import org.diorite.material.blocks.*;
import org.diorite.material.blocks.DoubleStoneSlabMat.DoubleStoneSlab2;
import org.diorite.material.blocks.StoneSlabMat.StoneSlab2;
import org.diorite.material.items.*;
import org.diorite.utils.SimpleEnum;
import org.diorite.utils.collections.maps.CaseInsensitiveMap;
import org.diorite.utils.math.DioriteMathUtils;

import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;

@SuppressWarnings("JavaDoc")
public abstract class Material extends MaterialCounters implements SimpleEnum<Material> {
    public static final int MATERIALS_SIZE = 385;

    public static final AirMat AIR = AirMat.AIR;
    public static final StoneMat STONE = StoneMat.STONE;
    public static final GrassMat GRASS = GrassMat.GRASS;
    public static final DirtMat DIRT = DirtMat.DIRT;
    public static final CobblestoneMat COBBLESTONE = CobblestoneMat.COBBLESTONE;
    public static final PlanksMat PLANKS = PlanksMat.PLANKS_OAK;
    public static final SaplingMat SAPLING = SaplingMat.SAPLING_OAK;
    public static final BedrockMat BEDROCK = BedrockMat.BEDROCK;
    public static final WaterMat WATER = WaterMat.WATER_SOURCE;
    public static final WaterMat WATER_STILL = WaterMat.WATER_SOURCE_STILL;
    public static final LavaMat LAVA = LavaMat.LAVA_SOURCE;
    public static final LavaMat LAVA_STILL = LavaMat.LAVA_SOURCE_STILL;
    public static final SandMat SAND = SandMat.SAND;
    public static final GravelMat GRAVEL = GravelMat.GRAVEL;
    public static final GoldOreMat GOLD_ORE = GoldOreMat.GOLD_ORE;
    public static final IronOreMat IRON_ORE = IronOreMat.IRON_ORE;
    public static final CoalOreMat COAL_ORE = CoalOreMat.COAL_ORE;
    public static final LogMat LOG = LogMat.LOG_OAK;
    public static final LogMat LOG2 = LogMat.LOG_ACACIA;
    public static final LeavesMat LEAVES = LeavesMat.LEAVES_OAK;
    public static final LeavesMat LEAVES2 = LeavesMat.LEAVES_ACACIA;
    public static final SpongeMat SPONGE = SpongeMat.SPONGE;
    public static final GlassMat GLASS = GlassMat.GLASS;
    public static final LapisOreMat LAPIS_ORE = LapisOreMat.LAPIS_ORE;
    public static final LapisBlockMat LAPIS_BLOCK = LapisBlockMat.LAPIS_BLOCK;
    public static final DispenserMat DISPENSER = DispenserMat.DISPENSER_DOWN;
    public static final SandstoneMat SANDSTONE = SandstoneMat.SANDSTONE;
    public static final NoteBlockMat NOTEBLOCK = NoteBlockMat.NOTEBLOCK;
    public static final BedBlockMat BED_BLOCK = BedBlockMat.BED_FOOT_SOUTH;
    public static final PoweredRailMat POWERED_RAIL = PoweredRailMat.POWERED_RAIL_NORTH_SOUTH;
    public static final DetectorRailMat DETECTOR_RAIL = DetectorRailMat.DETECTOR_RAIL_NORTH_SOUTH;
    public static final PistonStickyMat PISTON_STICKY = PistonStickyMat.PISTON_STICKY_DOWN;
    public static final CobwebMat WEB = CobwebMat.COBWEB;
    public static final TallGrassMat TALL_GRASS = TallGrassMat.TALL_GRASS_SHRUB;
    public static final DeadBushMat DEAD_BUSH = DeadBushMat.DEAD_BUSH;
    public static final PistonMat PISTON = PistonMat.PISTON_DOWN;
    public static final PistonExtensionMat PISTON_EXTENSION = PistonExtensionMat.PISTON_EXTENSION_DOWN;
    public static final WoolMat WOOL = WoolMat.WOOL_WHITE;
    public static final PistonHeadMat PISTON_HEAD = PistonHeadMat.PISTON_HEAD_DOWN;
    public static final DandelionMat DANDELION = DandelionMat.DANDELION;
    public static final FlowersMat FLOWERS = FlowersMat.FLOWERS_POPPY;
    public static final MushroomBrownMat BROWN_MUSHROOM = MushroomBrownMat.BROWN_MUSHROOM;
    public static final MushroomRedMat RED_MUSHROOM = MushroomRedMat.RED_MUSHROOM;
    public static final GoldBlockMat GOLD_BLOCK = GoldBlockMat.GOLD_BLOCK;
    public static final IronBlockMat IRON_BLOCK = IronBlockMat.IRON_BLOCK;
    public static final DoubleStoneSlabMat DOUBLE_STONE_SLAB = DoubleStoneSlabMat.DOUBLE_STONE_SLAB_STONE;
    public static final DoubleStoneSlabMat DOUBLE_STONE_SLAB2 = DoubleStoneSlabMat.DOUBLE_STONE_SLAB_RED_SANDSTONE;
    public static final StoneSlabMat STONE_SLAB = StoneSlabMat.STONE_SLAB_STONE;
    public static final StoneSlabMat STONE_SLAB2 = StoneSlabMat.STONE_SLAB_RED_SANDSTONE;
    public static final BrickBlockMat BRICK_BLOCK = BrickBlockMat.BRICK_BLOCK;
    public static final TntMat TNT = TntMat.TNT;
    public static final BookshelfMat BOOKSHELF = BookshelfMat.BOOKSHELF;
    public static final MossyCobblestoneMat MOSSY_COBBLESTONE = MossyCobblestoneMat.MOSSY_COBBLESTONE;
    public static final ObsidianMat OBSIDIAN = ObsidianMat.OBSIDIAN;
    public static final TorchMat TORCH = TorchMat.TORCH_EAST;
    public static final FireMat FIRE = FireMat.FIRE_0;
    public static final MobSpawnerMat MOB_SPAWNER = MobSpawnerMat.MOB_SPAWNER;
    public static final OakStairsMat OAK_STAIRS = OakStairsMat.OAK_STAIRS_EAST;
    public static final ChestMat CHEST = ChestMat.CHEST_NORTH;
    public static final RedstoneWireMat REDSTONE_WIRE = RedstoneWireMat.REDSTONE_WIRE_OFF;
    public static final DiamondOreMat DIAMOND_ORE = DiamondOreMat.DIAMOND_ORE;
    public static final DiamondBlockMat DIAMOND_BLOCK = DiamondBlockMat.DIAMOND_BLOCK;
    public static final CraftingTableMat CRAFTING_TABLE = CraftingTableMat.CRAFTING_TABLE;
    public static final WheatBlockMat WHEAT_BLOCK = WheatBlockMat.WHEAT_BLOCK_0;
    public static final FarmlandMat FARMLAND = FarmlandMat.FARMLAND_UNHYDRATED;
    public static final FurnaceMat FURNACE = FurnaceMat.FURNACE_NORTH;
    public static final BurningFurnaceMat BURNING_FURNACE = BurningFurnaceMat.BURNING_FURNACE_NORTH;
    public static final StandingSignMat STANDING_SIGN = StandingSignMat.STANDING_SIGN_SOUTH;
    public static final OakDoorMat OAK_DOOR = OakDoorMat.OAK_DOOR_BOTTOM_EAST;
    public static final LadderMat LADDER = LadderMat.LADDER_NORTH;
    public static final RailMat RAIL = RailMat.RAIL_FLAT_NORTH_SOUTH;
    public static final CobblestoneStairsMat COBBLESTONE_STAIRS = CobblestoneStairsMat.COBBLESTONE_STAIRS_EAST;
    public static final WallSignMat WALL_SIGN = WallSignMat.WALL_SIGN_NORTH;
    public static final LeverMat LEVER = LeverMat.LEVER_DOWN;
    public static final StonePressurePlateMat STONE_PRESSURE_PLATE = StonePressurePlateMat.STONE_PRESSURE_PLATE;
    public static final IronDoorMat IRON_DOOR = IronDoorMat.IRON_DOOR_BOTTOM_EAST;
    public static final WoodenPressurePlateMat WOODEN_PRESSURE_PLATE = WoodenPressurePlateMat.WOODEN_PRESSURE_PLATE;
    public static final RedstoneOreMat REDSTONE_ORE = RedstoneOreMat.REDSTONE_ORE;
    public static final RedstoneOreGlowingMat REDSTONE_ORE_GLOWING = RedstoneOreGlowingMat.REDSTONE_ORE_GLOWING;
    public static final RedstoneTorchOffMat REDSTONE_TORCH_OFF = RedstoneTorchOffMat.REDSTONE_TORCH_OFF_WEST;
    public static final RedstoneTorchOnMat REDSTONE_TORCH_ON = RedstoneTorchOnMat.REDSTONE_TORCH_ON_WEST;
    public static final StoneButtonMat STONE_BUTTON = StoneButtonMat.STONE_BUTTON_DOWN;
    public static final SnowLayerMat SNOW_LAYER = SnowLayerMat.SNOW_LAYER_1;
    public static final IceMat ICE = IceMat.ICE;
    public static final SnowBlockMat SNOW_BLOCK = SnowBlockMat.SNOW_BLOCK;
    public static final CactusMat CACTUS = CactusMat.CACTUS_0;
    public static final ClayBlockMat CLAY_BLOCK = ClayBlockMat.CLAY_BLOCK;
    public static final ReedsBlockMat REEDS_BLOCK = ReedsBlockMat.REEDS_BLOCK_0;
    public static final JukeboxMat JUKEBOX = JukeboxMat.JUKEBOX;
    public static final OakFenceMat OAK_FENCE = OakFenceMat.OAK_FENCE;
    public static final PumpkinMat PUMPKIN = PumpkinMat.PUMPKIN_SOUTH;
    public static final NetherrackMat NETHERRACK = NetherrackMat.NETHERRACK;
    public static final SoulSandMat SOUL_SAND = SoulSandMat.SOUL_SAND;
    public static final GlowstoneMat GLOWSTONE = GlowstoneMat.GLOWSTONE;
    public static final NetherPortalMat NETHER_PORTAL = NetherPortalMat.NETHER_PORTAL_EAST_WEST;
    public static final PumpkinLanternMat PUMPKIN_LANTERN = PumpkinLanternMat.PUMPKIN_LANTERN_SOUTH;
    public static final CakeBlockMat CAKE_BLOCK = CakeBlockMat.CAKE_BLOCK_0;
    public static final RedstoneRepeaterOffMat REPEATER_OFF = RedstoneRepeaterOffMat.REDSTONE_REPEATER_OFF_NORTH_1;
    public static final RedstoneRepeaterOnMat REPEATER_ON = RedstoneRepeaterOnMat.REDSTONE_REPEATER_ON_NORTH_1;
    public static final StainedGlassMat STAINED_GLASS = StainedGlassMat.STAINED_GLASS_WHITE;
    public static final WoodenTrapdoorMat WOODEN_TRAPDOOR = WoodenTrapdoorMat.WOODEN_TRAPDOOR_WEST_BOTTOM;
    public static final MonsterEggTrapMat MONSTER_EGG_TRAP = MonsterEggTrapMat.MONSTER_EGG_TRAP_STONE;
    public static final StoneBrickMat STONE_BRICK = StoneBrickMat.STONE_BRICK;
    public static final BrownMushroomBlockMat BROWN_MUSHROOM_BLOCK = BrownMushroomBlockMat.BROWN_MUSHROOM_BLOCK_PORES_FULL;
    public static final RedMushroomBlockMat RED_MUSHROOM_BLOCK = RedMushroomBlockMat.RED_MUSHROOM_BLOCK_PORES_FULL;
    public static final IronBarsMat IRON_BARS = IronBarsMat.IRON_BARS;
    public static final GlassPaneMat GLASS_PANE = GlassPaneMat.GLASS_PANE;
    public static final MelonBlockMat MELON_BLOCK = MelonBlockMat.MELON_BLOCK;
    public static final PumpkinStemMat PUMPKIN_STEM = PumpkinStemMat.PUMPKIN_STEM_0;
    public static final MelonStemMat MELON_STEM = MelonStemMat.MELON_STEM_0;
    public static final VineMat VINE = VineMat.VINE;
    public static final OakFenceGateMat OAK_FENCE_GATE = OakFenceGateMat.OAK_FENCE_GATE_SOUTH;
    public static final BrickStairsMat BRICK_STAIRS = BrickStairsMat.BRICK_STAIRS_EAST;
    public static final StoneBrickStairsMat STONE_BRICK_STAIRS = StoneBrickStairsMat.STONE_BRICK_STAIRS_EAST;
    public static final MyceliumMat MYCELIUM = MyceliumMat.MYCELIUM;
    public static final WaterLilyMat WATER_LILY = WaterLilyMat.WATER_LILY;
    public static final NetherBrickMat NETHER_BRICK = NetherBrickMat.NETHER_BRICK;
    public static final NetherBrickFenceMat NETHER_BRICK_FENCE = NetherBrickFenceMat.NETHER_BRICK_FENCE;
    public static final NetherBrickStairsMat NETHER_BRICK_STAIRS = NetherBrickStairsMat.NETHER_BRICK_STAIRS_EAST;
    public static final NetherWartBlockMat NETHER_WART_BLOCK = NetherWartBlockMat.NETHER_WART_BLOCK_0;
    public static final EnchantingTableMat ENCHANTING_TABLE = EnchantingTableMat.ENCHANTING_TABLE;
    public static final BrewingStandBlockMat BREWING_STAND_BLOCK = BrewingStandBlockMat.BREWING_STAND_BLOCK_EMPTY;
    public static final CauldronBlockMat CAULDRON_BLOCK = CauldronBlockMat.CAULDRON_BLOCK_EMPTY;
    public static final EndPortalMat END_PORTAL = EndPortalMat.END_PORTAL;
    public static final EndPortalFrameMat END_PORTAL_FRAME = EndPortalFrameMat.END_PORTAL_FRAME_SOUTH;
    public static final EndStoneMat END_STONE = EndStoneMat.END_STONE;
    public static final DragonEggMat DRAGON_EGG = DragonEggMat.DRAGON_EGG;
    public static final RedstoneLampOffMat REDSTONE_LAMP_OFF = RedstoneLampOffMat.REDSTONE_LAMP_OFF;
    public static final RedstoneLampOnMat REDSTONE_LAMP_ON = RedstoneLampOnMat.REDSTONE_LAMP_ON;
    public static final DoubleWoodenSlabMat DOUBLE_WOODEN_SLAB = DoubleWoodenSlabMat.DOUBLE_WOODEN_SLAB_OAK;
    public static final WoodenSlabMat WOODEN_SLAB = WoodenSlabMat.WOODEN_SLAB_OAK;
    public static final CocoaMat COCOA = CocoaMat.COCOA_NORTH_0;
    public static final SandstoneStairsMat SANDSTONE_STAIRS = SandstoneStairsMat.SANDSTONE_STAIRS_EAST;
    public static final EmeraldOreMat EMERALD_ORE = EmeraldOreMat.EMERALD_ORE;
    public static final EnderChestMat ENDER_CHEST = EnderChestMat.ENDER_CHEST_NORTH;
    public static final TripwireHookMat TRIPWIRE_HOOK = TripwireHookMat.TRIPWIRE_HOOK_SOUTH;
    public static final TripwireMat TRIPWIRE = TripwireMat.TRIPWIRE;
    public static final EmeraldBlockMat EMERALD_BLOCK = EmeraldBlockMat.EMERALD_BLOCK;
    public static final SpruceStairsMat SPRUCE_STAIRS = SpruceStairsMat.SPRUCE_STAIRS_EAST;
    public static final BirchStairsMat BIRCH_STAIRS = BirchStairsMat.BIRCH_STAIRS_EAST;
    public static final JungleStairsMat JUNGLE_STAIRS = JungleStairsMat.JUNGLE_STAIRS_EAST;
    public static final CommandBlockMat COMMAND_BLOCK = CommandBlockMat.COMMAND_BLOCK;
    public static final BeaconMat BEACON = BeaconMat.BEACON;
    public static final CobblestoneWallMat COBBLESTONE_WALL = CobblestoneWallMat.COBBLESTONE_WALL;
    public static final FlowerPotBlockMat FLOWER_POT_BLOCK = FlowerPotBlockMat.FLOWER_POT_BLOCK_EMPTY;
    public static final CarrotsBlockMat CARROTS_BLOCK = CarrotsBlockMat.CARROTS_BLOCK_0;
    public static final PotatoesBlockMat POTATOES_BLOCK = PotatoesBlockMat.POTATOES_BLOCK_0;
    public static final WoodenButtonMat WOODEN_BUTTON = WoodenButtonMat.WOODEN_BUTTON_DOWN;
    public static final SkullBlockMat SKULL_BLOCK = SkullBlockMat.SKULL_BLOCK_FLOOR;
    public static final AnvilMat ANVIL = AnvilMat.ANVIL_NORTH_SOUTH_NEW;
    public static final TrappedChestMat TRAPPED_CHEST = TrappedChestMat.TRAPPED_CHEST_NORTH;
    public static final GoldenPressurePlateMat GOLDEN_PRESSURE_PLATE = GoldenPressurePlateMat.GOLDEN_PRESSURE_PLATE_0;
    public static final IronPressurePlateMat IRON_PRESSURE_PLATE = IronPressurePlateMat.IRON_PRESSURE_PLATE_0;
    public static final RedstoneComparatorMat REDSTONE_COMPARATOR = RedstoneComparatorMat.REDSTONE_COMPARATOR_NORTH;
    public static final DaylightDetectorMat DAYLIGHT_DETECTOR = DaylightDetectorMat.DAYLIGHT_DETECTOR_OFF;
    public static final RedstoneBlockMat REDSTONE_BLOCK = RedstoneBlockMat.REDSTONE_BLOCK;
    public static final QuartzOreMat QUARTZ_ORE = QuartzOreMat.QUARTZ_ORE;
    public static final HopperMat HOPPER = HopperMat.HOPPER_DOWN;
    public static final QuartzBlockMat QUARTZ_BLOCK = QuartzBlockMat.QUARTZ_BLOCK;
    public static final QuartzStairsMat QUARTZ_STAIRS = QuartzStairsMat.QUARTZ_STAIRS_EAST;
    public static final ActivatorRailMat ACTIVATOR_RAIL = ActivatorRailMat.ACTIVATOR_RAIL_NORTH_SOUTH;
    public static final DropperMat DROPPER = DropperMat.DROPPER_DOWN;
    public static final StainedHardenedClayMat STAINED_HARDENED_CLAY = StainedHardenedClayMat.STAINED_HARDENED_CLAY_WHITE;
    public static final StainedGlassPaneMat STAINED_GLASS_PANE = StainedGlassPaneMat.STAINED_GLASS_PANE_WHITE;
    public static final AcaciaStairsMat ACACIA_STAIRS = AcaciaStairsMat.ACACIA_STAIRS_EAST;
    public static final DarkOakStairsMat DARK_OAK_STAIRS = DarkOakStairsMat.DARK_OAK_STAIRS_EAST;
    public static final SlimeBlockMat SLIME_BLOCK = SlimeBlockMat.SLIME_BLOCK;
    public static final BarrierMat BARRIER = BarrierMat.BARRIER;
    public static final IronTrapdoorMat IRON_TRAPDOOR = IronTrapdoorMat.IRON_TRAPDOOR_WEST_BOTTOM;
    public static final PrismarineMat PRISMARINE = PrismarineMat.PRISMARINE;
    public static final SeaLanternMat SEA_LANTERN = SeaLanternMat.SEA_LANTERN;
    public static final HayBlockMat HAY_BLOCK = HayBlockMat.HAY_BLOCK_UP_DOWN;
    public static final CarpetMat CARPET = CarpetMat.CARPET_WHITE;
    public static final HardenedClayMat HARDENED_CLAY = HardenedClayMat.HARDENED_CLAY;
    public static final CoalBlockMat COAL_BLOCK = CoalBlockMat.COAL_BLOCK;
    public static final PackedIceMat PACKED_ICE = PackedIceMat.PACKED_ICE;
    public static final DoubleFlowersMat DOUBLE_FLOWERS = DoubleFlowersMat.DOUBLE_FLOWERS_SUNFLOWER;
    public static final StandingBannerMat STANDING_BANNER = StandingBannerMat.STANDING_BANNER_SOUTH;
    public static final WallBannerMat WALL_BANNER = WallBannerMat.WALL_BANNER_NORTH;
    public static final DaylightDetectorInvertedMat DAYLIGHT_DETECTOR_INVERTED = DaylightDetectorInvertedMat.DAYLIGHT_DETECTOR_INVERTED_OFF;
    public static final RedSandstoneMat RED_SANDSTONE = RedSandstoneMat.RED_SANDSTONE;
    public static final RedSandstoneStairsMat RED_SANDSTONE_STAIRS = RedSandstoneStairsMat.RED_SANDSTONE_STAIRS_EAST;
    public static final SpruceFenceGateMat SPRUCE_FENCE_GATE = SpruceFenceGateMat.SPRUCE_FENCE_GATE_SOUTH;
    public static final BirchFenceGateMat BIRCH_FENCE_GATE = BirchFenceGateMat.BIRCH_FENCE_GATE_SOUTH;
    public static final JungleFenceGateMat JUNGLE_FENCE_GATE = JungleFenceGateMat.JUNGLE_FENCE_GATE_SOUTH;
    public static final DarkOakFenceGateMat DARK_OAK_FENCE_GATE = DarkOakFenceGateMat.DARK_OAK_FENCE_GATE_SOUTH;
    public static final AcaciaFenceGateMat ACACIA_FENCE_GATE = AcaciaFenceGateMat.ACACIA_FENCE_GATE_SOUTH;
    public static final SpruceFenceMat SPRUCE_FENCE = SpruceFenceMat.SPRUCE_FENCE;
    public static final BirchFenceMat BIRCH_FENCE = BirchFenceMat.BRICH_FENCE;
    public static final JungleFenceMat JUNGLE_FENCE = JungleFenceMat.JUNGLE_FENCE;
    public static final DarkOakFenceMat DARK_OAK_FENCE = DarkOakFenceMat.DARK_OAK_FENCE;
    public static final AcaciaFenceMat ACACIA_FENCE = AcaciaFenceMat.ACACIA_FENCE;
    public static final SpruceDoorMat SPRUCE_DOOR = SpruceDoorMat.SPRUCE_DOOR_BOTTOM_EAST;
    public static final BirchDoorMat BIRCH_DOOR = BirchDoorMat.BIRCH_DOOR_BOTTOM_EAST;
    public static final JungleDoorMat JUNGLE_DOOR = JungleDoorMat.JUNGLE_DOOR_BOTTOM_EAST;
    public static final AcaciaDoorMat ACACIA_DOOR = AcaciaDoorMat.ACACIA_DOOR_BOTTOM_EAST;
    public static final DarkOakDoorMat DARK_OAK_DOOR = DarkOakDoorMat.DARK_OAK_DOOR_BOTTOM_EAST;
    // ----- Item Separator -----
    public static final IronShovelMat IRON_SHOVEL = IronShovelMat.IRON_SHOVEL;
    public static final IronPickaxeMat IRON_PICKAXE = IronPickaxeMat.IRON_PICKAXE;
    public static final IronAxeMat IRON_AXE = IronAxeMat.IRON_AXE;
    public static final FlintAndSteelMat FLINT_AND_STEEL = FlintAndSteelMat.FLINT_AND_STEEL;
    public static final AppleMat APPLE = AppleMat.APPLE;
    public static final BowMat BOW = BowMat.BOW;
    public static final ArrowMat ARROW = ArrowMat.ARROW;
    public static final CoalMat COAL = CoalMat.COAL;
    public static final DiamondMat DIAMOND = DiamondMat.DIAMOND;
    public static final IronIngotMat IRON_INGOT = IronIngotMat.IRON_INGOT;
    public static final GoldIngotMat GOLD_INGOT = GoldIngotMat.GOLD_INGOT;
    public static final IronSwordMat IRON_SWORD = IronSwordMat.IRON_SWORD;
    public static final WoodenSwordMat WOODEN_SWORD = WoodenSwordMat.WOODEN_SWORD;
    public static final WoodenShovelMat WOODEN_SHOVEL = WoodenShovelMat.WOODEN_SHOVEL;
    public static final WoodenPickaxeMat WOODEN_PICKAXE = WoodenPickaxeMat.WOODEN_PICKAXE;
    public static final WoodenAxeMat WOODEN_AXE = WoodenAxeMat.WOODEN_AXE;
    public static final StoneSwordMat STONE_SWORD = StoneSwordMat.STONE_SWORD;
    public static final StoneShovelMat STONE_SHOVEL = StoneShovelMat.STONE_SHOVEL;
    public static final StonePickaxeMat STONE_PICKAXE = StonePickaxeMat.STONE_PICKAXE;
    public static final StoneAxeMat STONE_AXE = StoneAxeMat.STONE_AXE;
    public static final DiamondSwordMat DIAMOND_SWORD = DiamondSwordMat.DIAMOND_SWORD;
    public static final DiamondShovelMat DIAMOND_SHOVEL = DiamondShovelMat.DIAMOND_SHOVEL;
    public static final DiamondPickaxeMat DIAMOND_PICKAXE = DiamondPickaxeMat.DIAMOND_PICKAXE;
    public static final DiamondAxeMat DIAMOND_AXE = DiamondAxeMat.DIAMOND_AXE;
    public static final StickMat STICK = StickMat.STICK;
    public static final BowlMat BOWL = BowlMat.BOWL;
    public static final MushroomStewMat MUSHROOM_STEW = MushroomStewMat.MUSHROOM_STEW;
    public static final GoldenSwordMat GOLDEN_SWORD = GoldenSwordMat.GOLDEN_SWORD;
    public static final GoldenShovelMat GOLDEN_SHOVEL = GoldenShovelMat.GOLDEN_SHOVEL;
    public static final GoldenPickaxeMat GOLDEN_PICKAXE = GoldenPickaxeMat.GOLDEN_PICKAXE;
    public static final GoldenAxeMat GOLDEN_AXE = GoldenAxeMat.GOLDEN_AXE;
    public static final StringMat STRING = StringMat.STRING;
    public static final FeatherMat FEATHER = FeatherMat.FEATHER;
    public static final GunpowderMat GUNPOWDER = GunpowderMat.GUNPOWDER;
    public static final WoodenHoeMat WOODEN_HOE = WoodenHoeMat.WOODEN_HOE;
    public static final StoneHoeMat STONE_HOE = StoneHoeMat.STONE_HOE;
    public static final IronHoeMat IRON_HOE = IronHoeMat.IRON_HOE;
    public static final DiamondHoeMat DIAMOND_HOE = DiamondHoeMat.DIAMOND_HOE;
    public static final GoldenHoeMat GOLDEN_HOE = GoldenHoeMat.GOLDEN_HOE;
    public static final WheatSeedsMat WHEAT_SEEDS = WheatSeedsMat.WHEAT_SEEDS;
    public static final WheatMat WHEAT = WheatMat.WHEAT;
    public static final BreadMat BREAD = BreadMat.BREAD;
    public static final LeatherHelmetMat LEATHER_HELMET = LeatherHelmetMat.LEATHER_HELMET;
    public static final LeatherChestplateMat LEATHER_CHESTPLATE = LeatherChestplateMat.LEATHER_CHESTPLATE;
    public static final LeatherLeggingsMat LEATHER_LEGGINGS = LeatherLeggingsMat.LEATHER_LEGGINGS;
    public static final LeatherBootsMat LEATHER_BOOTS = LeatherBootsMat.LEATHER_BOOTS;
    public static final ChainmailHelmetMat CHAINMAIL_HELMET = ChainmailHelmetMat.CHAINMAIL_HELMET;
    public static final ChainmailChestplateMat CHAINMAIL_CHESTPLATE = ChainmailChestplateMat.CHAINMAIL_CHESTPLATE;
    public static final ChainmailLeggingsMat CHAINMAIL_LEGGINGS = ChainmailLeggingsMat.CHAINMAIL_LEGGINGS;
    public static final ChainmailBootsMat CHAINMAIL_BOOTS = ChainmailBootsMat.CHAINMAIL_BOOTS;
    public static final IronHelmetMat IRON_HELMET = IronHelmetMat.IRON_HELMET;
    public static final IronChestplateMat IRON_CHESTPLATE = IronChestplateMat.IRON_CHESTPLATE;
    public static final IronLeggingsMat IRON_LEGGINGS = IronLeggingsMat.IRON_LEGGINGS;
    public static final IronBootsMat IRON_BOOTS = IronBootsMat.IRON_BOOTS;
    public static final DiamondHelmetMat DIAMOND_HELMET = DiamondHelmetMat.DIAMOND_HELMET;
    public static final DiamondChestplateMat DIAMOND_CHESTPLATE = DiamondChestplateMat.DIAMOND_CHESTPLATE;
    public static final DiamondLeggingsMat DIAMOND_LEGGINGS = DiamondLeggingsMat.DIAMOND_LEGGINGS;
    public static final DiamondBootsMat DIAMOND_BOOTS = DiamondBootsMat.DIAMOND_BOOTS;
    public static final GoldHelmetMat GOLD_HELMET = GoldHelmetMat.GOLD_HELMET;
    public static final GoldChestplateMat GOLD_CHESTPLATE = GoldChestplateMat.GOLD_CHESTPLATE;
    public static final GoldLeggingsMat GOLD_LEGGINGS = GoldLeggingsMat.GOLD_LEGGINGS;
    public static final GoldBootsMat GOLD_BOOTS = GoldBootsMat.GOLD_BOOTS;
    public static final FlintMat FLINT = FlintMat.FLINT;
    public static final PorkchopMat PORKCHOP = PorkchopMat.PORKCHOP;
    public static final CookedPorkchopMat COOKED_PORKCHOP = CookedPorkchopMat.COOKED_PORKCHOP;
    public static final PaintingMat PAINTING = PaintingMat.PAINTING;
    public static final GoldenAppleMat GOLDEN_APPLE = GoldenAppleMat.GOLDEN_APPLE;
    public static final SignMat SIGN = SignMat.SIGN;
    public static final OakDoorItemMat OAK_DOOR_ITEM = OakDoorItemMat.OAK_DOOR_ITEM;
    public static final BucketMat BUCKET = BucketMat.BUCKET;
    public static final WaterBucketMat WATER_BUCKET = WaterBucketMat.WATER_BUCKET;
    public static final LavaBucketMat LAVA_BUCKET = LavaBucketMat.LAVA_BUCKET;
    public static final MinecartMat MINECART = MinecartMat.MINECART;
    public static final SaddleMat SADDLE = SaddleMat.SADDLE;
    public static final IronDoorItemMat IRON_DOOR_ITEM = IronDoorItemMat.IRON_DOOR_ITEM;
    public static final RedstoneMat REDSTONE = RedstoneMat.REDSTONE;
    public static final SnowballMat SNOWBALL = SnowballMat.SNOWBALL;
    public static final OakBoatMat OAK_BOAT = OakBoatMat.OAK_BOAT;
    public static final LeatherMat LEATHER = LeatherMat.LEATHER;
    public static final MilkBucketMat MILK_BUCKET = MilkBucketMat.MILK_BUCKET;
    public static final BrickMat BRICK = BrickMat.BRICK;
    public static final ClayBallMat CLAY_BALL = ClayBallMat.CLAY_BALL;
    public static final ReedsMat REEDS = ReedsMat.REEDS;
    public static final PaperMat PAPER = PaperMat.PAPER;
    public static final BookMat BOOK = BookMat.BOOK;
    public static final SlimeballMat SLIMEBALL = SlimeballMat.SLIMEBALL;
    public static final ChestMinecartMat CHEST_MINECART = ChestMinecartMat.CHEST_MINECART;
    public static final FurnaceMinecartMat FURNACE_MINECART = FurnaceMinecartMat.FURNACE_MINECART;
    public static final EggMat EGG = EggMat.EGG;
    public static final CompassMat COMPASS = CompassMat.COMPASS;
    public static final FishingRodMat FISHING_ROD = FishingRodMat.FISHING_ROD;
    public static final ClockMat CLOCK = ClockMat.CLOCK;
    public static final GlowstoneDustMat GLOWSTONE_DUST = GlowstoneDustMat.GLOWSTONE_DUST;
    public static final FishMat FISH = FishMat.FISH;
    public static final CookedFishMat COOKED_FISH = CookedFishMat.COOKED_FISH;
    public static final DyeMat DYE = DyeMat.DYE_INK_SAC;
    public static final BoneMat BONE = BoneMat.BONE;
    public static final SugarMat SUGAR = SugarMat.SUGAR;
    public static final CakeMat CAKE = CakeMat.CAKE;
    public static final BedMat BED = BedMat.BED;
    public static final RedstoneRepeaterItemMat REDSTONE_REPEATER_ITEM = RedstoneRepeaterItemMat.REDSTONE_REPEATER_ITEM;
    public static final CookieMat COOKIE = CookieMat.COOKIE;
    public static final FilledMapMat FILLED_MAP = FilledMapMat.FILLED_MAP;
    public static final ShearsMat SHEARS = ShearsMat.SHEARS;
    public static final MelonMat MELON = MelonMat.MELON;
    public static final PumpkinSeedsMat PUMPKIN_SEEDS = PumpkinSeedsMat.PUMPKIN_SEEDS;
    public static final MelonSeedsMat MELON_SEEDS = MelonSeedsMat.MELON_SEEDS;
    public static final BeefMat BEEF = BeefMat.BEEF;
    public static final CookedBeefMat COOKED_BEEF = CookedBeefMat.COOKED_BEEF;
    public static final ChickenMat CHICKEN = ChickenMat.CHICKEN;
    public static final CookedChickenMat COOKED_CHICKEN = CookedChickenMat.COOKED_CHICKEN;
    public static final RottenFleshMat ROTTEN_FLESH = RottenFleshMat.ROTTEN_FLESH;
    public static final EnderPearlMat ENDER_PEARL = EnderPearlMat.ENDER_PEARL;
    public static final BlazeRodMat BLAZE_ROD = BlazeRodMat.BLAZE_ROD;
    public static final GhastTearMat GHAST_TEAR = GhastTearMat.GHAST_TEAR;
    public static final GoldNuggetMat GOLD_NUGGET = GoldNuggetMat.GOLD_NUGGET;
    public static final NetherWartMat NETHER_WART = NetherWartMat.NETHER_WART;
    public static final PotionMat POTION = PotionMat.POTION;
    public static final GlassBottleMat GLASS_BOTTLE = GlassBottleMat.GLASS_BOTTLE;
    public static final SpiderEyeMat SPIDER_EYE = SpiderEyeMat.SPIDER_EYE;
    public static final FermentedSpiderEyeMat FERMENTED_SPIDER_EYE = FermentedSpiderEyeMat.FERMENTED_SPIDER_EYE;
    public static final BlazePowderMat BLAZE_POWDER = BlazePowderMat.BLAZE_POWDER;
    public static final MagmaCreamMat MAGMA_CREAM = MagmaCreamMat.MAGMA_CREAM;
    public static final BrewingStandMat BREWING_STAND = BrewingStandMat.BREWING_STAND;
    public static final CauldronMat CAULDRON = CauldronMat.CAULDRON;
    public static final EnderEyeMat ENDER_EYE = EnderEyeMat.ENDER_EYE;
    public static final SpeckledMelonMat SPECKLED_MELON = SpeckledMelonMat.SPECKLED_MELON;
    public static final SpawnEggMat SPAWN_EGG = SpawnEggMat.SPAWN_EGG_CREEPER;
    public static final ExperienceBottleMat EXPERIENCE_BOTTLE = ExperienceBottleMat.EXPERIENCE_BOTTLE;
    public static final FireChargeMat FIRE_CHARGE = FireChargeMat.FIRE_CHARGE;
    public static final WritableBookMat WRITABLE_BOOK = WritableBookMat.WRITABLE_BOOK;
    public static final WrittenBookMat WRITTEN_BOOK = WrittenBookMat.WRITTEN_BOOK;
    public static final EmeraldMat EMERALD = EmeraldMat.EMERALD;
    public static final ItemFrameMat ITEM_FRAME = ItemFrameMat.ITEM_FRAME;
    public static final FlowerPotMat FLOWER_POT = FlowerPotMat.FLOWER_POT;
    public static final CarrotMat CARROT = CarrotMat.CARROT;
    public static final PotatoMat POTATO = PotatoMat.POTATO;
    public static final BakedPotatoMat BAKED_POTATO = BakedPotatoMat.BAKED_POTATO;
    public static final PoisonousPotatoMat POISONOUS_POTATO = PoisonousPotatoMat.POISONOUS_POTATO;
    public static final MapMat MAP = MapMat.MAP;
    public static final GoldenCarrotMat GOLDEN_CARROT = GoldenCarrotMat.GOLDEN_CARROT;
    public static final SkullMat SKULL = SkullMat.SKULL_SKELETON;
    public static final CarrotOnAStickMat CARROT_ON_A_STICK = CarrotOnAStickMat.CARROT_ON_A_STICK;
    public static final NetherStarMat NETHER_STAR = NetherStarMat.NETHER_STAR;
    public static final PumpkinPieMat PUMPKIN_PIE = PumpkinPieMat.PUMPKIN_PIE;
    public static final FireworksMat FIREWORKS = FireworksMat.FIREWORKS;
    public static final FireworkChargeMat FIREWORK_CHARGE = FireworkChargeMat.FIREWORK_CHARGE;
    public static final EnchantedBookMat ENCHANTED_BOOK = EnchantedBookMat.ENCHANTED_BOOK;
    public static final RedstoneComparatorItemMat REDSTONE_COMPARATOR_ITEM = RedstoneComparatorItemMat.REDSTONE_COMPARATOR_ITEM;
    public static final NetherBrickItemMat NETHER_BRICK_ITEM = NetherBrickItemMat.NETHER_BRICK_ITEM;
    public static final QuartzMat QUARTZ = QuartzMat.QUARTZ;
    public static final TntMinecartMat TNT_MINECART = TntMinecartMat.TNT_MINECART;
    public static final HopperMinecartMat HOPPER_MINECART = HopperMinecartMat.HOPPER_MINECART;
    public static final PrismarineShardMat PRISMARINE_SHARD = PrismarineShardMat.PRISMARINE_SHARD;
    public static final PrismarineCrystalsMat PRISMARINE_CRYSTALS = PrismarineCrystalsMat.PRISMARINE_CRYSTALS;
    public static final RabbitMat RABBIT = RabbitMat.RABBIT;
    public static final CookedRabbitMat COOKED_RABBIT = CookedRabbitMat.COOKED_RABBIT;
    public static final RabbitStewMat RABBIT_STEW = RabbitStewMat.RABBIT_STEW;
    public static final RabbitFootMat RABBIT_FOOT = RabbitFootMat.RABBIT_FOOT;
    public static final RabbitHideMat RABBIT_HIDE = RabbitHideMat.RABBIT_HIDE;
    public static final ArmorStandMat ARMOR_STAND = ArmorStandMat.ARMOR_STAND;
    public static final IronHorseArmorMat IRON_HORSE_ARMOR = IronHorseArmorMat.IRON_HORSE_ARMOR;
    public static final GoldenHorseArmorMat GOLDEN_HORSE_ARMOR = GoldenHorseArmorMat.GOLDEN_HORSE_ARMOR;
    public static final DiamondHorseArmorMat DIAMOND_HORSE_ARMOR = DiamondHorseArmorMat.DIAMOND_HORSE_ARMOR;
    public static final LeadMat LEAD = LeadMat.LEAD;
    public static final NameTagMat NAME_TAG = NameTagMat.NAME_TAG;
    public static final CommandBlockMinecartMat COMMAND_BLOCK_MINECART = CommandBlockMinecartMat.COMMAND_BLOCK_MINECART;
    public static final MuttonMat MUTTON = MuttonMat.MUTTON;
    public static final CookedMuttonMat COOKED_MUTTON = CookedMuttonMat.COOKED_MUTTON;
    public static final BannerMat BANNER = BannerMat.BANNER_BLACK;
    public static final SpruceDoorItemMat SPRUCE_DOOR_ITEM = SpruceDoorItemMat.SPRUCE_DOOR_ITEM;
    public static final BirchDoorItemMat BIRCH_DOOR_ITEM = BirchDoorItemMat.BIRCH_DOOR_ITEM;
    public static final JungleDoorItemMat JUNGLE_DOOR_ITEM = JungleDoorItemMat.JUNGLE_DOOR_ITEM;
    public static final AcaciaDoorItemMat ACACIA_DOOR_ITEM = AcaciaDoorItemMat.ACACIA_DOOR_ITEM;
    public static final DarkOakDoorItemMat DARK_OAK_DOOR_ITEM = DarkOakDoorItemMat.DARK_OAK_DOOR_ITEM;
    public static final SpruceBoatMat SPRUCE_BOAT = SpruceBoatMat.SPRUCE_BOAT;
    public static final BirchBoatMat BIRCH_BOAT = BirchBoatMat.BIRCH_BOAT;
    public static final JungleBoatMat JUNGLE_BOAT = JungleBoatMat.JUNGLE_BOAT;
    public static final AcaciaBoatMat ACACIA_BOAT = AcaciaBoatMat.ACACIA_BOAT;
    public static final DarkOakBoatMat DARK_OAK_BOAT = DarkOakBoatMat.DARK_OAK_BOAT;
    public static final Record13Mat RECORD_13 = Record13Mat.RECORD_13;
    public static final RecordCatMat RECORD_CAT = RecordCatMat.RECORD_CAT;
    public static final RecordBlocksMat RECORD_BLOCKS = RecordBlocksMat.RECORD_BLOCKS;
    public static final RecordChripMat RECORD_CHRIP = RecordChripMat.RECORD_CHRIP;
    public static final RecordFarMat RECORD_FAR = RecordFarMat.RECORD_FAR;
    public static final RecordMallMat RECORD_MALL = RecordMallMat.RECORD_MALL;
    public static final RecordMellohiMat RECORD_MELLOHI = RecordMellohiMat.RECORD_MELLOHI;
    public static final RecordStalMat RECORD_STAL = RecordStalMat.RECORD_STAL;
    public static final RecordStradMat RECORD_STRAD = RecordStradMat.RECORD_STRAD;
    public static final RecordWardMat RECORD_WARD = RecordWardMat.RECORD_WARD;
    public static final Record11Mat RECORD_11 = Record11Mat.RECORD_11;
    public static final RecordWaitMat RECORD_WAIT = RecordWaitMat.RECORD_WAIT;

    private static final Map<String, Material> byName = new CaseInsensitiveMap<>(MATERIALS_SIZE, SMALL_LOAD_FACTOR);
    private static final Map<String, Material> byMinecraftId = new CaseInsensitiveMap<>(MATERIALS_SIZE,
            SMALL_LOAD_FACTOR);
    private static final Int2ObjectMap<Material> byID = new Int2ObjectOpenHashMap<>(MATERIALS_SIZE,
            SMALL_LOAD_FACTOR);

    private final String enumName;
    /**
     * id of this material.
     */
    protected final int id;
    /**
     * minecraft string id of this material.
     */
    protected final String minecraftId;
    /**
     * Max amount of items in item stack of this material.
     */
    protected final int maxStack;
    /**
     * Type name of sub-type.
     */
    protected final String typeName;
    /**
     * id of sub-type.
     */
    protected final short type;
    /**
     * Item meta type of this material.
     */
    protected Class<? extends ItemMeta> metaType = ItemMeta.class;

    protected Material(final String enumName, final int id, final String minecraftId, final String typeName,
            final short type) {
        this(enumName, id, minecraftId, MagicNumbers.ITEMS__DEFAULT_STACK_SIZE, typeName, type);
    }

    protected Material(final String enumName, final int id, final String minecraftId, final int maxStack,
            final String typeName, final short type) {
        this.enumName = enumName;
        this.id = id;
        this.minecraftId = minecraftId;
        this.maxStack = maxStack;
        this.typeName = typeName;
        this.type = type;
    }

    /**
     * Returns amount of all (with subtypes) items registered in diorite.
     *
     * @return amount of all (with subtypes) items registered in diorite.
     */
    public static int getAllItemMaterialsCount() {
        return allItems.get();
    }

    /**
     * Returns amount of all (with subtypes) blocks registered in diorite.
     *
     * @return amount of all (with subtypes) blocks registered in diorite.
     */
    public static int getAllBlockMaterialsCount() {
        return allBlocks.get();
    }

    /**
     * Returns amount of all (with subtypes) blocks and items registered in diorite.
     *
     * @return amount of all (with subtypes) blocks and items registered in diorite.
     */
    public static int getAllMaterialsCount() {
        return allItems.get() + allBlocks.get();
    }

    /**
     * Returns amount of items registered in diorite.
     *
     * @return amount of items registered in diorite.
     */
    public static int getItemMaterialsCount() {
        return items.get();
    }

    /**
     * Returns amount of blocks registered in diorite.
     *
     * @return amount of blocks registered in diorite.
     */
    public static int getBlockMaterialsCount() {
        return blocks.get();
    }

    /**
     * Returns amount of blocks and items registered in diorite.
     *
     * @return amount of blocks and items registered in diorite.
     */
    public static int getMaterialsCount() {
        return items.get() + blocks.get();
    }

    /**
     * Returns block that use largest id, used by diorite in few places.
     *
     * @return block that use largest id, used by diorite in few places.
     */
    public static BlockMaterialData getBlockWithLargestID() {
        return lastBlock;
    }

    @Override
    public String name() {
        return this.enumName;
    }

    @Override
    public int ordinal() {
        return this.id;
    }

    @Override
    public Material byOrdinal(final int ordinal) {
        return byID.get(ordinal);
    }

    @Override
    public Material byName(final String name) {
        return byName.get(name);
    }

    /**
     * Returns sub-id of material, for blocks is in 0-15 range, for items it use 2 bytes.
     *
     * @return sub-id of material
     */
    public int getType() {
        return this.type;
    }

    /**
     * Returns type name of this type of material.
     *
     * @return type name of this type of material.
     */
    public String getTypeName() {
        return this.typeName;
    }

    /**
     * Get subtype of material by its subid/meta.
     *
     * @param type subid of type to get.
     *
     * @return subtype or null if not exist.
     */
    public abstract Material getType(int type);

    /**
     * Get subtype of material by its subid/meta.
     *
     * @param type subid of type to get.
     *
     * @return subtype or null if not exist.
     */
    public abstract Material getType(String type);

    /**
     * @return vanilla minecraft id, fro compatybility.
     */
    public String getMinecraftId() {
        return this.minecraftId;
    }

    /**
     * @return max size of itemstack, client can hold up to 100 items in one slot, but prefered size is 64.
     */
    public int getMaxStack() {
        return this.maxStack;
    }

    /**
     * @return if material is block-type.
     */
    public abstract boolean isBlock();

    /**
     * Returns type of ItemMeta used by this material.
     *
     * @return type of ItemMeta used by this material.
     */
    public Class<? extends ItemMeta> getMetaType() {
        return this.metaType;
    }

    /**
     * Set meta type of this material, can be changed at runtime.
     *
     * @param metaType new meta type of this material.
     */
    public void setMetaType(final Class<? extends ItemMeta> metaType) {
        this.metaType = metaType;
    }

    /**
     * Returns array contains all other (including current one) sub-types of this material.
     *
     * @return array of sub-types.
     */
    public abstract Material[] types();

    /*
     * ==========================================
     * May by replaced with interaction pipeline
     * or some property map.
     * ==========================================
     *
     * public abstract boolean isTransparent();
     *
     * public abstract boolean isFlammable();
     *
     * public abstract boolean isBurnable();
     *
     * public abstract boolean isOccluding();
     *
     * public abstract boolean hasGravity();
     *
     * public abstract boolean isEdible();
     *
     * public abstract boolean isReplaceable();
     *
     * public abstract boolean isGlowing();
     *
     * public abstract int getLuminance();
     *
     * public abstract IntRange getExperienceWhenMined();
     *
     * ==========================================
     * May by replaced with interaction pipeline
     * or some property map.
     * ==========================================
     */

    // TODO: drop pipeline?

    /**
     * Check if given material have this same id as this.
     *
     * @param mat material to check.
     *
     * @return true if this materials use this same id;
     */
    public boolean isThisSameID(final Material mat) {
        return this.id == (mat.getId());
    }

    /**
     * Simple equals for material, it only check enumname without checking sub-type.
     *
     * @param o object to check.
     *
     * @return true if given object is material with this same enum name.
     */
    public final boolean simpleEquals(final Object o) {
        //noinspection ObjectEquality
        if (this == o) {
            return true;
        }
        if (!(o instanceof Material)) {
            return false;
        }

        final Material material = (Material) o;

        return this.enumName.equals(material.enumName);
    }

    @Override
    public int hashCode() {
        return this.enumName.hashCode();
    }

    @Override
    public boolean equals(final Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof Material)) {
            return false;
        }

        final Material material = (Material) o;

        return this.enumName.equals(material.enumName) && this.typeName.equals(material.typeName);
    }

    @Override
    public String toString() {
        return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE).appendSuper(super.toString())
                .append("enumName", this.enumName).append("id", this.id).append("maxStack", this.maxStack)
                .toString();
    }

    /**
     * Returns id of material.
     *
     * @return id of material.
     */
    public int getId() {
        return this.id;
    }

    /**
     * Returns id and meta as one int. {@literal (id << 4) | meta}
     *
     * @return id and meta as one int. {@literal (id << 4) | meta}
     */
    public int getIdAndMeta() {
        return (this.id << 4) | this.type;
    }

    /**
     * Some item's can't be directly added to player inventory,
     * (they will make client crash, thanks Mojang for that). <br>
     * This method will return other simillar item that can be added
     * to inventory, like water bucket for water block. <br>
     * Or will return this same instance if it already can be added. <br>
     * <br>
     * Overriding methods should not change type of returned value
     * as it may change in nex updates.
     *
     * @return item that can be added to inventory.
     */
    public Material ensureValidInventoryItem() {
        return this;
    }

    /**
     * Method will try to find material by given name, converting it to any possible type of id: <br>
     * <ul>
     * <li>{numericId} {@literal ->} like "1" for stone</li>
     * <li>{enumStringId} {@literal ->} like "STONE"</li>
     * <li>{minecraftStringId} {@literal ->} like "minecraft:stone"</li>
     * <li>minecraft:{shortMinecraftStringId} {@literal ->} like "stone"</li>
     * <li>{numericId}:{numericMeta} {@literal ->} like "1:0"</li>
     * <li>{numericId}:{stringMeta} {@literal ->} like "1:diorite"</li>
     * <li>{enumStringId}:{numericMeta} {@literal ->} like "STONE:0"</li>
     * <li>{enumStringId}:{stringMeta} {@literal ->} like "STONE:diorite"</li>
     * <li>{minecraftStringId}:{numericMeta} {@literal ->} like "minecraft:stone:diorite"</li>
     * <li>minecraft:{shortMinecraftStringId}:{numericMeta} {@literal ->} like "stone:diorite"</li>
     * </ul>
     *
     * @param string material name/id to find.
     *
     * @return material or null if it didn't find any.
     *
     * @see #matchMaterial(String, boolean)
     */
    public static Material matchMaterial(final String string) {
        return matchMaterial(string, false);
    }

    /**
     * Method will try to find material by given name, converting it to any possible type of id: <br>
     * <ul>
     * <li>{numericId} {@literal ->} like "1" for stone</li>
     * <li>{enumStringId} {@literal ->} like "STONE"</li>
     * <li>{minecraftStringId} {@literal ->} like "minecraft:stone"</li>
     * <li>minecraft:{shortMinecraftStringId} {@literal ->} like "stone"</li>
     * <li>{numericId}:{numericMeta} {@literal ->} like "1:0"</li>
     * <li>{numericId}:{stringMeta} {@literal ->} like "1:diorite"</li>
     * <li>{enumStringId}:{numericMeta} {@literal ->} like "STONE:0"</li>
     * <li>{enumStringId}:{stringMeta} {@literal ->} like "STONE:diorite"</li>
     * <li>{minecraftStringId}:{numericMeta} {@literal ->} like "minecraft:stone:diorite"</li>
     * <li>minecraft:{shortMinecraftStringId}:{numericMeta} {@literal ->} like "stone:diorite"</li>
     * </ul>
     * With extended mode it will also scan all materials and looks for sub-material with name equals to given string
     * multiple types may have this same sub-material name, so may not return valid material for types like that.
     *
     * @param string   material name/id to find.
     * @param extended if it should use extended mode. (slower)
     *
     * @return material or null if it didn't find any.
     */
    public static Material matchMaterial(String string, final boolean extended) {
        string = StringUtils.replace(string, " ", "_");

        // using simple id
        final Integer i = DioriteMathUtils.asInt(string);
        if (i != null) {
            return getByID(i);
        }

        // find in enum by whole string
        Material result = getByEnumName(string);
        if ((result != null) || (((result = getByMinecraftId(string))) != null)
                || (((result = getByMinecraftId("minecraft:" + string))) != null)) {
            return result;
        }

        // split to [id, meta], where meta can't contains any ":"
        final int index = string.lastIndexOf(':');
        if (index == -1) {
            if (!extended) {
                return string.equalsIgnoreCase("diorite") ? StoneMat.STONE_DIORITE : null;
            }

            for (final Material m : values()) {
                result = m.getType(string);
                if (result != null) {
                    return result;
                }
            }

            // :<
            return null;
        }
        final String idPart = string.substring(0, index);
        final String metaPart = string.substring(index + 1);
        final Integer id = DioriteMathUtils.asInt(idPart);
        final Integer meta = DioriteMathUtils.asInt(metaPart);

        // by numeric id, and numeric or text meta.
        if (id != null) {
            return (meta != null) ? getByID(id, meta) : getByID(id, metaPart);
        }

        if (meta != null) {
            result = getByEnumName(idPart, meta);
            if ((result != null) || (((result = getByMinecraftId(idPart, meta))) != null)
                    || (((result = getByMinecraftId("minecraft:" + idPart, meta))) != null)) {
                return result;
            }
        }
        result = getByEnumName(idPart, metaPart);
        if ((result != null) || (((result = getByMinecraftId(idPart, metaPart))) != null)
                || (((result = getByMinecraftId("minecraft:" + idPart, metaPart))) != null)) {
            return result;
        }

        // :<
        return null;
    }

    /**
     * Method will try to find material by given name, converting it to any possible type of id: <br>
     * <ul>
     * <li>{numericId} {@literal ->} like "1" for stone</li>
     * <li>{enumStringId} {@literal ->} like "STONE"</li>
     * <li>{minecraftStringId} {@literal ->} like "minecraft:stone"</li>
     * <li>minecraft:{shortMinecraftStringId} {@literal ->} like "stone"</li>
     * <li>{numericId}:{numericMeta} {@literal ->} like "1:0"</li>
     * <li>{numericId}:{stringMeta} {@literal ->} like "1:diorite"</li>
     * <li>{enumStringId}:{numericMeta} {@literal ->} like "STONE:0"</li>
     * <li>{enumStringId}:{stringMeta} {@literal ->} like "STONE:diorite"</li>
     * <li>{minecraftStringId}:{numericMeta} {@literal ->} like "minecraft:stone:diorite"</li>
     * <li>minecraft:{shortMinecraftStringId}:{numericMeta} {@literal ->} like "stone:diorite"</li>
     * </ul>
     * With extended mode it will also scan all materials and looks for sub-material with name equals to given string
     * multiple types may have this same sub-material name, so may not return valid material for types like that.
     *
     * @param string                   material name/id to find.
     * @param extended                 if it should use extended mode. (slower)
     * @param ensureValidInventoryItem if it should use {@link #ensureValidInventoryItem()} before returing result.
     *
     * @return material or null if it didn't find any.
     */
    public static Material matchMaterial(final String string, final boolean extended,
            final boolean ensureValidInventoryItem) {
        Material mat = matchMaterial(string, extended);
        if (ensureValidInventoryItem && (mat != null)) {
            mat = mat.ensureValidInventoryItem();
        }
        return mat;
    }

    /**
     * Method will try to find material by given name, converting it to any possible type of id: <br>
     * <ul>
     * <li>{numericId} {@literal ->} like "1" for stone</li>
     * <li>{enumStringId} {@literal ->} like "STONE"</li>
     * <li>{minecraftStringId} {@literal ->} like "minecraft:stone"</li>
     * <li>minecraft:{shortMinecraftStringId} {@literal ->} like "stone"</li>
     * <li>{numericId}:{numericMeta} {@literal ->} like "1:0"</li>
     * <li>{numericId}:{stringMeta} {@literal ->} like "1:diorite"</li>
     * <li>{enumStringId}:{numericMeta} {@literal ->} like "STONE:0"</li>
     * <li>{enumStringId}:{stringMeta} {@literal ->} like "STONE:diorite"</li>
     * <li>{minecraftStringId}:{numericMeta} {@literal ->} like "minecraft:stone:diorite"</li>
     * <li>minecraft:{shortMinecraftStringId}:{numericMeta} {@literal ->} like "stone:diorite"</li>
     * </ul>
     * With extended mode it will also scan all materials and looks for sub-material with name equals to given string
     * multiple types may have this same sub-material name, so may not return valid material for types like that. <br>
     * <br>
     * This methos will also invoke {@link #ensureValidInventoryItem()} before returing result, so it is good for
     * getting materials for items.
     *
     * @param string material name/id to find.
     *
     * @return material or null if it didn't find any.
     *
     * @see #matchMaterial(String, boolean, boolean)
     */
    public static Material matchValidInventoryMaterial(final String string) {
        return matchMaterial(string, false, true);
    }

    /**
     * Method will try to find material by given name, converting it to any possible type of id: <br>
     * <ul>
     * <li>{numericId} {@literal ->} like "1" for stone</li>
     * <li>{enumStringId} {@literal ->} like "STONE"</li>
     * <li>{minecraftStringId} {@literal ->} like "minecraft:stone"</li>
     * <li>minecraft:{shortMinecraftStringId} {@literal ->} like "stone"</li>
     * <li>{numericId}:{numericMeta} {@literal ->} like "1:0"</li>
     * <li>{numericId}:{stringMeta} {@literal ->} like "1:diorite"</li>
     * <li>{enumStringId}:{numericMeta} {@literal ->} like "STONE:0"</li>
     * <li>{enumStringId}:{stringMeta} {@literal ->} like "STONE:diorite"</li>
     * <li>{minecraftStringId}:{numericMeta} {@literal ->} like "minecraft:stone:diorite"</li>
     * <li>minecraft:{shortMinecraftStringId}:{numericMeta} {@literal ->} like "stone:diorite"</li>
     * </ul>
     * With extended mode it will also scan all materials and looks for sub-material with name equals to given string
     * multiple types may have this same sub-material name, so may not return valid material for types like that. <br>
     * <br>
     * This methos will also invoke {@link #ensureValidInventoryItem()} before returing result, so it is good for
     * getting materials for items.
     *
     * @param string   material name/id to find.
     * @param extended if it should use extended mode. (slower)
     *
     * @return material or null if it didn't find any.
     *
     * @see #matchMaterial(String, boolean, boolean)
     */
    public static Material matchValidInventoryMaterial(final String string, final boolean extended) {
        return matchMaterial(string, extended, true);
    }

    /**
     * Returns one of material based on id, may return null
     *
     * @param id id of material.
     *
     * @return one of material or null
     */
    public static Material getByID(final int id) {
        return byID.get(id);
    }

    /**
     * Returns one of material sub-type based on id and meta, may return null
     *
     * @param id   id of material.
     * @param meta sub-id of material.
     *
     * @return one of material or null
     */
    public static Material getByID(final int id, final int meta) {
        final Material mat = byID.get(id);
        if (mat != null) {
            return mat.getType(meta);
        }
        return null;
    }

    /**
     * Returns one of material sub-type based on id and meta, may return null
     *
     * @param id   id of material.
     * @param meta sub-type name of material.
     *
     * @return one of material or null
     */
    public static Material getByID(final int id, final String meta) {
        final Material mat = byID.get(id);
        if (mat != null) {
            return mat.getType(meta);
        }
        return null;
    }

    /**
     * Returns one of material based on enum name, may return null
     *
     * @param name enum name of material.
     *
     * @return one of material or null
     */
    public static Material getByEnumName(final String name) {
        return byName.get(name);
    }

    /**
     * Returns one of material sub-type based on enum name and meta, may return null
     *
     * @param name enum name of material.
     * @param meta sub-id of material.
     *
     * @return one of material or null
     */
    public static Material getByEnumName(final String name, final int meta) {
        final Material mat = byName.get(name);
        if (mat != null) {
            return mat.getType(meta);
        }
        return null;
    }

    /**
     * Returns one of material sub-type based on enum name and meta, may return null
     *
     * @param name enum name of material.
     * @param meta sub-type name of material.
     *
     * @return one of material or null
     */
    public static Material getByEnumName(final String name, final String meta) {
        final Material mat = byName.get(name);
        if (mat != null) {
            return mat.getType(meta);
        }
        return null;
    }

    /**
     * Returns one of material based on minecraft id, may return null
     *
     * @param name minecraft id of material.
     *
     * @return one of material or null
     */
    public static Material getByMinecraftId(final String name) {
        return byMinecraftId.get(name);
    }

    /**
     * Returns one of material based on minecraft id and meta, may return null
     *
     * @param name minecraft id of material.
     * @param meta sub-id of material.
     *
     * @return one of material or null
     */
    public static Material getByMinecraftId(final String name, final int meta) {
        final Material mat = byMinecraftId.get(name);
        if (mat != null) {
            return mat.getType(meta);
        }
        return null;
    }

    /**
     * Returns one of material based on minecraft id and meta, may return null
     *
     * @param name minecraft id of material.
     * @param meta sub-name of material.
     *
     * @return one of material or null
     */
    public static Material getByMinecraftId(final String name, final String meta) {
        final Material mat = byMinecraftId.get(name);
        if (mat != null) {
            return mat.getType(meta);
        }
        return null;
    }

    /**
     * Register new material to diorite.
     *
     * @param element element to register.
     */
    public static void register(final Material element) {
        if (element instanceof ItemMaterialData) {
            items.incrementAndGet();
        } else {
            blocks.incrementAndGet();
            if (lastBlock == null) {
                lastBlock = (BlockMaterialData) element;
            } else if (element.getId() > lastBlock.getId()) {
                BlockMaterialData lasted = (BlockMaterialData) element;
                final BlockMaterialData[] types = lasted.types();
                for (final BlockMaterialData type : types) {
                    if (type.getType() > lasted.getType()) {
                        lasted = type;
                    }
                }
                lastBlock = lasted;
            }
        }
        byID.put(element.ordinal(), element);
        byName.put(element.name(), element);
        byMinecraftId.put(element.getMinecraftId(), element);
    }

    /**
     * @return all values in array.
     */
    public static Material[] values() {
        return byID.values().toArray(new Material[byID.size()]);
    }

    static {
        register(AIR);
        register(STONE);
        register(GRASS);
        register(DIRT);
        register(COBBLESTONE);
        register(PLANKS);
        register(SAPLING);
        register(BEDROCK);
        register(WATER);
        register(WATER_STILL);
        register(LAVA);
        register(LAVA_STILL);
        register(SAND);
        register(GRAVEL);
        register(GOLD_ORE);
        register(IRON_ORE);
        register(COAL_ORE);
        register(LOG);
        register(LEAVES);
        register(SPONGE);
        register(GLASS);
        register(LAPIS_ORE);
        register(LAPIS_BLOCK);
        register(DISPENSER);
        register(SANDSTONE);
        register(NOTEBLOCK);
        register(BED_BLOCK);
        register(POWERED_RAIL);
        register(DETECTOR_RAIL);
        register(PISTON_STICKY);
        register(WEB);
        register(TALL_GRASS);
        register(DEAD_BUSH);
        register(PISTON);
        register(PISTON_EXTENSION);
        register(WOOL);
        register(PISTON_HEAD);
        register(DANDELION);
        register(FLOWERS);
        register(BROWN_MUSHROOM);
        register(RED_MUSHROOM);
        register(GOLD_BLOCK);
        register(IRON_BLOCK);
        register(DOUBLE_STONE_SLAB);
        register(STONE_SLAB);
        register(DoubleStoneSlab2.DOUBLE_STONE_SLAB_RED_SANDSTONE);
        register(StoneSlab2.STONE_SLAB_RED_SANDSTONE);
        register(BRICK_BLOCK);
        register(TNT);
        register(BOOKSHELF);
        register(MOSSY_COBBLESTONE);
        register(OBSIDIAN);
        register(TORCH);
        register(FIRE);
        register(MOB_SPAWNER);
        register(OAK_STAIRS);
        register(CHEST);
        register(REDSTONE_WIRE);
        register(DIAMOND_ORE);
        register(DIAMOND_BLOCK);
        register(CRAFTING_TABLE);
        register(WHEAT_BLOCK);
        register(FARMLAND);
        register(FURNACE);
        register(BURNING_FURNACE);
        register(STANDING_SIGN);
        register(OAK_DOOR);
        register(LADDER);
        register(RAIL);
        register(COBBLESTONE_STAIRS);
        register(WALL_SIGN);
        register(LEVER);
        register(STONE_PRESSURE_PLATE);
        register(IRON_DOOR);
        register(WOODEN_PRESSURE_PLATE);
        register(REDSTONE_ORE);
        register(REDSTONE_ORE_GLOWING);
        register(REDSTONE_TORCH_OFF);
        register(REDSTONE_TORCH_ON);
        register(STONE_BUTTON);
        register(SNOW_LAYER);
        register(ICE);
        register(SNOW_BLOCK);
        register(CACTUS);
        register(CLAY_BLOCK);
        register(REEDS_BLOCK);
        register(JUKEBOX);
        register(OAK_FENCE);
        register(PUMPKIN);
        register(NETHERRACK);
        register(SOUL_SAND);
        register(GLOWSTONE);
        register(NETHER_PORTAL);
        register(PUMPKIN_LANTERN);
        register(CAKE_BLOCK);
        register(REPEATER_OFF);
        register(REPEATER_ON);
        register(STAINED_GLASS);
        register(WOODEN_TRAPDOOR);
        register(MONSTER_EGG_TRAP);
        register(STONE_BRICK);
        register(BROWN_MUSHROOM_BLOCK);
        register(RED_MUSHROOM_BLOCK);
        register(IRON_BARS);
        register(GLASS_PANE);
        register(MELON_BLOCK);
        register(PUMPKIN_STEM);
        register(MELON_STEM);
        register(VINE);
        register(OAK_FENCE_GATE);
        register(BRICK_STAIRS);
        register(STONE_BRICK_STAIRS);
        register(MYCELIUM);
        register(WATER_LILY);
        register(NETHER_BRICK);
        register(NETHER_BRICK_FENCE);
        register(NETHER_BRICK_STAIRS);
        register(NETHER_WART_BLOCK);
        register(ENCHANTING_TABLE);
        register(BREWING_STAND_BLOCK);
        register(CAULDRON_BLOCK);
        register(END_PORTAL);
        register(END_PORTAL_FRAME);
        register(END_STONE);
        register(DRAGON_EGG);
        register(REDSTONE_LAMP_OFF);
        register(REDSTONE_LAMP_ON);
        register(DOUBLE_WOODEN_SLAB);
        register(WOODEN_SLAB);
        register(COCOA);
        register(SANDSTONE_STAIRS);
        register(EMERALD_ORE);
        register(ENDER_CHEST);
        register(TRIPWIRE_HOOK);
        register(TRIPWIRE);
        register(EMERALD_BLOCK);
        register(SPRUCE_STAIRS);
        register(BIRCH_STAIRS);
        register(JUNGLE_STAIRS);
        register(COMMAND_BLOCK);
        register(BEACON);
        register(COBBLESTONE_WALL);
        register(FLOWER_POT_BLOCK);
        register(CARROTS_BLOCK);
        register(POTATOES_BLOCK);
        register(WOODEN_BUTTON);
        register(SKULL_BLOCK);
        register(ANVIL);
        register(TRAPPED_CHEST);
        register(GOLDEN_PRESSURE_PLATE);
        register(IRON_PRESSURE_PLATE);
        register(REDSTONE_COMPARATOR);
        register(DAYLIGHT_DETECTOR);
        register(REDSTONE_BLOCK);
        register(QUARTZ_ORE);
        register(HOPPER);
        register(QUARTZ_BLOCK);
        register(QUARTZ_STAIRS);
        register(ACTIVATOR_RAIL);
        register(DROPPER);
        register(STAINED_HARDENED_CLAY);
        register(STAINED_GLASS_PANE);
        register(LeavesMat.LEAVES_ACACIA);
        register(LogMat.LOG_ACACIA);
        register(ACACIA_STAIRS);
        register(DARK_OAK_STAIRS);
        register(SLIME_BLOCK);
        register(BARRIER);
        register(IRON_TRAPDOOR);
        register(PRISMARINE);
        register(SEA_LANTERN);
        register(HAY_BLOCK);
        register(CARPET);
        register(HARDENED_CLAY);
        register(COAL_BLOCK);
        register(PACKED_ICE);
        register(DOUBLE_FLOWERS);
        register(STANDING_BANNER);
        register(WALL_BANNER);
        register(DAYLIGHT_DETECTOR_INVERTED);
        register(RED_SANDSTONE);
        register(RED_SANDSTONE_STAIRS);
        register(SPRUCE_FENCE_GATE);
        register(BIRCH_FENCE_GATE);
        register(JUNGLE_FENCE_GATE);
        register(DARK_OAK_FENCE_GATE);
        register(ACACIA_FENCE_GATE);
        register(SPRUCE_FENCE);
        register(BIRCH_FENCE);
        register(JUNGLE_FENCE);
        register(DARK_OAK_FENCE);
        register(ACACIA_FENCE);
        register(SPRUCE_DOOR);
        register(BIRCH_DOOR);
        register(JUNGLE_DOOR);
        register(ACACIA_DOOR);
        register(DARK_OAK_DOOR);
        register(IRON_SHOVEL);
        register(IRON_PICKAXE);
        register(IRON_AXE);
        register(FLINT_AND_STEEL);
        register(APPLE);
        register(BOW);
        register(ARROW);
        register(COAL);
        register(DIAMOND);
        register(IRON_INGOT);
        register(GOLD_INGOT);
        register(IRON_SWORD);
        register(WOODEN_SWORD);
        register(WOODEN_SHOVEL);
        register(WOODEN_PICKAXE);
        register(WOODEN_AXE);
        register(STONE_SWORD);
        register(STONE_SHOVEL);
        register(STONE_PICKAXE);
        register(STONE_AXE);
        register(DIAMOND_SWORD);
        register(DIAMOND_SHOVEL);
        register(DIAMOND_PICKAXE);
        register(DIAMOND_AXE);
        register(STICK);
        register(BOWL);
        register(MUSHROOM_STEW);
        register(GOLDEN_SWORD);
        register(GOLDEN_SHOVEL);
        register(GOLDEN_PICKAXE);
        register(GOLDEN_AXE);
        register(STRING);
        register(FEATHER);
        register(GUNPOWDER);
        register(WOODEN_HOE);
        register(STONE_HOE);
        register(IRON_HOE);
        register(DIAMOND_HOE);
        register(GOLDEN_HOE);
        register(WHEAT_SEEDS);
        register(WHEAT);
        register(BREAD);
        register(LEATHER_HELMET);
        register(LEATHER_CHESTPLATE);
        register(LEATHER_LEGGINGS);
        register(LEATHER_BOOTS);
        register(CHAINMAIL_HELMET);
        register(CHAINMAIL_CHESTPLATE);
        register(CHAINMAIL_LEGGINGS);
        register(CHAINMAIL_BOOTS);
        register(IRON_HELMET);
        register(IRON_CHESTPLATE);
        register(IRON_LEGGINGS);
        register(IRON_BOOTS);
        register(DIAMOND_HELMET);
        register(DIAMOND_CHESTPLATE);
        register(DIAMOND_LEGGINGS);
        register(DIAMOND_BOOTS);
        register(GOLD_HELMET);
        register(GOLD_CHESTPLATE);
        register(GOLD_LEGGINGS);
        register(GOLD_BOOTS);
        register(FLINT);
        register(PORKCHOP);
        register(COOKED_PORKCHOP);
        register(PAINTING);
        register(GOLDEN_APPLE);
        register(SIGN);
        register(OAK_DOOR_ITEM);
        register(BUCKET);
        register(WATER_BUCKET);
        register(LAVA_BUCKET);
        register(MINECART);
        register(SADDLE);
        register(IRON_DOOR_ITEM);
        register(REDSTONE);
        register(SNOWBALL);
        register(OAK_BOAT);
        register(LEATHER);
        register(MILK_BUCKET);
        register(BRICK);
        register(CLAY_BALL);
        register(REEDS);
        register(PAPER);
        register(BOOK);
        register(SLIMEBALL);
        register(CHEST_MINECART);
        register(FURNACE_MINECART);
        register(EGG);
        register(COMPASS);
        register(FISHING_ROD);
        register(CLOCK);
        register(GLOWSTONE_DUST);
        register(FISH);
        register(COOKED_FISH);
        register(DYE);
        register(BONE);
        register(SUGAR);
        register(CAKE);
        register(BED);
        register(REDSTONE_REPEATER_ITEM);
        register(COOKIE);
        register(FILLED_MAP);
        register(SHEARS);
        register(MELON);
        register(PUMPKIN_SEEDS);
        register(MELON_SEEDS);
        register(BEEF);
        register(COOKED_BEEF);
        register(CHICKEN);
        register(COOKED_CHICKEN);
        register(ROTTEN_FLESH);
        register(ENDER_PEARL);
        register(BLAZE_ROD);
        register(GHAST_TEAR);
        register(GOLD_NUGGET);
        register(NETHER_WART);
        register(POTION);
        register(GLASS_BOTTLE);
        register(SPIDER_EYE);
        register(FERMENTED_SPIDER_EYE);
        register(BLAZE_POWDER);
        register(MAGMA_CREAM);
        register(BREWING_STAND);
        register(CAULDRON);
        register(ENDER_EYE);
        register(SPECKLED_MELON);
        register(SPAWN_EGG);
        register(EXPERIENCE_BOTTLE);
        register(FIRE_CHARGE);
        register(WRITABLE_BOOK);
        register(WRITTEN_BOOK);
        register(EMERALD);
        register(ITEM_FRAME);
        register(FLOWER_POT);
        register(CARROT);
        register(POTATO);
        register(BAKED_POTATO);
        register(POISONOUS_POTATO);
        register(MAP);
        register(GOLDEN_CARROT);
        register(SKULL);
        register(CARROT_ON_A_STICK);
        register(NETHER_STAR);
        register(PUMPKIN_PIE);
        register(FIREWORKS);
        register(FIREWORK_CHARGE);
        register(ENCHANTED_BOOK);
        register(REDSTONE_COMPARATOR_ITEM);
        register(NETHER_BRICK_ITEM);
        register(QUARTZ);
        register(TNT_MINECART);
        register(HOPPER_MINECART);
        register(PRISMARINE_SHARD);
        register(PRISMARINE_CRYSTALS);
        register(RABBIT);
        register(COOKED_RABBIT);
        register(RABBIT_STEW);
        register(RABBIT_FOOT);
        register(RABBIT_HIDE);
        register(ARMOR_STAND);
        register(IRON_HORSE_ARMOR);
        register(GOLDEN_HORSE_ARMOR);
        register(DIAMOND_HORSE_ARMOR);
        register(LEAD);
        register(NAME_TAG);
        register(COMMAND_BLOCK_MINECART);
        register(MUTTON);
        register(COOKED_MUTTON);
        register(BANNER);
        register(SPRUCE_DOOR_ITEM);
        register(BIRCH_DOOR_ITEM);
        register(JUNGLE_DOOR_ITEM);
        register(ACACIA_DOOR_ITEM);
        register(DARK_OAK_DOOR_ITEM);
        register(SPRUCE_BOAT);
        register(BIRCH_BOAT);
        register(JUNGLE_BOAT);
        register(ACACIA_BOAT);
        register(DARK_OAK_BOAT);
        register(RECORD_13);
        register(RECORD_CAT);
        register(RECORD_BLOCKS);
        register(RECORD_CHRIP);
        register(RECORD_FAR);
        register(RECORD_MALL);
        register(RECORD_MELLOHI);
        register(RECORD_STAL);
        register(RECORD_STRAD);
        register(RECORD_WARD);
        register(RECORD_11);
        register(RECORD_WAIT);
    }
}