<?php

/*
 *
 *  ____            _        _   __  __ _                  __  __ ____  
 * |  _ \ ___   ___| | _____| |_|  \/  (_)_ __   ___      |  \/  |  _ \ 
 * | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
 * |  __/ (_) | (__|   <  __/ |_| |  | | | | | |  __/_____| |  | |  __/ 
 * |_|   \___/ \___|_|\_\___|\__|_|  |_|_|_| |_|\___|     |_|  |_|_| 
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * @author PocketMine Team
 * @link http://www.pocketmine.net/
 *
 *
*/

/**
 * All the Item classes
 */
namespace pocketmine\item;
use pocketmine\entity\Creeper;
use pocketmine\entity\Skeleton;
use pocketmine\entity\Spider;
use pocketmine\block\Block;
use pocketmine\block\Flower;
use pocketmine\entity\Entity;
use pocketmine\entity\Squid;
use pocketmine\entity\Villager;
use pocketmine\entity\Zombie;
use pocketmine\entity\Chicken;
use pocketmine\entity\Sheep;
use pocketmine\entity\Pig;
use pocketmine\entity\Wolf;
use pocketmine\entity\Cow;
use pocketmine\entity\Mooshroom;
use pocketmine\inventory\Fuel;
use pocketmine\level\Level;
use pocketmine\Player;
use pocketmine\entity\PigZombie;
use pocketmine\entity\Slime;
use pocketmine\entity\Enderman;
use pocketmine\entity\Silverfish;
class Item{
	//All Block IDs are here too
	const AIR = 0;
	const STONE = 1;
	const GRASS = 2;
	const DIRT = 3;
	const COBBLESTONE = 4;
	const COBBLE = 4;
	const PLANK = 5;
	const PLANKS = 5;
	const WOODEN_PLANK = 5;
	const WOODEN_PLANKS = 5;
	const SAPLING = 6;
	const SAPLINGS = 6;
	const BEDROCK = 7;
	const WATER = 8;
	const STILL_WATER = 9;
	const LAVA = 10;
	const STILL_LAVA = 11;
	const SAND = 12;
	const GRAVEL = 13;
	const GOLD_ORE = 14;
	const IRON_ORE = 15;
	const COAL_ORE = 16;
	const LOG = 17;
	const WOOD = 17;
	const TRUNK = 17;
	const LEAVES = 18;
	const LEAVE = 18;
	const SPONGE = 19;
	const GLASS = 20;
	const LAPIS_ORE = 21;
	const LAPIS_BLOCK = 22;

	const SANDSTONE = 24;

	const BED_BLOCK = 26;


	const COBWEB = 30;
	const TALL_GRASS = 31;
	const BUSH = 32;
	const DEAD_BUSH = 32;
	const WOOL = 35;
	const DANDELION = 37;
	const POPPY = 38;
	const ROSE = 38;
	const RED_FLOWER = 38;
	const BROWN_MUSHROOM = 39;
	const RED_MUSHROOM = 40;
	const GOLD_BLOCK = 41;
	const IRON_BLOCK = 42;
	const DOUBLE_SLAB = 43;
	const DOUBLE_SLABS = 43;
	const SLAB = 44;
	const SLABS = 44;
	const BRICKS = 45;
	const BRICKS_BLOCK = 45;
	const TNT = 46;
	const BOOKSHELF = 47;
	const MOSS_STONE = 48;
	const MOSSY_STONE = 48;
	const OBSIDIAN = 49;
	const TORCH = 50;
	const FIRE = 51;
	const MONSTER_SPAWNER = 52;
	const WOOD_STAIRS = 53;
	const WOODEN_STAIRS = 53;
	const OAK_WOOD_STAIRS = 53;
	const OAK_WOODEN_STAIRS = 53;
	const CHEST = 54;

	const DIAMOND_ORE = 56;
	const DIAMOND_BLOCK = 57;
	const CRAFTING_TABLE = 58;
	const WORKBENCH = 58;
	const WHEAT_BLOCK = 59;
	const FARMLAND = 60;
	const FURNACE = 61;
	const BURNING_FURNACE = 62;
	const LIT_FURNACE = 62;
	const SIGN_POST = 63;
	const DOOR_BLOCK = 64;
	const WOODEN_DOOR_BLOCK = 64;
	const WOOD_DOOR_BLOCK = 64;
	const LADDER = 65;

	const COBBLE_STAIRS = 67;
	const COBBLESTONE_STAIRS = 67;
	const WALL_SIGN = 68;

	const IRON_DOOR_BLOCK = 71;

	const REDSTONE_ORE = 73;
	const GLOWING_REDSTONE_ORE = 74;
	const LIT_REDSTONE_ORE = 74;

	const SNOW = 78;
	const SNOW_LAYER = 78;
	const ICE = 79;
	const SNOW_BLOCK = 80;
	const CACTUS = 81;
	const CLAY_BLOCK = 82;
	const REEDS = 83;
	const SUGARCANE_BLOCK = 83;

	const FENCE = 85;
	const PUMPKIN = 86;
	const NETHERRACK = 87;
	const SOUL_SAND = 88;
	const GLOWSTONE = 89;
	const GLOWSTONE_BLOCK = 89;


	const LIT_PUMPKIN = 91;
	const JACK_O_LANTERN = 91;
	const CAKE_BLOCK = 92;

	const TRAPDOOR = 96;

	const STONE_BRICKS = 98;
	const STONE_BRICK = 98;

	const IRON_BAR = 101;
	const IRON_BARS = 101;
	const GLASS_PANE = 102;
	const GLASS_PANEL = 102;
	const MELON_BLOCK = 103;
	const PUMPKIN_STEM = 104;
	const MELON_STEM = 105;
	const VINE = 106;
	const VINES = 106;
	const FENCE_GATE = 107;
	const BRICK_STAIRS = 108;
	const STONE_BRICK_STAIRS = 109;
	const MYCELIUM = 110;
	const WATER_LILY = 111;
	const LILY_PAD = 111;
	const NETHER_BRICKS = 112;
	const NETHER_BRICK_BLOCK = 112;

	const NETHER_BRICKS_STAIRS = 114;

	const END_PORTAL = 120;
	const END_STONE = 121;

	const SANDSTONE_STAIRS = 128;
	const EMERALD_ORE = 129;

	const EMERALD_BLOCK = 133;
	const SPRUCE_WOOD_STAIRS = 134;
	const SPRUCE_WOODEN_STAIRS = 134;
	const BIRCH_WOOD_STAIRS = 135;
	const BIRCH_WOODEN_STAIRS = 135;
	const JUNGLE_WOOD_STAIRS = 136;
	const JUNGLE_WOODEN_STAIRS = 136;

	const COBBLE_WALL = 139;
	const STONE_WALL = 139;
	const COBBLESTONE_WALL = 139;

	const CARROT_BLOCK = 141;
	const POTATO_BLOCK = 142;

	const REDSTONE_BLOCK = 152;

	const QUARTZ_BLOCK = 155;
	const QUARTZ_STAIRS = 156;
	const DOUBLE_WOOD_SLAB = 157;
	const DOUBLE_WOODEN_SLAB = 157;
	const DOUBLE_WOOD_SLABS = 157;
	const DOUBLE_WOODEN_SLABS = 157;
	const WOOD_SLAB = 158;
	const WOODEN_SLAB = 158;
	const WOOD_SLABS = 158;
	const WOODEN_SLABS = 158;
	const STAINED_CLAY = 159;
	const STAINED_HARDENED_CLAY = 159;

	const LEAVES2 = 161;
	const LEAVE2 = 161;
	const WOOD2 = 162;
	const TRUNK2 = 162;
	const LOG2 = 162;
	const ACACIA_WOOD_STAIRS = 163;
	const ACACIA_WOODEN_STAIRS = 163;
	const DARK_OAK_WOOD_STAIRS = 164;
	const DARK_OAK_WOODEN_STAIRS = 164;

	const HAY_BALE = 170;
	const CARPET = 171;
	const HARDENED_CLAY = 172;
	const COAL_BLOCK = 173;

	const DOUBLE_PLANT = 175;

	const FENCE_GATE_SPRUCE = 183;
	const FENCE_GATE_BIRCH = 184;
	const FENCE_GATE_JUNGLE = 185;
	const FENCE_GATE_DARK_OAK = 186;
	const FENCE_GATE_ACACIA = 187;

	const GRASS_PATH = 198;

	const PODZOL = 243;
	const BEETROOT_BLOCK = 244;
	const STONECUTTER = 245;
	const GLOWING_OBSIDIAN = 246;
	const NETHER_REACTOR = 247;


	//Normal Item IDs

	const IRON_SHOVEL = 256; //
	const IRON_PICKAXE = 257; //
	const IRON_AXE = 258; //
	const FLINT_STEEL = 259; //
	const FLINT_AND_STEEL = 259; //
	const APPLE = 260; //
	const BOW = 261;
	const ARROW = 262;
	const COAL = 263; //
	const DIAMOND = 264; //
	const IRON_INGOT = 265; //
	const GOLD_INGOT = 266; //
	const IRON_SWORD = 267;
	const WOODEN_SWORD = 268; //
	const WOODEN_SHOVEL = 269; //
	const WOODEN_PICKAXE = 270; //
	const WOODEN_AXE = 271; //
	const STONE_SWORD = 272;
	const STONE_SHOVEL = 273;
	const STONE_PICKAXE = 274;
	const STONE_AXE = 275;
	const DIAMOND_SWORD = 276;
	const DIAMOND_SHOVEL = 277;
	const DIAMOND_PICKAXE = 278;
	const DIAMOND_AXE = 279;
	const STICK = 280; //
	const STICKS = 280;
	const BOWL = 281; //
	const MUSHROOM_STEW = 282;
	const GOLD_SWORD = 283;
	const GOLD_SHOVEL = 284;
	const GOLD_PICKAXE = 285;
	const GOLD_AXE = 286;
	const GOLDEN_SWORD = 283;
	const GOLDEN_SHOVEL = 284;
	const GOLDEN_PICKAXE = 285;
	const GOLDEN_AXE = 286;
	const STRING = 287;
	const FEATHER = 288; //
	const GUNPOWDER = 289;
	const WOODEN_HOE = 290;
	const STONE_HOE = 291;
	const IRON_HOE = 292; //
	const DIAMOND_HOE = 293;
	const GOLD_HOE = 294;
	const GOLDEN_HOE = 294;
	const SEEDS = 295;
	const WHEAT_SEEDS = 295;
	const WHEAT = 296;
	const BREAD = 297;
	const LEATHER_CAP = 298;
	const LEATHER_TUNIC = 299;
	const LEATHER_PANTS = 300;
	const LEATHER_BOOTS = 301;
	const CHAIN_HELMET = 302;
	const CHAIN_CHESTPLATE = 303;
	const CHAIN_LEGGINGS = 304;
	const CHAIN_BOOTS = 305;
	const IRON_HELMET = 306;
	const IRON_CHESTPLATE = 307;
	const IRON_LEGGINGS = 308;
	const IRON_BOOTS = 309;
	const DIAMOND_HELMET = 310;
	const DIAMOND_CHESTPLATE = 311;
	const DIAMOND_LEGGINGS = 312;
	const DIAMOND_BOOTS = 313;
	const GOLD_HELMET = 314;
	const GOLD_CHESTPLATE = 315;
	const GOLD_LEGGINGS = 316;
	const GOLD_BOOTS = 317;
	const FLINT = 318;
	const RAW_PORKCHOP = 319;
	const COOKED_PORKCHOP = 320;
	const PAINTING = 321;
	const GOLDEN_APPLE = 322;
	const SIGN = 323;
	const WOODEN_DOOR = 324;
	const BUCKET = 325;

	const MINECART = 328;

	const IRON_DOOR = 330;
	const REDSTONE = 331;
	const REDSTONE_DUST = 331;
	const SNOWBALL = 332;

	const LEATHER = 334;

	const BRICK = 336;
	const CLAY = 337;
	const SUGARCANE = 338;
	const SUGAR_CANE = 338;
	const SUGAR_CANES = 338;
	const PAPER = 339;
	const BOOK = 340;
	const SLIMEBALL = 341;

	const EGG = 344;
	const COMPASS = 345;

	const CLOCK = 347;
	const GLOWSTONE_DUST = 348;
	const RAW_FISH = 349;
	const COOKED_FISH = 350;
	const DYE = 351;
	const BONE = 352;
	const SUGAR = 353;
	const CAKE = 354;
	const BED = 355;


	const COOKIE = 357;


	const SHEARS = 359;
	const MELON = 360;
	const MELON_SLICE = 360;
	const PUMPKIN_SEEDS = 361;
	const MELON_SEEDS = 362;
	const RAW_BEEF = 363;
	const STEAK = 364;
	const COOKED_BEEF = 364;

	const RAW_CHICKEN = 365;
	const COOKED_CHICKEN = 366;

	const SPAWN_EGG = 383;

	const EMERALD = 388;

	const CARROT = 391;
	const CARROTS = 391;
	const POTATO = 392;
	const POTATOES = 392;
	const BAKED_POTATO = 393;
	const BAKED_POTATOES = 393;

	const PUMPKIN_PIE = 400;

	const NETHER_BRICK = 405;
	const QUARTZ = 406;
	const NETHER_QUARTZ = 406;

	const CAMERA = 456;
	const BEETROOT = 457;
	const BEETROOT_SEEDS = 458;
	const BEETROOT_SEED = 458;
	const BEETROOT_SOUP = 459;


	/** @var \SplFixedArray */
	public static $list = \null;
	protected $block;
	protected $id;
	protected $meta;
	public $count;
	protected $durability = 0;
	protected $name;

	public function canBeActivated(){
		return \false;
	}

	public static function init(){
		if(self::$list === \null){
			self::$list = new \SplFixedArray(65536);
			self::$list[self::SUGARCANE] = Sugarcane::class;
			self::$list[self::WHEAT_SEEDS] = WheatSeeds::class;
			self::$list[self::PUMPKIN_SEEDS] = PumpkinSeeds::class;
			self::$list[self::MELON_SEEDS] = MelonSeeds::class;
			self::$list[self::MUSHROOM_STEW] = MushroomStew::class;
			self::$list[self::BEETROOT_SOUP] = BeetrootSoup::class;
			self::$list[self::CARROT] = Carrot::class;
			self::$list[self::POTATO] = Potato::class;
			self::$list[self::BEETROOT_SEEDS] = BeetrootSeeds::class;
			self::$list[self::SIGN] = Sign::class;
			self::$list[self::WOODEN_DOOR] = WoodenDoor::class;
			self::$list[self::BUCKET] = Bucket::class;
			self::$list[self::IRON_DOOR] = IronDoor::class;
			self::$list[self::CAKE] = Cake::class;
			self::$list[self::BED] = Bed::class;
			self::$list[self::PAINTING] = Painting::class;
			self::$list[self::COAL] = Coal::class;
			self::$list[self::APPLE] = Apple::class;
			self::$list[self::SPAWN_EGG] = SpawnEgg::class;
			self::$list[self::DIAMOND] = Diamond::class;
			self::$list[self::STICK] = Stick::class;
			self::$list[self::SNOWBALL] = Snowball::class;
			self::$list[self::BOWL] = Bowl::class;
			self::$list[self::FEATHER] = Feather::class;
			self::$list[self::BRICK] = Brick::class;
			self::$list[self::LEATHER_CAP] = LeatherCap::class;
			self::$list[self::LEATHER_TUNIC] = LeatherTunic::class;
			self::$list[self::LEATHER_PANTS] = LeatherPants::class;
			self::$list[self::LEATHER_BOOTS] = LeatherBoots::class;
			self::$list[self::CHAIN_HELMET] = ChainHelmet::class;
			self::$list[self::CHAIN_CHESTPLATE] = ChainChestplate::class;
			self::$list[self::CHAIN_LEGGINGS] = ChainLeggings::class;
			self::$list[self::CHAIN_BOOTS] = ChainBoots::class;
			self::$list[self::IRON_HELMET] = IronHelmet::class;
			self::$list[self::IRON_CHESTPLATE] = IronChestplate::class;
			self::$list[self::IRON_LEGGINGS] = IronLeggings::class;
			self::$list[self::IRON_BOOTS] = IronBoots::class;
			self::$list[self::GOLD_HELMET] = GoldHelmet::class;
			self::$list[self::GOLD_CHESTPLATE] = GoldChestplate::class;
			self::$list[self::GOLD_LEGGINGS] = GoldLeggings::class;
			self::$list[self::GOLD_BOOTS] = GoldBoots::class;
			self::$list[self::DIAMOND_HELMET] = DiamondHelmet::class;
			self::$list[self::DIAMOND_CHESTPLATE] = DiamondChestplate::class;
			self::$list[self::DIAMOND_LEGGINGS] = DiamondLeggings::class;
			self::$list[self::DIAMOND_BOOTS] = DiamondBoots::class;
			self::$list[self::IRON_SWORD] = IronSword::class;
			self::$list[self::IRON_INGOT] = IronIngot::class;
			self::$list[self::GOLD_INGOT] = GoldIngot::class;
			self::$list[self::IRON_SHOVEL] = IronShovel::class;
			self::$list[self::IRON_PICKAXE] = IronPickaxe::class;
			self::$list[self::IRON_AXE] = IronAxe::class;
			self::$list[self::IRON_HOE] = IronHoe::class;
			self::$list[self::DIAMOND_SWORD] = DiamondSword::class;
			self::$list[self::DIAMOND_SHOVEL] = DiamondShovel::class;
			self::$list[self::DIAMOND_PICKAXE] = DiamondPickaxe::class;
			self::$list[self::DIAMOND_AXE] = DiamondAxe::class;
			self::$list[self::DIAMOND_HOE] = DiamondHoe::class;
			self::$list[self::GOLD_SWORD] = GoldSword::class;
			self::$list[self::GOLD_SHOVEL] = GoldShovel::class;
			self::$list[self::GOLD_PICKAXE] = GoldPickaxe::class;
			self::$list[self::GOLD_AXE] = GoldAxe::class;
			self::$list[self::GOLD_HOE] = GoldHoe::class;
			self::$list[self::STONE_SWORD] = StoneSword::class;
			self::$list[self::STONE_SHOVEL] = StoneShovel::class;
			self::$list[self::STONE_PICKAXE] = StonePickaxe::class;
			self::$list[self::STONE_AXE] = StoneAxe::class;
			self::$list[self::STONE_HOE] = StoneHoe::class;
			self::$list[self::WOODEN_SWORD] = WoodenSword::class;
			self::$list[self::WOODEN_SHOVEL] = WoodenShovel::class;
			self::$list[self::WOODEN_PICKAXE] = WoodenPickaxe::class;
			self::$list[self::WOODEN_AXE] = WoodenAxe::class;
			self::$list[self::WOODEN_HOE] = WoodenHoe::class;
			self::$list[self::FLINT_STEEL] = FlintSteel::class;
			self::$list[self::SHEARS] = Shears::class;
			self::$list[self::BOW] = Bow::class;

			self::$list[self::RAW_FISH] = Fish::class;
			self::$list[self::COOKED_FISH] = CookedFish::class;

			for($i = 0; $i < 256; ++$i){
				if(Block::$list[$i] !== \null){
					self::$list[$i] = Block::$list[$i];
				}
			}
		}
		
		self::initCreativeItems();
	}

	private static $creative = [];

	private static function initCreativeItems(){
		self::clearCreativeItems();
		//Building
		self::addCreativeItem(Item::get(Item::COBBLESTONE, 0));
		self::addCreativeItem(Item::get(Item::STONE_BRICKS, 0));
		self::addCreativeItem(Item::get(Item::STONE_BRICKS, 1));
		self::addCreativeItem(Item::get(Item::STONE_BRICKS, 2));
		self::addCreativeItem(Item::get(Item::STONE_BRICKS, 3));
		self::addCreativeItem(Item::get(Item::MOSS_STONE, 0));
		self::addCreativeItem(Item::get(Item::WOODEN_PLANKS, 0));
		self::addCreativeItem(Item::get(Item::WOODEN_PLANKS, 1));
		self::addCreativeItem(Item::get(Item::WOODEN_PLANKS, 2));
		self::addCreativeItem(Item::get(Item::WOODEN_PLANKS, 3));
		self::addCreativeItem(Item::get(Item::WOODEN_PLANKS, 4));
		self::addCreativeItem(Item::get(Item::WOODEN_PLANKS, 5));
		self::addCreativeItem(Item::get(Item::BRICKS, 0));

		self::addCreativeItem(Item::get(Item::STONE, 0));
		self::addCreativeItem(Item::get(Item::STONE, 1));
		self::addCreativeItem(Item::get(Item::STONE, 2));
		self::addCreativeItem(Item::get(Item::STONE, 3));
		self::addCreativeItem(Item::get(Item::STONE, 4));
		self::addCreativeItem(Item::get(Item::STONE, 5));
		self::addCreativeItem(Item::get(Item::STONE, 6));
		self::addCreativeItem(Item::get(Item::DIRT, 0));
		self::addCreativeItem(Item::get(Item::PODZOL, 0));
		self::addCreativeItem(Item::get(Item::GRASS, 0));
		self::addCreativeItem(Item::get(Item::MYCELIUM, 0));
		self::addCreativeItem(Item::get(Item::CLAY_BLOCK, 0));
		self::addCreativeItem(Item::get(Item::HARDENED_CLAY, 0));
		self::addCreativeItem(Item::get(Item::STAINED_CLAY, 0));
		self::addCreativeItem(Item::get(Item::STAINED_CLAY, 7));
		self::addCreativeItem(Item::get(Item::STAINED_CLAY, 6));
		self::addCreativeItem(Item::get(Item::STAINED_CLAY, 5));
		self::addCreativeItem(Item::get(Item::STAINED_CLAY, 4));
		self::addCreativeItem(Item::get(Item::STAINED_CLAY, 3));
		self::addCreativeItem(Item::get(Item::STAINED_CLAY, 2));
		self::addCreativeItem(Item::get(Item::STAINED_CLAY, 1));
		self::addCreativeItem(Item::get(Item::STAINED_CLAY, 15));
		self::addCreativeItem(Item::get(Item::STAINED_CLAY, 14));
		self::addCreativeItem(Item::get(Item::STAINED_CLAY, 13));
		self::addCreativeItem(Item::get(Item::STAINED_CLAY, 12));
		self::addCreativeItem(Item::get(Item::STAINED_CLAY, 11));
		self::addCreativeItem(Item::get(Item::STAINED_CLAY, 10));
		self::addCreativeItem(Item::get(Item::STAINED_CLAY, 9));
		self::addCreativeItem(Item::get(Item::STAINED_CLAY, 8));
		self::addCreativeItem(Item::get(Item::SANDSTONE, 0));
		self::addCreativeItem(Item::get(Item::SANDSTONE, 1));
		self::addCreativeItem(Item::get(Item::SANDSTONE, 2));
		self::addCreativeItem(Item::get(Item::SAND, 0));
		self::addCreativeItem(Item::get(Item::SAND, 1));
		self::addCreativeItem(Item::get(Item::GRAVEL, 0));
		self::addCreativeItem(Item::get(Item::TRUNK, 0));
		self::addCreativeItem(Item::get(Item::TRUNK, 1));
		self::addCreativeItem(Item::get(Item::TRUNK, 2));
		self::addCreativeItem(Item::get(Item::TRUNK, 3));
		self::addCreativeItem(Item::get(Item::TRUNK2, 0));
		self::addCreativeItem(Item::get(Item::TRUNK2, 1));
		self::addCreativeItem(Item::get(Item::NETHER_BRICKS, 0));
		self::addCreativeItem(Item::get(Item::NETHERRACK, 0));
		self::addCreativeItem(Item::get(Item::BEDROCK, 0));
		self::addCreativeItem(Item::get(Item::COBBLESTONE_STAIRS, 0));
		self::addCreativeItem(Item::get(Item::OAK_WOODEN_STAIRS, 0));
		self::addCreativeItem(Item::get(Item::SPRUCE_WOODEN_STAIRS, 0));
		self::addCreativeItem(Item::get(Item::BIRCH_WOODEN_STAIRS, 0));
		self::addCreativeItem(Item::get(Item::JUNGLE_WOODEN_STAIRS, 0));
		self::addCreativeItem(Item::get(Item::ACACIA_WOODEN_STAIRS, 0));
		self::addCreativeItem(Item::get(Item::DARK_OAK_WOODEN_STAIRS, 0));
		self::addCreativeItem(Item::get(Item::BRICK_STAIRS, 0));
		self::addCreativeItem(Item::get(Item::SANDSTONE_STAIRS, 0));
		self::addCreativeItem(Item::get(Item::STONE_BRICK_STAIRS, 0));
		self::addCreativeItem(Item::get(Item::NETHER_BRICKS_STAIRS, 0));
		self::addCreativeItem(Item::get(Item::QUARTZ_STAIRS, 0));
		self::addCreativeItem(Item::get(Item::SLAB, 0));
		self::addCreativeItem(Item::get(Item::SLAB, 1));
		self::addCreativeItem(Item::get(Item::WOODEN_SLAB, 0));
		self::addCreativeItem(Item::get(Item::WOODEN_SLAB, 1));
		self::addCreativeItem(Item::get(Item::WOODEN_SLAB, 2));
		self::addCreativeItem(Item::get(Item::WOODEN_SLAB, 3));
		self::addCreativeItem(Item::get(Item::WOODEN_SLAB, 4));
		self::addCreativeItem(Item::get(Item::WOODEN_SLAB, 5));
		self::addCreativeItem(Item::get(Item::SLAB, 3));
		self::addCreativeItem(Item::get(Item::SLAB, 4));
		self::addCreativeItem(Item::get(Item::SLAB, 5));
		self::addCreativeItem(Item::get(Item::SLAB, 6));
		self::addCreativeItem(Item::get(Item::QUARTZ_BLOCK, 0));
		self::addCreativeItem(Item::get(Item::QUARTZ_BLOCK, 1));
		self::addCreativeItem(Item::get(Item::QUARTZ_BLOCK, 2));
		self::addCreativeItem(Item::get(Item::COAL_ORE, 0));
		self::addCreativeItem(Item::get(Item::IRON_ORE, 0));
		self::addCreativeItem(Item::get(Item::GOLD_ORE, 0));
		self::addCreativeItem(Item::get(Item::DIAMOND_ORE, 0));
		self::addCreativeItem(Item::get(Item::LAPIS_ORE, 0));
		self::addCreativeItem(Item::get(Item::REDSTONE_ORE, 0));
		self::addCreativeItem(Item::get(Item::EMERALD_ORE, 0));
		self::addCreativeItem(Item::get(Item::OBSIDIAN, 0));
		self::addCreativeItem(Item::get(Item::ICE, 0));
		self::addCreativeItem(Item::get(Item::SNOW_BLOCK, 0));
		self::addCreativeItem(Item::get(Item::END_STONE, 0));

		//Decoration
		self::addCreativeItem(Item::get(Item::COBBLESTONE_WALL, 0));
		self::addCreativeItem(Item::get(Item::COBBLESTONE_WALL, 1));
		self::addCreativeItem(Item::get(Item::WATER_LILY, 0));
		self::addCreativeItem(Item::get(Item::GOLD_BLOCK, 0));
		self::addCreativeItem(Item::get(Item::IRON_BLOCK, 0));
		self::addCreativeItem(Item::get(Item::DIAMOND_BLOCK, 0));
		self::addCreativeItem(Item::get(Item::LAPIS_BLOCK, 0));
		self::addCreativeItem(Item::get(Item::COAL_BLOCK, 0));
		self::addCreativeItem(Item::get(Item::EMERALD_BLOCK, 0));
		self::addCreativeItem(Item::get(Item::REDSTONE_BLOCK, 0));
		self::addCreativeItem(Item::get(Item::SNOW_LAYER, 0));
		self::addCreativeItem(Item::get(Item::GLASS, 0));
		self::addCreativeItem(Item::get(Item::GLOWSTONE_BLOCK, 0));
		self::addCreativeItem(Item::get(Item::VINES, 0));
		self::addCreativeItem(Item::get(Item::NETHER_REACTOR, 0));
		self::addCreativeItem(Item::get(Item::LADDER, 0));
		self::addCreativeItem(Item::get(Item::SPONGE, 0));
		self::addCreativeItem(Item::get(Item::GLASS_PANE, 0));
		self::addCreativeItem(Item::get(Item::WOODEN_DOOR, 0));
		self::addCreativeItem(Item::get(Item::TRAPDOOR, 0));
		self::addCreativeItem(Item::get(Item::FENCE, 0));
		self::addCreativeItem(Item::get(Item::FENCE, 1));
		self::addCreativeItem(Item::get(Item::FENCE, 2));
		self::addCreativeItem(Item::get(Item::FENCE, 3));
		self::addCreativeItem(Item::get(Item::FENCE, 4));
		self::addCreativeItem(Item::get(Item::FENCE, 5));
		self::addCreativeItem(Item::get(Item::FENCE_GATE, 0));
		self::addCreativeItem(Item::get(Item::FENCE_GATE_BIRCH, 0));
		self::addCreativeItem(Item::get(Item::FENCE_GATE_SPRUCE, 0));
		self::addCreativeItem(Item::get(Item::FENCE_GATE_DARK_OAK, 0));
		self::addCreativeItem(Item::get(Item::FENCE_GATE_JUNGLE, 0));
		self::addCreativeItem(Item::get(Item::FENCE_GATE_ACACIA, 0));
		self::addCreativeItem(Item::get(Item::IRON_BARS, 0));
		self::addCreativeItem(Item::get(Item::BED, 0));
		self::addCreativeItem(Item::get(Item::BOOKSHELF, 0));
		self::addCreativeItem(Item::get(Item::PAINTING, 0));
		self::addCreativeItem(Item::get(Item::WORKBENCH, 0));
		self::addCreativeItem(Item::get(Item::STONECUTTER, 0));
		self::addCreativeItem(Item::get(Item::CHEST, 0));
		self::addCreativeItem(Item::get(Item::FURNACE, 0));
		self::addCreativeItem(Item::get(Item::END_PORTAL, 0));
		self::addCreativeItem(Item::get(Item::DANDELION, 0));
		self::addCreativeItem(Item::get(Item::RED_FLOWER, Flower::TYPE_POPPY));
		self::addCreativeItem(Item::get(Item::RED_FLOWER, Flower::TYPE_BLUE_ORCHID));
		self::addCreativeItem(Item::get(Item::RED_FLOWER, Flower::TYPE_ALLIUM));
		self::addCreativeItem(Item::get(Item::RED_FLOWER, Flower::TYPE_AZURE_BLUET));
		self::addCreativeItem(Item::get(Item::RED_FLOWER, Flower::TYPE_RED_TULIP));
		self::addCreativeItem(Item::get(Item::RED_FLOWER, Flower::TYPE_ORANGE_TULIP));
		self::addCreativeItem(Item::get(Item::RED_FLOWER, Flower::TYPE_WHITE_TULIP));
		self::addCreativeItem(Item::get(Item::RED_FLOWER, Flower::TYPE_PINK_TULIP));
		self::addCreativeItem(Item::get(Item::RED_FLOWER, Flower::TYPE_OXEYE_DAISY));
		//TODO: Lilac
		//TODO: Double Tallgrass
		//TODO: Large Fern
		//TODO: Rose Bush
		//TODO: Peony
		self::addCreativeItem(Item::get(Item::BROWN_MUSHROOM, 0));
		self::addCreativeItem(Item::get(Item::RED_MUSHROOM, 0));
		//TODO: Mushroom block (brown, cover)
		//TODO: Mushroom block (red, cover)
		//TODO: Mushroom block (brown, stem)
		//TODO: Mushroom block (red, stem)
		self::addCreativeItem(Item::get(Item::CACTUS, 0));
		self::addCreativeItem(Item::get(Item::MELON_BLOCK, 0));
		self::addCreativeItem(Item::get(Item::PUMPKIN, 0));
		self::addCreativeItem(Item::get(Item::LIT_PUMPKIN, 0));
		self::addCreativeItem(Item::get(Item::COBWEB, 0));
		self::addCreativeItem(Item::get(Item::HAY_BALE, 0));
		self::addCreativeItem(Item::get(Item::TALL_GRASS, 1));
		self::addCreativeItem(Item::get(Item::TALL_GRASS, 2));
		self::addCreativeItem(Item::get(Item::DEAD_BUSH, 0));
		self::addCreativeItem(Item::get(Item::SAPLING, 0));
		self::addCreativeItem(Item::get(Item::SAPLING, 1));
		self::addCreativeItem(Item::get(Item::SAPLING, 2));
		self::addCreativeItem(Item::get(Item::SAPLING, 3));
		self::addCreativeItem(Item::get(Item::SAPLING, 4));
		self::addCreativeItem(Item::get(Item::SAPLING, 5));
		self::addCreativeItem(Item::get(Item::LEAVES, 0));
		self::addCreativeItem(Item::get(Item::LEAVES, 1));
		self::addCreativeItem(Item::get(Item::LEAVES, 2));
		self::addCreativeItem(Item::get(Item::LEAVES, 3));
		self::addCreativeItem(Item::get(Item::LEAVES, 3));
		self::addCreativeItem(Item::get(Item::LEAVES2, 0));
		self::addCreativeItem(Item::get(Item::LEAVES2, 1));
		self::addCreativeItem(Item::get(Item::CAKE, 0));
		self::addCreativeItem(Item::get(Item::SIGN, 0));
		self::addCreativeItem(Item::get(Item::MONSTER_SPAWNER, 0));
		self::addCreativeItem(Item::get(Item::WOOL, 0));
		self::addCreativeItem(Item::get(Item::WOOL, 7));
		self::addCreativeItem(Item::get(Item::WOOL, 6));
		self::addCreativeItem(Item::get(Item::WOOL, 5));
		self::addCreativeItem(Item::get(Item::WOOL, 4));
		self::addCreativeItem(Item::get(Item::WOOL, 3));
		self::addCreativeItem(Item::get(Item::WOOL, 2));
		self::addCreativeItem(Item::get(Item::WOOL, 1));
		self::addCreativeItem(Item::get(Item::WOOL, 15));
		self::addCreativeItem(Item::get(Item::WOOL, 14));
		self::addCreativeItem(Item::get(Item::WOOL, 13));
		self::addCreativeItem(Item::get(Item::WOOL, 12));
		self::addCreativeItem(Item::get(Item::WOOL, 11));
		self::addCreativeItem(Item::get(Item::WOOL, 10));
		self::addCreativeItem(Item::get(Item::WOOL, 9));
		self::addCreativeItem(Item::get(Item::WOOL, 8));
		self::addCreativeItem(Item::get(Item::CARPET, 0));
		self::addCreativeItem(Item::get(Item::CARPET, 7));
		self::addCreativeItem(Item::get(Item::CARPET, 6));
		self::addCreativeItem(Item::get(Item::CARPET, 5));
		self::addCreativeItem(Item::get(Item::CARPET, 4));
		self::addCreativeItem(Item::get(Item::CARPET, 3));
		self::addCreativeItem(Item::get(Item::CARPET, 2));
		self::addCreativeItem(Item::get(Item::CARPET, 1));
		self::addCreativeItem(Item::get(Item::CARPET, 15));
		self::addCreativeItem(Item::get(Item::CARPET, 14));
		self::addCreativeItem(Item::get(Item::CARPET, 13));
		self::addCreativeItem(Item::get(Item::CARPET, 12));
		self::addCreativeItem(Item::get(Item::CARPET, 11));
		self::addCreativeItem(Item::get(Item::CARPET, 10));
		self::addCreativeItem(Item::get(Item::CARPET, 9));
		self::addCreativeItem(Item::get(Item::CARPET, 8));

		//Tools
		//TODO self::addCreativeItem(Item::get(Item::RAILS, 0));
		//TODO self::addCreativeItem(Item::get(Item::POWERED_RAILS, 0));
		self::addCreativeItem(Item::get(Item::TORCH, 0));
		self::addCreativeItem(Item::get(Item::BUCKET, 0));
		self::addCreativeItem(Item::get(Item::BUCKET, 1));
		self::addCreativeItem(Item::get(Item::BUCKET, 8));
		self::addCreativeItem(Item::get(Item::BUCKET, 10));
		self::addCreativeItem(Item::get(Item::TNT, 0));
		self::addCreativeItem(Item::get(Item::IRON_HOE, 0));
		self::addCreativeItem(Item::get(Item::IRON_SHOVEL, 0));
		self::addCreativeItem(Item::get(Item::IRON_SWORD, 0));
		self::addCreativeItem(Item::get(Item::BOW, 0));
		self::addCreativeItem(Item::get(Item::SHEARS, 0));
		self::addCreativeItem(Item::get(Item::FLINT_AND_STEEL, 0));
		self::addCreativeItem(Item::get(Item::CLOCK, 0));
		self::addCreativeItem(Item::get(Item::COMPASS, 0));
		self::addCreativeItem(Item::get(Item::MINECART, 0));
		
		self::addCreativeItem(Item::get(Item::SPAWN_EGG, Chicken::NETWORK_ID)); //Chicken
		self::addCreativeItem(Item::get(Item::SPAWN_EGG, Cow::NETWORK_ID)); //Cow
		self::addCreativeItem(Item::get(Item::SPAWN_EGG, Pig::NETWORK_ID)); //Pig
		self::addCreativeItem(Item::get(Item::SPAWN_EGG, Sheep::NETWORK_ID)); //Sheep
		self::addCreativeItem(Item::get(Item::SPAWN_EGG, Wolf::NETWORK_ID)); //Wolf
		self::addCreativeItem(Item::get(Item::SPAWN_EGG, Villager::NETWORK_ID)); //Villager
		self::addCreativeItem(Item::get(Item::SPAWN_EGG, Mooshroom::NETWORK_ID)); //Mooshroom
		self::addCreativeItem(Item::get(Item::SPAWN_EGG, Squid::NETWORK_ID)); //Squid
		
		self::addCreativeItem(Item::get(Item::SPAWN_EGG, Zombie::NETWORK_ID));
		self::addCreativeItem(Item::get(Item::SPAWN_EGG, Creeper::NETWORK_ID));
		self::addCreativeItem(Item::get(Item::SPAWN_EGG, Skeleton::NETWORK_ID));
		self::addCreativeItem(Item::get(Item::SPAWN_EGG, Spider::NETWORK_ID));
		self::addCreativeItem(Item::get(Item::SPAWN_EGG, PigZombie::NETWORK_ID));
		self::addCreativeItem(Item::get(Item::SPAWN_EGG, Slime::NETWORK_ID));
		self::addCreativeItem(Item::get(Item::SPAWN_EGG, Enderman::NETWORK_ID));
		self::addCreativeItem(Item::get(Item::SPAWN_EGG, Silverfish::NETWORK_ID));
		
		
		

		self::addCreativeItem(Item::get(Item::SNOWBALL));


		//Seeds
		self::addCreativeItem(Item::get(Item::SUGARCANE, 0));
		self::addCreativeItem(Item::get(Item::WHEAT, 0));
		self::addCreativeItem(Item::get(Item::SEEDS, 0));
		self::addCreativeItem(Item::get(Item::MELON_SEEDS, 0));
		self::addCreativeItem(Item::get(Item::PUMPKIN_SEEDS, 0));
		self::addCreativeItem(Item::get(Item::CARROT, 0));
		self::addCreativeItem(Item::get(Item::POTATO, 0));
		self::addCreativeItem(Item::get(Item::BEETROOT_SEEDS, 0));
		self::addCreativeItem(Item::get(Item::EGG, 0));
		self::addCreativeItem(Item::get(Item::RAW_FISH, 0));
		self::addCreativeItem(Item::get(Item::RAW_FISH, 1));
		self::addCreativeItem(Item::get(Item::RAW_FISH, 2));
		self::addCreativeItem(Item::get(Item::RAW_FISH, 3));
		self::addCreativeItem(Item::get(Item::COOKED_FISH, 0));
		self::addCreativeItem(Item::get(Item::COOKED_FISH, 1));
		self::addCreativeItem(Item::get(Item::DYE, 0));
		self::addCreativeItem(Item::get(Item::DYE, 7));
		self::addCreativeItem(Item::get(Item::DYE, 6));
		self::addCreativeItem(Item::get(Item::DYE, 5));
		self::addCreativeItem(Item::get(Item::DYE, 4));
		self::addCreativeItem(Item::get(Item::DYE, 3));
		self::addCreativeItem(Item::get(Item::DYE, 2));
		self::addCreativeItem(Item::get(Item::DYE, 1));
		self::addCreativeItem(Item::get(Item::DYE, 15));
		self::addCreativeItem(Item::get(Item::DYE, 14));
		self::addCreativeItem(Item::get(Item::DYE, 13));
		self::addCreativeItem(Item::get(Item::DYE, 12));
		self::addCreativeItem(Item::get(Item::DYE, 11));
		self::addCreativeItem(Item::get(Item::DYE, 10));
		self::addCreativeItem(Item::get(Item::DYE, 9));
		self::addCreativeItem(Item::get(Item::DYE, 8));
	}

	public static function clearCreativeItems(){
		Item::$creative = [];
	}

	public static function getCreativeItems(){
		return Item::$creative;
	}

	public static function addCreativeItem(Item $item){
		Item::$creative[] = Item::get($item->getId(), $item->getDamage());
	}

	public static function removeCreativeItem(Item $item){
		$index = self::getCreativeItemIndex($item);
		if($index !== -1){
			unset(Item::$creative[$index]);
		}
	}

	public static function isCreativeItem(Item $item){
		foreach(Item::$creative as $i => $d){
			if($item->equals($d, !$item->isTool())){
				return \true;
			}
		}

		return \false;
	}

	/**
	 * @param $index
	 * @return Item
	 */
	public static function getCreativeItem($index){
		return isset(Item::$creative[$index]) ? Item::$creative[$index] : \null;
	}

	/**
	 * @param Item $item
	 * @return int
	 */
	public static function getCreativeItemIndex(Item $item){
		foreach(Item::$creative as $i => $d){
			if($item->equals($d, !$item->isTool())){
				return $i;
			}
		}

		return -1;
	}

	public static function get($id, $meta = 0, $count = 1){
		try{
			$class = self::$list[$id];
			if($class === \null){
				return new Item($id, $meta, $count);
			}elseif($id < 256){
				return new ItemBlock(new $class($meta), $meta, $count);
			}else{
				return new $class($meta, $count);
			}
		}catch(\RuntimeException $e){
			return new Item($id, $meta, $count);
		}
	}

	public static function fromString($str, $multiple = \false){
		if($multiple === \true){
			$blocks = [];
			foreach(\explode(",", $str) as $b){
				$blocks[] = self::fromString($b, \false);
			}

			return $blocks;
		}else{
			$b = \explode(":", \str_replace(" ", "_", \trim($str)));
			if(!isset($b[1])){
				$meta = 0;
			}else{
				$meta = $b[1] & 0xFFFF;
			}

			if(\defined(Item::class . "::" . \strtoupper($b[0]))){
				$item = self::get(\constant(Item::class . "::" . \strtoupper($b[0])), $meta);
				if($item->getId() === self::AIR and \strtoupper($b[0]) !== "AIR"){
					$item = self::get($b[0] & 0xFFFF, $meta);
				}
			}else{
				$item = self::get($b[0] & 0xFFFF, $meta);
			}

			return $item;
		}
	}

	public function __construct($id, $meta = 0, $count = 1, $name = "Unknown"){
		$this->id = $id & 0xffff;
		$this->meta = $meta !== \null ? $meta & 0xffff : \null;
		$this->count = (int) $count;
		$this->name = $name;
		if(!isset($this->block) and $this->id <= 0xff and isset(Block::$list[$this->id])){
			$this->block = Block::get($this->id, $this->meta);
			$this->name = $this->block->getName();
		}
	}


	public function getCount(){
		return $this->count;
	}

	public function setCount($count){
		$this->count = (int) $count;
	}

	final public function getName(){
		return $this->name;
	}

	final public function isPlaceable(){
		return (($this->block instanceof Block) and $this->block->isPlaceable === \true);
	}

	public function getBlock(){
		if($this->block instanceof Block){
			return clone $this->block;
		}else{
			return Block::get(self::AIR);
		}
	}

	final public function getId(){
		return $this->id;
	}

	final public function getDamage(){
		return $this->meta;
	}

	public function setDamage($meta){
		$this->meta = $meta !== \null ? $meta & 0xFFFF : \null;
	}

	public function getMaxStackSize(){
		return 64;
	}

	final public function getFuelTime(){
		if(!isset(Fuel::$duration[$this->id])){
			return \null;
		}
		if($this->id !== self::BUCKET or $this->meta === 10){
			return Fuel::$duration[$this->id];
		}

		return \null;
	}

	/**
	 * @param Entity|Block $object
	 *
	 * @return bool
	 */
	public function useOn($object){
		return \false;
	}

	/**
	 * @return bool
	 */
	public function isTool(){
		return \false;
	}

	/**
	 * @return int|bool
	 */
	public function getMaxDurability(){
		return \false;
	}

	public function isPickaxe(){
		return \false;
	}

	public function isAxe(){
		return \false;
	}

	public function isSword(){
		return \false;
	}

	public function isShovel(){
		return \false;
	}

	public function isHoe(){
		return \false;
	}

	public function isShears(){
		return \false;
	}

	final public function __toString(){
		return "Item " . $this->name . " (" . $this->id . ":" . ($this->meta === \null ? "?" : $this->meta) . ")x" . $this->count;
	}

	public function getDestroySpeed(Block $block, Player $player){
		return 1;
	}

	public function onActivate(Level $level, Player $player, Block $block, Block $target, $face, $fx, $fy, $fz){
		return \false;
	}

	public final function equals(Item $item, $checkDamage = \false){
		return $this->id === $item->getId() and ($checkDamage === \false or $this->getDamage() === $item->getDamage());
	}

}
