diff --git a/src/block/Anvil.php b/src/block/Anvil.php index 785d59afd..25e48ac60 100644 --- a/src/block/Anvil.php +++ b/src/block/Anvil.php @@ -24,7 +24,8 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\inventory\AnvilInventory; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\Fallable; use pocketmine\block\utils\FallableTrait; use pocketmine\block\utils\HorizontalFacingTrait; @@ -46,23 +47,20 @@ class Anvil extends Transparent implements Fallable{ private int $damage = self::UNDAMAGED; - protected function writeStateToMeta() : int{ - return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing) | ($this->damage << 2); - } - - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x3); - $this->damage = BlockDataSerializer::readBoundedInt("damage", $stateMeta >> 2, self::UNDAMAGED, self::VERY_DAMAGED); - } - - public function getStateBitmask() : int{ - return 0b1111; - } - protected function writeStateToItemMeta() : int{ return $this->damage << 2; } + protected function decodeState(BlockDataReader $r) : void{ + $this->setDamage($r->readBoundedInt(2, self::UNDAMAGED, self::VERY_DAMAGED)); + $this->setFacing($r->readHorizontalFacing()); + } + + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeInt(2, $this->getDamage()); + $w->writeHorizontalFacing($this->getFacing()); + } + public function getDamage() : int{ return $this->damage; } /** @return $this */ diff --git a/src/block/Bamboo.php b/src/block/Bamboo.php index 427b0b8e7..a5b2e35e8 100644 --- a/src/block/Bamboo.php +++ b/src/block/Bamboo.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\SupportType; use pocketmine\event\block\StructureGrowEvent; use pocketmine\item\Bamboo as ItemBamboo; @@ -54,18 +55,16 @@ class Bamboo extends Transparent{ protected bool $ready = false; protected int $leafSize = self::NO_LEAVES; - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->thick = ($stateMeta & BlockLegacyMetadata::BAMBOO_FLAG_THICK) !== 0; - $this->leafSize = BlockDataSerializer::readBoundedInt("leafSize", ($stateMeta >> BlockLegacyMetadata::BAMBOO_LEAF_SIZE_SHIFT) & BlockLegacyMetadata::BAMBOO_LEAF_SIZE_MASK, self::NO_LEAVES, self::LARGE_LEAVES); - $this->ready = ($stateMeta & BlockLegacyMetadata::BAMBOO_FLAG_READY) !== 0; + protected function decodeState(BlockDataReader $r) : void{ + $this->setLeafSize($r->readBoundedInt(2, self::NO_LEAVES, self::LARGE_LEAVES)); + $this->setThick($r->readBool()); + $this->setReady($r->readBool()); } - public function writeStateToMeta() : int{ - return ($this->thick ? BlockLegacyMetadata::BAMBOO_FLAG_THICK : 0) | ($this->leafSize << BlockLegacyMetadata::BAMBOO_LEAF_SIZE_SHIFT) | ($this->ready ? BlockLegacyMetadata::BAMBOO_FLAG_READY : 0); - } - - public function getStateBitmask() : int{ - return 0b1111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeInt(2, $this->getLeafSize()); + $w->writeBool($this->isThick()); + $w->writeBool($this->isReady()); } public function isThick() : bool{ return $this->thick; } diff --git a/src/block/BambooSapling.php b/src/block/BambooSapling.php index a00361416..5d476ff8f 100644 --- a/src/block/BambooSapling.php +++ b/src/block/BambooSapling.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\event\block\StructureGrowEvent; use pocketmine\item\Bamboo as ItemBamboo; use pocketmine\item\Fertilizer; @@ -32,19 +34,16 @@ use pocketmine\player\Player; use pocketmine\world\BlockTransaction; final class BambooSapling extends Flowable{ - private bool $ready = false; - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->ready = ($stateMeta & BlockLegacyMetadata::BAMBOO_SAPLING_FLAG_READY) !== 0; + protected function decodeState(BlockDataReader $r) : void{ + $this->setReady($r->readBool()); } - protected function writeStateToMeta() : int{ - return $this->ready ? BlockLegacyMetadata::BAMBOO_SAPLING_FLAG_READY : 0; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeBool($this->isReady()); } - public function getStateBitmask() : int{ return 0b1; } - public function isReady() : bool{ return $this->ready; } /** @return $this */ diff --git a/src/block/Barrel.php b/src/block/Barrel.php index bcd8621ad..8979622ba 100644 --- a/src/block/Barrel.php +++ b/src/block/Barrel.php @@ -25,7 +25,8 @@ namespace pocketmine\block; use pocketmine\block\tile\Barrel as TileBarrel; use pocketmine\block\utils\AnyFacingTrait; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; @@ -38,17 +39,14 @@ class Barrel extends Opaque{ protected bool $open = false; - protected function writeStateToMeta() : int{ - return BlockDataSerializer::writeFacing($this->facing) | ($this->open ? BlockLegacyMetadata::BARREL_FLAG_OPEN : 0); + protected function decodeState(BlockDataReader $r) : void{ + $this->setFacing($r->readFacing()); + $this->setOpen($r->readBool()); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->facing = BlockDataSerializer::readFacing($stateMeta & 0x07); - $this->open = ($stateMeta & BlockLegacyMetadata::BARREL_FLAG_OPEN) === BlockLegacyMetadata::BARREL_FLAG_OPEN; - } - - public function getStateBitmask() : int{ - return 0b1111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeFacing($this->getFacing()); + $w->writeBool($this->isOpen()); } public function isOpen() : bool{ diff --git a/src/block/BaseBanner.php b/src/block/BaseBanner.php index 3cc59ae78..d785bca1c 100644 --- a/src/block/BaseBanner.php +++ b/src/block/BaseBanner.php @@ -25,6 +25,8 @@ namespace pocketmine\block; use pocketmine\block\tile\Banner as TileBanner; use pocketmine\block\utils\BannerPatternLayer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\ColoredTrait; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\SupportType; @@ -53,6 +55,14 @@ abstract class BaseBanner extends Transparent{ parent::__construct($idInfo, $name, $breakInfo); } + protected function decodeState(BlockDataReader $r) : void{ + //TODO: we currently purposely don't read or write colour (it's stored on the tile) + } + + protected function encodeState(BlockDataWriter $w) : void{ + //TODO: we currently purposely don't read or write colour (it's stored on the tile) + } + public function readStateFromWorld() : void{ parent::readStateFromWorld(); $tile = $this->position->getWorld()->getTile($this->position); diff --git a/src/block/Bed.php b/src/block/Bed.php index 7ce2fa70b..80851c131 100644 --- a/src/block/Bed.php +++ b/src/block/Bed.php @@ -24,12 +24,12 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\tile\Bed as TileBed; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\ColoredTrait; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; -use pocketmine\data\bedrock\DyeColorIdMap; use pocketmine\entity\Entity; use pocketmine\entity\Living; use pocketmine\item\Item; @@ -54,20 +54,18 @@ class Bed extends Transparent{ parent::__construct($idInfo, $name, $breakInfo); } - protected function writeStateToMeta() : int{ - return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing) | - ($this->occupied ? BlockLegacyMetadata::BED_FLAG_OCCUPIED : 0) | - ($this->head ? BlockLegacyMetadata::BED_FLAG_HEAD : 0); + protected function decodeState(BlockDataReader $r) : void{ + $this->facing = $r->readHorizontalFacing(); + $this->occupied = $r->readBool(); + $this->head = $r->readBool(); + //TODO: we currently purposely don't read or write colour (it's stored on the tile) } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03); - $this->occupied = ($stateMeta & BlockLegacyMetadata::BED_FLAG_OCCUPIED) !== 0; - $this->head = ($stateMeta & BlockLegacyMetadata::BED_FLAG_HEAD) !== 0; - } - - public function getStateBitmask() : int{ - return 0b1111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeHorizontalFacing($this->facing); + $w->writeBool($this->occupied); + $w->writeBool($this->head); + //TODO: we currently purposely don't read or write colour (it's stored on the tile) } public function readStateFromWorld() : void{ @@ -209,10 +207,6 @@ class Bed extends Transparent{ return []; } - protected function writeStateToItemMeta() : int{ - return DyeColorIdMap::getInstance()->toId($this->color); - } - public function getAffectedBlocks() : array{ if(($other = $this->getOtherHalf()) !== null){ return [$this, $other]; diff --git a/src/block/Bedrock.php b/src/block/Bedrock.php index 3bb42560f..ed77833bb 100644 --- a/src/block/Bedrock.php +++ b/src/block/Bedrock.php @@ -23,20 +23,18 @@ declare(strict_types=1); namespace pocketmine\block; -class Bedrock extends Opaque{ +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; +class Bedrock extends Opaque{ private bool $burnsForever = false; - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->burnsForever = ($stateMeta & BlockLegacyMetadata::BEDROCK_FLAG_INFINIBURN) !== 0; + protected function decodeState(BlockDataReader $r) : void{ + $this->burnsForever = $r->readBool(); } - protected function writeStateToMeta() : int{ - return $this->burnsForever ? BlockLegacyMetadata::BEDROCK_FLAG_INFINIBURN : 0; - } - - public function getStateBitmask() : int{ - return 0b1; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeBool($this->burnsForever); } public function burnsForever() : bool{ diff --git a/src/block/Bell.php b/src/block/Bell.php index c75d7d785..9a9fad9d9 100644 --- a/src/block/Bell.php +++ b/src/block/Bell.php @@ -25,16 +25,17 @@ namespace pocketmine\block; use pocketmine\block\tile\Bell as TileBell; use pocketmine\block\utils\BellAttachmentType; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataReaderHelper; +use pocketmine\block\utils\BlockDataWriter; +use pocketmine\block\utils\BlockDataWriterHelper; use pocketmine\block\utils\HorizontalFacingTrait; -use pocketmine\block\utils\InvalidBlockStateException; use pocketmine\block\utils\SupportType; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; -use pocketmine\utils\AssumptionFailedError; use pocketmine\world\BlockTransaction; use pocketmine\world\sound\BellRingSound; @@ -48,36 +49,14 @@ final class Bell extends Transparent{ parent::__construct($idInfo, $name, $breakInfo); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->setFacing(BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03)); - - $attachmentType = [ - BlockLegacyMetadata::BELL_ATTACHMENT_FLOOR => BellAttachmentType::FLOOR(), - BlockLegacyMetadata::BELL_ATTACHMENT_CEILING => BellAttachmentType::CEILING(), - BlockLegacyMetadata::BELL_ATTACHMENT_ONE_WALL => BellAttachmentType::ONE_WALL(), - BlockLegacyMetadata::BELL_ATTACHMENT_TWO_WALLS => BellAttachmentType::TWO_WALLS() - ][($stateMeta >> 2) & 0b11] ?? null; - if($attachmentType === null){ - throw new InvalidBlockStateException("No such attachment type"); - } - $this->setAttachmentType($attachmentType); + protected function decodeState(BlockDataReader $r) : void{ + $this->attachmentType = BlockDataReaderHelper::readBellAttachmentType($r); + $this->facing = $r->readHorizontalFacing(); } - public function writeStateToMeta() : int{ - $attachmentTypeMeta = [ - BellAttachmentType::FLOOR()->id() => BlockLegacyMetadata::BELL_ATTACHMENT_FLOOR, - BellAttachmentType::CEILING()->id() => BlockLegacyMetadata::BELL_ATTACHMENT_CEILING, - BellAttachmentType::ONE_WALL()->id() => BlockLegacyMetadata::BELL_ATTACHMENT_ONE_WALL, - BellAttachmentType::TWO_WALLS()->id() => BlockLegacyMetadata::BELL_ATTACHMENT_TWO_WALLS - ][$this->getAttachmentType()->id()] ?? null; - if($attachmentTypeMeta === null){ - throw new AssumptionFailedError("Mapping should cover all cases"); - } - return BlockDataSerializer::writeLegacyHorizontalFacing($this->getFacing()) | ($attachmentTypeMeta << 2); - } - - public function getStateBitmask() : int{ - return 0b1111; + protected function encodeState(BlockDataWriter $w) : void{ + BlockDataWriterHelper::writeBellAttachmentType($w, $this->attachmentType); + $w->writeHorizontalFacing($this->facing); } protected function recalculateCollisionBoxes() : array{ diff --git a/src/block/Block.php b/src/block/Block.php index 89aa0221d..5bf58b47c 100644 --- a/src/block/Block.php +++ b/src/block/Block.php @@ -28,7 +28,8 @@ namespace pocketmine\block; use pocketmine\block\tile\Spawnable; use pocketmine\block\tile\Tile; -use pocketmine\block\utils\InvalidBlockStateException; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\SupportType; use pocketmine\entity\Entity; use pocketmine\item\enchantment\VanillaEnchantments; @@ -44,14 +45,12 @@ use pocketmine\world\BlockTransaction; use pocketmine\world\format\Chunk; use pocketmine\world\Position; use pocketmine\world\World; -use function assert; use function count; -use function dechex; use const PHP_INT_MAX; class Block{ - public const INTERNAL_METADATA_BITS = 4; - public const INTERNAL_METADATA_MASK = ~(~0 << self::INTERNAL_METADATA_BITS); + public const INTERNAL_STATE_DATA_BITS = 6; + public const INTERNAL_STATE_DATA_MASK = ~(~0 << self::INTERNAL_STATE_DATA_BITS); protected BlockIdentifier $idInfo; protected string $fallbackName; @@ -65,9 +64,6 @@ class Block{ * @param string $name English name of the block type (TODO: implement translations) */ public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ - if(($idInfo->getLegacyVariant() & $this->getStateBitmask()) !== 0){ - throw new \InvalidArgumentException("Variant 0x" . dechex($idInfo->getLegacyVariant()) . " collides with state bitmask 0x" . dechex($this->getStateBitmask())); - } $this->idInfo = $idInfo; $this->fallbackName = $name; $this->breakInfo = $breakInfo; @@ -86,18 +82,11 @@ class Block{ return $this->fallbackName; } - /** - * @deprecated - */ - public function getId() : int{ - return $this->idInfo->getLegacyBlockId(); - } - /** * @internal */ - public function getFullId() : int{ - return ($this->getId() << self::INTERNAL_METADATA_BITS) | $this->getMeta(); + public function getStateId() : int{ + return ($this->getTypeId() << self::INTERNAL_STATE_DATA_BITS) | $this->computeStateData(); } public function asItem() : Item{ @@ -107,34 +96,29 @@ class Block{ ); } - /** - * @deprecated - */ - public function getMeta() : int{ - $stateMeta = $this->writeStateToMeta(); - assert(($stateMeta & ~$this->getStateBitmask()) === 0); - return $this->idInfo->getLegacyVariant() | $stateMeta; - } - protected function writeStateToItemMeta() : int{ return 0; } - /** - * Returns a bitmask used to extract state bits from block metadata. - */ - public function getStateBitmask() : int{ - return 0; + public function decodeStateData(int $data) : void{ + $reader = new BlockDataReader(self::INTERNAL_STATE_DATA_BITS, $data); + $this->decodeState($reader); } - protected function writeStateToMeta() : int{ - return 0; + protected function decodeState(BlockDataReader $r) : void{ + //NOOP } /** - * @throws InvalidBlockStateException + * @internal */ - public function readStateFromData(int $id, int $stateMeta) : void{ + public function computeStateData() : int{ + $writer = new BlockDataWriter(self::INTERNAL_STATE_DATA_BITS); + $this->encodeState($writer); + return $writer->getValue(); + } + + protected function encodeState(BlockDataWriter $w) : void{ //NOOP } @@ -150,7 +134,7 @@ class Block{ } public function writeStateToWorld() : void{ - $this->position->getWorld()->getOrLoadChunkAtPosition($this->position)->setFullBlock($this->position->x & Chunk::COORD_MASK, $this->position->y, $this->position->z & Chunk::COORD_MASK, $this->getFullId()); + $this->position->getWorld()->getOrLoadChunkAtPosition($this->position)->setFullBlock($this->position->x & Chunk::COORD_MASK, $this->position->y, $this->position->z & Chunk::COORD_MASK, $this->getStateId()); $tileType = $this->idInfo->getTileClass(); $oldTile = $this->position->getWorld()->getTile($this->position); @@ -194,7 +178,7 @@ class Block{ * Returns whether the given block has the same type and properties as this block. */ public function isSameState(Block $other) : bool{ - return $this->getFullId() === $other->getFullId(); + return $this->getStateId() === $other->getStateId(); } /** @@ -551,7 +535,7 @@ class Block{ * @return string */ public function __toString(){ - return "Block[" . $this->getName() . "] (" . $this->getId() . ":" . $this->getMeta() . ")"; + return "Block[" . $this->getName() . "] (" . $this->getTypeId() . ":" . $this->computeStateData() . ")"; } /** diff --git a/src/block/BlockFactory.php b/src/block/BlockFactory.php index ec45b6ab7..f71d4bbb1 100644 --- a/src/block/BlockFactory.php +++ b/src/block/BlockFactory.php @@ -55,14 +55,13 @@ use pocketmine\block\tile\Skull as TileSkull; use pocketmine\block\tile\Smoker as TileSmoker; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\InvalidBlockStateException; -use pocketmine\block\utils\SlabType; use pocketmine\block\utils\TreeType; use pocketmine\item\Item; use pocketmine\item\ItemIds; use pocketmine\item\ToolTier; +use pocketmine\utils\AssumptionFailedError; use pocketmine\utils\SingletonTrait; use pocketmine\world\light\LightUpdate; -use function get_class; use function min; /** @@ -79,16 +78,11 @@ class BlockFactory{ private array $fullList = []; /** - * @var int[] - * @phpstan-var array + * Index of default states for every block type + * @var Block[] + * @phpstan-var array */ - private array $defaultStateIndexes = []; - - /** - * @var int[] - * @phpstan-var array - */ - private array $mappedStateIndexes = []; + private array $typeIndex = []; /** * @var int[] @@ -113,10 +107,10 @@ class BlockFactory{ public function __construct(){ $railBreakInfo = new BlockBreakInfo(0.7); - $this->registerAllMeta(new ActivatorRail(new BID(Ids::ACTIVATOR_RAIL, LegacyIds::ACTIVATOR_RAIL, 0), "Activator Rail", $railBreakInfo)); - $this->registerAllMeta(new Air(new BID(Ids::AIR, LegacyIds::AIR, 0), "Air", BreakInfo::indestructible(-1.0))); - $this->registerAllMeta(new Anvil(new BID(Ids::ANVIL, LegacyIds::ANVIL, 0), "Anvil", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 6000.0))); - $this->registerAllMeta(new Bamboo(new BID(Ids::BAMBOO, LegacyIds::BAMBOO, 0), "Bamboo", new class(2.0 /* 1.0 in PC */, ToolType::AXE) extends BreakInfo{ + $this->register(new ActivatorRail(new BID(Ids::ACTIVATOR_RAIL, LegacyIds::ACTIVATOR_RAIL, 0), "Activator Rail", $railBreakInfo)); + $this->register(new Air(new BID(Ids::AIR, LegacyIds::AIR, 0), "Air", BreakInfo::indestructible(-1.0))); + $this->register(new Anvil(new BID(Ids::ANVIL, LegacyIds::ANVIL, 0), "Anvil", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 6000.0))); + $this->register(new Bamboo(new BID(Ids::BAMBOO, LegacyIds::BAMBOO, 0), "Bamboo", new class(2.0 /* 1.0 in PC */, ToolType::AXE) extends BreakInfo{ public function getBreakTime(Item $item) : float{ if($item->getBlockToolType() === ToolType::SWORD){ return 0.0; @@ -124,234 +118,224 @@ class BlockFactory{ return parent::getBreakTime($item); } })); - $this->registerAllMeta(new BambooSapling(new BID(Ids::BAMBOO_SAPLING, LegacyIds::BAMBOO_SAPLING, 0), "Bamboo Sapling", BreakInfo::instant())); + $this->register(new BambooSapling(new BID(Ids::BAMBOO_SAPLING, LegacyIds::BAMBOO_SAPLING, 0), "Bamboo Sapling", BreakInfo::instant())); $bannerBreakInfo = new BreakInfo(1.0, ToolType::AXE); - $this->registerAllMeta(new FloorBanner(new BID(Ids::BANNER, LegacyIds::STANDING_BANNER, 0, ItemIds::BANNER, TileBanner::class), "Banner", $bannerBreakInfo)); - $this->registerAllMeta(new WallBanner(new BID(Ids::WALL_BANNER, LegacyIds::WALL_BANNER, 0, ItemIds::BANNER, TileBanner::class), "Wall Banner", $bannerBreakInfo)); - $this->registerAllMeta(new Barrel(new BID(Ids::BARREL, LegacyIds::BARREL, 0, null, TileBarrel::class), "Barrel", new BreakInfo(2.5, ToolType::AXE))); - $this->registerAllMeta(new Transparent(new BID(Ids::BARRIER, LegacyIds::BARRIER, 0), "Barrier", BreakInfo::indestructible())); - $this->registerAllMeta(new Beacon(new BID(Ids::BEACON, LegacyIds::BEACON, 0, null, TileBeacon::class), "Beacon", new BreakInfo(3.0))); - $this->registerAllMeta(new Bed(new BID(Ids::BED, LegacyIds::BED_BLOCK, 0, ItemIds::BED, TileBed::class), "Bed Block", new BreakInfo(0.2))); - $this->registerAllMeta(new Bedrock(new BID(Ids::BEDROCK, LegacyIds::BEDROCK, 0), "Bedrock", BreakInfo::indestructible())); + $this->register(new FloorBanner(new BID(Ids::BANNER, LegacyIds::STANDING_BANNER, 0, ItemIds::BANNER, TileBanner::class), "Banner", $bannerBreakInfo)); + $this->register(new WallBanner(new BID(Ids::WALL_BANNER, LegacyIds::WALL_BANNER, 0, ItemIds::BANNER, TileBanner::class), "Wall Banner", $bannerBreakInfo)); + $this->register(new Barrel(new BID(Ids::BARREL, LegacyIds::BARREL, 0, null, TileBarrel::class), "Barrel", new BreakInfo(2.5, ToolType::AXE))); + $this->register(new Transparent(new BID(Ids::BARRIER, LegacyIds::BARRIER, 0), "Barrier", BreakInfo::indestructible())); + $this->register(new Beacon(new BID(Ids::BEACON, LegacyIds::BEACON, 0, null, TileBeacon::class), "Beacon", new BreakInfo(3.0))); + $this->register(new Bed(new BID(Ids::BED, LegacyIds::BED_BLOCK, 0, ItemIds::BED, TileBed::class), "Bed Block", new BreakInfo(0.2))); + $this->register(new Bedrock(new BID(Ids::BEDROCK, LegacyIds::BEDROCK, 0), "Bedrock", BreakInfo::indestructible())); - $this->registerAllMeta(new Beetroot(new BID(Ids::BEETROOTS, LegacyIds::BEETROOT_BLOCK, 0), "Beetroot Block", BreakInfo::instant())); - $this->registerAllMeta(new Bell(new BID(Ids::BELL, LegacyIds::BELL, 0, null, TileBell::class), "Bell", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new BlueIce(new BID(Ids::BLUE_ICE, LegacyIds::BLUE_ICE, 0), "Blue Ice", new BreakInfo(2.8, ToolType::PICKAXE))); - $this->registerAllMeta(new BoneBlock(new BID(Ids::BONE_BLOCK, LegacyIds::BONE_BLOCK, 0), "Bone Block", new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new Bookshelf(new BID(Ids::BOOKSHELF, LegacyIds::BOOKSHELF, 0), "Bookshelf", new BreakInfo(1.5, ToolType::AXE))); - $this->registerAllMeta(new BrewingStand(new BID(Ids::BREWING_STAND, LegacyIds::BREWING_STAND_BLOCK, 0, ItemIds::BREWING_STAND, TileBrewingStand::class), "Brewing Stand", new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Beetroot(new BID(Ids::BEETROOTS, LegacyIds::BEETROOT_BLOCK, 0), "Beetroot Block", BreakInfo::instant())); + $this->register(new Bell(new BID(Ids::BELL, LegacyIds::BELL, 0, null, TileBell::class), "Bell", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new BlueIce(new BID(Ids::BLUE_ICE, LegacyIds::BLUE_ICE, 0), "Blue Ice", new BreakInfo(2.8, ToolType::PICKAXE))); + $this->register(new BoneBlock(new BID(Ids::BONE_BLOCK, LegacyIds::BONE_BLOCK, 0), "Bone Block", new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Bookshelf(new BID(Ids::BOOKSHELF, LegacyIds::BOOKSHELF, 0), "Bookshelf", new BreakInfo(1.5, ToolType::AXE))); + $this->register(new BrewingStand(new BID(Ids::BREWING_STAND, LegacyIds::BREWING_STAND_BLOCK, 0, ItemIds::BREWING_STAND, TileBrewingStand::class), "Brewing Stand", new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); $bricksBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - $this->registerAllMeta(new Stair(new BID(Ids::BRICK_STAIRS, LegacyIds::BRICK_STAIRS, 0), "Brick Stairs", $bricksBreakInfo)); - $this->registerAllMeta(new Opaque(new BID(Ids::BRICKS, LegacyIds::BRICK_BLOCK, 0), "Bricks", $bricksBreakInfo)); + $this->register(new Stair(new BID(Ids::BRICK_STAIRS, LegacyIds::BRICK_STAIRS, 0), "Brick Stairs", $bricksBreakInfo)); + $this->register(new Opaque(new BID(Ids::BRICKS, LegacyIds::BRICK_BLOCK, 0), "Bricks", $bricksBreakInfo)); - $this->registerAllMeta(new BrownMushroom(new BID(Ids::BROWN_MUSHROOM, LegacyIds::BROWN_MUSHROOM, 0), "Brown Mushroom", BreakInfo::instant())); - $this->registerAllMeta(new Cactus(new BID(Ids::CACTUS, LegacyIds::CACTUS, 0), "Cactus", new BreakInfo(0.4))); - $this->registerAllMeta(new Cake(new BID(Ids::CAKE, LegacyIds::CAKE_BLOCK, 0, ItemIds::CAKE), "Cake", new BreakInfo(0.5))); - $this->registerAllMeta(new Carrot(new BID(Ids::CARROTS, LegacyIds::CARROTS, 0), "Carrot Block", BreakInfo::instant())); + $this->register(new BrownMushroom(new BID(Ids::BROWN_MUSHROOM, LegacyIds::BROWN_MUSHROOM, 0), "Brown Mushroom", BreakInfo::instant())); + $this->register(new Cactus(new BID(Ids::CACTUS, LegacyIds::CACTUS, 0), "Cactus", new BreakInfo(0.4))); + $this->register(new Cake(new BID(Ids::CAKE, LegacyIds::CAKE_BLOCK, 0, ItemIds::CAKE), "Cake", new BreakInfo(0.5))); + $this->register(new Carrot(new BID(Ids::CARROTS, LegacyIds::CARROTS, 0), "Carrot Block", BreakInfo::instant())); $chestBreakInfo = new BreakInfo(2.5, ToolType::AXE); - $this->registerAllMeta(new Chest(new BID(Ids::CHEST, LegacyIds::CHEST, 0, null, TileChest::class), "Chest", $chestBreakInfo)); - $this->registerAllMeta(new Clay(new BID(Ids::CLAY, LegacyIds::CLAY_BLOCK, 0), "Clay Block", new BreakInfo(0.6, ToolType::SHOVEL))); - $this->registerAllMeta(new Coal(new BID(Ids::COAL, LegacyIds::COAL_BLOCK, 0), "Coal Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0))); - $this->registerAllMeta(new CoalOre(new BID(Ids::COAL_ORE, LegacyIds::COAL_ORE, 0), "Coal Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Chest(new BID(Ids::CHEST, LegacyIds::CHEST, 0, null, TileChest::class), "Chest", $chestBreakInfo)); + $this->register(new Clay(new BID(Ids::CLAY, LegacyIds::CLAY_BLOCK, 0), "Clay Block", new BreakInfo(0.6, ToolType::SHOVEL))); + $this->register(new Coal(new BID(Ids::COAL, LegacyIds::COAL_BLOCK, 0), "Coal Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0))); + $this->register(new CoalOre(new BID(Ids::COAL_ORE, LegacyIds::COAL_ORE, 0), "Coal Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); $cobblestoneBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - $this->registerAllMeta($cobblestone = new Opaque(new BID(Ids::COBBLESTONE, LegacyIds::COBBLESTONE, 0), "Cobblestone", $cobblestoneBreakInfo)); - $this->registerAllMeta(new Opaque(new BID(Ids::MOSSY_COBBLESTONE, LegacyIds::MOSSY_COBBLESTONE, 0), "Mossy Cobblestone", $cobblestoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::COBBLESTONE_STAIRS, LegacyIds::COBBLESTONE_STAIRS, 0), "Cobblestone Stairs", $cobblestoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::MOSSY_COBBLESTONE_STAIRS, LegacyIds::MOSSY_COBBLESTONE_STAIRS, 0), "Mossy Cobblestone Stairs", $cobblestoneBreakInfo)); + $this->register($cobblestone = new Opaque(new BID(Ids::COBBLESTONE, LegacyIds::COBBLESTONE, 0), "Cobblestone", $cobblestoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::MOSSY_COBBLESTONE, LegacyIds::MOSSY_COBBLESTONE, 0), "Mossy Cobblestone", $cobblestoneBreakInfo)); + $this->register(new Stair(new BID(Ids::COBBLESTONE_STAIRS, LegacyIds::COBBLESTONE_STAIRS, 0), "Cobblestone Stairs", $cobblestoneBreakInfo)); + $this->register(new Stair(new BID(Ids::MOSSY_COBBLESTONE_STAIRS, LegacyIds::MOSSY_COBBLESTONE_STAIRS, 0), "Mossy Cobblestone Stairs", $cobblestoneBreakInfo)); - $this->registerAllMeta(new Cobweb(new BID(Ids::COBWEB, LegacyIds::COBWEB, 0), "Cobweb", new BreakInfo(4.0, ToolType::SWORD | ToolType::SHEARS, 1))); - $this->registerAllMeta(new CocoaBlock(new BID(Ids::COCOA_POD, LegacyIds::COCOA, 0), "Cocoa Block", new BreakInfo(0.2, ToolType::AXE, 0, 15.0))); - $this->registerAllMeta(new CoralBlock(new BID(Ids::CORAL_BLOCK, LegacyIds::CORAL_BLOCK, 0), "Coral Block", new BreakInfo(7.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new CraftingTable(new BID(Ids::CRAFTING_TABLE, LegacyIds::CRAFTING_TABLE, 0), "Crafting Table", new BreakInfo(2.5, ToolType::AXE))); - $this->registerAllMeta(new DaylightSensor(new BIDFlattened(Ids::DAYLIGHT_SENSOR, LegacyIds::DAYLIGHT_DETECTOR, [LegacyIds::DAYLIGHT_DETECTOR_INVERTED], 0, null, TileDaylightSensor::class), "Daylight Sensor", new BreakInfo(0.2, ToolType::AXE))); - $this->registerAllMeta(new DeadBush(new BID(Ids::DEAD_BUSH, LegacyIds::DEADBUSH, 0), "Dead Bush", BreakInfo::instant(ToolType::SHEARS, 1))); - $this->registerAllMeta(new DetectorRail(new BID(Ids::DETECTOR_RAIL, LegacyIds::DETECTOR_RAIL, 0), "Detector Rail", $railBreakInfo)); + $this->register(new Cobweb(new BID(Ids::COBWEB, LegacyIds::COBWEB, 0), "Cobweb", new BreakInfo(4.0, ToolType::SWORD | ToolType::SHEARS, 1))); + $this->register(new CocoaBlock(new BID(Ids::COCOA_POD, LegacyIds::COCOA, 0), "Cocoa Block", new BreakInfo(0.2, ToolType::AXE, 0, 15.0))); + $this->register(new CoralBlock(new BID(Ids::CORAL_BLOCK, LegacyIds::CORAL_BLOCK, 0), "Coral Block", new BreakInfo(7.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new CraftingTable(new BID(Ids::CRAFTING_TABLE, LegacyIds::CRAFTING_TABLE, 0), "Crafting Table", new BreakInfo(2.5, ToolType::AXE))); + $this->register(new DaylightSensor(new BIDFlattened(Ids::DAYLIGHT_SENSOR, LegacyIds::DAYLIGHT_DETECTOR, [LegacyIds::DAYLIGHT_DETECTOR_INVERTED], 0, null, TileDaylightSensor::class), "Daylight Sensor", new BreakInfo(0.2, ToolType::AXE))); + $this->register(new DeadBush(new BID(Ids::DEAD_BUSH, LegacyIds::DEADBUSH, 0), "Dead Bush", BreakInfo::instant(ToolType::SHEARS, 1))); + $this->register(new DetectorRail(new BID(Ids::DETECTOR_RAIL, LegacyIds::DETECTOR_RAIL, 0), "Detector Rail", $railBreakInfo)); - $this->registerAllMeta(new Opaque(new BID(Ids::DIAMOND, LegacyIds::DIAMOND_BLOCK, 0), "Diamond Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel(), 30.0))); - $this->registerAllMeta(new DiamondOre(new BID(Ids::DIAMOND_ORE, LegacyIds::DIAMOND_ORE, 0), "Diamond Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); - $this->registerAllMeta(new Dirt(new BID(Ids::DIRT, LegacyIds::DIRT, 0), "Dirt", new BreakInfo(0.5, ToolType::SHOVEL))); - $this->registerAllMeta( - new DoublePlant(new BID(Ids::SUNFLOWER, LegacyIds::DOUBLE_PLANT, Meta::DOUBLE_PLANT_SUNFLOWER), "Sunflower", BreakInfo::instant()), - new DoublePlant(new BID(Ids::LILAC, LegacyIds::DOUBLE_PLANT, Meta::DOUBLE_PLANT_LILAC), "Lilac", BreakInfo::instant()), - new DoublePlant(new BID(Ids::ROSE_BUSH, LegacyIds::DOUBLE_PLANT, Meta::DOUBLE_PLANT_ROSE_BUSH), "Rose Bush", BreakInfo::instant()), - new DoublePlant(new BID(Ids::PEONY, LegacyIds::DOUBLE_PLANT, Meta::DOUBLE_PLANT_PEONY), "Peony", BreakInfo::instant()), - new DoubleTallGrass(new BID(Ids::DOUBLE_TALLGRASS, LegacyIds::DOUBLE_PLANT, Meta::DOUBLE_PLANT_TALLGRASS), "Double Tallgrass", BreakInfo::instant(ToolType::SHEARS, 1)), - new DoubleTallGrass(new BID(Ids::LARGE_FERN, LegacyIds::DOUBLE_PLANT, Meta::DOUBLE_PLANT_LARGE_FERN), "Large Fern", BreakInfo::instant(ToolType::SHEARS, 1)), - ); - $this->registerAllMeta(new DragonEgg(new BID(Ids::DRAGON_EGG, LegacyIds::DRAGON_EGG, 0), "Dragon Egg", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new DriedKelp(new BID(Ids::DRIED_KELP, LegacyIds::DRIED_KELP_BLOCK, 0), "Dried Kelp Block", new BreakInfo(0.5, ToolType::NONE, 0, 12.5))); - $this->registerAllMeta(new Opaque(new BID(Ids::EMERALD, LegacyIds::EMERALD_BLOCK, 0), "Emerald Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel(), 30.0))); - $this->registerAllMeta(new EmeraldOre(new BID(Ids::EMERALD_ORE, LegacyIds::EMERALD_ORE, 0), "Emerald Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); - $this->registerAllMeta(new EnchantingTable(new BID(Ids::ENCHANTING_TABLE, LegacyIds::ENCHANTING_TABLE, 0, null, TileEnchantingTable::class), "Enchanting Table", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 6000.0))); - $this->registerAllMeta(new EndPortalFrame(new BID(Ids::END_PORTAL_FRAME, LegacyIds::END_PORTAL_FRAME, 0), "End Portal Frame", BreakInfo::indestructible())); - $this->registerAllMeta(new EndRod(new BID(Ids::END_ROD, LegacyIds::END_ROD, 0), "End Rod", BreakInfo::instant())); - $this->registerAllMeta(new Opaque(new BID(Ids::END_STONE, LegacyIds::END_STONE, 0), "End Stone", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 45.0))); + $this->register(new Opaque(new BID(Ids::DIAMOND, LegacyIds::DIAMOND_BLOCK, 0), "Diamond Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel(), 30.0))); + $this->register(new DiamondOre(new BID(Ids::DIAMOND_ORE, LegacyIds::DIAMOND_ORE, 0), "Diamond Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); + $this->register(new Dirt(new BID(Ids::DIRT, LegacyIds::DIRT, 0), "Dirt", new BreakInfo(0.5, ToolType::SHOVEL))); + $this->register(new DoublePlant(new BID(Ids::SUNFLOWER, LegacyIds::DOUBLE_PLANT, Meta::DOUBLE_PLANT_SUNFLOWER), "Sunflower", BreakInfo::instant())); + $this->register(new DoublePlant(new BID(Ids::LILAC, LegacyIds::DOUBLE_PLANT, Meta::DOUBLE_PLANT_LILAC), "Lilac", BreakInfo::instant())); + $this->register(new DoublePlant(new BID(Ids::ROSE_BUSH, LegacyIds::DOUBLE_PLANT, Meta::DOUBLE_PLANT_ROSE_BUSH), "Rose Bush", BreakInfo::instant())); + $this->register(new DoublePlant(new BID(Ids::PEONY, LegacyIds::DOUBLE_PLANT, Meta::DOUBLE_PLANT_PEONY), "Peony", BreakInfo::instant())); + $this->register(new DoubleTallGrass(new BID(Ids::DOUBLE_TALLGRASS, LegacyIds::DOUBLE_PLANT, Meta::DOUBLE_PLANT_TALLGRASS), "Double Tallgrass", BreakInfo::instant(ToolType::SHEARS, 1))); + $this->register(new DoubleTallGrass(new BID(Ids::LARGE_FERN, LegacyIds::DOUBLE_PLANT, Meta::DOUBLE_PLANT_LARGE_FERN), "Large Fern", BreakInfo::instant(ToolType::SHEARS, 1))); + $this->register(new DragonEgg(new BID(Ids::DRAGON_EGG, LegacyIds::DRAGON_EGG, 0), "Dragon Egg", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new DriedKelp(new BID(Ids::DRIED_KELP, LegacyIds::DRIED_KELP_BLOCK, 0), "Dried Kelp Block", new BreakInfo(0.5, ToolType::NONE, 0, 12.5))); + $this->register(new Opaque(new BID(Ids::EMERALD, LegacyIds::EMERALD_BLOCK, 0), "Emerald Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel(), 30.0))); + $this->register(new EmeraldOre(new BID(Ids::EMERALD_ORE, LegacyIds::EMERALD_ORE, 0), "Emerald Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); + $this->register(new EnchantingTable(new BID(Ids::ENCHANTING_TABLE, LegacyIds::ENCHANTING_TABLE, 0, null, TileEnchantingTable::class), "Enchanting Table", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 6000.0))); + $this->register(new EndPortalFrame(new BID(Ids::END_PORTAL_FRAME, LegacyIds::END_PORTAL_FRAME, 0), "End Portal Frame", BreakInfo::indestructible())); + $this->register(new EndRod(new BID(Ids::END_ROD, LegacyIds::END_ROD, 0), "End Rod", BreakInfo::instant())); + $this->register(new Opaque(new BID(Ids::END_STONE, LegacyIds::END_STONE, 0), "End Stone", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 45.0))); $endBrickBreakInfo = new BreakInfo(0.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 4.0); - $this->registerAllMeta(new Opaque(new BID(Ids::END_STONE_BRICKS, LegacyIds::END_BRICKS, 0), "End Stone Bricks", $endBrickBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::END_STONE_BRICK_STAIRS, LegacyIds::END_BRICK_STAIRS, 0), "End Stone Brick Stairs", $endBrickBreakInfo)); + $this->register(new Opaque(new BID(Ids::END_STONE_BRICKS, LegacyIds::END_BRICKS, 0), "End Stone Bricks", $endBrickBreakInfo)); + $this->register(new Stair(new BID(Ids::END_STONE_BRICK_STAIRS, LegacyIds::END_BRICK_STAIRS, 0), "End Stone Brick Stairs", $endBrickBreakInfo)); - $this->registerAllMeta(new EnderChest(new BID(Ids::ENDER_CHEST, LegacyIds::ENDER_CHEST, 0, null, TileEnderChest::class), "Ender Chest", new BreakInfo(22.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 3000.0))); - $this->registerAllMeta(new Farmland(new BID(Ids::FARMLAND, LegacyIds::FARMLAND, 0), "Farmland", new BreakInfo(0.6, ToolType::SHOVEL))); - $this->registerAllMeta(new Fire(new BID(Ids::FIRE, LegacyIds::FIRE, 0), "Fire Block", BreakInfo::instant())); - $this->registerAllMeta(new FletchingTable(new BID(Ids::FLETCHING_TABLE, LegacyIds::FLETCHING_TABLE, 0), "Fletching Table", new BreakInfo(2.5, ToolType::AXE, 0, 2.5))); - $this->registerAllMeta(new Flower(new BID(Ids::DANDELION, LegacyIds::DANDELION, 0), "Dandelion", BreakInfo::instant())); - $this->registerAllMeta( - new Flower(new BID(Ids::POPPY, LegacyIds::RED_FLOWER, Meta::FLOWER_POPPY), "Poppy", BreakInfo::instant()), - new Flower(new BID(Ids::ALLIUM, LegacyIds::RED_FLOWER, Meta::FLOWER_ALLIUM), "Allium", BreakInfo::instant()), - new Flower(new BID(Ids::AZURE_BLUET, LegacyIds::RED_FLOWER, Meta::FLOWER_AZURE_BLUET), "Azure Bluet", BreakInfo::instant()), - new Flower(new BID(Ids::BLUE_ORCHID, LegacyIds::RED_FLOWER, Meta::FLOWER_BLUE_ORCHID), "Blue Orchid", BreakInfo::instant()), - new Flower(new BID(Ids::CORNFLOWER, LegacyIds::RED_FLOWER, Meta::FLOWER_CORNFLOWER), "Cornflower", BreakInfo::instant()), - new Flower(new BID(Ids::LILY_OF_THE_VALLEY, LegacyIds::RED_FLOWER, Meta::FLOWER_LILY_OF_THE_VALLEY), "Lily of the Valley", BreakInfo::instant()), - new Flower(new BID(Ids::ORANGE_TULIP, LegacyIds::RED_FLOWER, Meta::FLOWER_ORANGE_TULIP), "Orange Tulip", BreakInfo::instant()), - new Flower(new BID(Ids::OXEYE_DAISY, LegacyIds::RED_FLOWER, Meta::FLOWER_OXEYE_DAISY), "Oxeye Daisy", BreakInfo::instant()), - new Flower(new BID(Ids::PINK_TULIP, LegacyIds::RED_FLOWER, Meta::FLOWER_PINK_TULIP), "Pink Tulip", BreakInfo::instant()), - new Flower(new BID(Ids::RED_TULIP, LegacyIds::RED_FLOWER, Meta::FLOWER_RED_TULIP), "Red Tulip", BreakInfo::instant()), - new Flower(new BID(Ids::WHITE_TULIP, LegacyIds::RED_FLOWER, Meta::FLOWER_WHITE_TULIP), "White Tulip", BreakInfo::instant()), - ); - $this->registerAllMeta(new FlowerPot(new BID(Ids::FLOWER_POT, LegacyIds::FLOWER_POT_BLOCK, 0, ItemIds::FLOWER_POT, TileFlowerPot::class), "Flower Pot", BreakInfo::instant())); - $this->registerAllMeta(new FrostedIce(new BID(Ids::FROSTED_ICE, LegacyIds::FROSTED_ICE, 0), "Frosted Ice", new BreakInfo(2.5, ToolType::PICKAXE))); - $this->registerAllMeta(new Furnace(new BIDFlattened(Ids::FURNACE, LegacyIds::FURNACE, [LegacyIds::LIT_FURNACE], 0, null, TileNormalFurnace::class), "Furnace", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new Furnace(new BIDFlattened(Ids::BLAST_FURNACE, LegacyIds::BLAST_FURNACE, [LegacyIds::LIT_BLAST_FURNACE], 0, null, TileBlastFurnace::class), "Blast Furnace", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new Furnace(new BIDFlattened(Ids::SMOKER, LegacyIds::SMOKER, [LegacyIds::LIT_SMOKER], 0, null, TileSmoker::class), "Smoker", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new EnderChest(new BID(Ids::ENDER_CHEST, LegacyIds::ENDER_CHEST, 0, null, TileEnderChest::class), "Ender Chest", new BreakInfo(22.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 3000.0))); + $this->register(new Farmland(new BID(Ids::FARMLAND, LegacyIds::FARMLAND, 0), "Farmland", new BreakInfo(0.6, ToolType::SHOVEL))); + $this->register(new Fire(new BID(Ids::FIRE, LegacyIds::FIRE, 0), "Fire Block", BreakInfo::instant())); + $this->register(new FletchingTable(new BID(Ids::FLETCHING_TABLE, LegacyIds::FLETCHING_TABLE, 0), "Fletching Table", new BreakInfo(2.5, ToolType::AXE, 0, 2.5))); + $this->register(new Flower(new BID(Ids::DANDELION, LegacyIds::DANDELION, 0), "Dandelion", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::POPPY, LegacyIds::RED_FLOWER, Meta::FLOWER_POPPY), "Poppy", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::ALLIUM, LegacyIds::RED_FLOWER, Meta::FLOWER_ALLIUM), "Allium", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::AZURE_BLUET, LegacyIds::RED_FLOWER, Meta::FLOWER_AZURE_BLUET), "Azure Bluet", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::BLUE_ORCHID, LegacyIds::RED_FLOWER, Meta::FLOWER_BLUE_ORCHID), "Blue Orchid", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::CORNFLOWER, LegacyIds::RED_FLOWER, Meta::FLOWER_CORNFLOWER), "Cornflower", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::LILY_OF_THE_VALLEY, LegacyIds::RED_FLOWER, Meta::FLOWER_LILY_OF_THE_VALLEY), "Lily of the Valley", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::ORANGE_TULIP, LegacyIds::RED_FLOWER, Meta::FLOWER_ORANGE_TULIP), "Orange Tulip", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::OXEYE_DAISY, LegacyIds::RED_FLOWER, Meta::FLOWER_OXEYE_DAISY), "Oxeye Daisy", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::PINK_TULIP, LegacyIds::RED_FLOWER, Meta::FLOWER_PINK_TULIP), "Pink Tulip", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::RED_TULIP, LegacyIds::RED_FLOWER, Meta::FLOWER_RED_TULIP), "Red Tulip", BreakInfo::instant())); + $this->register(new Flower(new BID(Ids::WHITE_TULIP, LegacyIds::RED_FLOWER, Meta::FLOWER_WHITE_TULIP), "White Tulip", BreakInfo::instant())); + $this->register(new FlowerPot(new BID(Ids::FLOWER_POT, LegacyIds::FLOWER_POT_BLOCK, 0, ItemIds::FLOWER_POT, TileFlowerPot::class), "Flower Pot", BreakInfo::instant())); + $this->register(new FrostedIce(new BID(Ids::FROSTED_ICE, LegacyIds::FROSTED_ICE, 0), "Frosted Ice", new BreakInfo(2.5, ToolType::PICKAXE))); + $this->register(new Furnace(new BIDFlattened(Ids::FURNACE, LegacyIds::FURNACE, [LegacyIds::LIT_FURNACE], 0, null, TileNormalFurnace::class), "Furnace", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Furnace(new BIDFlattened(Ids::BLAST_FURNACE, LegacyIds::BLAST_FURNACE, [LegacyIds::LIT_BLAST_FURNACE], 0, null, TileBlastFurnace::class), "Blast Furnace", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Furnace(new BIDFlattened(Ids::SMOKER, LegacyIds::SMOKER, [LegacyIds::LIT_SMOKER], 0, null, TileSmoker::class), "Smoker", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); $glassBreakInfo = new BreakInfo(0.3); - $this->registerAllMeta(new Glass(new BID(Ids::GLASS, LegacyIds::GLASS, 0), "Glass", $glassBreakInfo)); - $this->registerAllMeta(new GlassPane(new BID(Ids::GLASS_PANE, LegacyIds::GLASS_PANE, 0), "Glass Pane", $glassBreakInfo)); - $this->registerAllMeta(new GlowingObsidian(new BID(Ids::GLOWING_OBSIDIAN, LegacyIds::GLOWINGOBSIDIAN, 0), "Glowing Obsidian", new BreakInfo(10.0, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel(), 50.0))); - $this->registerAllMeta(new Glowstone(new BID(Ids::GLOWSTONE, LegacyIds::GLOWSTONE, 0), "Glowstone", new BreakInfo(0.3, ToolType::PICKAXE))); - $this->registerAllMeta(new Opaque(new BID(Ids::GOLD, LegacyIds::GOLD_BLOCK, 0), "Gold Block", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel(), 30.0))); - $this->registerAllMeta(new Opaque(new BID(Ids::GOLD_ORE, LegacyIds::GOLD_ORE, 0), "Gold Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); + $this->register(new Glass(new BID(Ids::GLASS, LegacyIds::GLASS, 0), "Glass", $glassBreakInfo)); + $this->register(new GlassPane(new BID(Ids::GLASS_PANE, LegacyIds::GLASS_PANE, 0), "Glass Pane", $glassBreakInfo)); + $this->register(new GlowingObsidian(new BID(Ids::GLOWING_OBSIDIAN, LegacyIds::GLOWINGOBSIDIAN, 0), "Glowing Obsidian", new BreakInfo(10.0, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel(), 50.0))); + $this->register(new Glowstone(new BID(Ids::GLOWSTONE, LegacyIds::GLOWSTONE, 0), "Glowstone", new BreakInfo(0.3, ToolType::PICKAXE))); + $this->register(new Opaque(new BID(Ids::GOLD, LegacyIds::GOLD_BLOCK, 0), "Gold Block", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel(), 30.0))); + $this->register(new Opaque(new BID(Ids::GOLD_ORE, LegacyIds::GOLD_ORE, 0), "Gold Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); $grassBreakInfo = new BreakInfo(0.6, ToolType::SHOVEL); - $this->registerAllMeta(new Grass(new BID(Ids::GRASS, LegacyIds::GRASS, 0), "Grass", $grassBreakInfo)); - $this->registerAllMeta(new GrassPath(new BID(Ids::GRASS_PATH, LegacyIds::GRASS_PATH, 0), "Grass Path", $grassBreakInfo)); - $this->registerAllMeta(new Gravel(new BID(Ids::GRAVEL, LegacyIds::GRAVEL, 0), "Gravel", new BreakInfo(0.6, ToolType::SHOVEL))); + $this->register(new Grass(new BID(Ids::GRASS, LegacyIds::GRASS, 0), "Grass", $grassBreakInfo)); + $this->register(new GrassPath(new BID(Ids::GRASS_PATH, LegacyIds::GRASS_PATH, 0), "Grass Path", $grassBreakInfo)); + $this->register(new Gravel(new BID(Ids::GRAVEL, LegacyIds::GRAVEL, 0), "Gravel", new BreakInfo(0.6, ToolType::SHOVEL))); $hardenedClayBreakInfo = new BreakInfo(1.25, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 21.0); - $this->registerAllMeta(new HardenedClay(new BID(Ids::HARDENED_CLAY, LegacyIds::HARDENED_CLAY, 0), "Hardened Clay", $hardenedClayBreakInfo)); + $this->register(new HardenedClay(new BID(Ids::HARDENED_CLAY, LegacyIds::HARDENED_CLAY, 0), "Hardened Clay", $hardenedClayBreakInfo)); $hardenedGlassBreakInfo = new BreakInfo(10.0); - $this->registerAllMeta(new HardenedGlass(new BID(Ids::HARDENED_GLASS, LegacyIds::HARD_GLASS, 0), "Hardened Glass", $hardenedGlassBreakInfo)); - $this->registerAllMeta(new HardenedGlassPane(new BID(Ids::HARDENED_GLASS_PANE, LegacyIds::HARD_GLASS_PANE, 0), "Hardened Glass Pane", $hardenedGlassBreakInfo)); - $this->registerAllMeta(new HayBale(new BID(Ids::HAY_BALE, LegacyIds::HAY_BALE, 0), "Hay Bale", new BreakInfo(0.5))); - $this->registerAllMeta(new Hopper(new BID(Ids::HOPPER, LegacyIds::HOPPER_BLOCK, 0, ItemIds::HOPPER, TileHopper::class), "Hopper", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 15.0))); - $this->registerAllMeta(new Ice(new BID(Ids::ICE, LegacyIds::ICE, 0), "Ice", new BreakInfo(0.5, ToolType::PICKAXE))); + $this->register(new HardenedGlass(new BID(Ids::HARDENED_GLASS, LegacyIds::HARD_GLASS, 0), "Hardened Glass", $hardenedGlassBreakInfo)); + $this->register(new HardenedGlassPane(new BID(Ids::HARDENED_GLASS_PANE, LegacyIds::HARD_GLASS_PANE, 0), "Hardened Glass Pane", $hardenedGlassBreakInfo)); + $this->register(new HayBale(new BID(Ids::HAY_BALE, LegacyIds::HAY_BALE, 0), "Hay Bale", new BreakInfo(0.5))); + $this->register(new Hopper(new BID(Ids::HOPPER, LegacyIds::HOPPER_BLOCK, 0, ItemIds::HOPPER, TileHopper::class), "Hopper", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 15.0))); + $this->register(new Ice(new BID(Ids::ICE, LegacyIds::ICE, 0), "Ice", new BreakInfo(0.5, ToolType::PICKAXE))); $updateBlockBreakInfo = new BreakInfo(1.0); - $this->registerAllMeta(new Opaque(new BID(Ids::INFO_UPDATE, LegacyIds::INFO_UPDATE, 0), "update!", $updateBlockBreakInfo)); - $this->registerAllMeta(new Opaque(new BID(Ids::INFO_UPDATE2, LegacyIds::INFO_UPDATE2, 0), "ate!upd", $updateBlockBreakInfo)); - $this->registerAllMeta(new Transparent(new BID(Ids::INVISIBLE_BEDROCK, LegacyIds::INVISIBLEBEDROCK, 0), "Invisible Bedrock", BreakInfo::indestructible())); + $this->register(new Opaque(new BID(Ids::INFO_UPDATE, LegacyIds::INFO_UPDATE, 0), "update!", $updateBlockBreakInfo)); + $this->register(new Opaque(new BID(Ids::INFO_UPDATE2, LegacyIds::INFO_UPDATE2, 0), "ate!upd", $updateBlockBreakInfo)); + $this->register(new Transparent(new BID(Ids::INVISIBLE_BEDROCK, LegacyIds::INVISIBLEBEDROCK, 0), "Invisible Bedrock", BreakInfo::indestructible())); $ironBreakInfo = new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel(), 30.0); - $this->registerAllMeta(new Opaque(new BID(Ids::IRON, LegacyIds::IRON_BLOCK, 0), "Iron Block", $ironBreakInfo)); - $this->registerAllMeta(new Thin(new BID(Ids::IRON_BARS, LegacyIds::IRON_BARS, 0), "Iron Bars", $ironBreakInfo)); + $this->register(new Opaque(new BID(Ids::IRON, LegacyIds::IRON_BLOCK, 0), "Iron Block", $ironBreakInfo)); + $this->register(new Thin(new BID(Ids::IRON_BARS, LegacyIds::IRON_BARS, 0), "Iron Bars", $ironBreakInfo)); $ironDoorBreakInfo = new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 25.0); - $this->registerAllMeta(new Door(new BID(Ids::IRON_DOOR, LegacyIds::IRON_DOOR_BLOCK, 0, ItemIds::IRON_DOOR), "Iron Door", $ironDoorBreakInfo)); - $this->registerAllMeta(new Trapdoor(new BID(Ids::IRON_TRAPDOOR, LegacyIds::IRON_TRAPDOOR, 0), "Iron Trapdoor", $ironDoorBreakInfo)); - $this->registerAllMeta(new Opaque(new BID(Ids::IRON_ORE, LegacyIds::IRON_ORE, 0), "Iron Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); - $this->registerAllMeta(new ItemFrame(new BID(Ids::ITEM_FRAME, LegacyIds::FRAME_BLOCK, 0, ItemIds::FRAME, TileItemFrame::class), "Item Frame", new BreakInfo(0.25))); - $this->registerAllMeta(new Jukebox(new BID(Ids::JUKEBOX, LegacyIds::JUKEBOX, 0, ItemIds::JUKEBOX, TileJukebox::class), "Jukebox", new BreakInfo(0.8, ToolType::AXE))); //TODO: in PC the hardness is 2.0, not 0.8, unsure if this is a MCPE bug or not - $this->registerAllMeta(new Ladder(new BID(Ids::LADDER, LegacyIds::LADDER, 0), "Ladder", new BreakInfo(0.4, ToolType::AXE))); - $this->registerAllMeta(new Lantern(new BID(Ids::LANTERN, LegacyIds::LANTERN, 0), "Lantern", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new Opaque(new BID(Ids::LAPIS_LAZULI, LegacyIds::LAPIS_BLOCK, 0), "Lapis Lazuli Block", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); - $this->registerAllMeta(new LapisOre(new BID(Ids::LAPIS_LAZULI_ORE, LegacyIds::LAPIS_ORE, 0), "Lapis Lazuli Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); - $this->registerAllMeta(new Lava(new BIDFlattened(Ids::LAVA, LegacyIds::FLOWING_LAVA, [LegacyIds::STILL_LAVA], 0), "Lava", BreakInfo::indestructible(500.0))); - $this->registerAllMeta(new Lectern(new BID(Ids::LECTERN, LegacyIds::LECTERN, 0, ItemIds::LECTERN, TileLectern::class), "Lectern", new BreakInfo(2.0, ToolType::AXE))); - $this->registerAllMeta(new Lever(new BID(Ids::LEVER, LegacyIds::LEVER, 0), "Lever", new BreakInfo(0.5))); - $this->registerAllMeta(new Loom(new BID(Ids::LOOM, LegacyIds::LOOM, 0), "Loom", new BreakInfo(2.5, ToolType::AXE))); - $this->registerAllMeta(new Magma(new BID(Ids::MAGMA, LegacyIds::MAGMA, 0), "Magma Block", new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new Melon(new BID(Ids::MELON, LegacyIds::MELON_BLOCK, 0), "Melon Block", new BreakInfo(1.0, ToolType::AXE))); - $this->registerAllMeta(new MelonStem(new BID(Ids::MELON_STEM, LegacyIds::MELON_STEM, 0, ItemIds::MELON_SEEDS), "Melon Stem", BreakInfo::instant())); - $this->registerAllMeta(new MonsterSpawner(new BID(Ids::MONSTER_SPAWNER, LegacyIds::MOB_SPAWNER, 0, null, TileMonsterSpawner::class), "Monster Spawner", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new Mycelium(new BID(Ids::MYCELIUM, LegacyIds::MYCELIUM, 0), "Mycelium", new BreakInfo(0.6, ToolType::SHOVEL))); + $this->register(new Door(new BID(Ids::IRON_DOOR, LegacyIds::IRON_DOOR_BLOCK, 0, ItemIds::IRON_DOOR), "Iron Door", $ironDoorBreakInfo)); + $this->register(new Trapdoor(new BID(Ids::IRON_TRAPDOOR, LegacyIds::IRON_TRAPDOOR, 0), "Iron Trapdoor", $ironDoorBreakInfo)); + $this->register(new Opaque(new BID(Ids::IRON_ORE, LegacyIds::IRON_ORE, 0), "Iron Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); + $this->register(new ItemFrame(new BID(Ids::ITEM_FRAME, LegacyIds::FRAME_BLOCK, 0, ItemIds::FRAME, TileItemFrame::class), "Item Frame", new BreakInfo(0.25))); + $this->register(new Jukebox(new BID(Ids::JUKEBOX, LegacyIds::JUKEBOX, 0, ItemIds::JUKEBOX, TileJukebox::class), "Jukebox", new BreakInfo(0.8, ToolType::AXE))); //TODO: in PC the hardness is 2.0, not 0.8, unsure if this is a MCPE bug or not + $this->register(new Ladder(new BID(Ids::LADDER, LegacyIds::LADDER, 0), "Ladder", new BreakInfo(0.4, ToolType::AXE))); + $this->register(new Lantern(new BID(Ids::LANTERN, LegacyIds::LANTERN, 0), "Lantern", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Opaque(new BID(Ids::LAPIS_LAZULI, LegacyIds::LAPIS_BLOCK, 0), "Lapis Lazuli Block", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); + $this->register(new LapisOre(new BID(Ids::LAPIS_LAZULI_ORE, LegacyIds::LAPIS_ORE, 0), "Lapis Lazuli Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::STONE()->getHarvestLevel()))); + $this->register(new Lava(new BIDFlattened(Ids::LAVA, LegacyIds::FLOWING_LAVA, [LegacyIds::STILL_LAVA], 0), "Lava", BreakInfo::indestructible(500.0))); + $this->register(new Lectern(new BID(Ids::LECTERN, LegacyIds::LECTERN, 0, ItemIds::LECTERN, TileLectern::class), "Lectern", new BreakInfo(2.0, ToolType::AXE))); + $this->register(new Lever(new BID(Ids::LEVER, LegacyIds::LEVER, 0), "Lever", new BreakInfo(0.5))); + $this->register(new Loom(new BID(Ids::LOOM, LegacyIds::LOOM, 0), "Loom", new BreakInfo(2.5, ToolType::AXE))); + $this->register(new Magma(new BID(Ids::MAGMA, LegacyIds::MAGMA, 0), "Magma Block", new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Melon(new BID(Ids::MELON, LegacyIds::MELON_BLOCK, 0), "Melon Block", new BreakInfo(1.0, ToolType::AXE))); + $this->register(new MelonStem(new BID(Ids::MELON_STEM, LegacyIds::MELON_STEM, 0, ItemIds::MELON_SEEDS), "Melon Stem", BreakInfo::instant())); + $this->register(new MonsterSpawner(new BID(Ids::MONSTER_SPAWNER, LegacyIds::MOB_SPAWNER, 0, null, TileMonsterSpawner::class), "Monster Spawner", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Mycelium(new BID(Ids::MYCELIUM, LegacyIds::MYCELIUM, 0), "Mycelium", new BreakInfo(0.6, ToolType::SHOVEL))); $netherBrickBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - $this->registerAllMeta(new Opaque(new BID(Ids::NETHER_BRICKS, LegacyIds::NETHER_BRICK_BLOCK, 0), "Nether Bricks", $netherBrickBreakInfo)); - $this->registerAllMeta(new Opaque(new BID(Ids::RED_NETHER_BRICKS, LegacyIds::RED_NETHER_BRICK, 0), "Red Nether Bricks", $netherBrickBreakInfo)); - $this->registerAllMeta(new Fence(new BID(Ids::NETHER_BRICK_FENCE, LegacyIds::NETHER_BRICK_FENCE, 0), "Nether Brick Fence", $netherBrickBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::NETHER_BRICK_STAIRS, LegacyIds::NETHER_BRICK_STAIRS, 0), "Nether Brick Stairs", $netherBrickBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::RED_NETHER_BRICK_STAIRS, LegacyIds::RED_NETHER_BRICK_STAIRS, 0), "Red Nether Brick Stairs", $netherBrickBreakInfo)); - $this->registerAllMeta(new NetherPortal(new BID(Ids::NETHER_PORTAL, LegacyIds::PORTAL, 0), "Nether Portal", BreakInfo::indestructible(0.0))); - $this->registerAllMeta(new NetherQuartzOre(new BID(Ids::NETHER_QUARTZ_ORE, LegacyIds::NETHER_QUARTZ_ORE, 0), "Nether Quartz Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new NetherReactor(new BID(Ids::NETHER_REACTOR_CORE, LegacyIds::NETHERREACTOR, 0), "Nether Reactor Core", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new Opaque(new BID(Ids::NETHER_WART_BLOCK, LegacyIds::NETHER_WART_BLOCK, 0), "Nether Wart Block", new BreakInfo(1.0, ToolType::HOE))); - $this->registerAllMeta(new NetherWartPlant(new BID(Ids::NETHER_WART, LegacyIds::NETHER_WART_PLANT, 0, ItemIds::NETHER_WART), "Nether Wart", BreakInfo::instant())); - $this->registerAllMeta(new Netherrack(new BID(Ids::NETHERRACK, LegacyIds::NETHERRACK, 0), "Netherrack", new BreakInfo(0.4, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new Note(new BID(Ids::NOTE_BLOCK, LegacyIds::NOTEBLOCK, 0, null, TileNote::class), "Note Block", new BreakInfo(0.8, ToolType::AXE))); - $this->registerAllMeta(new Opaque(new BID(Ids::OBSIDIAN, LegacyIds::OBSIDIAN, 0), "Obsidian", new BreakInfo(35.0 /* 50 in PC */, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel(), 6000.0))); - $this->registerAllMeta(new PackedIce(new BID(Ids::PACKED_ICE, LegacyIds::PACKED_ICE, 0), "Packed Ice", new BreakInfo(0.5, ToolType::PICKAXE))); - $this->registerAllMeta(new Podzol(new BID(Ids::PODZOL, LegacyIds::PODZOL, 0), "Podzol", new BreakInfo(0.5, ToolType::SHOVEL))); - $this->registerAllMeta(new Potato(new BID(Ids::POTATOES, LegacyIds::POTATOES, 0), "Potato Block", BreakInfo::instant())); - $this->registerAllMeta(new PoweredRail(new BID(Ids::POWERED_RAIL, LegacyIds::GOLDEN_RAIL, 0), "Powered Rail", $railBreakInfo)); + $this->register(new Opaque(new BID(Ids::NETHER_BRICKS, LegacyIds::NETHER_BRICK_BLOCK, 0), "Nether Bricks", $netherBrickBreakInfo)); + $this->register(new Opaque(new BID(Ids::RED_NETHER_BRICKS, LegacyIds::RED_NETHER_BRICK, 0), "Red Nether Bricks", $netherBrickBreakInfo)); + $this->register(new Fence(new BID(Ids::NETHER_BRICK_FENCE, LegacyIds::NETHER_BRICK_FENCE, 0), "Nether Brick Fence", $netherBrickBreakInfo)); + $this->register(new Stair(new BID(Ids::NETHER_BRICK_STAIRS, LegacyIds::NETHER_BRICK_STAIRS, 0), "Nether Brick Stairs", $netherBrickBreakInfo)); + $this->register(new Stair(new BID(Ids::RED_NETHER_BRICK_STAIRS, LegacyIds::RED_NETHER_BRICK_STAIRS, 0), "Red Nether Brick Stairs", $netherBrickBreakInfo)); + $this->register(new NetherPortal(new BID(Ids::NETHER_PORTAL, LegacyIds::PORTAL, 0), "Nether Portal", BreakInfo::indestructible(0.0))); + $this->register(new NetherQuartzOre(new BID(Ids::NETHER_QUARTZ_ORE, LegacyIds::NETHER_QUARTZ_ORE, 0), "Nether Quartz Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new NetherReactor(new BID(Ids::NETHER_REACTOR_CORE, LegacyIds::NETHERREACTOR, 0), "Nether Reactor Core", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Opaque(new BID(Ids::NETHER_WART_BLOCK, LegacyIds::NETHER_WART_BLOCK, 0), "Nether Wart Block", new BreakInfo(1.0, ToolType::HOE))); + $this->register(new NetherWartPlant(new BID(Ids::NETHER_WART, LegacyIds::NETHER_WART_PLANT, 0, ItemIds::NETHER_WART), "Nether Wart", BreakInfo::instant())); + $this->register(new Netherrack(new BID(Ids::NETHERRACK, LegacyIds::NETHERRACK, 0), "Netherrack", new BreakInfo(0.4, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Note(new BID(Ids::NOTE_BLOCK, LegacyIds::NOTEBLOCK, 0, null, TileNote::class), "Note Block", new BreakInfo(0.8, ToolType::AXE))); + $this->register(new Opaque(new BID(Ids::OBSIDIAN, LegacyIds::OBSIDIAN, 0), "Obsidian", new BreakInfo(35.0 /* 50 in PC */, ToolType::PICKAXE, ToolTier::DIAMOND()->getHarvestLevel(), 6000.0))); + $this->register(new PackedIce(new BID(Ids::PACKED_ICE, LegacyIds::PACKED_ICE, 0), "Packed Ice", new BreakInfo(0.5, ToolType::PICKAXE))); + $this->register(new Podzol(new BID(Ids::PODZOL, LegacyIds::PODZOL, 0), "Podzol", new BreakInfo(0.5, ToolType::SHOVEL))); + $this->register(new Potato(new BID(Ids::POTATOES, LegacyIds::POTATOES, 0), "Potato Block", BreakInfo::instant())); + $this->register(new PoweredRail(new BID(Ids::POWERED_RAIL, LegacyIds::GOLDEN_RAIL, 0), "Powered Rail", $railBreakInfo)); $prismarineBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - $this->registerAllMeta( - new Opaque(new BID(Ids::PRISMARINE, LegacyIds::PRISMARINE, Meta::PRISMARINE_NORMAL), "Prismarine", $prismarineBreakInfo), - new Opaque(new BID(Ids::DARK_PRISMARINE, LegacyIds::PRISMARINE, Meta::PRISMARINE_DARK), "Dark Prismarine", $prismarineBreakInfo), - new Opaque(new BID(Ids::PRISMARINE_BRICKS, LegacyIds::PRISMARINE, Meta::PRISMARINE_BRICKS), "Prismarine Bricks", $prismarineBreakInfo) - ); - $this->registerAllMeta(new Stair(new BID(Ids::PRISMARINE_BRICKS_STAIRS, LegacyIds::PRISMARINE_BRICKS_STAIRS, 0), "Prismarine Bricks Stairs", $prismarineBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::DARK_PRISMARINE_STAIRS, LegacyIds::DARK_PRISMARINE_STAIRS, 0), "Dark Prismarine Stairs", $prismarineBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::PRISMARINE_STAIRS, LegacyIds::PRISMARINE_STAIRS, 0), "Prismarine Stairs", $prismarineBreakInfo)); + $this->register(new Opaque(new BID(Ids::PRISMARINE, LegacyIds::PRISMARINE, Meta::PRISMARINE_NORMAL), "Prismarine", $prismarineBreakInfo)); + $this->register(new Opaque(new BID(Ids::DARK_PRISMARINE, LegacyIds::PRISMARINE, Meta::PRISMARINE_DARK), "Dark Prismarine", $prismarineBreakInfo)); + $this->register(new Opaque(new BID(Ids::PRISMARINE_BRICKS, LegacyIds::PRISMARINE, Meta::PRISMARINE_BRICKS), "Prismarine Bricks", $prismarineBreakInfo)); + $this->register(new Stair(new BID(Ids::PRISMARINE_BRICKS_STAIRS, LegacyIds::PRISMARINE_BRICKS_STAIRS, 0), "Prismarine Bricks Stairs", $prismarineBreakInfo)); + $this->register(new Stair(new BID(Ids::DARK_PRISMARINE_STAIRS, LegacyIds::DARK_PRISMARINE_STAIRS, 0), "Dark Prismarine Stairs", $prismarineBreakInfo)); + $this->register(new Stair(new BID(Ids::PRISMARINE_STAIRS, LegacyIds::PRISMARINE_STAIRS, 0), "Prismarine Stairs", $prismarineBreakInfo)); $pumpkinBreakInfo = new BreakInfo(1.0, ToolType::AXE); - $this->registerAllMeta(new Pumpkin(new BID(Ids::PUMPKIN, LegacyIds::PUMPKIN, 0), "Pumpkin", $pumpkinBreakInfo)); - $this->registerAllMeta(new CarvedPumpkin(new BID(Ids::CARVED_PUMPKIN, LegacyIds::CARVED_PUMPKIN, 0), "Carved Pumpkin", $pumpkinBreakInfo)); - $this->registerAllMeta(new LitPumpkin(new BID(Ids::LIT_PUMPKIN, LegacyIds::JACK_O_LANTERN, 0), "Jack o'Lantern", $pumpkinBreakInfo)); + $this->register(new Pumpkin(new BID(Ids::PUMPKIN, LegacyIds::PUMPKIN, 0), "Pumpkin", $pumpkinBreakInfo)); + $this->register(new CarvedPumpkin(new BID(Ids::CARVED_PUMPKIN, LegacyIds::CARVED_PUMPKIN, 0), "Carved Pumpkin", $pumpkinBreakInfo)); + $this->register(new LitPumpkin(new BID(Ids::LIT_PUMPKIN, LegacyIds::JACK_O_LANTERN, 0), "Jack o'Lantern", $pumpkinBreakInfo)); - $this->registerAllMeta(new PumpkinStem(new BID(Ids::PUMPKIN_STEM, LegacyIds::PUMPKIN_STEM, 0, ItemIds::PUMPKIN_SEEDS), "Pumpkin Stem", BreakInfo::instant())); + $this->register(new PumpkinStem(new BID(Ids::PUMPKIN_STEM, LegacyIds::PUMPKIN_STEM, 0, ItemIds::PUMPKIN_SEEDS), "Pumpkin Stem", BreakInfo::instant())); $purpurBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - $this->registerAllMeta( - new Opaque(new BID(Ids::PURPUR, LegacyIds::PURPUR_BLOCK, Meta::PURPUR_NORMAL), "Purpur Block", $purpurBreakInfo), - new SimplePillar(new BID(Ids::PURPUR_PILLAR, LegacyIds::PURPUR_BLOCK, Meta::PURPUR_PILLAR), "Purpur Pillar", $purpurBreakInfo) - ); - $this->registerAllMeta(new Stair(new BID(Ids::PURPUR_STAIRS, LegacyIds::PURPUR_STAIRS, 0), "Purpur Stairs", $purpurBreakInfo)); + $this->register(new Opaque(new BID(Ids::PURPUR, LegacyIds::PURPUR_BLOCK, Meta::PURPUR_NORMAL), "Purpur Block", $purpurBreakInfo)); + $this->register(new SimplePillar(new BID(Ids::PURPUR_PILLAR, LegacyIds::PURPUR_BLOCK, Meta::PURPUR_PILLAR), "Purpur Pillar", $purpurBreakInfo)); + $this->register(new Stair(new BID(Ids::PURPUR_STAIRS, LegacyIds::PURPUR_STAIRS, 0), "Purpur Stairs", $purpurBreakInfo)); $quartzBreakInfo = new BreakInfo(0.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); - $this->registerAllMeta( - new Opaque(new BID(Ids::QUARTZ, LegacyIds::QUARTZ_BLOCK, Meta::QUARTZ_NORMAL), "Quartz Block", $quartzBreakInfo), - new SimplePillar(new BID(Ids::CHISELED_QUARTZ, LegacyIds::QUARTZ_BLOCK, Meta::QUARTZ_CHISELED), "Chiseled Quartz Block", $quartzBreakInfo), - new SimplePillar(new BID(Ids::QUARTZ_PILLAR, LegacyIds::QUARTZ_BLOCK, Meta::QUARTZ_PILLAR), "Quartz Pillar", $quartzBreakInfo), - new Opaque(new BID(Ids::SMOOTH_QUARTZ, LegacyIds::QUARTZ_BLOCK, Meta::QUARTZ_SMOOTH), "Smooth Quartz Block", $quartzBreakInfo) //TODO: we may need to account for the fact this previously incorrectly had axis - ); - $this->registerAllMeta(new Stair(new BID(Ids::QUARTZ_STAIRS, LegacyIds::QUARTZ_STAIRS, 0), "Quartz Stairs", $quartzBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::SMOOTH_QUARTZ_STAIRS, LegacyIds::SMOOTH_QUARTZ_STAIRS, 0), "Smooth Quartz Stairs", $quartzBreakInfo)); + $this->register(new Opaque(new BID(Ids::QUARTZ, LegacyIds::QUARTZ_BLOCK, Meta::QUARTZ_NORMAL), "Quartz Block", $quartzBreakInfo)); + $this->register(new SimplePillar(new BID(Ids::CHISELED_QUARTZ, LegacyIds::QUARTZ_BLOCK, Meta::QUARTZ_CHISELED), "Chiseled Quartz Block", $quartzBreakInfo)); + $this->register(new SimplePillar(new BID(Ids::QUARTZ_PILLAR, LegacyIds::QUARTZ_BLOCK, Meta::QUARTZ_PILLAR), "Quartz Pillar", $quartzBreakInfo)); + $this->register(new Opaque(new BID(Ids::SMOOTH_QUARTZ, LegacyIds::QUARTZ_BLOCK, Meta::QUARTZ_SMOOTH), "Smooth Quartz Block", $quartzBreakInfo)); - $this->registerAllMeta(new Rail(new BID(Ids::RAIL, LegacyIds::RAIL, 0), "Rail", $railBreakInfo)); - $this->registerAllMeta(new RedMushroom(new BID(Ids::RED_MUSHROOM, LegacyIds::RED_MUSHROOM, 0), "Red Mushroom", BreakInfo::instant())); - $this->registerAllMeta(new Redstone(new BID(Ids::REDSTONE, LegacyIds::REDSTONE_BLOCK, 0), "Redstone Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0))); - $this->registerAllMeta(new RedstoneComparator(new BIDFlattened(Ids::REDSTONE_COMPARATOR, LegacyIds::UNPOWERED_COMPARATOR, [LegacyIds::POWERED_COMPARATOR], 0, ItemIds::COMPARATOR, TileComparator::class), "Redstone Comparator", BreakInfo::instant())); - $this->registerAllMeta(new RedstoneLamp(new BIDFlattened(Ids::REDSTONE_LAMP, LegacyIds::REDSTONE_LAMP, [LegacyIds::LIT_REDSTONE_LAMP], 0), "Redstone Lamp", new BreakInfo(0.3))); - $this->registerAllMeta(new RedstoneOre(new BIDFlattened(Ids::REDSTONE_ORE, LegacyIds::REDSTONE_ORE, [LegacyIds::LIT_REDSTONE_ORE], 0), "Redstone Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); - $this->registerAllMeta(new RedstoneRepeater(new BIDFlattened(Ids::REDSTONE_REPEATER, LegacyIds::UNPOWERED_REPEATER, [LegacyIds::POWERED_REPEATER], 0, ItemIds::REPEATER), "Redstone Repeater", BreakInfo::instant())); - $this->registerAllMeta(new RedstoneTorch(new BIDFlattened(Ids::REDSTONE_TORCH, LegacyIds::REDSTONE_TORCH, [LegacyIds::UNLIT_REDSTONE_TORCH], 0), "Redstone Torch", BreakInfo::instant())); - $this->registerAllMeta(new RedstoneWire(new BID(Ids::REDSTONE_WIRE, LegacyIds::REDSTONE_WIRE, 0, ItemIds::REDSTONE), "Redstone", BreakInfo::instant())); - $this->registerAllMeta(new Reserved6(new BID(Ids::RESERVED6, LegacyIds::RESERVED6, 0), "reserved6", BreakInfo::instant())); + $this->register(new Stair(new BID(Ids::QUARTZ_STAIRS, LegacyIds::QUARTZ_STAIRS, 0), "Quartz Stairs", $quartzBreakInfo)); + $this->register(new Stair(new BID(Ids::SMOOTH_QUARTZ_STAIRS, LegacyIds::SMOOTH_QUARTZ_STAIRS, 0), "Smooth Quartz Stairs", $quartzBreakInfo)); + + $this->register(new Rail(new BID(Ids::RAIL, LegacyIds::RAIL, 0), "Rail", $railBreakInfo)); + $this->register(new RedMushroom(new BID(Ids::RED_MUSHROOM, LegacyIds::RED_MUSHROOM, 0), "Red Mushroom", BreakInfo::instant())); + $this->register(new Redstone(new BID(Ids::REDSTONE, LegacyIds::REDSTONE_BLOCK, 0), "Redstone Block", new BreakInfo(5.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0))); + $this->register(new RedstoneComparator(new BIDFlattened(Ids::REDSTONE_COMPARATOR, LegacyIds::UNPOWERED_COMPARATOR, [LegacyIds::POWERED_COMPARATOR], 0, ItemIds::COMPARATOR, TileComparator::class), "Redstone Comparator", BreakInfo::instant())); + $this->register(new RedstoneLamp(new BIDFlattened(Ids::REDSTONE_LAMP, LegacyIds::REDSTONE_LAMP, [LegacyIds::LIT_REDSTONE_LAMP], 0), "Redstone Lamp", new BreakInfo(0.3))); + $this->register(new RedstoneOre(new BIDFlattened(Ids::REDSTONE_ORE, LegacyIds::REDSTONE_ORE, [LegacyIds::LIT_REDSTONE_ORE], 0), "Redstone Ore", new BreakInfo(3.0, ToolType::PICKAXE, ToolTier::IRON()->getHarvestLevel()))); + $this->register(new RedstoneRepeater(new BIDFlattened(Ids::REDSTONE_REPEATER, LegacyIds::UNPOWERED_REPEATER, [LegacyIds::POWERED_REPEATER], 0, ItemIds::REPEATER), "Redstone Repeater", BreakInfo::instant())); + $this->register(new RedstoneTorch(new BIDFlattened(Ids::REDSTONE_TORCH, LegacyIds::REDSTONE_TORCH, [LegacyIds::UNLIT_REDSTONE_TORCH], 0), "Redstone Torch", BreakInfo::instant())); + $this->register(new RedstoneWire(new BID(Ids::REDSTONE_WIRE, LegacyIds::REDSTONE_WIRE, 0, ItemIds::REDSTONE), "Redstone", BreakInfo::instant())); + $this->register(new Reserved6(new BID(Ids::RESERVED6, LegacyIds::RESERVED6, 0), "reserved6", BreakInfo::instant())); $sandBreakInfo = new BreakInfo(0.5, ToolType::SHOVEL); - $this->registerAllMeta( - new Sand(new BID(Ids::SAND, LegacyIds::SAND, 0), "Sand", $sandBreakInfo), - new Sand(new BID(Ids::RED_SAND, LegacyIds::SAND, 1), "Red Sand", $sandBreakInfo) - ); - $this->registerAllMeta(new SeaLantern(new BID(Ids::SEA_LANTERN, LegacyIds::SEALANTERN, 0), "Sea Lantern", new BreakInfo(0.3))); - $this->registerAllMeta(new SeaPickle(new BID(Ids::SEA_PICKLE, LegacyIds::SEA_PICKLE, 0), "Sea Pickle", BreakInfo::instant())); - $this->registerAllMeta(new Skull(new BID(Ids::MOB_HEAD, LegacyIds::MOB_HEAD_BLOCK, 0, ItemIds::SKULL, TileSkull::class), "Mob Head", new BreakInfo(1.0))); - $this->registerAllMeta(new Slime(new BID(Ids::SLIME, LegacyIds::SLIME, 0), "Slime Block", BreakInfo::instant())); - $this->registerAllMeta(new Snow(new BID(Ids::SNOW, LegacyIds::SNOW, 0), "Snow Block", new BreakInfo(0.2, ToolType::SHOVEL, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new SnowLayer(new BID(Ids::SNOW_LAYER, LegacyIds::SNOW_LAYER, 0), "Snow Layer", new BreakInfo(0.1, ToolType::SHOVEL, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new SoulSand(new BID(Ids::SOUL_SAND, LegacyIds::SOUL_SAND, 0), "Soul Sand", new BreakInfo(0.5, ToolType::SHOVEL))); - $this->registerAllMeta(new Sponge(new BID(Ids::SPONGE, LegacyIds::SPONGE, 0), "Sponge", new BreakInfo(0.6, ToolType::HOE))); + $this->register(new Sand(new BID(Ids::SAND, LegacyIds::SAND, 0), "Sand", $sandBreakInfo)); + $this->register(new Sand(new BID(Ids::RED_SAND, LegacyIds::SAND, 1), "Red Sand", $sandBreakInfo)); + + $this->register(new SeaLantern(new BID(Ids::SEA_LANTERN, LegacyIds::SEALANTERN, 0), "Sea Lantern", new BreakInfo(0.3))); + $this->register(new SeaPickle(new BID(Ids::SEA_PICKLE, LegacyIds::SEA_PICKLE, 0), "Sea Pickle", BreakInfo::instant())); + $this->register(new Skull(new BID(Ids::MOB_HEAD, LegacyIds::MOB_HEAD_BLOCK, 0, ItemIds::SKULL, TileSkull::class), "Mob Head", new BreakInfo(1.0))); + $this->register(new Slime(new BID(Ids::SLIME, LegacyIds::SLIME, 0), "Slime Block", BreakInfo::instant())); + $this->register(new Snow(new BID(Ids::SNOW, LegacyIds::SNOW, 0), "Snow Block", new BreakInfo(0.2, ToolType::SHOVEL, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new SnowLayer(new BID(Ids::SNOW_LAYER, LegacyIds::SNOW_LAYER, 0), "Snow Layer", new BreakInfo(0.1, ToolType::SHOVEL, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new SoulSand(new BID(Ids::SOUL_SAND, LegacyIds::SOUL_SAND, 0), "Soul Sand", new BreakInfo(0.5, ToolType::SHOVEL))); + $this->register(new Sponge(new BID(Ids::SPONGE, LegacyIds::SPONGE, 0), "Sponge", new BreakInfo(0.6, ToolType::HOE))); $shulkerBoxBreakInfo = new BreakInfo(2, ToolType::PICKAXE); - $this->registerAllMeta(new ShulkerBox(new BID(Ids::SHULKER_BOX, LegacyIds::UNDYED_SHULKER_BOX, 0, null, TileShulkerBox::class), "Shulker Box", $shulkerBoxBreakInfo)); + $this->register(new ShulkerBox(new BID(Ids::SHULKER_BOX, LegacyIds::UNDYED_SHULKER_BOX, 0, null, TileShulkerBox::class), "Shulker Box", $shulkerBoxBreakInfo)); $stoneBreakInfo = new BreakInfo(1.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - $this->registerAllMeta( + $this->register( $stone = new class(new BID(Ids::STONE, LegacyIds::STONE, Meta::STONE_NORMAL), "Stone", $stoneBreakInfo) extends Opaque{ public function getDropsForCompatibleTool(Item $item) : array{ return [VanillaBlocks::COBBLESTONE()->asItem()]; @@ -360,42 +344,41 @@ class BlockFactory{ public function isAffectedBySilkTouch() : bool{ return true; } - }, - new Opaque(new BID(Ids::ANDESITE, LegacyIds::STONE, Meta::STONE_ANDESITE), "Andesite", $stoneBreakInfo), - new Opaque(new BID(Ids::DIORITE, LegacyIds::STONE, Meta::STONE_DIORITE), "Diorite", $stoneBreakInfo), - new Opaque(new BID(Ids::GRANITE, LegacyIds::STONE, Meta::STONE_GRANITE), "Granite", $stoneBreakInfo), - new Opaque(new BID(Ids::POLISHED_ANDESITE, LegacyIds::STONE, Meta::STONE_POLISHED_ANDESITE), "Polished Andesite", $stoneBreakInfo), - new Opaque(new BID(Ids::POLISHED_DIORITE, LegacyIds::STONE, Meta::STONE_POLISHED_DIORITE), "Polished Diorite", $stoneBreakInfo), - new Opaque(new BID(Ids::POLISHED_GRANITE, LegacyIds::STONE, Meta::STONE_POLISHED_GRANITE), "Polished Granite", $stoneBreakInfo) - ); - $this->registerAllMeta( - $stoneBrick = new Opaque(new BID(Ids::STONE_BRICKS, LegacyIds::STONEBRICK, Meta::STONE_BRICK_NORMAL), "Stone Bricks", $stoneBreakInfo), - $mossyStoneBrick = new Opaque(new BID(Ids::MOSSY_STONE_BRICKS, LegacyIds::STONEBRICK, Meta::STONE_BRICK_MOSSY), "Mossy Stone Bricks", $stoneBreakInfo), - $crackedStoneBrick = new Opaque(new BID(Ids::CRACKED_STONE_BRICKS, LegacyIds::STONEBRICK, Meta::STONE_BRICK_CRACKED), "Cracked Stone Bricks", $stoneBreakInfo), - $chiseledStoneBrick = new Opaque(new BID(Ids::CHISELED_STONE_BRICKS, LegacyIds::STONEBRICK, Meta::STONE_BRICK_CHISELED), "Chiseled Stone Bricks", $stoneBreakInfo) + } ); + $this->register(new Opaque(new BID(Ids::ANDESITE, LegacyIds::STONE, Meta::STONE_ANDESITE), "Andesite", $stoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::DIORITE, LegacyIds::STONE, Meta::STONE_DIORITE), "Diorite", $stoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::GRANITE, LegacyIds::STONE, Meta::STONE_GRANITE), "Granite", $stoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::POLISHED_ANDESITE, LegacyIds::STONE, Meta::STONE_POLISHED_ANDESITE), "Polished Andesite", $stoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::POLISHED_DIORITE, LegacyIds::STONE, Meta::STONE_POLISHED_DIORITE), "Polished Diorite", $stoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::POLISHED_GRANITE, LegacyIds::STONE, Meta::STONE_POLISHED_GRANITE), "Polished Granite", $stoneBreakInfo)); + + $this->register($stoneBrick = new Opaque(new BID(Ids::STONE_BRICKS, LegacyIds::STONEBRICK, Meta::STONE_BRICK_NORMAL), "Stone Bricks", $stoneBreakInfo)); + $this->register($mossyStoneBrick = new Opaque(new BID(Ids::MOSSY_STONE_BRICKS, LegacyIds::STONEBRICK, Meta::STONE_BRICK_MOSSY), "Mossy Stone Bricks", $stoneBreakInfo)); + $this->register($crackedStoneBrick = new Opaque(new BID(Ids::CRACKED_STONE_BRICKS, LegacyIds::STONEBRICK, Meta::STONE_BRICK_CRACKED), "Cracked Stone Bricks", $stoneBreakInfo)); + $this->register($chiseledStoneBrick = new Opaque(new BID(Ids::CHISELED_STONE_BRICKS, LegacyIds::STONEBRICK, Meta::STONE_BRICK_CHISELED), "Chiseled Stone Bricks", $stoneBreakInfo)); + $infestedStoneBreakInfo = new BreakInfo(0.75, ToolType::PICKAXE); - $this->registerAllMeta( - new InfestedStone(new BID(Ids::INFESTED_STONE, LegacyIds::MONSTER_EGG, Meta::INFESTED_STONE), "Infested Stone", $infestedStoneBreakInfo, $stone), - new InfestedStone(new BID(Ids::INFESTED_STONE_BRICK, LegacyIds::MONSTER_EGG, Meta::INFESTED_STONE_BRICK), "Infested Stone Brick", $infestedStoneBreakInfo, $stoneBrick), - new InfestedStone(new BID(Ids::INFESTED_COBBLESTONE, LegacyIds::MONSTER_EGG, Meta::INFESTED_COBBLESTONE), "Infested Cobblestone", $infestedStoneBreakInfo, $cobblestone), - new InfestedStone(new BID(Ids::INFESTED_MOSSY_STONE_BRICK, LegacyIds::MONSTER_EGG, Meta::INFESTED_STONE_BRICK_MOSSY), "Infested Mossy Stone Brick", $infestedStoneBreakInfo, $mossyStoneBrick), - new InfestedStone(new BID(Ids::INFESTED_CRACKED_STONE_BRICK, LegacyIds::MONSTER_EGG, Meta::INFESTED_STONE_BRICK_CRACKED), "Infested Cracked Stone Brick", $infestedStoneBreakInfo, $crackedStoneBrick), - new InfestedStone(new BID(Ids::INFESTED_CHISELED_STONE_BRICK, LegacyIds::MONSTER_EGG, Meta::INFESTED_STONE_BRICK_CHISELED), "Infested Chiseled Stone Brick", $infestedStoneBreakInfo, $chiseledStoneBrick) - ); - $this->registerAllMeta(new Stair(new BID(Ids::STONE_STAIRS, LegacyIds::NORMAL_STONE_STAIRS, 0), "Stone Stairs", $stoneBreakInfo)); - $this->registerAllMeta(new Opaque(new BID(Ids::SMOOTH_STONE, LegacyIds::SMOOTH_STONE, 0), "Smooth Stone", $stoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::ANDESITE_STAIRS, LegacyIds::ANDESITE_STAIRS, 0), "Andesite Stairs", $stoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::DIORITE_STAIRS, LegacyIds::DIORITE_STAIRS, 0), "Diorite Stairs", $stoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::GRANITE_STAIRS, LegacyIds::GRANITE_STAIRS, 0), "Granite Stairs", $stoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::POLISHED_ANDESITE_STAIRS, LegacyIds::POLISHED_ANDESITE_STAIRS, 0), "Polished Andesite Stairs", $stoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::POLISHED_DIORITE_STAIRS, LegacyIds::POLISHED_DIORITE_STAIRS, 0), "Polished Diorite Stairs", $stoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::POLISHED_GRANITE_STAIRS, LegacyIds::POLISHED_GRANITE_STAIRS, 0), "Polished Granite Stairs", $stoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::STONE_BRICK_STAIRS, LegacyIds::STONE_BRICK_STAIRS, 0), "Stone Brick Stairs", $stoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::MOSSY_STONE_BRICK_STAIRS, LegacyIds::MOSSY_STONE_BRICK_STAIRS, 0), "Mossy Stone Brick Stairs", $stoneBreakInfo)); - $this->registerAllMeta(new StoneButton(new BID(Ids::STONE_BUTTON, LegacyIds::STONE_BUTTON, 0), "Stone Button", new BreakInfo(0.5, ToolType::PICKAXE))); - $this->registerAllMeta(new Stonecutter(new BID(Ids::STONECUTTER, LegacyIds::STONECUTTER_BLOCK, 0, ItemIds::STONECUTTER_BLOCK), "Stonecutter", new BreakInfo(3.5, ToolType::PICKAXE))); - $this->registerAllMeta(new StonePressurePlate(new BID(Ids::STONE_PRESSURE_PLATE, LegacyIds::STONE_PRESSURE_PLATE, 0), "Stone Pressure Plate", new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new InfestedStone(new BID(Ids::INFESTED_STONE, LegacyIds::MONSTER_EGG, Meta::INFESTED_STONE), "Infested Stone", $infestedStoneBreakInfo, $stone)); + $this->register(new InfestedStone(new BID(Ids::INFESTED_STONE_BRICK, LegacyIds::MONSTER_EGG, Meta::INFESTED_STONE_BRICK), "Infested Stone Brick", $infestedStoneBreakInfo, $stoneBrick)); + $this->register(new InfestedStone(new BID(Ids::INFESTED_COBBLESTONE, LegacyIds::MONSTER_EGG, Meta::INFESTED_COBBLESTONE), "Infested Cobblestone", $infestedStoneBreakInfo, $cobblestone)); + $this->register(new InfestedStone(new BID(Ids::INFESTED_MOSSY_STONE_BRICK, LegacyIds::MONSTER_EGG, Meta::INFESTED_STONE_BRICK_MOSSY), "Infested Mossy Stone Brick", $infestedStoneBreakInfo, $mossyStoneBrick)); + $this->register(new InfestedStone(new BID(Ids::INFESTED_CRACKED_STONE_BRICK, LegacyIds::MONSTER_EGG, Meta::INFESTED_STONE_BRICK_CRACKED), "Infested Cracked Stone Brick", $infestedStoneBreakInfo, $crackedStoneBrick)); + $this->register(new InfestedStone(new BID(Ids::INFESTED_CHISELED_STONE_BRICK, LegacyIds::MONSTER_EGG, Meta::INFESTED_STONE_BRICK_CHISELED), "Infested Chiseled Stone Brick", $infestedStoneBreakInfo, $chiseledStoneBrick)); + + $this->register(new Stair(new BID(Ids::STONE_STAIRS, LegacyIds::NORMAL_STONE_STAIRS, 0), "Stone Stairs", $stoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::SMOOTH_STONE, LegacyIds::SMOOTH_STONE, 0), "Smooth Stone", $stoneBreakInfo)); + $this->register(new Stair(new BID(Ids::ANDESITE_STAIRS, LegacyIds::ANDESITE_STAIRS, 0), "Andesite Stairs", $stoneBreakInfo)); + $this->register(new Stair(new BID(Ids::DIORITE_STAIRS, LegacyIds::DIORITE_STAIRS, 0), "Diorite Stairs", $stoneBreakInfo)); + $this->register(new Stair(new BID(Ids::GRANITE_STAIRS, LegacyIds::GRANITE_STAIRS, 0), "Granite Stairs", $stoneBreakInfo)); + $this->register(new Stair(new BID(Ids::POLISHED_ANDESITE_STAIRS, LegacyIds::POLISHED_ANDESITE_STAIRS, 0), "Polished Andesite Stairs", $stoneBreakInfo)); + $this->register(new Stair(new BID(Ids::POLISHED_DIORITE_STAIRS, LegacyIds::POLISHED_DIORITE_STAIRS, 0), "Polished Diorite Stairs", $stoneBreakInfo)); + $this->register(new Stair(new BID(Ids::POLISHED_GRANITE_STAIRS, LegacyIds::POLISHED_GRANITE_STAIRS, 0), "Polished Granite Stairs", $stoneBreakInfo)); + $this->register(new Stair(new BID(Ids::STONE_BRICK_STAIRS, LegacyIds::STONE_BRICK_STAIRS, 0), "Stone Brick Stairs", $stoneBreakInfo)); + $this->register(new Stair(new BID(Ids::MOSSY_STONE_BRICK_STAIRS, LegacyIds::MOSSY_STONE_BRICK_STAIRS, 0), "Mossy Stone Brick Stairs", $stoneBreakInfo)); + $this->register(new StoneButton(new BID(Ids::STONE_BUTTON, LegacyIds::STONE_BUTTON, 0), "Stone Button", new BreakInfo(0.5, ToolType::PICKAXE))); + $this->register(new Stonecutter(new BID(Ids::STONECUTTER, LegacyIds::STONECUTTER_BLOCK, 0, ItemIds::STONECUTTER_BLOCK), "Stonecutter", new BreakInfo(3.5, ToolType::PICKAXE))); + $this->register(new StonePressurePlate(new BID(Ids::STONE_PRESSURE_PLATE, LegacyIds::STONE_PRESSURE_PLATE, 0), "Stone Pressure Plate", new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); //TODO: in the future this won't be the same for all the types $stoneSlabBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); @@ -432,38 +415,34 @@ class BlockFactory{ new Slab($getStoneSlabId(Ids::SMOOTH_QUARTZ_SLAB, 4, Meta::STONE_SLAB4_SMOOTH_QUARTZ), "Smooth Quartz", $stoneSlabBreakInfo), new Slab($getStoneSlabId(Ids::STONE_SLAB, 4, Meta::STONE_SLAB4_STONE), "Stone", $stoneSlabBreakInfo), ] as $slabType){ - $this->registerSlabWithDoubleHighBitsRemapping($slabType); + $this->register($slabType); } - $this->registerAllMeta(new Opaque(new BID(Ids::LEGACY_STONECUTTER, LegacyIds::STONECUTTER, 0), "Legacy Stonecutter", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new Sugarcane(new BID(Ids::SUGARCANE, LegacyIds::REEDS_BLOCK, 0, ItemIds::REEDS), "Sugarcane", BreakInfo::instant())); - $this->registerAllMeta(new SweetBerryBush(new BID(Ids::SWEET_BERRY_BUSH, LegacyIds::SWEET_BERRY_BUSH, 0, ItemIds::SWEET_BERRIES), "Sweet Berry Bush", BreakInfo::instant())); - $this->registerAllMeta(new TNT(new BID(Ids::TNT, LegacyIds::TNT, 0), "TNT", BreakInfo::instant())); - $this->registerAllMeta( - new TallGrass(new BID(Ids::FERN, LegacyIds::TALLGRASS, Meta::TALLGRASS_FERN), "Fern", BreakInfo::instant(ToolType::SHEARS, 1)), - new TallGrass(new BID(Ids::TALL_GRASS, LegacyIds::TALLGRASS, Meta::TALLGRASS_NORMAL), "Tall Grass", BreakInfo::instant(ToolType::SHEARS, 1)) - ); - $this->registerAllMeta( - new Torch(new BID(Ids::BLUE_TORCH, LegacyIds::COLORED_TORCH_BP, 0), "Blue Torch", BreakInfo::instant()), - new Torch(new BID(Ids::PURPLE_TORCH, LegacyIds::COLORED_TORCH_BP, 8), "Purple Torch", BreakInfo::instant()) - ); - $this->registerAllMeta( - new Torch(new BID(Ids::RED_TORCH, LegacyIds::COLORED_TORCH_RG, 0), "Red Torch", BreakInfo::instant()), - new Torch(new BID(Ids::GREEN_TORCH, LegacyIds::COLORED_TORCH_RG, 8), "Green Torch", BreakInfo::instant()) - ); - $this->registerAllMeta(new Torch(new BID(Ids::TORCH, LegacyIds::TORCH, 0), "Torch", BreakInfo::instant())); - $this->registerAllMeta(new TrappedChest(new BID(Ids::TRAPPED_CHEST, LegacyIds::TRAPPED_CHEST, 0, null, TileChest::class), "Trapped Chest", $chestBreakInfo)); - $this->registerAllMeta(new Tripwire(new BID(Ids::TRIPWIRE, LegacyIds::TRIPWIRE, 0, ItemIds::STRING), "Tripwire", BreakInfo::instant())); - $this->registerAllMeta(new TripwireHook(new BID(Ids::TRIPWIRE_HOOK, LegacyIds::TRIPWIRE_HOOK, 0), "Tripwire Hook", BreakInfo::instant())); - $this->registerAllMeta(new UnderwaterTorch(new BID(Ids::UNDERWATER_TORCH, LegacyIds::UNDERWATER_TORCH, 0), "Underwater Torch", BreakInfo::instant())); - $this->registerAllMeta(new Vine(new BID(Ids::VINES, LegacyIds::VINE, 0), "Vines", new BreakInfo(0.2, ToolType::AXE))); - $this->registerAllMeta(new Water(new BIDFlattened(Ids::WATER, LegacyIds::FLOWING_WATER, [LegacyIds::STILL_WATER], 0), "Water", BreakInfo::indestructible(500.0))); - $this->registerAllMeta(new WaterLily(new BID(Ids::LILY_PAD, LegacyIds::LILY_PAD, 0), "Lily Pad", BreakInfo::instant())); + $this->register(new Opaque(new BID(Ids::LEGACY_STONECUTTER, LegacyIds::STONECUTTER, 0), "Legacy Stonecutter", new BreakInfo(3.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new Sugarcane(new BID(Ids::SUGARCANE, LegacyIds::REEDS_BLOCK, 0, ItemIds::REEDS), "Sugarcane", BreakInfo::instant())); + $this->register(new SweetBerryBush(new BID(Ids::SWEET_BERRY_BUSH, LegacyIds::SWEET_BERRY_BUSH, 0, ItemIds::SWEET_BERRIES), "Sweet Berry Bush", BreakInfo::instant())); + $this->register(new TNT(new BID(Ids::TNT, LegacyIds::TNT, 0), "TNT", BreakInfo::instant())); + $this->register(new TallGrass(new BID(Ids::FERN, LegacyIds::TALLGRASS, Meta::TALLGRASS_FERN), "Fern", BreakInfo::instant(ToolType::SHEARS, 1))); + $this->register(new TallGrass(new BID(Ids::TALL_GRASS, LegacyIds::TALLGRASS, Meta::TALLGRASS_NORMAL), "Tall Grass", BreakInfo::instant(ToolType::SHEARS, 1))); + + $this->register(new Torch(new BID(Ids::BLUE_TORCH, LegacyIds::COLORED_TORCH_BP, 0), "Blue Torch", BreakInfo::instant())); + $this->register(new Torch(new BID(Ids::PURPLE_TORCH, LegacyIds::COLORED_TORCH_BP, 8), "Purple Torch", BreakInfo::instant())); + $this->register(new Torch(new BID(Ids::RED_TORCH, LegacyIds::COLORED_TORCH_RG, 0), "Red Torch", BreakInfo::instant())); + $this->register(new Torch(new BID(Ids::GREEN_TORCH, LegacyIds::COLORED_TORCH_RG, 8), "Green Torch", BreakInfo::instant())); + $this->register(new Torch(new BID(Ids::TORCH, LegacyIds::TORCH, 0), "Torch", BreakInfo::instant())); + + $this->register(new TrappedChest(new BID(Ids::TRAPPED_CHEST, LegacyIds::TRAPPED_CHEST, 0, null, TileChest::class), "Trapped Chest", $chestBreakInfo)); + $this->register(new Tripwire(new BID(Ids::TRIPWIRE, LegacyIds::TRIPWIRE, 0, ItemIds::STRING), "Tripwire", BreakInfo::instant())); + $this->register(new TripwireHook(new BID(Ids::TRIPWIRE_HOOK, LegacyIds::TRIPWIRE_HOOK, 0), "Tripwire Hook", BreakInfo::instant())); + $this->register(new UnderwaterTorch(new BID(Ids::UNDERWATER_TORCH, LegacyIds::UNDERWATER_TORCH, 0), "Underwater Torch", BreakInfo::instant())); + $this->register(new Vine(new BID(Ids::VINES, LegacyIds::VINE, 0), "Vines", new BreakInfo(0.2, ToolType::AXE))); + $this->register(new Water(new BIDFlattened(Ids::WATER, LegacyIds::FLOWING_WATER, [LegacyIds::STILL_WATER], 0), "Water", BreakInfo::indestructible(500.0))); + $this->register(new WaterLily(new BID(Ids::LILY_PAD, LegacyIds::LILY_PAD, 0), "Lily Pad", BreakInfo::instant())); $weightedPressurePlateBreakInfo = new BreakInfo(0.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); - $this->registerAllMeta(new WeightedPressurePlateHeavy(new BID(Ids::WEIGHTED_PRESSURE_PLATE_HEAVY, LegacyIds::HEAVY_WEIGHTED_PRESSURE_PLATE, 0), "Weighted Pressure Plate Heavy", $weightedPressurePlateBreakInfo)); - $this->registerAllMeta(new WeightedPressurePlateLight(new BID(Ids::WEIGHTED_PRESSURE_PLATE_LIGHT, LegacyIds::LIGHT_WEIGHTED_PRESSURE_PLATE, 0), "Weighted Pressure Plate Light", $weightedPressurePlateBreakInfo)); - $this->registerAllMeta(new Wheat(new BID(Ids::WHEAT, LegacyIds::WHEAT_BLOCK, 0), "Wheat Block", BreakInfo::instant())); + $this->register(new WeightedPressurePlateHeavy(new BID(Ids::WEIGHTED_PRESSURE_PLATE_HEAVY, LegacyIds::HEAVY_WEIGHTED_PRESSURE_PLATE, 0), "Weighted Pressure Plate Heavy", $weightedPressurePlateBreakInfo)); + $this->register(new WeightedPressurePlateLight(new BID(Ids::WEIGHTED_PRESSURE_PLATE_LIGHT, LegacyIds::LIGHT_WEIGHTED_PRESSURE_PLATE, 0), "Weighted Pressure Plate Light", $weightedPressurePlateBreakInfo)); + $this->register(new Wheat(new BID(Ids::WHEAT, LegacyIds::WHEAT_BLOCK, 0), "Wheat Block", BreakInfo::instant())); $planksBreakInfo = new BreakInfo(2.0, ToolType::AXE, 0, 15.0); $leavesBreakInfo = new class(0.2, ToolType::HOE) extends BreakInfo{ @@ -480,82 +459,65 @@ class BlockFactory{ $woodenButtonBreakInfo = new BreakInfo(0.5, ToolType::AXE); $woodenPressurePlateBreakInfo = new BreakInfo(0.5, ToolType::AXE); - $planks = []; - $saplings = []; - $fences = []; - $leaves = []; - $allSidedLogs = []; foreach(TreeType::getAll() as $treeType){ - $magicNumber = $treeType->getMagicNumber(); $name = $treeType->getDisplayName(); - $planks[] = new Planks(BlockLegacyIdHelper::getWoodenPlanksIdentifier($treeType), $name . " Planks", $planksBreakInfo); - $saplings[] = new Sapling(BlockLegacyIdHelper::getSaplingIdentifier($treeType), $name . " Sapling", BreakInfo::instant(), $treeType); - $fences[] = new WoodenFence(BlockLegacyIdHelper::getWoodenFenceIdentifier($treeType), $name . " Fence", $planksBreakInfo); - $this->registerSlabWithDoubleHighBitsRemapping(new WoodenSlab(BlockLegacyIdHelper::getWoodenSlabIdentifier($treeType), $name, $planksBreakInfo)); + $this->register(new Planks(BlockLegacyIdHelper::getWoodenPlanksIdentifier($treeType), $name . " Planks", $planksBreakInfo)); + $this->register(new Sapling(BlockLegacyIdHelper::getSaplingIdentifier($treeType), $name . " Sapling", BreakInfo::instant(), $treeType)); + $this->register(new WoodenFence(BlockLegacyIdHelper::getWoodenFenceIdentifier($treeType), $name . " Fence", $planksBreakInfo)); + $this->register(new WoodenSlab(BlockLegacyIdHelper::getWoodenSlabIdentifier($treeType), $name, $planksBreakInfo)); - //TODO: find a better way to deal with this split - $leaves[] = new Leaves(BlockLegacyIdHelper::getLeavesIdentifier($treeType), $name . " Leaves", $leavesBreakInfo, $treeType); + $this->register(new Leaves(BlockLegacyIdHelper::getLeavesIdentifier($treeType), $name . " Leaves", $leavesBreakInfo, $treeType)); $this->register(new Log(BlockLegacyIdHelper::getLogIdentifier($treeType), $name . " Log", $logBreakInfo, $treeType, false)); - $wood = new Wood(BlockLegacyIdHelper::getAllSidedLogIdentifier($treeType), $name . " Wood", $logBreakInfo, $treeType, false); - $this->remap($magicNumber >= 4 ? LegacyIds::LOG2 : LegacyIds::LOG, ($magicNumber & 0x03) | 0b1100, $wood); + $this->register(new Log(BlockLegacyIdHelper::getStrippedLogIdentifier($treeType), "Stripped " . $name . " Log", $logBreakInfo, $treeType, true)); - $allSidedLogs[] = $wood; - $allSidedLogs[] = new Wood(BlockLegacyIdHelper::getAllSidedStrippedLogIdentifier($treeType), "Stripped $name Wood", $logBreakInfo, $treeType, true); + $this->register(new Wood(BlockLegacyIdHelper::getAllSidedLogIdentifier($treeType), $name . " Wood", $logBreakInfo, $treeType, false)); + $this->register(new Wood(BlockLegacyIdHelper::getAllSidedStrippedLogIdentifier($treeType), "Stripped $name Wood", $logBreakInfo, $treeType, true)); - $this->registerAllMeta(new Log(BlockLegacyIdHelper::getStrippedLogIdentifier($treeType), "Stripped " . $name . " Log", $logBreakInfo, $treeType, true)); - $this->registerAllMeta(new FenceGate(BlockLegacyIdHelper::getWoodenFenceGateIdentifier($treeType), $name . " Fence Gate", $planksBreakInfo)); - $this->registerAllMeta(new WoodenStairs(BlockLegacyIdHelper::getWoodenStairsIdentifier($treeType), $name . " Stairs", $planksBreakInfo)); - $this->registerAllMeta(new WoodenDoor(BlockLegacyIdHelper::getWoodenDoorIdentifier($treeType), $name . " Door", $woodenDoorBreakInfo)); + $this->register(new FenceGate(BlockLegacyIdHelper::getWoodenFenceGateIdentifier($treeType), $name . " Fence Gate", $planksBreakInfo)); + $this->register(new WoodenStairs(BlockLegacyIdHelper::getWoodenStairsIdentifier($treeType), $name . " Stairs", $planksBreakInfo)); + $this->register(new WoodenDoor(BlockLegacyIdHelper::getWoodenDoorIdentifier($treeType), $name . " Door", $woodenDoorBreakInfo)); - $this->registerAllMeta(new WoodenButton(BlockLegacyIdHelper::getWoodenButtonIdentifier($treeType), $name . " Button", $woodenButtonBreakInfo)); - $this->registerAllMeta(new WoodenPressurePlate(BlockLegacyIdHelper::getWoodenPressurePlateIdentifier($treeType), $name . " Pressure Plate", $woodenPressurePlateBreakInfo)); - $this->registerAllMeta(new WoodenTrapdoor(BlockLegacyIdHelper::getWoodenTrapdoorIdentifier($treeType), $name . " Trapdoor", $woodenDoorBreakInfo)); + $this->register(new WoodenButton(BlockLegacyIdHelper::getWoodenButtonIdentifier($treeType), $name . " Button", $woodenButtonBreakInfo)); + $this->register(new WoodenPressurePlate(BlockLegacyIdHelper::getWoodenPressurePlateIdentifier($treeType), $name . " Pressure Plate", $woodenPressurePlateBreakInfo)); + $this->register(new WoodenTrapdoor(BlockLegacyIdHelper::getWoodenTrapdoorIdentifier($treeType), $name . " Trapdoor", $woodenDoorBreakInfo)); - $this->registerAllMeta(new FloorSign(BlockLegacyIdHelper::getWoodenFloorSignIdentifier($treeType), $name . " Sign", $signBreakInfo)); - $this->registerAllMeta(new WallSign(BlockLegacyIdHelper::getWoodenWallSignIdentifier($treeType), $name . " Wall Sign", $signBreakInfo)); + $this->register(new FloorSign(BlockLegacyIdHelper::getWoodenFloorSignIdentifier($treeType), $name . " Sign", $signBreakInfo)); + $this->register(new WallSign(BlockLegacyIdHelper::getWoodenWallSignIdentifier($treeType), $name . " Wall Sign", $signBreakInfo)); } - $this->registerAllMeta(...$planks); - $this->registerAllMeta(...$saplings); - $this->registerAllMeta(...$fences); - $this->registerAllMeta(...$leaves); - $this->registerAllMeta(...$allSidedLogs); $sandstoneBreakInfo = new BreakInfo(0.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); - $this->registerAllMeta(new Stair(new BID(Ids::RED_SANDSTONE_STAIRS, LegacyIds::RED_SANDSTONE_STAIRS, 0), "Red Sandstone Stairs", $sandstoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::SMOOTH_RED_SANDSTONE_STAIRS, LegacyIds::SMOOTH_RED_SANDSTONE_STAIRS, 0), "Smooth Red Sandstone Stairs", $sandstoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::SANDSTONE_STAIRS, LegacyIds::SANDSTONE_STAIRS, 0), "Sandstone Stairs", $sandstoneBreakInfo)); - $this->registerAllMeta(new Stair(new BID(Ids::SMOOTH_SANDSTONE_STAIRS, LegacyIds::SMOOTH_SANDSTONE_STAIRS, 0), "Smooth Sandstone Stairs", $sandstoneBreakInfo)); - $this->registerAllMeta( - new Opaque(new BID(Ids::SANDSTONE, LegacyIds::SANDSTONE, Meta::SANDSTONE_NORMAL), "Sandstone", $sandstoneBreakInfo), - new Opaque(new BID(Ids::CHISELED_SANDSTONE, LegacyIds::SANDSTONE, Meta::SANDSTONE_CHISELED), "Chiseled Sandstone", $sandstoneBreakInfo), - new Opaque(new BID(Ids::CUT_SANDSTONE, LegacyIds::SANDSTONE, Meta::SANDSTONE_CUT), "Cut Sandstone", $sandstoneBreakInfo), - new Opaque(new BID(Ids::SMOOTH_SANDSTONE, LegacyIds::SANDSTONE, Meta::SANDSTONE_SMOOTH), "Smooth Sandstone", $sandstoneBreakInfo), - ); - $this->registerAllMeta( - new Opaque(new BID(Ids::RED_SANDSTONE, LegacyIds::RED_SANDSTONE, Meta::SANDSTONE_NORMAL), "Red Sandstone", $sandstoneBreakInfo), - new Opaque(new BID(Ids::CHISELED_RED_SANDSTONE, LegacyIds::RED_SANDSTONE, Meta::SANDSTONE_CHISELED), "Chiseled Red Sandstone", $sandstoneBreakInfo), - new Opaque(new BID(Ids::CUT_RED_SANDSTONE, LegacyIds::RED_SANDSTONE, Meta::SANDSTONE_CUT), "Cut Red Sandstone", $sandstoneBreakInfo), - new Opaque(new BID(Ids::SMOOTH_RED_SANDSTONE, LegacyIds::RED_SANDSTONE, Meta::SANDSTONE_SMOOTH), "Smooth Red Sandstone", $sandstoneBreakInfo), - ); + $this->register(new Stair(new BID(Ids::RED_SANDSTONE_STAIRS, LegacyIds::RED_SANDSTONE_STAIRS, 0), "Red Sandstone Stairs", $sandstoneBreakInfo)); + $this->register(new Stair(new BID(Ids::SMOOTH_RED_SANDSTONE_STAIRS, LegacyIds::SMOOTH_RED_SANDSTONE_STAIRS, 0), "Smooth Red Sandstone Stairs", $sandstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::RED_SANDSTONE, LegacyIds::RED_SANDSTONE, Meta::SANDSTONE_NORMAL), "Red Sandstone", $sandstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::CHISELED_RED_SANDSTONE, LegacyIds::RED_SANDSTONE, Meta::SANDSTONE_CHISELED), "Chiseled Red Sandstone", $sandstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::CUT_RED_SANDSTONE, LegacyIds::RED_SANDSTONE, Meta::SANDSTONE_CUT), "Cut Red Sandstone", $sandstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::SMOOTH_RED_SANDSTONE, LegacyIds::RED_SANDSTONE, Meta::SANDSTONE_SMOOTH), "Smooth Red Sandstone", $sandstoneBreakInfo)); + + $this->register(new Stair(new BID(Ids::SANDSTONE_STAIRS, LegacyIds::SANDSTONE_STAIRS, 0), "Sandstone Stairs", $sandstoneBreakInfo)); + $this->register(new Stair(new BID(Ids::SMOOTH_SANDSTONE_STAIRS, LegacyIds::SMOOTH_SANDSTONE_STAIRS, 0), "Smooth Sandstone Stairs", $sandstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::SANDSTONE, LegacyIds::SANDSTONE, Meta::SANDSTONE_NORMAL), "Sandstone", $sandstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::CHISELED_SANDSTONE, LegacyIds::SANDSTONE, Meta::SANDSTONE_CHISELED), "Chiseled Sandstone", $sandstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::CUT_SANDSTONE, LegacyIds::SANDSTONE, Meta::SANDSTONE_CUT), "Cut Sandstone", $sandstoneBreakInfo)); + $this->register(new Opaque(new BID(Ids::SMOOTH_SANDSTONE, LegacyIds::SANDSTONE, Meta::SANDSTONE_SMOOTH), "Smooth Sandstone", $sandstoneBreakInfo)); $glazedTerracottaBreakInfo = new BreakInfo(1.4, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); foreach(DyeColor::getAll() as $color){ $coloredName = function(string $name) use($color) : string{ return $color->getDisplayName() . " " . $name; }; - $this->registerAllMeta(new GlazedTerracotta(BlockLegacyIdHelper::getGlazedTerracottaIdentifier($color), $coloredName("Glazed Terracotta"), $glazedTerracottaBreakInfo)); + $this->register(new GlazedTerracotta(BlockLegacyIdHelper::getGlazedTerracottaIdentifier($color), $coloredName("Glazed Terracotta"), $glazedTerracottaBreakInfo)); } - $this->registerAllMeta(new DyedShulkerBox(new BID(Ids::DYED_SHULKER_BOX, LegacyIds::SHULKER_BOX, 0, null, TileShulkerBox::class), "Dyed Shulker Box", $shulkerBoxBreakInfo)); - $this->registerAllMeta(new StainedGlass(new BID(Ids::STAINED_GLASS, LegacyIds::STAINED_GLASS, 0), "Stained Glass", $glassBreakInfo)); - $this->registerAllMeta(new StainedGlassPane(new BID(Ids::STAINED_GLASS_PANE, LegacyIds::STAINED_GLASS_PANE, 0), "Stained Glass Pane", $glassBreakInfo)); - $this->registerAllMeta(new StainedHardenedClay(new BID(Ids::STAINED_CLAY, LegacyIds::STAINED_CLAY, 0), "Stained Clay", $hardenedClayBreakInfo)); - $this->registerAllMeta(new StainedHardenedGlass(new BID(Ids::STAINED_HARDENED_GLASS, LegacyIds::HARD_STAINED_GLASS, 0), "Stained Hardened Glass", $hardenedGlassBreakInfo)); - $this->registerAllMeta(new StainedHardenedGlassPane(new BID(Ids::STAINED_HARDENED_GLASS_PANE, LegacyIds::HARD_STAINED_GLASS_PANE, 0), "Stained Hardened Glass Pane", $hardenedGlassBreakInfo)); - $this->registerAllMeta(new Carpet(new BID(Ids::CARPET, LegacyIds::CARPET, 0), "Carpet", new BreakInfo(0.1))); - $this->registerAllMeta(new Concrete(new BID(Ids::CONCRETE, LegacyIds::CONCRETE, 0), "Concrete", new BreakInfo(1.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); - $this->registerAllMeta(new ConcretePowder(new BID(Ids::CONCRETE_POWDER, LegacyIds::CONCRETE_POWDER, 0), "Concrete Powder", new BreakInfo(0.5, ToolType::SHOVEL))); - $this->registerAllMeta(new Wool(new BID(Ids::WOOL, LegacyIds::WOOL, 0), "Wool", new class(0.8, ToolType::SHEARS) extends BreakInfo{ + $this->register(new DyedShulkerBox(new BID(Ids::DYED_SHULKER_BOX, LegacyIds::SHULKER_BOX, 0, null, TileShulkerBox::class), "Dyed Shulker Box", $shulkerBoxBreakInfo)); + $this->register(new StainedGlass(new BID(Ids::STAINED_GLASS, LegacyIds::STAINED_GLASS, 0), "Stained Glass", $glassBreakInfo)); + $this->register(new StainedGlassPane(new BID(Ids::STAINED_GLASS_PANE, LegacyIds::STAINED_GLASS_PANE, 0), "Stained Glass Pane", $glassBreakInfo)); + $this->register(new StainedHardenedClay(new BID(Ids::STAINED_CLAY, LegacyIds::STAINED_CLAY, 0), "Stained Clay", $hardenedClayBreakInfo)); + $this->register(new StainedHardenedGlass(new BID(Ids::STAINED_HARDENED_GLASS, LegacyIds::HARD_STAINED_GLASS, 0), "Stained Hardened Glass", $hardenedGlassBreakInfo)); + $this->register(new StainedHardenedGlassPane(new BID(Ids::STAINED_HARDENED_GLASS_PANE, LegacyIds::HARD_STAINED_GLASS_PANE, 0), "Stained Hardened Glass Pane", $hardenedGlassBreakInfo)); + $this->register(new Carpet(new BID(Ids::CARPET, LegacyIds::CARPET, 0), "Carpet", new BreakInfo(0.1))); + $this->register(new Concrete(new BID(Ids::CONCRETE, LegacyIds::CONCRETE, 0), "Concrete", new BreakInfo(1.8, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()))); + $this->register(new ConcretePowder(new BID(Ids::CONCRETE_POWDER, LegacyIds::CONCRETE_POWDER, 0), "Concrete Powder", new BreakInfo(0.5, ToolType::SHOVEL))); + $this->register(new Wool(new BID(Ids::WOOL, LegacyIds::WOOL, 0), "Wool", new class(0.8, ToolType::SHEARS) extends BreakInfo{ public function getBreakTime(Item $item) : float{ $time = parent::getBreakTime($item); if($item->getBlockToolType() === ToolType::SHEARS){ @@ -568,48 +530,44 @@ class BlockFactory{ //TODO: in the future these won't all have the same hardness; they only do now because of the old metadata crap $wallBreakInfo = new BreakInfo(2.0, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel(), 30.0); - $this->registerAllMeta( - new Wall(new BID(Ids::COBBLESTONE_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_COBBLESTONE), "Cobblestone Wall", $wallBreakInfo), - new Wall(new BID(Ids::ANDESITE_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_ANDESITE), "Andesite Wall", $wallBreakInfo), - new Wall(new BID(Ids::BRICK_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_BRICK), "Brick Wall", $wallBreakInfo), - new Wall(new BID(Ids::DIORITE_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_DIORITE), "Diorite Wall", $wallBreakInfo), - new Wall(new BID(Ids::END_STONE_BRICK_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_END_STONE_BRICK), "End Stone Brick Wall", $wallBreakInfo), - new Wall(new BID(Ids::GRANITE_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_GRANITE), "Granite Wall", $wallBreakInfo), - new Wall(new BID(Ids::MOSSY_STONE_BRICK_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_MOSSY_STONE_BRICK), "Mossy Stone Brick Wall", $wallBreakInfo), - new Wall(new BID(Ids::MOSSY_COBBLESTONE_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_MOSSY_COBBLESTONE), "Mossy Cobblestone Wall", $wallBreakInfo), - new Wall(new BID(Ids::NETHER_BRICK_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_NETHER_BRICK), "Nether Brick Wall", $wallBreakInfo), - new Wall(new BID(Ids::PRISMARINE_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_PRISMARINE), "Prismarine Wall", $wallBreakInfo), - new Wall(new BID(Ids::RED_NETHER_BRICK_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_RED_NETHER_BRICK), "Red Nether Brick Wall", $wallBreakInfo), - new Wall(new BID(Ids::RED_SANDSTONE_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_RED_SANDSTONE), "Red Sandstone Wall", $wallBreakInfo), - new Wall(new BID(Ids::SANDSTONE_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_SANDSTONE), "Sandstone Wall", $wallBreakInfo), - new Wall(new BID(Ids::STONE_BRICK_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_STONE_BRICK), "Stone Brick Wall", $wallBreakInfo), - ); + $this->register(new Wall(new BID(Ids::COBBLESTONE_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_COBBLESTONE), "Cobblestone Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::ANDESITE_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_ANDESITE), "Andesite Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::BRICK_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_BRICK), "Brick Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::DIORITE_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_DIORITE), "Diorite Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::END_STONE_BRICK_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_END_STONE_BRICK), "End Stone Brick Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::GRANITE_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_GRANITE), "Granite Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::MOSSY_STONE_BRICK_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_MOSSY_STONE_BRICK), "Mossy Stone Brick Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::MOSSY_COBBLESTONE_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_MOSSY_COBBLESTONE), "Mossy Cobblestone Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::NETHER_BRICK_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_NETHER_BRICK), "Nether Brick Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::PRISMARINE_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_PRISMARINE), "Prismarine Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::RED_NETHER_BRICK_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_RED_NETHER_BRICK), "Red Nether Brick Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::RED_SANDSTONE_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_RED_SANDSTONE), "Red Sandstone Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::SANDSTONE_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_SANDSTONE), "Sandstone Wall", $wallBreakInfo)); + $this->register(new Wall(new BID(Ids::STONE_BRICK_WALL, LegacyIds::COBBLESTONE_WALL, Meta::WALL_STONE_BRICK), "Stone Brick Wall", $wallBreakInfo)); $this->registerElements(); $chemistryTableBreakInfo = new BreakInfo(2.5, ToolType::PICKAXE, ToolTier::WOOD()->getHarvestLevel()); - $this->registerAllMeta( - new ChemistryTable(new BID(Ids::COMPOUND_CREATOR, LegacyIds::CHEMISTRY_TABLE, Meta::CHEMISTRY_COMPOUND_CREATOR), "Compound Creator", $chemistryTableBreakInfo), - new ChemistryTable(new BID(Ids::ELEMENT_CONSTRUCTOR, LegacyIds::CHEMISTRY_TABLE, Meta::CHEMISTRY_ELEMENT_CONSTRUCTOR), "Element Constructor", $chemistryTableBreakInfo), - new ChemistryTable(new BID(Ids::LAB_TABLE, LegacyIds::CHEMISTRY_TABLE, Meta::CHEMISTRY_LAB_TABLE), "Lab Table", $chemistryTableBreakInfo), - new ChemistryTable(new BID(Ids::MATERIAL_REDUCER, LegacyIds::CHEMISTRY_TABLE, Meta::CHEMISTRY_MATERIAL_REDUCER), "Material Reducer", $chemistryTableBreakInfo) - ); + $this->register(new ChemistryTable(new BID(Ids::COMPOUND_CREATOR, LegacyIds::CHEMISTRY_TABLE, Meta::CHEMISTRY_COMPOUND_CREATOR), "Compound Creator", $chemistryTableBreakInfo)); + $this->register(new ChemistryTable(new BID(Ids::ELEMENT_CONSTRUCTOR, LegacyIds::CHEMISTRY_TABLE, Meta::CHEMISTRY_ELEMENT_CONSTRUCTOR), "Element Constructor", $chemistryTableBreakInfo)); + $this->register(new ChemistryTable(new BID(Ids::LAB_TABLE, LegacyIds::CHEMISTRY_TABLE, Meta::CHEMISTRY_LAB_TABLE), "Lab Table", $chemistryTableBreakInfo)); + $this->register(new ChemistryTable(new BID(Ids::MATERIAL_REDUCER, LegacyIds::CHEMISTRY_TABLE, Meta::CHEMISTRY_MATERIAL_REDUCER), "Material Reducer", $chemistryTableBreakInfo)); - $this->registerAllMeta(new ChemicalHeat(new BID(Ids::CHEMICAL_HEAT, LegacyIds::CHEMICAL_HEAT, 0), "Heat Block", $chemistryTableBreakInfo)); + $this->register(new ChemicalHeat(new BID(Ids::CHEMICAL_HEAT, LegacyIds::CHEMICAL_HEAT, 0), "Heat Block", $chemistryTableBreakInfo)); $this->registerMushroomBlocks(); - $this->registerAllMeta(new Coral( + $this->register(new Coral( new BID(Ids::CORAL, LegacyIds::CORAL, 0), "Coral", BreakInfo::instant(), )); - $this->registerAllMeta(new FloorCoralFan( + $this->register(new FloorCoralFan( new BlockIdentifierFlattened(Ids::CORAL_FAN, LegacyIds::CORAL_FAN, [LegacyIds::CORAL_FAN_DEAD], 0, ItemIds::CORAL_FAN), "Coral Fan", BreakInfo::instant(), )); - $this->registerAllMeta(new WallCoralFan( + $this->register(new WallCoralFan( new BlockIdentifierFlattened(Ids::WALL_CORAL_FAN, LegacyIds::CORAL_FAN_HANG, [LegacyIds::CORAL_FAN_HANG2, LegacyIds::CORAL_FAN_HANG3], 0, ItemIds::CORAL_FAN), "Wall Coral Fan", BreakInfo::instant(), @@ -751,279 +709,183 @@ class BlockFactory{ } private function registerMushroomBlocks() : void{ - //shrooms have to be handled one by one because some metas are variants and others aren't, and they can't be - //separated by a bitmask - $mushroomBlockBreakInfo = new BreakInfo(0.2, ToolType::AXE); - $mushroomBlocks = [ - new BrownMushroomBlock(new BID(Ids::BROWN_MUSHROOM_BLOCK, LegacyIds::BROWN_MUSHROOM_BLOCK, 0), "Brown Mushroom Block", $mushroomBlockBreakInfo), - new RedMushroomBlock(new BID(Ids::RED_MUSHROOM_BLOCK, LegacyIds::RED_MUSHROOM_BLOCK, 0), "Red Mushroom Block", $mushroomBlockBreakInfo) - ]; - - //caps - foreach([ - Meta::MUSHROOM_BLOCK_ALL_PORES, - Meta::MUSHROOM_BLOCK_CAP_NORTHWEST_CORNER, - Meta::MUSHROOM_BLOCK_CAP_NORTH_SIDE, - Meta::MUSHROOM_BLOCK_CAP_NORTHEAST_CORNER, - Meta::MUSHROOM_BLOCK_CAP_WEST_SIDE, - Meta::MUSHROOM_BLOCK_CAP_TOP_ONLY, - Meta::MUSHROOM_BLOCK_CAP_EAST_SIDE, - Meta::MUSHROOM_BLOCK_CAP_SOUTHWEST_CORNER, - Meta::MUSHROOM_BLOCK_CAP_SOUTH_SIDE, - Meta::MUSHROOM_BLOCK_CAP_SOUTHEAST_CORNER, - Meta::MUSHROOM_BLOCK_ALL_CAP, - ] as $meta){ - foreach($mushroomBlocks as $block){ - $block->readStateFromData($block->getId(), $meta); - $this->remap($block->getId(), $meta, clone $block); - } - } - - //and the invalid states - for($meta = 11; $meta <= 13; ++$meta){ - foreach($mushroomBlocks as $block){ - $this->remap($block->getId(), $meta, clone $block); - } - } + $this->register(new BrownMushroomBlock(new BID(Ids::BROWN_MUSHROOM_BLOCK, LegacyIds::BROWN_MUSHROOM_BLOCK, 0), "Brown Mushroom Block", $mushroomBlockBreakInfo)); + $this->register(new RedMushroomBlock(new BID(Ids::RED_MUSHROOM_BLOCK, LegacyIds::RED_MUSHROOM_BLOCK, 0), "Red Mushroom Block", $mushroomBlockBreakInfo)); //finally, the stems - $mushroomStem = new MushroomStem(new BID(Ids::MUSHROOM_STEM, LegacyIds::BROWN_MUSHROOM_BLOCK, Meta::MUSHROOM_BLOCK_STEM), "Mushroom Stem", $mushroomBlockBreakInfo); - $this->remap(LegacyIds::BROWN_MUSHROOM_BLOCK, Meta::MUSHROOM_BLOCK_STEM, $mushroomStem); - $this->remap(LegacyIds::RED_MUSHROOM_BLOCK, Meta::MUSHROOM_BLOCK_STEM, $mushroomStem); - $allSidedMushroomStem = new MushroomStem(new BID(Ids::ALL_SIDED_MUSHROOM_STEM, LegacyIds::BROWN_MUSHROOM_BLOCK, Meta::MUSHROOM_BLOCK_ALL_STEM), "All Sided Mushroom Stem", $mushroomBlockBreakInfo); - $this->remap(LegacyIds::BROWN_MUSHROOM_BLOCK, Meta::MUSHROOM_BLOCK_ALL_STEM, $allSidedMushroomStem); - $this->remap(LegacyIds::RED_MUSHROOM_BLOCK, Meta::MUSHROOM_BLOCK_ALL_STEM, $allSidedMushroomStem); + $this->register(new MushroomStem(new BID(Ids::MUSHROOM_STEM, LegacyIds::BROWN_MUSHROOM_BLOCK, Meta::MUSHROOM_BLOCK_STEM), "Mushroom Stem", $mushroomBlockBreakInfo)); + $this->register(new MushroomStem(new BID(Ids::ALL_SIDED_MUSHROOM_STEM, LegacyIds::BROWN_MUSHROOM_BLOCK, Meta::MUSHROOM_BLOCK_ALL_STEM), "All Sided Mushroom Stem", $mushroomBlockBreakInfo)); } private function registerElements() : void{ $instaBreak = BreakInfo::instant(); - $this->registerAllMeta(new Opaque(new BID(Ids::ELEMENT_ZERO, LegacyIds::ELEMENT_0, 0), "???", $instaBreak)); + $this->register(new Opaque(new BID(Ids::ELEMENT_ZERO, LegacyIds::ELEMENT_0, 0), "???", $instaBreak)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_HYDROGEN, LegacyIds::ELEMENT_1, 0), "Hydrogen", $instaBreak, "h", 1, 5)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_HELIUM, LegacyIds::ELEMENT_2, 0), "Helium", $instaBreak, "he", 2, 7)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_LITHIUM, LegacyIds::ELEMENT_3, 0), "Lithium", $instaBreak, "li", 3, 0)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_BERYLLIUM, LegacyIds::ELEMENT_4, 0), "Beryllium", $instaBreak, "be", 4, 1)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_BORON, LegacyIds::ELEMENT_5, 0), "Boron", $instaBreak, "b", 5, 4)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_CARBON, LegacyIds::ELEMENT_6, 0), "Carbon", $instaBreak, "c", 6, 5)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_NITROGEN, LegacyIds::ELEMENT_7, 0), "Nitrogen", $instaBreak, "n", 7, 5)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_OXYGEN, LegacyIds::ELEMENT_8, 0), "Oxygen", $instaBreak, "o", 8, 5)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_FLUORINE, LegacyIds::ELEMENT_9, 0), "Fluorine", $instaBreak, "f", 9, 6)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_NEON, LegacyIds::ELEMENT_10, 0), "Neon", $instaBreak, "ne", 10, 7)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_SODIUM, LegacyIds::ELEMENT_11, 0), "Sodium", $instaBreak, "na", 11, 0)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_MAGNESIUM, LegacyIds::ELEMENT_12, 0), "Magnesium", $instaBreak, "mg", 12, 1)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_ALUMINUM, LegacyIds::ELEMENT_13, 0), "Aluminum", $instaBreak, "al", 13, 3)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_SILICON, LegacyIds::ELEMENT_14, 0), "Silicon", $instaBreak, "si", 14, 4)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_PHOSPHORUS, LegacyIds::ELEMENT_15, 0), "Phosphorus", $instaBreak, "p", 15, 5)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_SULFUR, LegacyIds::ELEMENT_16, 0), "Sulfur", $instaBreak, "s", 16, 5)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_CHLORINE, LegacyIds::ELEMENT_17, 0), "Chlorine", $instaBreak, "cl", 17, 6)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_ARGON, LegacyIds::ELEMENT_18, 0), "Argon", $instaBreak, "ar", 18, 7)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_POTASSIUM, LegacyIds::ELEMENT_19, 0), "Potassium", $instaBreak, "k", 19, 0)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_CALCIUM, LegacyIds::ELEMENT_20, 0), "Calcium", $instaBreak, "ca", 20, 1)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_SCANDIUM, LegacyIds::ELEMENT_21, 0), "Scandium", $instaBreak, "sc", 21, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_TITANIUM, LegacyIds::ELEMENT_22, 0), "Titanium", $instaBreak, "ti", 22, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_VANADIUM, LegacyIds::ELEMENT_23, 0), "Vanadium", $instaBreak, "v", 23, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_CHROMIUM, LegacyIds::ELEMENT_24, 0), "Chromium", $instaBreak, "cr", 24, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_MANGANESE, LegacyIds::ELEMENT_25, 0), "Manganese", $instaBreak, "mn", 25, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_IRON, LegacyIds::ELEMENT_26, 0), "Iron", $instaBreak, "fe", 26, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_COBALT, LegacyIds::ELEMENT_27, 0), "Cobalt", $instaBreak, "co", 27, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_NICKEL, LegacyIds::ELEMENT_28, 0), "Nickel", $instaBreak, "ni", 28, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_COPPER, LegacyIds::ELEMENT_29, 0), "Copper", $instaBreak, "cu", 29, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_ZINC, LegacyIds::ELEMENT_30, 0), "Zinc", $instaBreak, "zn", 30, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_GALLIUM, LegacyIds::ELEMENT_31, 0), "Gallium", $instaBreak, "ga", 31, 3)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_GERMANIUM, LegacyIds::ELEMENT_32, 0), "Germanium", $instaBreak, "ge", 32, 4)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_ARSENIC, LegacyIds::ELEMENT_33, 0), "Arsenic", $instaBreak, "as", 33, 4)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_SELENIUM, LegacyIds::ELEMENT_34, 0), "Selenium", $instaBreak, "se", 34, 5)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_BROMINE, LegacyIds::ELEMENT_35, 0), "Bromine", $instaBreak, "br", 35, 6)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_KRYPTON, LegacyIds::ELEMENT_36, 0), "Krypton", $instaBreak, "kr", 36, 7)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_RUBIDIUM, LegacyIds::ELEMENT_37, 0), "Rubidium", $instaBreak, "rb", 37, 0)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_STRONTIUM, LegacyIds::ELEMENT_38, 0), "Strontium", $instaBreak, "sr", 38, 1)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_YTTRIUM, LegacyIds::ELEMENT_39, 0), "Yttrium", $instaBreak, "y", 39, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_ZIRCONIUM, LegacyIds::ELEMENT_40, 0), "Zirconium", $instaBreak, "zr", 40, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_NIOBIUM, LegacyIds::ELEMENT_41, 0), "Niobium", $instaBreak, "nb", 41, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_MOLYBDENUM, LegacyIds::ELEMENT_42, 0), "Molybdenum", $instaBreak, "mo", 42, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_TECHNETIUM, LegacyIds::ELEMENT_43, 0), "Technetium", $instaBreak, "tc", 43, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_RUTHENIUM, LegacyIds::ELEMENT_44, 0), "Ruthenium", $instaBreak, "ru", 44, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_RHODIUM, LegacyIds::ELEMENT_45, 0), "Rhodium", $instaBreak, "rh", 45, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_PALLADIUM, LegacyIds::ELEMENT_46, 0), "Palladium", $instaBreak, "pd", 46, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_SILVER, LegacyIds::ELEMENT_47, 0), "Silver", $instaBreak, "ag", 47, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_CADMIUM, LegacyIds::ELEMENT_48, 0), "Cadmium", $instaBreak, "cd", 48, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_INDIUM, LegacyIds::ELEMENT_49, 0), "Indium", $instaBreak, "in", 49, 3)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_TIN, LegacyIds::ELEMENT_50, 0), "Tin", $instaBreak, "sn", 50, 3)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_ANTIMONY, LegacyIds::ELEMENT_51, 0), "Antimony", $instaBreak, "sb", 51, 4)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_TELLURIUM, LegacyIds::ELEMENT_52, 0), "Tellurium", $instaBreak, "te", 52, 4)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_IODINE, LegacyIds::ELEMENT_53, 0), "Iodine", $instaBreak, "i", 53, 6)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_XENON, LegacyIds::ELEMENT_54, 0), "Xenon", $instaBreak, "xe", 54, 7)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_CESIUM, LegacyIds::ELEMENT_55, 0), "Cesium", $instaBreak, "cs", 55, 0)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_BARIUM, LegacyIds::ELEMENT_56, 0), "Barium", $instaBreak, "ba", 56, 1)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_LANTHANUM, LegacyIds::ELEMENT_57, 0), "Lanthanum", $instaBreak, "la", 57, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_CERIUM, LegacyIds::ELEMENT_58, 0), "Cerium", $instaBreak, "ce", 58, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_PRASEODYMIUM, LegacyIds::ELEMENT_59, 0), "Praseodymium", $instaBreak, "pr", 59, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_NEODYMIUM, LegacyIds::ELEMENT_60, 0), "Neodymium", $instaBreak, "nd", 60, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_PROMETHIUM, LegacyIds::ELEMENT_61, 0), "Promethium", $instaBreak, "pm", 61, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_SAMARIUM, LegacyIds::ELEMENT_62, 0), "Samarium", $instaBreak, "sm", 62, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_EUROPIUM, LegacyIds::ELEMENT_63, 0), "Europium", $instaBreak, "eu", 63, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_GADOLINIUM, LegacyIds::ELEMENT_64, 0), "Gadolinium", $instaBreak, "gd", 64, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_TERBIUM, LegacyIds::ELEMENT_65, 0), "Terbium", $instaBreak, "tb", 65, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_DYSPROSIUM, LegacyIds::ELEMENT_66, 0), "Dysprosium", $instaBreak, "dy", 66, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_HOLMIUM, LegacyIds::ELEMENT_67, 0), "Holmium", $instaBreak, "ho", 67, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_ERBIUM, LegacyIds::ELEMENT_68, 0), "Erbium", $instaBreak, "er", 68, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_THULIUM, LegacyIds::ELEMENT_69, 0), "Thulium", $instaBreak, "tm", 69, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_YTTERBIUM, LegacyIds::ELEMENT_70, 0), "Ytterbium", $instaBreak, "yb", 70, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_LUTETIUM, LegacyIds::ELEMENT_71, 0), "Lutetium", $instaBreak, "lu", 71, 8)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_HAFNIUM, LegacyIds::ELEMENT_72, 0), "Hafnium", $instaBreak, "hf", 72, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_TANTALUM, LegacyIds::ELEMENT_73, 0), "Tantalum", $instaBreak, "ta", 73, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_TUNGSTEN, LegacyIds::ELEMENT_74, 0), "Tungsten", $instaBreak, "w", 74, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_RHENIUM, LegacyIds::ELEMENT_75, 0), "Rhenium", $instaBreak, "re", 75, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_OSMIUM, LegacyIds::ELEMENT_76, 0), "Osmium", $instaBreak, "os", 76, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_IRIDIUM, LegacyIds::ELEMENT_77, 0), "Iridium", $instaBreak, "ir", 77, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_PLATINUM, LegacyIds::ELEMENT_78, 0), "Platinum", $instaBreak, "pt", 78, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_GOLD, LegacyIds::ELEMENT_79, 0), "Gold", $instaBreak, "au", 79, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_MERCURY, LegacyIds::ELEMENT_80, 0), "Mercury", $instaBreak, "hg", 80, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_THALLIUM, LegacyIds::ELEMENT_81, 0), "Thallium", $instaBreak, "tl", 81, 3)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_LEAD, LegacyIds::ELEMENT_82, 0), "Lead", $instaBreak, "pb", 82, 3)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_BISMUTH, LegacyIds::ELEMENT_83, 0), "Bismuth", $instaBreak, "bi", 83, 3)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_POLONIUM, LegacyIds::ELEMENT_84, 0), "Polonium", $instaBreak, "po", 84, 4)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_ASTATINE, LegacyIds::ELEMENT_85, 0), "Astatine", $instaBreak, "at", 85, 6)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_RADON, LegacyIds::ELEMENT_86, 0), "Radon", $instaBreak, "rn", 86, 7)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_FRANCIUM, LegacyIds::ELEMENT_87, 0), "Francium", $instaBreak, "fr", 87, 0)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_RADIUM, LegacyIds::ELEMENT_88, 0), "Radium", $instaBreak, "ra", 88, 1)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_ACTINIUM, LegacyIds::ELEMENT_89, 0), "Actinium", $instaBreak, "ac", 89, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_THORIUM, LegacyIds::ELEMENT_90, 0), "Thorium", $instaBreak, "th", 90, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_PROTACTINIUM, LegacyIds::ELEMENT_91, 0), "Protactinium", $instaBreak, "pa", 91, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_URANIUM, LegacyIds::ELEMENT_92, 0), "Uranium", $instaBreak, "u", 92, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_NEPTUNIUM, LegacyIds::ELEMENT_93, 0), "Neptunium", $instaBreak, "np", 93, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_PLUTONIUM, LegacyIds::ELEMENT_94, 0), "Plutonium", $instaBreak, "pu", 94, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_AMERICIUM, LegacyIds::ELEMENT_95, 0), "Americium", $instaBreak, "am", 95, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_CURIUM, LegacyIds::ELEMENT_96, 0), "Curium", $instaBreak, "cm", 96, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_BERKELIUM, LegacyIds::ELEMENT_97, 0), "Berkelium", $instaBreak, "bk", 97, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_CALIFORNIUM, LegacyIds::ELEMENT_98, 0), "Californium", $instaBreak, "cf", 98, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_EINSTEINIUM, LegacyIds::ELEMENT_99, 0), "Einsteinium", $instaBreak, "es", 99, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_FERMIUM, LegacyIds::ELEMENT_100, 0), "Fermium", $instaBreak, "fm", 100, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_MENDELEVIUM, LegacyIds::ELEMENT_101, 0), "Mendelevium", $instaBreak, "md", 101, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_NOBELIUM, LegacyIds::ELEMENT_102, 0), "Nobelium", $instaBreak, "no", 102, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_LAWRENCIUM, LegacyIds::ELEMENT_103, 0), "Lawrencium", $instaBreak, "lr", 103, 9)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_RUTHERFORDIUM, LegacyIds::ELEMENT_104, 0), "Rutherfordium", $instaBreak, "rf", 104, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_DUBNIUM, LegacyIds::ELEMENT_105, 0), "Dubnium", $instaBreak, "db", 105, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_SEABORGIUM, LegacyIds::ELEMENT_106, 0), "Seaborgium", $instaBreak, "sg", 106, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_BOHRIUM, LegacyIds::ELEMENT_107, 0), "Bohrium", $instaBreak, "bh", 107, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_HASSIUM, LegacyIds::ELEMENT_108, 0), "Hassium", $instaBreak, "hs", 108, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_MEITNERIUM, LegacyIds::ELEMENT_109, 0), "Meitnerium", $instaBreak, "mt", 109, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_DARMSTADTIUM, LegacyIds::ELEMENT_110, 0), "Darmstadtium", $instaBreak, "ds", 110, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_ROENTGENIUM, LegacyIds::ELEMENT_111, 0), "Roentgenium", $instaBreak, "rg", 111, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_COPERNICIUM, LegacyIds::ELEMENT_112, 0), "Copernicium", $instaBreak, "cn", 112, 2)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_NIHONIUM, LegacyIds::ELEMENT_113, 0), "Nihonium", $instaBreak, "nh", 113, 3)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_FLEROVIUM, LegacyIds::ELEMENT_114, 0), "Flerovium", $instaBreak, "fl", 114, 3)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_MOSCOVIUM, LegacyIds::ELEMENT_115, 0), "Moscovium", $instaBreak, "mc", 115, 3)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_LIVERMORIUM, LegacyIds::ELEMENT_116, 0), "Livermorium", $instaBreak, "lv", 116, 3)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_TENNESSINE, LegacyIds::ELEMENT_117, 0), "Tennessine", $instaBreak, "ts", 117, 6)); - $this->registerAllMeta(new Element(new BID(Ids::ELEMENT_OGANESSON, LegacyIds::ELEMENT_118, 0), "Oganesson", $instaBreak, "og", 118, 7)); + $this->register(new Element(new BID(Ids::ELEMENT_HYDROGEN, LegacyIds::ELEMENT_1, 0), "Hydrogen", $instaBreak, "h", 1, 5)); + $this->register(new Element(new BID(Ids::ELEMENT_HELIUM, LegacyIds::ELEMENT_2, 0), "Helium", $instaBreak, "he", 2, 7)); + $this->register(new Element(new BID(Ids::ELEMENT_LITHIUM, LegacyIds::ELEMENT_3, 0), "Lithium", $instaBreak, "li", 3, 0)); + $this->register(new Element(new BID(Ids::ELEMENT_BERYLLIUM, LegacyIds::ELEMENT_4, 0), "Beryllium", $instaBreak, "be", 4, 1)); + $this->register(new Element(new BID(Ids::ELEMENT_BORON, LegacyIds::ELEMENT_5, 0), "Boron", $instaBreak, "b", 5, 4)); + $this->register(new Element(new BID(Ids::ELEMENT_CARBON, LegacyIds::ELEMENT_6, 0), "Carbon", $instaBreak, "c", 6, 5)); + $this->register(new Element(new BID(Ids::ELEMENT_NITROGEN, LegacyIds::ELEMENT_7, 0), "Nitrogen", $instaBreak, "n", 7, 5)); + $this->register(new Element(new BID(Ids::ELEMENT_OXYGEN, LegacyIds::ELEMENT_8, 0), "Oxygen", $instaBreak, "o", 8, 5)); + $this->register(new Element(new BID(Ids::ELEMENT_FLUORINE, LegacyIds::ELEMENT_9, 0), "Fluorine", $instaBreak, "f", 9, 6)); + $this->register(new Element(new BID(Ids::ELEMENT_NEON, LegacyIds::ELEMENT_10, 0), "Neon", $instaBreak, "ne", 10, 7)); + $this->register(new Element(new BID(Ids::ELEMENT_SODIUM, LegacyIds::ELEMENT_11, 0), "Sodium", $instaBreak, "na", 11, 0)); + $this->register(new Element(new BID(Ids::ELEMENT_MAGNESIUM, LegacyIds::ELEMENT_12, 0), "Magnesium", $instaBreak, "mg", 12, 1)); + $this->register(new Element(new BID(Ids::ELEMENT_ALUMINUM, LegacyIds::ELEMENT_13, 0), "Aluminum", $instaBreak, "al", 13, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_SILICON, LegacyIds::ELEMENT_14, 0), "Silicon", $instaBreak, "si", 14, 4)); + $this->register(new Element(new BID(Ids::ELEMENT_PHOSPHORUS, LegacyIds::ELEMENT_15, 0), "Phosphorus", $instaBreak, "p", 15, 5)); + $this->register(new Element(new BID(Ids::ELEMENT_SULFUR, LegacyIds::ELEMENT_16, 0), "Sulfur", $instaBreak, "s", 16, 5)); + $this->register(new Element(new BID(Ids::ELEMENT_CHLORINE, LegacyIds::ELEMENT_17, 0), "Chlorine", $instaBreak, "cl", 17, 6)); + $this->register(new Element(new BID(Ids::ELEMENT_ARGON, LegacyIds::ELEMENT_18, 0), "Argon", $instaBreak, "ar", 18, 7)); + $this->register(new Element(new BID(Ids::ELEMENT_POTASSIUM, LegacyIds::ELEMENT_19, 0), "Potassium", $instaBreak, "k", 19, 0)); + $this->register(new Element(new BID(Ids::ELEMENT_CALCIUM, LegacyIds::ELEMENT_20, 0), "Calcium", $instaBreak, "ca", 20, 1)); + $this->register(new Element(new BID(Ids::ELEMENT_SCANDIUM, LegacyIds::ELEMENT_21, 0), "Scandium", $instaBreak, "sc", 21, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_TITANIUM, LegacyIds::ELEMENT_22, 0), "Titanium", $instaBreak, "ti", 22, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_VANADIUM, LegacyIds::ELEMENT_23, 0), "Vanadium", $instaBreak, "v", 23, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_CHROMIUM, LegacyIds::ELEMENT_24, 0), "Chromium", $instaBreak, "cr", 24, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_MANGANESE, LegacyIds::ELEMENT_25, 0), "Manganese", $instaBreak, "mn", 25, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_IRON, LegacyIds::ELEMENT_26, 0), "Iron", $instaBreak, "fe", 26, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_COBALT, LegacyIds::ELEMENT_27, 0), "Cobalt", $instaBreak, "co", 27, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_NICKEL, LegacyIds::ELEMENT_28, 0), "Nickel", $instaBreak, "ni", 28, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_COPPER, LegacyIds::ELEMENT_29, 0), "Copper", $instaBreak, "cu", 29, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_ZINC, LegacyIds::ELEMENT_30, 0), "Zinc", $instaBreak, "zn", 30, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_GALLIUM, LegacyIds::ELEMENT_31, 0), "Gallium", $instaBreak, "ga", 31, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_GERMANIUM, LegacyIds::ELEMENT_32, 0), "Germanium", $instaBreak, "ge", 32, 4)); + $this->register(new Element(new BID(Ids::ELEMENT_ARSENIC, LegacyIds::ELEMENT_33, 0), "Arsenic", $instaBreak, "as", 33, 4)); + $this->register(new Element(new BID(Ids::ELEMENT_SELENIUM, LegacyIds::ELEMENT_34, 0), "Selenium", $instaBreak, "se", 34, 5)); + $this->register(new Element(new BID(Ids::ELEMENT_BROMINE, LegacyIds::ELEMENT_35, 0), "Bromine", $instaBreak, "br", 35, 6)); + $this->register(new Element(new BID(Ids::ELEMENT_KRYPTON, LegacyIds::ELEMENT_36, 0), "Krypton", $instaBreak, "kr", 36, 7)); + $this->register(new Element(new BID(Ids::ELEMENT_RUBIDIUM, LegacyIds::ELEMENT_37, 0), "Rubidium", $instaBreak, "rb", 37, 0)); + $this->register(new Element(new BID(Ids::ELEMENT_STRONTIUM, LegacyIds::ELEMENT_38, 0), "Strontium", $instaBreak, "sr", 38, 1)); + $this->register(new Element(new BID(Ids::ELEMENT_YTTRIUM, LegacyIds::ELEMENT_39, 0), "Yttrium", $instaBreak, "y", 39, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_ZIRCONIUM, LegacyIds::ELEMENT_40, 0), "Zirconium", $instaBreak, "zr", 40, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_NIOBIUM, LegacyIds::ELEMENT_41, 0), "Niobium", $instaBreak, "nb", 41, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_MOLYBDENUM, LegacyIds::ELEMENT_42, 0), "Molybdenum", $instaBreak, "mo", 42, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_TECHNETIUM, LegacyIds::ELEMENT_43, 0), "Technetium", $instaBreak, "tc", 43, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_RUTHENIUM, LegacyIds::ELEMENT_44, 0), "Ruthenium", $instaBreak, "ru", 44, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_RHODIUM, LegacyIds::ELEMENT_45, 0), "Rhodium", $instaBreak, "rh", 45, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_PALLADIUM, LegacyIds::ELEMENT_46, 0), "Palladium", $instaBreak, "pd", 46, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_SILVER, LegacyIds::ELEMENT_47, 0), "Silver", $instaBreak, "ag", 47, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_CADMIUM, LegacyIds::ELEMENT_48, 0), "Cadmium", $instaBreak, "cd", 48, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_INDIUM, LegacyIds::ELEMENT_49, 0), "Indium", $instaBreak, "in", 49, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_TIN, LegacyIds::ELEMENT_50, 0), "Tin", $instaBreak, "sn", 50, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_ANTIMONY, LegacyIds::ELEMENT_51, 0), "Antimony", $instaBreak, "sb", 51, 4)); + $this->register(new Element(new BID(Ids::ELEMENT_TELLURIUM, LegacyIds::ELEMENT_52, 0), "Tellurium", $instaBreak, "te", 52, 4)); + $this->register(new Element(new BID(Ids::ELEMENT_IODINE, LegacyIds::ELEMENT_53, 0), "Iodine", $instaBreak, "i", 53, 6)); + $this->register(new Element(new BID(Ids::ELEMENT_XENON, LegacyIds::ELEMENT_54, 0), "Xenon", $instaBreak, "xe", 54, 7)); + $this->register(new Element(new BID(Ids::ELEMENT_CESIUM, LegacyIds::ELEMENT_55, 0), "Cesium", $instaBreak, "cs", 55, 0)); + $this->register(new Element(new BID(Ids::ELEMENT_BARIUM, LegacyIds::ELEMENT_56, 0), "Barium", $instaBreak, "ba", 56, 1)); + $this->register(new Element(new BID(Ids::ELEMENT_LANTHANUM, LegacyIds::ELEMENT_57, 0), "Lanthanum", $instaBreak, "la", 57, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_CERIUM, LegacyIds::ELEMENT_58, 0), "Cerium", $instaBreak, "ce", 58, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_PRASEODYMIUM, LegacyIds::ELEMENT_59, 0), "Praseodymium", $instaBreak, "pr", 59, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_NEODYMIUM, LegacyIds::ELEMENT_60, 0), "Neodymium", $instaBreak, "nd", 60, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_PROMETHIUM, LegacyIds::ELEMENT_61, 0), "Promethium", $instaBreak, "pm", 61, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_SAMARIUM, LegacyIds::ELEMENT_62, 0), "Samarium", $instaBreak, "sm", 62, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_EUROPIUM, LegacyIds::ELEMENT_63, 0), "Europium", $instaBreak, "eu", 63, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_GADOLINIUM, LegacyIds::ELEMENT_64, 0), "Gadolinium", $instaBreak, "gd", 64, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_TERBIUM, LegacyIds::ELEMENT_65, 0), "Terbium", $instaBreak, "tb", 65, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_DYSPROSIUM, LegacyIds::ELEMENT_66, 0), "Dysprosium", $instaBreak, "dy", 66, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_HOLMIUM, LegacyIds::ELEMENT_67, 0), "Holmium", $instaBreak, "ho", 67, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_ERBIUM, LegacyIds::ELEMENT_68, 0), "Erbium", $instaBreak, "er", 68, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_THULIUM, LegacyIds::ELEMENT_69, 0), "Thulium", $instaBreak, "tm", 69, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_YTTERBIUM, LegacyIds::ELEMENT_70, 0), "Ytterbium", $instaBreak, "yb", 70, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_LUTETIUM, LegacyIds::ELEMENT_71, 0), "Lutetium", $instaBreak, "lu", 71, 8)); + $this->register(new Element(new BID(Ids::ELEMENT_HAFNIUM, LegacyIds::ELEMENT_72, 0), "Hafnium", $instaBreak, "hf", 72, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_TANTALUM, LegacyIds::ELEMENT_73, 0), "Tantalum", $instaBreak, "ta", 73, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_TUNGSTEN, LegacyIds::ELEMENT_74, 0), "Tungsten", $instaBreak, "w", 74, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_RHENIUM, LegacyIds::ELEMENT_75, 0), "Rhenium", $instaBreak, "re", 75, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_OSMIUM, LegacyIds::ELEMENT_76, 0), "Osmium", $instaBreak, "os", 76, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_IRIDIUM, LegacyIds::ELEMENT_77, 0), "Iridium", $instaBreak, "ir", 77, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_PLATINUM, LegacyIds::ELEMENT_78, 0), "Platinum", $instaBreak, "pt", 78, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_GOLD, LegacyIds::ELEMENT_79, 0), "Gold", $instaBreak, "au", 79, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_MERCURY, LegacyIds::ELEMENT_80, 0), "Mercury", $instaBreak, "hg", 80, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_THALLIUM, LegacyIds::ELEMENT_81, 0), "Thallium", $instaBreak, "tl", 81, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_LEAD, LegacyIds::ELEMENT_82, 0), "Lead", $instaBreak, "pb", 82, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_BISMUTH, LegacyIds::ELEMENT_83, 0), "Bismuth", $instaBreak, "bi", 83, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_POLONIUM, LegacyIds::ELEMENT_84, 0), "Polonium", $instaBreak, "po", 84, 4)); + $this->register(new Element(new BID(Ids::ELEMENT_ASTATINE, LegacyIds::ELEMENT_85, 0), "Astatine", $instaBreak, "at", 85, 6)); + $this->register(new Element(new BID(Ids::ELEMENT_RADON, LegacyIds::ELEMENT_86, 0), "Radon", $instaBreak, "rn", 86, 7)); + $this->register(new Element(new BID(Ids::ELEMENT_FRANCIUM, LegacyIds::ELEMENT_87, 0), "Francium", $instaBreak, "fr", 87, 0)); + $this->register(new Element(new BID(Ids::ELEMENT_RADIUM, LegacyIds::ELEMENT_88, 0), "Radium", $instaBreak, "ra", 88, 1)); + $this->register(new Element(new BID(Ids::ELEMENT_ACTINIUM, LegacyIds::ELEMENT_89, 0), "Actinium", $instaBreak, "ac", 89, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_THORIUM, LegacyIds::ELEMENT_90, 0), "Thorium", $instaBreak, "th", 90, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_PROTACTINIUM, LegacyIds::ELEMENT_91, 0), "Protactinium", $instaBreak, "pa", 91, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_URANIUM, LegacyIds::ELEMENT_92, 0), "Uranium", $instaBreak, "u", 92, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_NEPTUNIUM, LegacyIds::ELEMENT_93, 0), "Neptunium", $instaBreak, "np", 93, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_PLUTONIUM, LegacyIds::ELEMENT_94, 0), "Plutonium", $instaBreak, "pu", 94, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_AMERICIUM, LegacyIds::ELEMENT_95, 0), "Americium", $instaBreak, "am", 95, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_CURIUM, LegacyIds::ELEMENT_96, 0), "Curium", $instaBreak, "cm", 96, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_BERKELIUM, LegacyIds::ELEMENT_97, 0), "Berkelium", $instaBreak, "bk", 97, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_CALIFORNIUM, LegacyIds::ELEMENT_98, 0), "Californium", $instaBreak, "cf", 98, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_EINSTEINIUM, LegacyIds::ELEMENT_99, 0), "Einsteinium", $instaBreak, "es", 99, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_FERMIUM, LegacyIds::ELEMENT_100, 0), "Fermium", $instaBreak, "fm", 100, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_MENDELEVIUM, LegacyIds::ELEMENT_101, 0), "Mendelevium", $instaBreak, "md", 101, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_NOBELIUM, LegacyIds::ELEMENT_102, 0), "Nobelium", $instaBreak, "no", 102, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_LAWRENCIUM, LegacyIds::ELEMENT_103, 0), "Lawrencium", $instaBreak, "lr", 103, 9)); + $this->register(new Element(new BID(Ids::ELEMENT_RUTHERFORDIUM, LegacyIds::ELEMENT_104, 0), "Rutherfordium", $instaBreak, "rf", 104, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_DUBNIUM, LegacyIds::ELEMENT_105, 0), "Dubnium", $instaBreak, "db", 105, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_SEABORGIUM, LegacyIds::ELEMENT_106, 0), "Seaborgium", $instaBreak, "sg", 106, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_BOHRIUM, LegacyIds::ELEMENT_107, 0), "Bohrium", $instaBreak, "bh", 107, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_HASSIUM, LegacyIds::ELEMENT_108, 0), "Hassium", $instaBreak, "hs", 108, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_MEITNERIUM, LegacyIds::ELEMENT_109, 0), "Meitnerium", $instaBreak, "mt", 109, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_DARMSTADTIUM, LegacyIds::ELEMENT_110, 0), "Darmstadtium", $instaBreak, "ds", 110, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_ROENTGENIUM, LegacyIds::ELEMENT_111, 0), "Roentgenium", $instaBreak, "rg", 111, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_COPERNICIUM, LegacyIds::ELEMENT_112, 0), "Copernicium", $instaBreak, "cn", 112, 2)); + $this->register(new Element(new BID(Ids::ELEMENT_NIHONIUM, LegacyIds::ELEMENT_113, 0), "Nihonium", $instaBreak, "nh", 113, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_FLEROVIUM, LegacyIds::ELEMENT_114, 0), "Flerovium", $instaBreak, "fl", 114, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_MOSCOVIUM, LegacyIds::ELEMENT_115, 0), "Moscovium", $instaBreak, "mc", 115, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_LIVERMORIUM, LegacyIds::ELEMENT_116, 0), "Livermorium", $instaBreak, "lv", 116, 3)); + $this->register(new Element(new BID(Ids::ELEMENT_TENNESSINE, LegacyIds::ELEMENT_117, 0), "Tennessine", $instaBreak, "ts", 117, 6)); + $this->register(new Element(new BID(Ids::ELEMENT_OGANESSON, LegacyIds::ELEMENT_118, 0), "Oganesson", $instaBreak, "og", 118, 7)); } /** - * Claims the whole metadata range (0-15) for all IDs associated with this block. Any unregistered states will be - * mapped to the default (provided) state. - * - * This should only be used when this block type has sole ownership of an ID. For IDs which contain multiple block - * types (variants), the regular register() method should be used instead. - */ - private function registerAllMeta(Block $default, Block ...$additional) : void{ - $ids = []; - $this->register($default); - foreach($default->getIdInfo()->getAllLegacyBlockIds() as $id){ - $ids[$id] = $id; - } - foreach($additional as $block){ - $this->register($block); - foreach($block->getIdInfo()->getAllLegacyBlockIds() as $id){ - $ids[$id] = $id; - } - } - - foreach($ids as $id){ - $this->defaultStateIndexes[$id] = $default->getFullId(); - } - } - - private function registerSlabWithDoubleHighBitsRemapping(Slab $block) : void{ - $this->register($block); - $identifierFlattened = $block->getIdInfo(); - if($identifierFlattened instanceof BlockIdentifierFlattened){ - $this->remap($identifierFlattened->getSecondId(), $identifierFlattened->getLegacyVariant() | 0x8, $block->setSlabType(SlabType::DOUBLE())); - } - } - - /** - * Maps a block type to its corresponding ID. This is necessary to ensure that the block is correctly loaded when - * reading from disk storage. + * Maps a block type to its corresponding type ID. This is necessary for the block to be recognized when loading + * from disk, and also when being read at runtime. * * NOTE: If you are registering a new block type, you will need to add it to the creative inventory yourself - it * will not automatically appear there. * * @param bool $override Whether to override existing registrations * - * @throws \RuntimeException if something attempted to override an already-registered block without specifying the + * @throws \InvalidArgumentException if something attempted to override an already-registered block without specifying the * $override parameter. */ public function register(Block $block, bool $override = false) : void{ - $variant = $block->getIdInfo()->getLegacyVariant(); + $typeId = $block->getTypeId(); - $stateMask = $block->getStateBitmask(); - if(($variant & $stateMask) !== 0){ - throw new \InvalidArgumentException("Block variant collides with state bitmask"); + if(!$override && isset($this->typeIndex[$typeId])){ + throw new \InvalidArgumentException("Block ID $typeId is already used by another block, and override was not requested"); } - foreach($block->getIdInfo()->getAllLegacyBlockIds() as $id){ - if(!$override && $this->isRegistered($id, $variant)){ - throw new \InvalidArgumentException("Block registration $id:$variant conflicts with an existing block"); + $this->typeIndex[$typeId] = clone $block; + + //TODO: this bruteforce approach to discovering all valid states is very inefficient for larger state data sizes + //at some point we'll need to find a better way to do this + for($stateData = 0; $stateData < (1 << Block::INTERNAL_STATE_DATA_BITS); ++$stateData){ + $v = clone $block; + try{ + $v->decodeStateData($stateData); + if($v->computeStateData() !== $stateData){ + //if the fullID comes back different, this is a broken state that we can't rely on; map it to default + throw new InvalidBlockStateException("Corrupted state"); + } + }catch(InvalidBlockStateException $e){ //invalid property combination, leave it + continue; } - for($m = $variant; $m <= ($variant | $stateMask); ++$m){ - if(($m & ~$stateMask) !== $variant){ - continue; - } - - if(!$override && $this->isRegistered($id, $m)){ - throw new \InvalidArgumentException("Block registration " . get_class($block) . " has states which conflict with other blocks"); - } - - $index = ($id << Block::INTERNAL_METADATA_BITS) | $m; - - $v = clone $block; - try{ - $v->readStateFromData($id, $m); - if($v->getFullId() !== $index){ - //if the fullID comes back different, this is a broken state that we can't rely on; map it to default - throw new InvalidBlockStateException("Corrupted state"); - } - }catch(InvalidBlockStateException $e){ //invalid property combination, fill the default state - $this->fillStaticArrays($index, $block); - continue; - } - - $this->fillStaticArrays($index, $v); - } + $this->fillStaticArrays($v->getStateId(), $v); } } - public function remap(int $id, int $meta, Block $block) : void{ - $index = ($id << Block::INTERNAL_METADATA_BITS) | $meta; - if($this->isRegistered($id, $meta)){ - $existing = $this->fullList[$index] ?? null; - if($existing !== null && $existing->getFullId() === $index){ - throw new \InvalidArgumentException("$id:$meta is already mapped"); - }else{ - //if it's not a match, this was already remapped for some reason; remapping overwrites are OK - } - } - $this->fillStaticArrays(($id << Block::INTERNAL_METADATA_BITS) | $meta, $block); - } - private function fillStaticArrays(int $index, Block $block) : void{ - $fullId = $block->getFullId(); + $fullId = $block->getStateId(); if($index !== $fullId){ - $this->mappedStateIndexes[$index] = $fullId; + throw new AssumptionFailedError("Cannot fill static arrays for an invalid blockstate"); }else{ $this->fullList[$index] = $block; $this->blastResistance[$index] = $block->getBreakInfo()->getBlastResistance(); @@ -1036,67 +898,54 @@ class BlockFactory{ } /** - * @deprecated This method should ONLY be used for deserializing data, e.g. from a config or database. For all other - * purposes, use VanillaBlocks. + * @internal * @see VanillaBlocks * - * Deserializes a block from the provided legacy ID and legacy meta. + * Deserializes a block from the provided type ID and internal state data. */ - public function get(int $id, int $meta) : Block{ - if($meta < 0 || $meta >= (1 << Block::INTERNAL_METADATA_BITS)){ - throw new \InvalidArgumentException("Block meta value $meta is out of bounds"); + public function get(int $typeId, int $stateData) : Block{ + if($stateData < 0 || $stateData >= (1 << Block::INTERNAL_STATE_DATA_BITS)){ + throw new \InvalidArgumentException("Block meta value $stateData is out of bounds"); } - $index = ($id << Block::INTERNAL_METADATA_BITS) | $meta; + $index = ($typeId << Block::INTERNAL_STATE_DATA_BITS) | $stateData; if($index < 0){ - throw new \InvalidArgumentException("Block ID $id is out of bounds"); + throw new \InvalidArgumentException("Block ID $typeId is out of bounds"); } - if(isset($this->fullList[$index])){ //hot + if(isset($this->fullList[$index])) { //hot $block = clone $this->fullList[$index]; - }elseif(($mappedIndex = $this->getMappedStateId($index)) !== $index && isset($this->fullList[$mappedIndex])){ //cold - $block = clone $this->fullList[$mappedIndex]; }else{ - $block = new UnknownBlock(new BID($id, $id, $meta), BreakInfo::instant()); + $block = new UnknownBlock(new BID($typeId, $typeId, $stateData), BreakInfo::instant()); } return $block; } public function fromFullBlock(int $fullState) : Block{ - return $this->get($fullState >> Block::INTERNAL_METADATA_BITS, $fullState & Block::INTERNAL_METADATA_MASK); + return $this->get($fullState >> Block::INTERNAL_STATE_DATA_BITS, $fullState & Block::INTERNAL_STATE_DATA_MASK); } /** * Returns whether a specified block state is already registered in the block factory. */ - public function isRegistered(int $id, int $meta = 0) : bool{ - $index = ($id << Block::INTERNAL_METADATA_BITS) | $meta; + public function isRegistered(int $typeId, int $stateData = 0) : bool{ + $index = ($typeId << Block::INTERNAL_STATE_DATA_BITS) | $stateData; $b = $this->fullList[$index] ?? null; - if($b === null){ - $mappedIndex = $this->mappedStateIndexes[$index] ?? $this->defaultStateIndexes[$id] ?? null; - if($mappedIndex === null){ - return false; - } - $b = $this->fullList[$mappedIndex] ?? null; - } return $b !== null && !($b instanceof UnknownBlock); } + /** + * @return Block[] + * @phpstan-return array + */ + public function getAllKnownTypes() : array{ + return $this->typeIndex; + } + /** * @return Block[] */ public function getAllKnownStates() : array{ return $this->fullList; } - - /** - * Returns the ID of the state mapped to the given state ID. - * Used to correct invalid blockstates found in loaded chunks. - */ - public function getMappedStateId(int $fullState) : int{ - if(isset($this->fullList[$fullState])){ - return $fullState; - } - return $this->mappedStateIndexes[$fullState] ?? $this->defaultStateIndexes[$fullState >> Block::INTERNAL_METADATA_BITS] ?? $fullState; - } } diff --git a/src/block/BoneBlock.php b/src/block/BoneBlock.php index 4c69e535f..247bdb748 100644 --- a/src/block/BoneBlock.php +++ b/src/block/BoneBlock.php @@ -23,8 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\PillarRotationInMetadataTrait; +use pocketmine\block\utils\PillarRotationTrait; class BoneBlock extends Opaque{ - use PillarRotationInMetadataTrait; + use PillarRotationTrait; } diff --git a/src/block/BrewingStand.php b/src/block/BrewingStand.php index c1840502e..20b1d802e 100644 --- a/src/block/BrewingStand.php +++ b/src/block/BrewingStand.php @@ -24,6 +24,10 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\tile\BrewingStand as TileBrewingStand; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataReaderHelper; +use pocketmine\block\utils\BlockDataWriter; +use pocketmine\block\utils\BlockDataWriterHelper; use pocketmine\block\utils\BrewingStandSlot; use pocketmine\block\utils\SupportType; use pocketmine\item\Item; @@ -42,33 +46,12 @@ class BrewingStand extends Transparent{ */ protected array $slots = []; - protected function writeStateToMeta() : int{ - $flags = 0; - foreach([ - BlockLegacyMetadata::BREWING_STAND_FLAG_EAST => BrewingStandSlot::EAST(), - BlockLegacyMetadata::BREWING_STAND_FLAG_NORTHWEST => BrewingStandSlot::NORTHWEST(), - BlockLegacyMetadata::BREWING_STAND_FLAG_SOUTHWEST => BrewingStandSlot::SOUTHWEST(), - ] as $flag => $slot){ - $flags |= (array_key_exists($slot->id(), $this->slots) ? $flag : 0); - } - return $flags; + protected function decodeState(BlockDataReader $r) : void{ + $this->setSlots(BlockDataReaderHelper::readBrewingStandSlotKeySet($r)); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->slots = []; - foreach([ - BlockLegacyMetadata::BREWING_STAND_FLAG_EAST => BrewingStandSlot::EAST(), - BlockLegacyMetadata::BREWING_STAND_FLAG_NORTHWEST => BrewingStandSlot::NORTHWEST(), - BlockLegacyMetadata::BREWING_STAND_FLAG_SOUTHWEST => BrewingStandSlot::SOUTHWEST(), - ] as $flag => $slot){ - if(($stateMeta & $flag) !== 0){ - $this->slots[$slot->id()] = $slot; - } - } - } - - public function getStateBitmask() : int{ - return 0b111; + protected function encodeState(BlockDataWriter $w) : void{ + BlockDataWriterHelper::writeBrewingStandSlotKeySet($w, $this->slots); } protected function recalculateCollisionBoxes() : array{ diff --git a/src/block/Button.php b/src/block/Button.php index 967e0d4f0..6e45df559 100644 --- a/src/block/Button.php +++ b/src/block/Button.php @@ -24,7 +24,8 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\AnyFacingTrait; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; @@ -38,18 +39,14 @@ abstract class Button extends Flowable{ protected bool $pressed = false; - protected function writeStateToMeta() : int{ - return BlockDataSerializer::writeFacing($this->facing) | ($this->pressed ? BlockLegacyMetadata::BUTTON_FLAG_POWERED : 0); + protected function decodeState(BlockDataReader $r) : void{ + $this->facing = $r->readFacing(); + $this->pressed = $r->readBool(); } - public function readStateFromData(int $id, int $stateMeta) : void{ - //TODO: in PC it's (6 - facing) for every meta except 0 (down) - $this->facing = BlockDataSerializer::readFacing($stateMeta & 0x07); - $this->pressed = ($stateMeta & BlockLegacyMetadata::BUTTON_FLAG_POWERED) !== 0; - } - - public function getStateBitmask() : int{ - return 0b1111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeFacing($this->facing); + $w->writeBool($this->pressed); } public function isPressed() : bool{ return $this->pressed; } diff --git a/src/block/Cactus.php b/src/block/Cactus.php index ad79d35ca..56b9129a3 100644 --- a/src/block/Cactus.php +++ b/src/block/Cactus.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\SupportType; use pocketmine\entity\Entity; use pocketmine\event\block\BlockGrowEvent; @@ -41,16 +42,12 @@ class Cactus extends Transparent{ protected int $age = 0; - protected function writeStateToMeta() : int{ - return $this->age; + protected function decodeState(BlockDataReader $r) : void{ + $this->age = $r->readBoundedInt(4, 0, self::MAX_AGE); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->age = BlockDataSerializer::readBoundedInt("age", $stateMeta, 0, self::MAX_AGE); - } - - public function getStateBitmask() : int{ - return 0b1111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeInt(4, $this->age); } public function getAge() : int{ return $this->age; } diff --git a/src/block/Cake.php b/src/block/Cake.php index f35684c1b..770b8fcfe 100644 --- a/src/block/Cake.php +++ b/src/block/Cake.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\SupportType; use pocketmine\entity\effect\EffectInstance; use pocketmine\entity\FoodSource; @@ -40,16 +41,12 @@ class Cake extends Transparent implements FoodSource{ protected int $bites = 0; - protected function writeStateToMeta() : int{ - return $this->bites; + protected function decodeState(BlockDataReader $r) : void{ + $this->bites = $r->readBoundedInt(3, 0, self::MAX_BITES); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->bites = BlockDataSerializer::readBoundedInt("bites", $stateMeta, 0, self::MAX_BITES); - } - - public function getStateBitmask() : int{ - return 0b111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeInt(3, $this->bites); } /** diff --git a/src/block/Carpet.php b/src/block/Carpet.php index a0dde73c8..75b9220b9 100644 --- a/src/block/Carpet.php +++ b/src/block/Carpet.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\ColorInMetadataTrait; +use pocketmine\block\utils\ColoredTrait; use pocketmine\block\utils\DyeColor; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; @@ -33,7 +33,7 @@ use pocketmine\player\Player; use pocketmine\world\BlockTransaction; class Carpet extends Flowable{ - use ColorInMetadataTrait; + use ColoredTrait; public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ $this->color = DyeColor::WHITE(); diff --git a/src/block/CarvedPumpkin.php b/src/block/CarvedPumpkin.php index 7c99c1531..5fc73d088 100644 --- a/src/block/CarvedPumpkin.php +++ b/src/block/CarvedPumpkin.php @@ -23,23 +23,10 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataSerializer; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; use pocketmine\block\utils\HorizontalFacingTrait; class CarvedPumpkin extends Opaque{ use FacesOppositePlacingPlayerTrait; use HorizontalFacingTrait; - - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03); - } - - protected function writeStateToMeta() : int{ - return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing); - } - - public function getStateBitmask() : int{ - return 0b11; - } } diff --git a/src/block/ChemistryTable.php b/src/block/ChemistryTable.php index fb2310dcd..d1e008d0e 100644 --- a/src/block/ChemistryTable.php +++ b/src/block/ChemistryTable.php @@ -23,11 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataSerializer; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\item\Item; -use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; @@ -35,18 +33,6 @@ final class ChemistryTable extends Opaque{ use FacesOppositePlacingPlayerTrait; use HorizontalFacingTrait; - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->facing = Facing::opposite(BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x3)); - } - - protected function writeStateToMeta() : int{ - return BlockDataSerializer::writeLegacyHorizontalFacing(Facing::opposite($this->facing)); - } - - public function getStateBitmask() : int{ - return 0b0011; - } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ //TODO return false; diff --git a/src/block/Chest.php b/src/block/Chest.php index 59c21e1b6..55a0591ca 100644 --- a/src/block/Chest.php +++ b/src/block/Chest.php @@ -25,7 +25,7 @@ namespace pocketmine\block; use pocketmine\block\tile\Chest as TileChest; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; -use pocketmine\block\utils\NormalHorizontalFacingInMetadataTrait; +use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; use pocketmine\event\block\ChestPairEvent; use pocketmine\item\Item; @@ -36,7 +36,7 @@ use pocketmine\player\Player; class Chest extends Transparent{ use FacesOppositePlacingPlayerTrait; - use NormalHorizontalFacingInMetadataTrait; + use HorizontalFacingTrait; /** * @return AxisAlignedBB[] diff --git a/src/block/CocoaBlock.php b/src/block/CocoaBlock.php index 8c01c29cc..b21af5e63 100644 --- a/src/block/CocoaBlock.php +++ b/src/block/CocoaBlock.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; use pocketmine\block\utils\TreeType; @@ -46,17 +47,14 @@ class CocoaBlock extends Transparent{ protected int $age = 0; - protected function writeStateToMeta() : int{ - return BlockDataSerializer::writeLegacyHorizontalFacing(Facing::opposite($this->facing)) | ($this->age << 2); + protected function decodeState(BlockDataReader $r) : void{ + $this->facing = $r->readHorizontalFacing(); + $this->age = $r->readBoundedInt(2, 0, self::MAX_AGE); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->facing = Facing::opposite(BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03)); - $this->age = BlockDataSerializer::readBoundedInt("age", $stateMeta >> 2, 0, self::MAX_AGE); - } - - public function getStateBitmask() : int{ - return 0b1111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeHorizontalFacing($this->facing); + $w->writeInt(2, $this->age); } public function getAge() : int{ return $this->age; } diff --git a/src/block/Concrete.php b/src/block/Concrete.php index 7e16ee4f6..7f07be308 100644 --- a/src/block/Concrete.php +++ b/src/block/Concrete.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\ColorInMetadataTrait; +use pocketmine\block\utils\ColoredTrait; use pocketmine\block\utils\DyeColor; class Concrete extends Opaque{ - use ColorInMetadataTrait; + use ColoredTrait; public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ $this->color = DyeColor::WHITE(); diff --git a/src/block/ConcretePowder.php b/src/block/ConcretePowder.php index 340c610b1..b70532c3f 100644 --- a/src/block/ConcretePowder.php +++ b/src/block/ConcretePowder.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\ColorInMetadataTrait; +use pocketmine\block\utils\ColoredTrait; use pocketmine\block\utils\DyeColor; use pocketmine\block\utils\Fallable; use pocketmine\block\utils\FallableTrait; @@ -31,7 +31,7 @@ use pocketmine\event\block\BlockFormEvent; use pocketmine\math\Facing; class ConcretePowder extends Opaque implements Fallable{ - use ColorInMetadataTrait; + use ColoredTrait; use FallableTrait { onNearbyBlockChange as protected startFalling; } diff --git a/src/block/Coral.php b/src/block/Coral.php index 6bbd50b73..7cb301b2c 100644 --- a/src/block/Coral.php +++ b/src/block/Coral.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\InvalidBlockStateException; use pocketmine\data\bedrock\CoralTypeIdMap; use pocketmine\item\Item; use pocketmine\math\Facing; @@ -33,24 +32,8 @@ use pocketmine\world\BlockTransaction; final class Coral extends BaseCoral{ - public function readStateFromData(int $id, int $stateMeta) : void{ - $coralType = CoralTypeIdMap::getInstance()->fromId($stateMeta); - if($coralType === null){ - throw new InvalidBlockStateException("No such coral type"); - } - $this->coralType = $coralType; - } - - public function writeStateToMeta() : int{ - return CoralTypeIdMap::getInstance()->toId($this->coralType); - } - protected function writeStateToItemMeta() : int{ - return $this->writeStateToMeta(); - } - - public function getStateBitmask() : int{ - return 0b0111; + return CoralTypeIdMap::getInstance()->toId($this->coralType); } public function readStateFromWorld() : void{ diff --git a/src/block/CoralBlock.php b/src/block/CoralBlock.php index e29591b3d..2075af358 100644 --- a/src/block/CoralBlock.php +++ b/src/block/CoralBlock.php @@ -25,7 +25,6 @@ namespace pocketmine\block; use pocketmine\block\utils\CoralType; use pocketmine\block\utils\CoralTypeTrait; -use pocketmine\block\utils\InvalidBlockStateException; use pocketmine\data\bedrock\CoralTypeIdMap; use pocketmine\item\Item; use function mt_rand; @@ -38,25 +37,8 @@ final class CoralBlock extends Opaque{ parent::__construct($idInfo, $name, $breakInfo); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $coralType = CoralTypeIdMap::getInstance()->fromId($stateMeta & 0x7); - if($coralType === null){ - throw new InvalidBlockStateException("No such coral type"); - } - $this->coralType = $coralType; - $this->dead = ($stateMeta & BlockLegacyMetadata::CORAL_BLOCK_FLAG_DEAD) !== 0; - } - - protected function writeStateToMeta() : int{ - return ($this->dead ? BlockLegacyMetadata::CORAL_BLOCK_FLAG_DEAD : 0) | CoralTypeIdMap::getInstance()->toId($this->coralType); - } - protected function writeStateToItemMeta() : int{ - return $this->writeStateToMeta(); - } - - public function getStateBitmask() : int{ - return 0b1111; + return ($this->dead ? BlockLegacyMetadata::CORAL_BLOCK_FLAG_DEAD : 0) | CoralTypeIdMap::getInstance()->toId($this->coralType); } public function onNearbyBlockChange() : void{ diff --git a/src/block/Crops.php b/src/block/Crops.php index c2f01c92c..f7823a8eb 100644 --- a/src/block/Crops.php +++ b/src/block/Crops.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\event\block\BlockGrowEvent; use pocketmine\item\Fertilizer; use pocketmine\item\Item; @@ -38,16 +39,12 @@ abstract class Crops extends Flowable{ protected int $age = 0; - protected function writeStateToMeta() : int{ - return $this->age; + protected function decodeState(BlockDataReader $r) : void{ + $this->age = $r->readBoundedInt(3, 0, self::MAX_AGE); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->age = BlockDataSerializer::readBoundedInt("age", $stateMeta, 0, self::MAX_AGE); - } - - public function getStateBitmask() : int{ - return 0b111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeInt(3, $this->age); } public function getAge() : int{ return $this->age; } diff --git a/src/block/DaylightSensor.php b/src/block/DaylightSensor.php index c13df4b6a..01c7040a4 100644 --- a/src/block/DaylightSensor.php +++ b/src/block/DaylightSensor.php @@ -24,7 +24,8 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\AnalogRedstoneSignalEmitterTrait; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\SupportType; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; @@ -39,30 +40,16 @@ use const M_PI; class DaylightSensor extends Transparent{ use AnalogRedstoneSignalEmitterTrait; - protected BlockIdentifierFlattened $idInfoFlattened; - protected bool $inverted = false; - public function __construct(BlockIdentifierFlattened $idInfo, string $name, BlockBreakInfo $breakInfo){ - $this->idInfoFlattened = $idInfo; - parent::__construct($idInfo, $name, $breakInfo); + protected function decodeState(BlockDataReader $r) : void{ + $this->signalStrength = $r->readBoundedInt(4, 0, 15); + $this->inverted = $r->readBool(); } - public function getId() : int{ - return $this->inverted ? $this->idInfoFlattened->getSecondId() : parent::getId(); - } - - protected function writeStateToMeta() : int{ - return $this->signalStrength; - } - - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->signalStrength = BlockDataSerializer::readBoundedInt("signalStrength", $stateMeta, 0, 15); - $this->inverted = $id === $this->idInfoFlattened->getSecondId(); - } - - public function getStateBitmask() : int{ - return 0b1111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeInt(4, $this->signalStrength); + $w->writeBool($this->inverted); } public function isInverted() : bool{ diff --git a/src/block/DetectorRail.php b/src/block/DetectorRail.php index e3eb0a486..ad4d95810 100644 --- a/src/block/DetectorRail.php +++ b/src/block/DetectorRail.php @@ -23,9 +23,22 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; + class DetectorRail extends StraightOnlyRail{ protected bool $activated = false; + protected function decodeState(BlockDataReader $r) : void{ + parent::decodeState($r); + $this->activated = $r->readBool(); + } + + protected function encodeState(BlockDataWriter $w) : void{ + parent::encodeState($w); + $w->writeBool($this->activated); + } + public function isActivated() : bool{ return $this->activated; } /** @return $this */ @@ -33,19 +46,5 @@ class DetectorRail extends StraightOnlyRail{ $this->activated = $activated; return $this; } - - public function readStateFromData(int $id, int $stateMeta) : void{ - parent::readStateFromData($id, $stateMeta & ~BlockLegacyMetadata::REDSTONE_RAIL_FLAG_POWERED); - $this->activated = ($stateMeta & BlockLegacyMetadata::REDSTONE_RAIL_FLAG_POWERED) !== 0; - } - - protected function writeStateToMeta() : int{ - return parent::writeStateToMeta() | ($this->activated ? BlockLegacyMetadata::REDSTONE_RAIL_FLAG_POWERED : 0); - } - - public function getStateBitmask() : int{ - return 0b1111; - } - //TODO } diff --git a/src/block/Dirt.php b/src/block/Dirt.php index 8197f1415..d926000aa 100644 --- a/src/block/Dirt.php +++ b/src/block/Dirt.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\item\Hoe; use pocketmine\item\Item; use pocketmine\math\Facing; @@ -31,23 +33,18 @@ use pocketmine\player\Player; use pocketmine\world\sound\ItemUseOnBlockSound; class Dirt extends Opaque{ - protected bool $coarse = false; - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->coarse = ($stateMeta & BlockLegacyMetadata::DIRT_FLAG_COARSE) !== 0; - } - - protected function writeStateToMeta() : int{ + protected function writeStateToItemMeta() : int{ return $this->coarse ? BlockLegacyMetadata::DIRT_FLAG_COARSE : 0; } - protected function writeStateToItemMeta() : int{ - return $this->writeStateToMeta(); + protected function decodeState(BlockDataReader $r) : void{ + $this->coarse = $r->readBool(); } - public function getStateBitmask() : int{ - return 0b1; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeBool($this->coarse); } public function isCoarse() : bool{ return $this->coarse; } diff --git a/src/block/Door.php b/src/block/Door.php index 0c4afdb65..6f3654ca5 100644 --- a/src/block/Door.php +++ b/src/block/Door.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; use pocketmine\item\Item; @@ -41,27 +42,18 @@ class Door extends Transparent{ protected bool $hingeRight = false; protected bool $open = false; - protected function writeStateToMeta() : int{ - if($this->top){ - return BlockLegacyMetadata::DOOR_FLAG_TOP | - ($this->hingeRight ? BlockLegacyMetadata::DOOR_TOP_FLAG_RIGHT : 0); - } - - return BlockDataSerializer::writeLegacyHorizontalFacing(Facing::rotateY($this->facing, true)) | ($this->open ? BlockLegacyMetadata::DOOR_BOTTOM_FLAG_OPEN : 0); + protected function decodeState(BlockDataReader $r) : void{ + $this->facing = $r->readHorizontalFacing(); + $this->top = $r->readBool(); + $this->hingeRight = $r->readBool(); + $this->open = $r->readBool(); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->top = ($stateMeta & BlockLegacyMetadata::DOOR_FLAG_TOP) !== 0; - if($this->top){ - $this->hingeRight = ($stateMeta & BlockLegacyMetadata::DOOR_TOP_FLAG_RIGHT) !== 0; - }else{ - $this->facing = Facing::rotateY(BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03), false); - $this->open = ($stateMeta & BlockLegacyMetadata::DOOR_BOTTOM_FLAG_OPEN) !== 0; - } - } - - public function getStateBitmask() : int{ - return 0b1111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeHorizontalFacing($this->facing); + $w->writeBool($this->top); + $w->writeBool($this->hingeRight); + $w->writeBool($this->open); } public function readStateFromWorld() : void{ diff --git a/src/block/DoublePlant.php b/src/block/DoublePlant.php index 517e77e58..14d363794 100644 --- a/src/block/DoublePlant.php +++ b/src/block/DoublePlant.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; @@ -30,19 +32,14 @@ use pocketmine\player\Player; use pocketmine\world\BlockTransaction; class DoublePlant extends Flowable{ - protected bool $top = false; - protected function writeStateToMeta() : int{ - return ($this->top ? BlockLegacyMetadata::DOUBLE_PLANT_FLAG_TOP : 0); + protected function decodeState(BlockDataReader $r) : void{ + $this->top = $r->readBool(); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->top = ($stateMeta & BlockLegacyMetadata::DOUBLE_PLANT_FLAG_TOP) !== 0; - } - - public function getStateBitmask() : int{ - return 0b1000; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeBool($this->top); } public function isTop() : bool{ return $this->top; } diff --git a/src/block/DyedShulkerBox.php b/src/block/DyedShulkerBox.php index 1e950c791..ffe5e5f16 100644 --- a/src/block/DyedShulkerBox.php +++ b/src/block/DyedShulkerBox.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\ColorInMetadataTrait; +use pocketmine\block\utils\ColoredTrait; use pocketmine\block\utils\DyeColor; final class DyedShulkerBox extends ShulkerBox{ - use ColorInMetadataTrait; + use ColoredTrait; public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ $this->color = DyeColor::WHITE(); diff --git a/src/block/EndPortalFrame.php b/src/block/EndPortalFrame.php index 4f957da72..e9c69b1fc 100644 --- a/src/block/EndPortalFrame.php +++ b/src/block/EndPortalFrame.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\math\AxisAlignedBB; @@ -35,17 +36,14 @@ class EndPortalFrame extends Opaque{ protected bool $eye = false; - protected function writeStateToMeta() : int{ - return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing) | ($this->eye ? BlockLegacyMetadata::END_PORTAL_FRAME_FLAG_EYE : 0); + protected function decodeState(BlockDataReader $r) : void{ + $this->facing = $r->readHorizontalFacing(); + $this->eye = $r->readBool(); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03); - $this->eye = ($stateMeta & BlockLegacyMetadata::END_PORTAL_FRAME_FLAG_EYE) !== 0; - } - - public function getStateBitmask() : int{ - return 0b111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeHorizontalFacing($this->facing); + $w->writeBool($this->eye); } public function hasEye() : bool{ return $this->eye; } diff --git a/src/block/EndRod.php b/src/block/EndRod.php index d980b63af..f0b28c26d 100644 --- a/src/block/EndRod.php +++ b/src/block/EndRod.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\AnyFacingTrait; -use pocketmine\block\utils\BlockDataSerializer; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\AxisAlignedBB; @@ -36,27 +35,6 @@ use pocketmine\world\BlockTransaction; class EndRod extends Flowable{ use AnyFacingTrait; - protected function writeStateToMeta() : int{ - $result = BlockDataSerializer::writeFacing($this->facing); - if(Facing::axis($this->facing) !== Axis::Y){ - $result ^= 1; //TODO: in PC this is always the same as facing, just PE is stupid - } - - return $result; - } - - public function readStateFromData(int $id, int $stateMeta) : void{ - if($stateMeta !== 0 && $stateMeta !== 1){ - $stateMeta ^= 1; - } - - $this->facing = BlockDataSerializer::readFacing($stateMeta); - } - - public function getStateBitmask() : int{ - return 0b111; - } - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ $this->facing = $face; if($blockClicked instanceof EndRod && $blockClicked->facing === $this->facing){ diff --git a/src/block/EnderChest.php b/src/block/EnderChest.php index cf1ec0039..e71206b56 100644 --- a/src/block/EnderChest.php +++ b/src/block/EnderChest.php @@ -26,7 +26,7 @@ namespace pocketmine\block; use pocketmine\block\inventory\EnderChestInventory; use pocketmine\block\tile\EnderChest as TileEnderChest; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; -use pocketmine\block\utils\NormalHorizontalFacingInMetadataTrait; +use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; @@ -36,7 +36,7 @@ use pocketmine\player\Player; class EnderChest extends Transparent{ use FacesOppositePlacingPlayerTrait; - use NormalHorizontalFacingInMetadataTrait; + use HorizontalFacingTrait; public function getLightLevel() : int{ return 7; diff --git a/src/block/Farmland.php b/src/block/Farmland.php index 6e1ad13f0..8dfb3f6f7 100644 --- a/src/block/Farmland.php +++ b/src/block/Farmland.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\entity\Entity; use pocketmine\entity\Living; use pocketmine\event\entity\EntityTrampleFarmlandEvent; @@ -37,16 +38,12 @@ class Farmland extends Transparent{ protected int $wetness = 0; //"moisture" blockstate property in PC - protected function writeStateToMeta() : int{ - return $this->wetness; + protected function decodeState(BlockDataReader $r) : void{ + $this->wetness = $r->readBoundedInt(3, 0, self::MAX_WETNESS); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->wetness = BlockDataSerializer::readBoundedInt("wetness", $stateMeta, 0, self::MAX_WETNESS); - } - - public function getStateBitmask() : int{ - return 0b111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeInt(3, $this->wetness); } public function getWetness() : int{ return $this->wetness; } diff --git a/src/block/FenceGate.php b/src/block/FenceGate.php index fefd49b6c..0cec6374e 100644 --- a/src/block/FenceGate.php +++ b/src/block/FenceGate.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; use pocketmine\item\Item; @@ -40,20 +41,16 @@ class FenceGate extends Transparent{ protected bool $open = false; protected bool $inWall = false; - protected function writeStateToMeta() : int{ - return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing) | - ($this->open ? BlockLegacyMetadata::FENCE_GATE_FLAG_OPEN : 0) | - ($this->inWall ? BlockLegacyMetadata::FENCE_GATE_FLAG_IN_WALL : 0); + protected function decodeState(BlockDataReader $r) : void{ + $this->facing = $r->readHorizontalFacing(); + $this->open = $r->readBool(); + $this->inWall = $r->readBool(); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03); - $this->open = ($stateMeta & BlockLegacyMetadata::FENCE_GATE_FLAG_OPEN) !== 0; - $this->inWall = ($stateMeta & BlockLegacyMetadata::FENCE_GATE_FLAG_IN_WALL) !== 0; - } - - public function getStateBitmask() : int{ - return 0b1111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeHorizontalFacing($this->facing); + $w->writeBool($this->open); + $w->writeBool($this->inWall); } public function isOpen() : bool{ return $this->open; } diff --git a/src/block/Fire.php b/src/block/Fire.php index ba8f31463..b9da2f33a 100644 --- a/src/block/Fire.php +++ b/src/block/Fire.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\entity\Entity; use pocketmine\entity\projectile\Arrow; use pocketmine\event\block\BlockBurnEvent; @@ -45,16 +46,12 @@ class Fire extends Flowable{ protected int $age = 0; - protected function writeStateToMeta() : int{ - return $this->age; + protected function decodeState(BlockDataReader $r) : void{ + $this->age = $r->readBoundedInt(4, 0, self::MAX_AGE); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->age = BlockDataSerializer::readBoundedInt("age", $stateMeta, 0, self::MAX_AGE); - } - - public function getStateBitmask() : int{ - return 0b1111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeInt(4, $this->age); } public function getAge() : int{ return $this->age; } diff --git a/src/block/FloorBanner.php b/src/block/FloorBanner.php index d2ac152af..5e0074477 100644 --- a/src/block/FloorBanner.php +++ b/src/block/FloorBanner.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\SignLikeRotationTrait; use pocketmine\item\Item; use pocketmine\math\Facing; @@ -31,18 +33,19 @@ use pocketmine\player\Player; use pocketmine\world\BlockTransaction; final class FloorBanner extends BaseBanner{ - use SignLikeRotationTrait; - - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->rotation = $stateMeta; + use SignLikeRotationTrait { + decodeState as decodeRotation; + encodeState as encodeRotation; } - protected function writeStateToMeta() : int{ - return $this->rotation; + protected function decodeState(BlockDataReader $r) : void{ + parent::decodeState($r); + $this->decodeRotation($r); } - public function getStateBitmask() : int{ - return 0b1111; + protected function encodeState(BlockDataWriter $w) : void{ + parent::encodeState($w); + $this->encodeRotation($w); } protected function getSupportingFace() : int{ diff --git a/src/block/FloorCoralFan.php b/src/block/FloorCoralFan.php index 8572adf73..d1515eef9 100644 --- a/src/block/FloorCoralFan.php +++ b/src/block/FloorCoralFan.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\InvalidBlockStateException; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\data\bedrock\CoralTypeIdMap; use pocketmine\item\Item; use pocketmine\item\ItemFactory; @@ -37,30 +38,8 @@ use function atan2; use function rad2deg; final class FloorCoralFan extends BaseCoral{ - - protected BlockIdentifierFlattened $idInfoFlattened; - private int $axis = Axis::X; - public function __construct(BlockIdentifierFlattened $idInfo, string $name, BlockBreakInfo $breakInfo){ - $this->idInfoFlattened = $idInfo; - parent::__construct($idInfo, $name, $breakInfo); - } - - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->dead = $id === $this->idInfoFlattened->getSecondId(); - $this->axis = ($stateMeta >> 3) === BlockLegacyMetadata::CORAL_FAN_EAST_WEST ? Axis::X : Axis::Z; - $coralType = CoralTypeIdMap::getInstance()->fromId($stateMeta & BlockLegacyMetadata::CORAL_FAN_TYPE_MASK); - if($coralType === null){ - throw new InvalidBlockStateException("No such coral type"); - } - $this->coralType = $coralType; - } - - public function getId() : int{ - return $this->dead ? $this->idInfoFlattened->getSecondId() : parent::getId(); - } - public function asItem() : Item{ //TODO: HACK! workaround dead flag being lost when broken / blockpicked (original impl only uses first ID) return ItemFactory::getInstance()->get( @@ -69,17 +48,18 @@ final class FloorCoralFan extends BaseCoral{ ); } - protected function writeStateToMeta() : int{ - return (($this->axis === Axis::X ? BlockLegacyMetadata::CORAL_FAN_EAST_WEST : BlockLegacyMetadata::CORAL_FAN_NORTH_SOUTH) << 3) | - CoralTypeIdMap::getInstance()->toId($this->coralType); - } - protected function writeStateToItemMeta() : int{ return CoralTypeIdMap::getInstance()->toId($this->coralType); } - public function getStateBitmask() : int{ - return 0b1111; + protected function decodeState(BlockDataReader $r) : void{ + parent::decodeState($r); + $this->axis = $r->readHorizontalAxis(); + } + + protected function encodeState(BlockDataWriter $w) : void{ + parent::encodeState($w); + $w->writeHorizontalAxis($this->axis); } public function getAxis() : int{ return $this->axis; } diff --git a/src/block/FloorSign.php b/src/block/FloorSign.php index 13e4a6c9d..5615d15d8 100644 --- a/src/block/FloorSign.php +++ b/src/block/FloorSign.php @@ -33,18 +33,6 @@ use pocketmine\world\BlockTransaction; final class FloorSign extends BaseSign{ use SignLikeRotationTrait; - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->rotation = $stateMeta; - } - - protected function writeStateToMeta() : int{ - return $this->rotation; - } - - public function getStateBitmask() : int{ - return 0b1111; - } - protected function getSupportingFace() : int{ return Facing::DOWN; } diff --git a/src/block/FlowerPot.php b/src/block/FlowerPot.php index 69764b900..fd25284cd 100644 --- a/src/block/FlowerPot.php +++ b/src/block/FlowerPot.php @@ -36,15 +36,6 @@ class FlowerPot extends Flowable{ protected ?Block $plant = null; - protected function writeStateToMeta() : int{ - //TODO: HACK! this is just to make the client actually render the plant - we purposely don't read the flag back - return $this->plant !== null ? BlockLegacyMetadata::FLOWER_POT_FLAG_OCCUPIED : 0; - } - - public function getStateBitmask() : int{ - return 0b1; - } - public function readStateFromWorld() : void{ parent::readStateFromWorld(); $tile = $this->position->getWorld()->getTile($this->position); diff --git a/src/block/FrostedIce.php b/src/block/FrostedIce.php index 065caf589..e6addea5c 100644 --- a/src/block/FrostedIce.php +++ b/src/block/FrostedIce.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\event\block\BlockMeltEvent; use function mt_rand; @@ -32,16 +33,12 @@ class FrostedIce extends Ice{ protected int $age = 0; - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->age = BlockDataSerializer::readBoundedInt("age", $stateMeta, 0, self::MAX_AGE); + protected function decodeState(BlockDataReader $r) : void{ + $this->age = $r->readBoundedInt(2, 0, self::MAX_AGE); } - protected function writeStateToMeta() : int{ - return $this->age; - } - - public function getStateBitmask() : int{ - return 0b11; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeInt(2, $this->age); } public function getAge() : int{ return $this->age; } diff --git a/src/block/Furnace.php b/src/block/Furnace.php index f5a81c524..1bb6191aa 100644 --- a/src/block/Furnace.php +++ b/src/block/Furnace.php @@ -24,8 +24,10 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\tile\Furnace as TileFurnace; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; -use pocketmine\block\utils\NormalHorizontalFacingInMetadataTrait; +use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\item\Item; use pocketmine\math\Vector3; use pocketmine\player\Player; @@ -33,26 +35,18 @@ use function mt_rand; class Furnace extends Opaque{ use FacesOppositePlacingPlayerTrait; - use NormalHorizontalFacingInMetadataTrait { - readStateFromData as readFacingStateFromData; + use HorizontalFacingTrait; + + protected bool $lit = false; + + protected function decodeState(BlockDataReader $r) : void{ + $this->facing = $r->readHorizontalFacing(); + $this->lit = $r->readBool(); } - protected BlockIdentifierFlattened $idInfoFlattened; - - protected bool $lit = false; //this is set based on the blockID - - public function __construct(BlockIdentifierFlattened $idInfo, string $name, BlockBreakInfo $breakInfo){ - $this->idInfoFlattened = $idInfo; - parent::__construct($idInfo, $name, $breakInfo); - } - - public function getId() : int{ - return $this->lit ? $this->idInfoFlattened->getSecondId() : parent::getId(); - } - - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->readFacingStateFromData($id, $stateMeta); - $this->lit = $id === $this->idInfoFlattened->getSecondId(); + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeHorizontalFacing($this->facing); + $w->writeBool($this->lit); } public function getLightLevel() : int{ diff --git a/src/block/GlazedTerracotta.php b/src/block/GlazedTerracotta.php index 1787e51ae..b782d5dbb 100644 --- a/src/block/GlazedTerracotta.php +++ b/src/block/GlazedTerracotta.php @@ -24,9 +24,9 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; -use pocketmine\block\utils\NormalHorizontalFacingInMetadataTrait; +use pocketmine\block\utils\HorizontalFacingTrait; class GlazedTerracotta extends Opaque{ use FacesOppositePlacingPlayerTrait; - use NormalHorizontalFacingInMetadataTrait; + use HorizontalFacingTrait; } diff --git a/src/block/HayBale.php b/src/block/HayBale.php index e47598ac5..6fdd2cb63 100644 --- a/src/block/HayBale.php +++ b/src/block/HayBale.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\PillarRotationInMetadataTrait; +use pocketmine\block\utils\PillarRotationTrait; use pocketmine\entity\Entity; class HayBale extends Opaque{ - use PillarRotationInMetadataTrait; + use PillarRotationTrait; public function getFlameEncouragement() : int{ return 60; diff --git a/src/block/Hopper.php b/src/block/Hopper.php index 618862b9b..320fd1ce7 100644 --- a/src/block/Hopper.php +++ b/src/block/Hopper.php @@ -24,7 +24,8 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\tile\Hopper as TileHopper; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\InvalidBlockStateException; use pocketmine\block\utils\PoweredByRedstoneTrait; use pocketmine\block\utils\SupportType; @@ -40,21 +41,18 @@ class Hopper extends Transparent{ private int $facing = Facing::DOWN; - public function readStateFromData(int $id, int $stateMeta) : void{ - $facing = BlockDataSerializer::readFacing($stateMeta & 0x07); + protected function decodeState(BlockDataReader $r) : void{ + $facing = $r->readFacing(); if($facing === Facing::UP){ throw new InvalidBlockStateException("Hopper may not face upward"); } $this->facing = $facing; - $this->powered = ($stateMeta & BlockLegacyMetadata::HOPPER_FLAG_POWERED) !== 0; + $this->powered = $r->readBool(); } - protected function writeStateToMeta() : int{ - return BlockDataSerializer::writeFacing($this->facing) | ($this->powered ? BlockLegacyMetadata::HOPPER_FLAG_POWERED : 0); - } - - public function getStateBitmask() : int{ - return 0b1111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeFacing($this->facing); + $w->writeBool($this->powered); } public function getFacing() : int{ return $this->facing; } diff --git a/src/block/InfestedStone.php b/src/block/InfestedStone.php index 93e0aa3d6..6fbda8eea 100644 --- a/src/block/InfestedStone.php +++ b/src/block/InfestedStone.php @@ -31,7 +31,7 @@ final class InfestedStone extends Opaque{ public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo, Block $imitated){ parent::__construct($idInfo, $name, $breakInfo); - $this->imitated = $imitated->getFullId(); + $this->imitated = $imitated->getStateId(); } public function getImitatedBlock() : Block{ diff --git a/src/block/ItemFrame.php b/src/block/ItemFrame.php index 3e7a7378a..1f77323a0 100644 --- a/src/block/ItemFrame.php +++ b/src/block/ItemFrame.php @@ -24,7 +24,8 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\tile\ItemFrame as TileItemFrame; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\item\Item; use pocketmine\math\Facing; @@ -46,13 +47,14 @@ class ItemFrame extends Flowable{ protected int $itemRotation = 0; protected float $itemDropChance = 1.0; - protected function writeStateToMeta() : int{ - return BlockDataSerializer::write5MinusHorizontalFacing($this->facing) | ($this->hasMap ? BlockLegacyMetadata::ITEM_FRAME_FLAG_HAS_MAP : 0); + protected function decodeState(BlockDataReader $r) : void{ + $this->facing = $r->readHorizontalFacing(); + $this->hasMap = $r->readBool(); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->facing = BlockDataSerializer::read5MinusHorizontalFacing($stateMeta); - $this->hasMap = ($stateMeta & BlockLegacyMetadata::ITEM_FRAME_FLAG_HAS_MAP) !== 0; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeHorizontalFacing($this->facing); + $w->writeBool($this->hasMap); } public function readStateFromWorld() : void{ @@ -78,10 +80,6 @@ class ItemFrame extends Flowable{ } } - public function getStateBitmask() : int{ - return 0b111; - } - public function getFramedItem() : ?Item{ return $this->framedItem !== null ? clone $this->framedItem : null; } diff --git a/src/block/Ladder.php b/src/block/Ladder.php index fcf2be061..ad70405ad 100644 --- a/src/block/Ladder.php +++ b/src/block/Ladder.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\NormalHorizontalFacingInMetadataTrait; +use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; use pocketmine\entity\Entity; use pocketmine\entity\Living; @@ -36,7 +36,7 @@ use pocketmine\player\Player; use pocketmine\world\BlockTransaction; class Ladder extends Transparent{ - use NormalHorizontalFacingInMetadataTrait; + use HorizontalFacingTrait; public function hasEntityCollision() : bool{ return true; diff --git a/src/block/Lantern.php b/src/block/Lantern.php index 0c2fb31ef..ec54070f3 100644 --- a/src/block/Lantern.php +++ b/src/block/Lantern.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\SupportType; use pocketmine\item\Item; use pocketmine\math\Axis; @@ -33,19 +35,14 @@ use pocketmine\player\Player; use pocketmine\world\BlockTransaction; class Lantern extends Transparent{ - protected bool $hanging = false; - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->hanging = ($stateMeta & BlockLegacyMetadata::LANTERN_FLAG_HANGING) !== 0; + protected function decodeState(BlockDataReader $r) : void{ + $this->hanging = $r->readBool(); } - protected function writeStateToMeta() : int{ - return $this->hanging ? BlockLegacyMetadata::LANTERN_FLAG_HANGING : 0; - } - - public function getStateBitmask() : int{ - return 0b1; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeBool($this->hanging); } public function isHanging() : bool{ return $this->hanging; } diff --git a/src/block/Leaves.php b/src/block/Leaves.php index 58a0f7304..4a753db52 100644 --- a/src/block/Leaves.php +++ b/src/block/Leaves.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\SupportType; use pocketmine\block\utils\TreeType; use pocketmine\event\block\LeavesDecayEvent; @@ -38,7 +40,6 @@ use pocketmine\world\World; use function mt_rand; class Leaves extends Transparent{ - protected TreeType $treeType; protected bool $noDecay = false; protected bool $checkDecay = false; @@ -48,17 +49,14 @@ class Leaves extends Transparent{ $this->treeType = $treeType; } - protected function writeStateToMeta() : int{ - return ($this->noDecay ? BlockLegacyMetadata::LEAVES_FLAG_NO_DECAY : 0) | ($this->checkDecay ? BlockLegacyMetadata::LEAVES_FLAG_CHECK_DECAY : 0); + protected function decodeState(BlockDataReader $r) : void{ + $this->noDecay = $r->readBool(); + $this->checkDecay = $r->readBool(); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->noDecay = ($stateMeta & BlockLegacyMetadata::LEAVES_FLAG_NO_DECAY) !== 0; - $this->checkDecay = ($stateMeta & BlockLegacyMetadata::LEAVES_FLAG_CHECK_DECAY) !== 0; - } - - public function getStateBitmask() : int{ - return 0b1100; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeBool($this->noDecay); + $w->writeBool($this->checkDecay); } public function isNoDecay() : bool{ return $this->noDecay; } diff --git a/src/block/Lectern.php b/src/block/Lectern.php index e94c5c706..7f8e73105 100644 --- a/src/block/Lectern.php +++ b/src/block/Lectern.php @@ -24,7 +24,8 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\tile\Lectern as TileLectern; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; @@ -43,15 +44,17 @@ class Lectern extends Transparent{ protected int $viewedPage = 0; protected ?WritableBookBase $book = null; + protected bool $producingSignal = false; - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03); - $this->producingSignal = ($stateMeta & BlockLegacyMetadata::LECTERN_FLAG_POWERED) !== 0; + protected function decodeState(BlockDataReader $r) : void{ + $this->facing = $r->readHorizontalFacing(); + $this->producingSignal = $r->readBool(); } - public function writeStateToMeta() : int{ - return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing) | ($this->producingSignal ? BlockLegacyMetadata::LECTERN_FLAG_POWERED : 0); + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeHorizontalFacing($this->facing); + $w->writeBool($this->producingSignal); } public function readStateFromWorld() : void{ @@ -72,10 +75,6 @@ class Lectern extends Transparent{ } } - public function getStateBitmask() : int{ - return 0b111; - } - public function getFlammability() : int{ return 30; } diff --git a/src/block/Lever.php b/src/block/Lever.php index c9dfe76bb..bf006d30e 100644 --- a/src/block/Lever.php +++ b/src/block/Lever.php @@ -23,6 +23,10 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataReaderHelper; +use pocketmine\block\utils\BlockDataWriter; +use pocketmine\block\utils\BlockDataWriterHelper; use pocketmine\block\utils\LeverFacing; use pocketmine\item\Item; use pocketmine\math\Axis; @@ -43,36 +47,14 @@ class Lever extends Flowable{ parent::__construct($idInfo, $name, $breakInfo); } - protected function writeStateToMeta() : int{ - $rotationMeta = match($this->facing->id()){ - LeverFacing::DOWN_AXIS_X()->id() => 0, - LeverFacing::EAST()->id() => 1, - LeverFacing::WEST()->id() => 2, - LeverFacing::SOUTH()->id() => 3, - LeverFacing::NORTH()->id() => 4, - LeverFacing::UP_AXIS_Z()->id() => 5, - LeverFacing::UP_AXIS_X()->id() => 6, - LeverFacing::DOWN_AXIS_Z()->id() => 7, - default => throw new AssumptionFailedError(), - }; - return $rotationMeta | ($this->activated ? BlockLegacyMetadata::LEVER_FLAG_POWERED : 0); + protected function decodeState(BlockDataReader $r) : void{ + $this->facing = BlockDataReaderHelper::readLeverFacing($r); + $this->activated = $r->readBool(); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $rotationMeta = $stateMeta & 0x07; - $this->facing = match($rotationMeta){ - 0 => LeverFacing::DOWN_AXIS_X(), - 1 => LeverFacing::EAST(), - 2 => LeverFacing::WEST(), - 3 => LeverFacing::SOUTH(), - 4 => LeverFacing::NORTH(), - 5 => LeverFacing::UP_AXIS_Z(), - 6 => LeverFacing::UP_AXIS_X(), - 7 => LeverFacing::DOWN_AXIS_Z(), - default => throw new AssumptionFailedError("0x07 mask should make this impossible"), //phpstan doesn't understand :( - }; - - $this->activated = ($stateMeta & BlockLegacyMetadata::LEVER_FLAG_POWERED) !== 0; + protected function encodeState(BlockDataWriter $w) : void{ + BlockDataWriterHelper::writeLeverFacing($w, $this->facing); + $w->writeBool($this->activated); } public function getFacing() : LeverFacing{ return $this->facing; } @@ -91,10 +73,6 @@ class Lever extends Flowable{ return $this; } - public function getStateBitmask() : int{ - return 0b1111; - } - public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ if(!$this->canBeSupportedBy($blockClicked, $face)){ return false; diff --git a/src/block/Liquid.php b/src/block/Liquid.php index 7087df5d4..e3aca2a52 100644 --- a/src/block/Liquid.php +++ b/src/block/Liquid.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\MinimumCostFlowCalculator; use pocketmine\block\utils\SupportType; use pocketmine\entity\Entity; @@ -40,8 +41,6 @@ use function lcg_value; abstract class Liquid extends Transparent{ public const MAX_DECAY = 7; - protected BlockIdentifierFlattened $idInfoFlattened; - public int $adjacentSources = 0; protected ?Vector3 $flowVector = null; @@ -50,27 +49,16 @@ abstract class Liquid extends Transparent{ protected int $decay = 0; //PC "level" property protected bool $still = false; - public function __construct(BlockIdentifierFlattened $idInfo, string $name, BlockBreakInfo $breakInfo){ - $this->idInfoFlattened = $idInfo; - parent::__construct($idInfo, $name, $breakInfo); + protected function decodeState(BlockDataReader $r) : void{ + $this->decay = $r->readBoundedInt(3, 0, self::MAX_DECAY); + $this->falling = $r->readBool(); + $this->still = $r->readBool(); } - public function getId() : int{ - return $this->still ? $this->idInfoFlattened->getSecondId() : parent::getId(); - } - - protected function writeStateToMeta() : int{ - return $this->decay | ($this->falling ? BlockLegacyMetadata::LIQUID_FLAG_FALLING : 0); - } - - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->decay = BlockDataSerializer::readBoundedInt("decay", $stateMeta & 0x07, 0, self::MAX_DECAY); - $this->falling = ($stateMeta & BlockLegacyMetadata::LIQUID_FLAG_FALLING) !== 0; - $this->still = $id === $this->idInfoFlattened->getSecondId(); - } - - public function getStateBitmask() : int{ - return 0b1111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeInt(3, $this->decay); + $w->writeBool($this->falling); + $w->writeBool($this->still); } public function isFalling() : bool{ return $this->falling; } diff --git a/src/block/Log.php b/src/block/Log.php index b96a0d380..88314eaf0 100644 --- a/src/block/Log.php +++ b/src/block/Log.php @@ -23,10 +23,10 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\PillarRotationInMetadataTrait; +use pocketmine\block\utils\PillarRotationTrait; class Log extends Wood{ - use PillarRotationInMetadataTrait; + use PillarRotationTrait; protected function getAxisMetaShift() : int{ return $this->isStripped() ? 0 : 2; diff --git a/src/block/Loom.php b/src/block/Loom.php index 9c5f830f7..e75594ece 100644 --- a/src/block/Loom.php +++ b/src/block/Loom.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\inventory\LoomInventory; -use pocketmine\block\utils\BlockDataSerializer; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\item\Item; @@ -35,18 +34,6 @@ final class Loom extends Opaque{ use FacesOppositePlacingPlayerTrait; use HorizontalFacingTrait; - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x3); - } - - protected function writeStateToMeta() : int{ - return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing); - } - - public function getStateBitmask() : int{ - return 0b11; - } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ if($player !== null){ $player->setCurrentWindow(new LoomInventory($this->position)); diff --git a/src/block/NetherPortal.php b/src/block/NetherPortal.php index 398b4c468..0d94449e0 100644 --- a/src/block/NetherPortal.php +++ b/src/block/NetherPortal.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\SupportType; use pocketmine\entity\Entity; use pocketmine\item\Item; @@ -33,16 +35,12 @@ class NetherPortal extends Transparent{ protected int $axis = Axis::X; - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->axis = $stateMeta === BlockLegacyMetadata::NETHER_PORTAL_AXIS_Z ? Axis::Z : Axis::X; //mojang u dumb + protected function decodeState(BlockDataReader $r) : void{ + $this->axis = $r->readHorizontalAxis(); } - protected function writeStateToMeta() : int{ - return $this->axis === Axis::Z ? BlockLegacyMetadata::NETHER_PORTAL_AXIS_Z : BlockLegacyMetadata::NETHER_PORTAL_AXIS_X; - } - - public function getStateBitmask() : int{ - return 0b11; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeHorizontalAxis($this->axis); } public function getAxis() : int{ diff --git a/src/block/NetherWartPlant.php b/src/block/NetherWartPlant.php index 0a30d35f4..b07644fa5 100644 --- a/src/block/NetherWartPlant.php +++ b/src/block/NetherWartPlant.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\event\block\BlockGrowEvent; use pocketmine\item\Item; use pocketmine\math\Facing; @@ -37,16 +38,12 @@ class NetherWartPlant extends Flowable{ protected int $age = 0; - protected function writeStateToMeta() : int{ - return $this->age; + protected function decodeState(BlockDataReader $r) : void{ + $this->age = $r->readBoundedInt(2, 0, self::MAX_AGE); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->age = BlockDataSerializer::readBoundedInt("age", $stateMeta, 0, self::MAX_AGE); - } - - public function getStateBitmask() : int{ - return 0b11; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeInt(2, $this->age); } public function getAge() : int{ return $this->age; } diff --git a/src/block/Rail.php b/src/block/Rail.php index ea3feba48..4b5ae94d6 100644 --- a/src/block/Rail.php +++ b/src/block/Rail.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\InvalidBlockStateException; use pocketmine\block\utils\RailConnectionInfo; use pocketmine\math\Facing; @@ -33,20 +35,16 @@ class Rail extends BaseRail{ private int $railShape = BlockLegacyMetadata::RAIL_STRAIGHT_NORTH_SOUTH; - public function readStateFromData(int $id, int $stateMeta) : void{ - if(!isset(RailConnectionInfo::CONNECTIONS[$stateMeta]) && !isset(RailConnectionInfo::CURVE_CONNECTIONS[$stateMeta])){ - throw new InvalidBlockStateException("No rail shape matches metadata $stateMeta"); + protected function decodeState(BlockDataReader $r) : void{ + $railShape = $r->readInt(4); + if(!isset(RailConnectionInfo::CONNECTIONS[$railShape]) && !isset(RailConnectionInfo::CURVE_CONNECTIONS[$railShape])){ + throw new InvalidBlockStateException("Invalid rail shape $railShape"); } - $this->railShape = $stateMeta; + $this->railShape = $railShape; } - protected function writeStateToMeta() : int{ - //TODO: railShape won't be plain metadata in future - return $this->railShape; - } - - public function getStateBitmask() : int{ - return 0b1111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeInt(4, $this->railShape); } protected function setShapeFromConnections(array $connections) : void{ diff --git a/src/block/RedMushroomBlock.php b/src/block/RedMushroomBlock.php index 820a0e5f8..f2a22a744 100644 --- a/src/block/RedMushroomBlock.php +++ b/src/block/RedMushroomBlock.php @@ -23,14 +23,15 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\InvalidBlockStateException; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataReaderHelper; +use pocketmine\block\utils\BlockDataWriter; +use pocketmine\block\utils\BlockDataWriterHelper; use pocketmine\block\utils\MushroomBlockType; -use pocketmine\data\bedrock\MushroomBlockTypeIdMap; use pocketmine\item\Item; use function mt_rand; class RedMushroomBlock extends Opaque{ - protected MushroomBlockType $mushroomBlockType; public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ @@ -38,20 +39,12 @@ class RedMushroomBlock extends Opaque{ parent::__construct($idInfo, $name, $breakInfo); } - protected function writeStateToMeta() : int{ - return MushroomBlockTypeIdMap::getInstance()->toId($this->mushroomBlockType); + protected function decodeState(BlockDataReader $r) : void{ + $this->mushroomBlockType = BlockDataReaderHelper::readMushroomBlockType($r); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $type = MushroomBlockTypeIdMap::getInstance()->fromId($stateMeta); - if($type === null){ - throw new InvalidBlockStateException("No such mushroom variant $stateMeta"); - } - $this->mushroomBlockType = $type; - } - - public function getStateBitmask() : int{ - return 0b1111; + protected function encodeState(BlockDataWriter $w) : void{ + BlockDataWriterHelper::writeMushroomBlockType($w, $this->mushroomBlockType); } public function getMushroomBlockType() : MushroomBlockType{ return $this->mushroomBlockType; } diff --git a/src/block/RedstoneComparator.php b/src/block/RedstoneComparator.php index c7396d119..8abb70a21 100644 --- a/src/block/RedstoneComparator.php +++ b/src/block/RedstoneComparator.php @@ -25,7 +25,8 @@ namespace pocketmine\block; use pocketmine\block\tile\Comparator; use pocketmine\block\utils\AnalogRedstoneSignalEmitterTrait; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\PoweredByRedstoneTrait; use pocketmine\block\utils\SupportType; @@ -42,33 +43,19 @@ class RedstoneComparator extends Flowable{ use AnalogRedstoneSignalEmitterTrait; use PoweredByRedstoneTrait; - protected BlockIdentifierFlattened $idInfoFlattened; - protected bool $isSubtractMode = false; - public function __construct(BlockIdentifierFlattened $idInfo, string $name, BlockBreakInfo $breakInfo){ - $this->idInfoFlattened = $idInfo; - parent::__construct($idInfo, $name, $breakInfo); + protected function decodeState(BlockDataReader $r) : void{ + $this->facing = $r->readHorizontalFacing(); + $this->isSubtractMode = $r->readBool(); + $this->powered = $r->readBool(); + //TODO: this doesn't call the decoder from AnalogRedstoneSignalEmitter } - public function getId() : int{ - return $this->powered ? $this->idInfoFlattened->getSecondId() : parent::getId(); - } - - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03); - $this->isSubtractMode = ($stateMeta & BlockLegacyMetadata::REDSTONE_COMPARATOR_FLAG_SUBTRACT) !== 0; - $this->powered = ($id === $this->idInfoFlattened->getSecondId() || ($stateMeta & BlockLegacyMetadata::REDSTONE_COMPARATOR_FLAG_POWERED) !== 0); - } - - public function writeStateToMeta() : int{ - return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing) | - ($this->isSubtractMode ? BlockLegacyMetadata::REDSTONE_COMPARATOR_FLAG_SUBTRACT : 0) | - ($this->powered ? BlockLegacyMetadata::REDSTONE_COMPARATOR_FLAG_POWERED : 0); - } - - public function getStateBitmask() : int{ - return 0b1111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeHorizontalFacing($this->facing); + $w->writeBool($this->isSubtractMode); + $w->writeBool($this->powered); } public function readStateFromWorld() : void{ diff --git a/src/block/RedstoneLamp.php b/src/block/RedstoneLamp.php index 5507881f5..de84d7445 100644 --- a/src/block/RedstoneLamp.php +++ b/src/block/RedstoneLamp.php @@ -23,24 +23,19 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\PoweredByRedstoneTrait; class RedstoneLamp extends Opaque{ use PoweredByRedstoneTrait; - protected BlockIdentifierFlattened $idInfoFlattened; - - public function __construct(BlockIdentifierFlattened $idInfo, string $name, BlockBreakInfo $breakInfo){ - $this->idInfoFlattened = $idInfo; - parent::__construct($idInfo, $name, $breakInfo); + protected function decodeState(BlockDataReader $r) : void{ + $this->powered = $r->readBool(); } - public function getId() : int{ - return $this->powered ? $this->idInfoFlattened->getSecondId() : parent::getId(); - } - - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->powered = $id === $this->idInfoFlattened->getSecondId(); + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeBool($this->powered); } public function getLightLevel() : int{ diff --git a/src/block/RedstoneOre.php b/src/block/RedstoneOre.php index 1557634a8..29946ee47 100644 --- a/src/block/RedstoneOre.php +++ b/src/block/RedstoneOre.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\item\Item; use pocketmine\item\VanillaItems; use pocketmine\math\Vector3; @@ -30,22 +32,14 @@ use pocketmine\player\Player; use function mt_rand; class RedstoneOre extends Opaque{ - - protected BlockIdentifierFlattened $idInfoFlattened; - protected bool $lit = false; - public function __construct(BlockIdentifierFlattened $idInfo, string $name, BlockBreakInfo $breakInfo){ - $this->idInfoFlattened = $idInfo; - parent::__construct($idInfo, $name, $breakInfo); + protected function decodeState(BlockDataReader $r) : void{ + $this->lit = $r->readBool(); } - public function getId() : int{ - return $this->lit ? $this->idInfoFlattened->getSecondId() : parent::getId(); - } - - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->lit = $id === $this->idInfoFlattened->getSecondId(); + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeBool($this->lit); } public function isLit() : bool{ diff --git a/src/block/RedstoneRepeater.php b/src/block/RedstoneRepeater.php index 2fbd0b259..ed6fe01a6 100644 --- a/src/block/RedstoneRepeater.php +++ b/src/block/RedstoneRepeater.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\PoweredByRedstoneTrait; use pocketmine\block\utils\SupportType; @@ -41,31 +42,18 @@ class RedstoneRepeater extends Flowable{ public const MIN_DELAY = 1; public const MAX_DELAY = 4; - protected BlockIdentifierFlattened $idInfoFlattened; - protected int $delay = self::MIN_DELAY; - public function __construct(BlockIdentifierFlattened $idInfo, string $name, BlockBreakInfo $breakInfo){ - $this->idInfoFlattened = $idInfo; - parent::__construct($idInfo, $name, $breakInfo); + protected function decodeState(BlockDataReader $r) : void{ + $this->facing = $r->readHorizontalFacing(); + $this->delay = $r->readBoundedInt(2, self::MIN_DELAY - 1, self::MAX_DELAY - 1) + 1; + $this->powered = $r->readBool(); } - public function getId() : int{ - return $this->powered ? $this->idInfoFlattened->getSecondId() : parent::getId(); - } - - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03); - $this->delay = BlockDataSerializer::readBoundedInt("delay", ($stateMeta >> 2) + 1, self::MIN_DELAY, self::MAX_DELAY); - $this->powered = $id === $this->idInfoFlattened->getSecondId(); - } - - public function writeStateToMeta() : int{ - return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing) | (($this->delay - 1) << 2); - } - - public function getStateBitmask() : int{ - return 0b1111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeHorizontalFacing($this->facing); + $w->writeInt(2, $this->delay - 1); + $w->writeBool($this->powered); } public function getDelay() : int{ return $this->delay; } diff --git a/src/block/RedstoneTorch.php b/src/block/RedstoneTorch.php index b5de4898b..78d5d282c 100644 --- a/src/block/RedstoneTorch.php +++ b/src/block/RedstoneTorch.php @@ -23,24 +23,20 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; + class RedstoneTorch extends Torch{ - - protected BlockIdentifierFlattened $idInfoFlattened; - protected bool $lit = true; - public function __construct(BlockIdentifierFlattened $idInfo, string $name, BlockBreakInfo $breakInfo){ - $this->idInfoFlattened = $idInfo; - parent::__construct($idInfo, $name, $breakInfo); + protected function decodeState(BlockDataReader $r) : void{ + parent::decodeState($r); + $this->lit = $r->readBool(); } - public function getId() : int{ - return $this->lit ? parent::getId() : $this->idInfoFlattened->getSecondId(); - } - - public function readStateFromData(int $id, int $stateMeta) : void{ - parent::readStateFromData($id, $stateMeta); - $this->lit = $id !== $this->idInfoFlattened->getSecondId(); + protected function encodeState(BlockDataWriter $w) : void{ + parent::encodeState($w); + $w->writeBool($this->lit); } public function isLit() : bool{ diff --git a/src/block/RedstoneWire.php b/src/block/RedstoneWire.php index e744c1849..aff8ec32e 100644 --- a/src/block/RedstoneWire.php +++ b/src/block/RedstoneWire.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\AnalogRedstoneSignalEmitterTrait; -use pocketmine\block\utils\BlockDataSerializer; use pocketmine\item\Item; use pocketmine\math\Facing; use pocketmine\math\Vector3; @@ -41,18 +40,6 @@ class RedstoneWire extends Flowable{ return false; } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->signalStrength = BlockDataSerializer::readBoundedInt("signalStrength", $stateMeta, 0, 15); - } - - protected function writeStateToMeta() : int{ - return $this->signalStrength; - } - - public function getStateBitmask() : int{ - return 0b1111; - } - public function readStateFromWorld() : void{ parent::readStateFromWorld(); //TODO: check connections to nearby redstone components diff --git a/src/block/Sapling.php b/src/block/Sapling.php index 9b5c8671d..1c4e87b59 100644 --- a/src/block/Sapling.php +++ b/src/block/Sapling.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\TreeType; use pocketmine\event\block\StructureGrowEvent; use pocketmine\item\Fertilizer; @@ -36,7 +38,6 @@ use pocketmine\world\generator\object\TreeFactory; use function mt_rand; class Sapling extends Flowable{ - protected bool $ready = false; private TreeType $treeType; @@ -46,16 +47,12 @@ class Sapling extends Flowable{ $this->treeType = $treeType; } - protected function writeStateToMeta() : int{ - return ($this->ready ? BlockLegacyMetadata::SAPLING_FLAG_READY : 0); + protected function decodeState(BlockDataReader $r) : void{ + $this->ready = $r->readBool(); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->ready = ($stateMeta & BlockLegacyMetadata::SAPLING_FLAG_READY) !== 0; - } - - public function getStateBitmask() : int{ - return 0b1000; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeBool($this->ready); } public function isReady() : bool{ return $this->ready; } diff --git a/src/block/SeaPickle.php b/src/block/SeaPickle.php index 39917aded..b2e304765 100644 --- a/src/block/SeaPickle.php +++ b/src/block/SeaPickle.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\SupportType; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; @@ -37,17 +39,14 @@ class SeaPickle extends Transparent{ protected int $count = self::MIN_COUNT; protected bool $underwater = false; - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->count = ($stateMeta & 0x03) + 1; - $this->underwater = ($stateMeta & BlockLegacyMetadata::SEA_PICKLE_FLAG_NOT_UNDERWATER) === 0; + protected function decodeState(BlockDataReader $r) : void{ + $this->count = $r->readBoundedInt(2, self::MIN_COUNT - 1, self::MAX_COUNT - 1) + 1; + $this->underwater = $r->readBool(); } - protected function writeStateToMeta() : int{ - return ($this->count - 1) | ($this->underwater ? 0 : BlockLegacyMetadata::SEA_PICKLE_FLAG_NOT_UNDERWATER); - } - - public function getStateBitmask() : int{ - return 0b111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeInt(2, $this->count - 1); + $w->writeBool($this->underwater); } public function getCount() : int{ return $this->count; } diff --git a/src/block/ShulkerBox.php b/src/block/ShulkerBox.php index de8cefeb8..b602555ac 100644 --- a/src/block/ShulkerBox.php +++ b/src/block/ShulkerBox.php @@ -25,6 +25,8 @@ namespace pocketmine\block; use pocketmine\block\tile\ShulkerBox as TileShulkerBox; use pocketmine\block\utils\AnyFacingTrait; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\item\Item; use pocketmine\math\Vector3; use pocketmine\player\Player; @@ -33,6 +35,14 @@ use pocketmine\world\BlockTransaction; class ShulkerBox extends Opaque{ use AnyFacingTrait; + protected function decodeState(BlockDataReader $r) : void{ + //NOOP - we don't read or write facing here, because the tile persists it + } + + protected function encodeState(BlockDataWriter $w) : void{ + //NOOP - we don't read or write facing here, because the tile persists it + } + public function writeStateToWorld() : void{ parent::writeStateToWorld(); $shulker = $this->position->getWorld()->getTile($this->position); diff --git a/src/block/SimplePillar.php b/src/block/SimplePillar.php index 72750e000..98c89f89c 100644 --- a/src/block/SimplePillar.php +++ b/src/block/SimplePillar.php @@ -23,12 +23,12 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\PillarRotationInMetadataTrait; +use pocketmine\block\utils\PillarRotationTrait; /** * @internal This class provides a general base for pillar-like blocks. It **should not** be used for contract binding * in APIs, because not all pillar-like blocks extend this class. */ class SimplePillar extends Opaque{ - use PillarRotationInMetadataTrait; + use PillarRotationTrait; } diff --git a/src/block/SimplePressurePlate.php b/src/block/SimplePressurePlate.php index 4ad9c5ce4..205583b41 100644 --- a/src/block/SimplePressurePlate.php +++ b/src/block/SimplePressurePlate.php @@ -23,20 +23,18 @@ declare(strict_types=1); namespace pocketmine\block; -abstract class SimplePressurePlate extends PressurePlate{ +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; +abstract class SimplePressurePlate extends PressurePlate{ protected bool $pressed = false; - protected function writeStateToMeta() : int{ - return $this->pressed ? BlockLegacyMetadata::PRESSURE_PLATE_FLAG_POWERED : 0; + protected function decodeState(BlockDataReader $r) : void{ + $this->pressed = $r->readBool(); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->pressed = ($stateMeta & BlockLegacyMetadata::PRESSURE_PLATE_FLAG_POWERED) !== 0; - } - - public function getStateBitmask() : int{ - return 0b1; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeBool($this->pressed); } public function isPressed() : bool{ return $this->pressed; } diff --git a/src/block/Skull.php b/src/block/Skull.php index b96a29850..3495027af 100644 --- a/src/block/Skull.php +++ b/src/block/Skull.php @@ -24,7 +24,9 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\tile\Skull as TileSkull; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; +use pocketmine\block\utils\InvalidBlockStateException; use pocketmine\block\utils\SkullType; use pocketmine\item\Item; use pocketmine\math\AxisAlignedBB; @@ -42,7 +44,6 @@ class Skull extends Flowable{ protected SkullType $skullType; protected int $facing = Facing::NORTH; - protected bool $noDrops = false; protected int $rotation = self::MIN_ROTATION; //TODO: split this into floor skull and wall skull handling public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ @@ -50,19 +51,16 @@ class Skull extends Flowable{ parent::__construct($idInfo, $name, $breakInfo); } - protected function writeStateToMeta() : int{ - return ($this->facing === Facing::UP ? 1 : BlockDataSerializer::writeHorizontalFacing($this->facing)) | - ($this->noDrops ? BlockLegacyMetadata::SKULL_FLAG_NO_DROPS : 0); + protected function decodeState(BlockDataReader $r) : void{ + $facing = $r->readFacing(); + if($facing === Facing::DOWN){ + throw new InvalidBlockStateException("Skull may not face down"); + } + $this->facing = $facing; } - public function readStateFromData(int $id, int $stateMeta) : void{ - $facingMeta = $stateMeta & 0x7; - $this->facing = $facingMeta === 1 ? Facing::UP : BlockDataSerializer::readHorizontalFacing($facingMeta); - $this->noDrops = ($stateMeta & BlockLegacyMetadata::SKULL_FLAG_NO_DROPS) !== 0; - } - - public function getStateBitmask() : int{ - return 0b1111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeFacing($this->facing); } public function readStateFromWorld() : void{ @@ -115,14 +113,6 @@ class Skull extends Flowable{ return $this; } - public function isNoDrops() : bool{ return $this->noDrops; } - - /** @return $this */ - public function setNoDrops(bool $noDrops) : self{ - $this->noDrops = $noDrops; - return $this; - } - /** * @return AxisAlignedBB[] */ diff --git a/src/block/Slab.php b/src/block/Slab.php index f3b21a5b8..c39e0de84 100644 --- a/src/block/Slab.php +++ b/src/block/Slab.php @@ -23,6 +23,10 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataReaderHelper; +use pocketmine\block\utils\BlockDataWriter; +use pocketmine\block\utils\BlockDataWriterHelper; use pocketmine\block\utils\SlabType; use pocketmine\block\utils\SupportType; use pocketmine\item\Item; @@ -33,38 +37,19 @@ use pocketmine\player\Player; use pocketmine\world\BlockTransaction; class Slab extends Transparent{ - - protected BlockIdentifierFlattened $idInfoFlattened; - protected SlabType $slabType; - public function __construct(BlockIdentifierFlattened $idInfo, string $name, BlockBreakInfo $breakInfo){ - $this->idInfoFlattened = $idInfo; + public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ parent::__construct($idInfo, $name . " Slab", $breakInfo); $this->slabType = SlabType::BOTTOM(); } - public function getId() : int{ - return $this->slabType->equals(SlabType::DOUBLE()) ? $this->idInfoFlattened->getSecondId() : parent::getId(); + protected function decodeState(BlockDataReader $r) : void{ + $this->slabType = BlockDataReaderHelper::readSlabType($r); } - protected function writeStateToMeta() : int{ - if(!$this->slabType->equals(SlabType::DOUBLE())){ - return ($this->slabType->equals(SlabType::TOP()) ? BlockLegacyMetadata::SLAB_FLAG_UPPER : 0); - } - return 0; - } - - public function readStateFromData(int $id, int $stateMeta) : void{ - if($id === $this->idInfoFlattened->getSecondId()){ - $this->slabType = SlabType::DOUBLE(); - }else{ - $this->slabType = ($stateMeta & BlockLegacyMetadata::SLAB_FLAG_UPPER) !== 0 ? SlabType::TOP() : SlabType::BOTTOM(); - } - } - - public function getStateBitmask() : int{ - return 0b1000; + protected function encodeState(BlockDataWriter $w) : void{ + BlockDataWriterHelper::writeSlabType($w, $this->slabType); } public function isTransparent() : bool{ diff --git a/src/block/SnowLayer.php b/src/block/SnowLayer.php index 4e65b5eeb..193d17799 100644 --- a/src/block/SnowLayer.php +++ b/src/block/SnowLayer.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\Fallable; use pocketmine\block\utils\FallableTrait; use pocketmine\block\utils\SupportType; @@ -46,16 +47,12 @@ class SnowLayer extends Flowable implements Fallable{ protected int $layers = self::MIN_LAYERS; - protected function writeStateToMeta() : int{ - return $this->layers - 1; + protected function decodeState(BlockDataReader $r) : void{ + $this->layers = $r->readBoundedInt(3, self::MIN_LAYERS - 1, self::MAX_LAYERS - 1) + 1; } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->layers = BlockDataSerializer::readBoundedInt("layers", $stateMeta + 1, self::MIN_LAYERS, self::MAX_LAYERS); - } - - public function getStateBitmask() : int{ - return 0b111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeInt(3, $this->layers - 1); } public function getLayers() : int{ return $this->layers; } diff --git a/src/block/Sponge.php b/src/block/Sponge.php index eb69c64c0..f5ee824bb 100644 --- a/src/block/Sponge.php +++ b/src/block/Sponge.php @@ -23,24 +23,22 @@ declare(strict_types=1); namespace pocketmine\block; -class Sponge extends Opaque{ +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; +class Sponge extends Opaque{ protected bool $wet = false; - protected function writeStateToMeta() : int{ + protected function writeStateToItemMeta() : int{ return $this->wet ? BlockLegacyMetadata::SPONGE_FLAG_WET : 0; } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->wet = ($stateMeta & BlockLegacyMetadata::SPONGE_FLAG_WET) !== 0; + protected function decodeState(BlockDataReader $r) : void{ + $this->wet = $r->readBool(); } - protected function writeStateToItemMeta() : int{ - return $this->writeStateToMeta(); - } - - public function getStateBitmask() : int{ - return 0b1; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeBool($this->wet); } public function isWet() : bool{ return $this->wet; } diff --git a/src/block/StainedGlass.php b/src/block/StainedGlass.php index 422d38dde..ad9ed24af 100644 --- a/src/block/StainedGlass.php +++ b/src/block/StainedGlass.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\ColorInMetadataTrait; +use pocketmine\block\utils\ColoredTrait; use pocketmine\block\utils\DyeColor; final class StainedGlass extends Glass{ - use ColorInMetadataTrait; + use ColoredTrait; public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ $this->color = DyeColor::WHITE(); diff --git a/src/block/StainedGlassPane.php b/src/block/StainedGlassPane.php index 4514991db..38c43f79b 100644 --- a/src/block/StainedGlassPane.php +++ b/src/block/StainedGlassPane.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\ColorInMetadataTrait; +use pocketmine\block\utils\ColoredTrait; use pocketmine\block\utils\DyeColor; final class StainedGlassPane extends GlassPane{ - use ColorInMetadataTrait; + use ColoredTrait; public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ $this->color = DyeColor::WHITE(); diff --git a/src/block/StainedHardenedClay.php b/src/block/StainedHardenedClay.php index 8d07bc0a3..e805e91cf 100644 --- a/src/block/StainedHardenedClay.php +++ b/src/block/StainedHardenedClay.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\ColorInMetadataTrait; +use pocketmine\block\utils\ColoredTrait; use pocketmine\block\utils\DyeColor; final class StainedHardenedClay extends HardenedClay{ - use ColorInMetadataTrait; + use ColoredTrait; public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ $this->color = DyeColor::WHITE(); diff --git a/src/block/StainedHardenedGlass.php b/src/block/StainedHardenedGlass.php index 591384182..e3915807d 100644 --- a/src/block/StainedHardenedGlass.php +++ b/src/block/StainedHardenedGlass.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\ColorInMetadataTrait; +use pocketmine\block\utils\ColoredTrait; use pocketmine\block\utils\DyeColor; final class StainedHardenedGlass extends HardenedGlass{ - use ColorInMetadataTrait; + use ColoredTrait; public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ $this->color = DyeColor::WHITE(); diff --git a/src/block/StainedHardenedGlassPane.php b/src/block/StainedHardenedGlassPane.php index ea9f213d3..805473087 100644 --- a/src/block/StainedHardenedGlassPane.php +++ b/src/block/StainedHardenedGlassPane.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\ColorInMetadataTrait; +use pocketmine\block\utils\ColoredTrait; use pocketmine\block\utils\DyeColor; final class StainedHardenedGlassPane extends HardenedGlassPane{ - use ColorInMetadataTrait; + use ColoredTrait; public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ $this->color = DyeColor::WHITE(); diff --git a/src/block/Stair.php b/src/block/Stair.php index 6ffc68be0..ab188c53a 100644 --- a/src/block/Stair.php +++ b/src/block/Stair.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\StairShape; use pocketmine\block\utils\SupportType; @@ -46,17 +47,14 @@ class Stair extends Transparent{ parent::__construct($idInfo, $name, $breakInfo); } - protected function writeStateToMeta() : int{ - return BlockDataSerializer::write5MinusHorizontalFacing($this->facing) | ($this->upsideDown ? BlockLegacyMetadata::STAIR_FLAG_UPSIDE_DOWN : 0); + protected function decodeState(BlockDataReader $r) : void{ + $this->facing = $r->readHorizontalFacing(); + $this->upsideDown = $r->readBool(); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->facing = BlockDataSerializer::read5MinusHorizontalFacing($stateMeta); - $this->upsideDown = ($stateMeta & BlockLegacyMetadata::STAIR_FLAG_UPSIDE_DOWN) !== 0; - } - - public function getStateBitmask() : int{ - return 0b111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeHorizontalFacing($this->facing); + $w->writeBool($this->upsideDown); } public function readStateFromWorld() : void{ diff --git a/src/block/Stonecutter.php b/src/block/Stonecutter.php index e16b00236..f31e95d2c 100644 --- a/src/block/Stonecutter.php +++ b/src/block/Stonecutter.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\inventory\StonecutterInventory; -use pocketmine\block\utils\BlockDataSerializer; use pocketmine\block\utils\FacesOppositePlacingPlayerTrait; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; @@ -38,18 +37,6 @@ class Stonecutter extends Transparent{ use FacesOppositePlacingPlayerTrait; use HorizontalFacingTrait; - public function writeStateToMeta() : int{ - return BlockDataSerializer::writeHorizontalFacing($this->facing); - } - - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->facing = BlockDataSerializer::readHorizontalFacing($stateMeta); - } - - public function getStateBitmask() : int{ - return 0b111; - } - public function onInteract(Item $item, int $face, Vector3 $clickVector, ?Player $player = null) : bool{ if($player !== null){ $player->setCurrentWindow(new StonecutterInventory($this->position)); diff --git a/src/block/StraightOnlyRail.php b/src/block/StraightOnlyRail.php index 37c88012f..8d9642987 100644 --- a/src/block/StraightOnlyRail.php +++ b/src/block/StraightOnlyRail.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\InvalidBlockStateException; use pocketmine\block\utils\RailConnectionInfo; use function array_keys; @@ -35,21 +37,16 @@ class StraightOnlyRail extends BaseRail{ private int $railShape = BlockLegacyMetadata::RAIL_STRAIGHT_NORTH_SOUTH; - public function readStateFromData(int $id, int $stateMeta) : void{ - $railShape = $stateMeta & ~BlockLegacyMetadata::REDSTONE_RAIL_FLAG_POWERED; + protected function decodeState(BlockDataReader $r) : void{ + $railShape = $r->readInt(3); if(!isset(RailConnectionInfo::CONNECTIONS[$railShape])){ - throw new InvalidBlockStateException("No rail shape matches meta $stateMeta"); + throw new InvalidBlockStateException("No rail shape matches meta $railShape"); } $this->railShape = $railShape; } - protected function writeStateToMeta() : int{ - //TODO: railShape won't be plain metadata in the future - return $this->railShape; - } - - public function getStateBitmask() : int{ - return 0b111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeInt(3, $this->railShape); } protected function setShapeFromConnections(array $connections) : void{ diff --git a/src/block/Sugarcane.php b/src/block/Sugarcane.php index 18c840b52..51726bcff 100644 --- a/src/block/Sugarcane.php +++ b/src/block/Sugarcane.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\event\block\BlockGrowEvent; use pocketmine\item\Fertilizer; use pocketmine\item\Item; @@ -37,16 +38,12 @@ class Sugarcane extends Flowable{ protected int $age = 0; - protected function writeStateToMeta() : int{ - return $this->age; + protected function decodeState(BlockDataReader $r) : void{ + $this->age = $r->readBoundedInt(4, 0, self::MAX_AGE); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->age = BlockDataSerializer::readBoundedInt("age", $stateMeta, 0, self::MAX_AGE); - } - - public function getStateBitmask() : int{ - return 0b1111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeInt(4, $this->age); } private function grow() : bool{ diff --git a/src/block/SweetBerryBush.php b/src/block/SweetBerryBush.php index 308f354a3..3fdfc9a4d 100644 --- a/src/block/SweetBerryBush.php +++ b/src/block/SweetBerryBush.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\entity\Entity; use pocketmine\entity\Living; use pocketmine\event\block\BlockGrowEvent; @@ -45,16 +46,12 @@ class SweetBerryBush extends Flowable{ protected int $age = self::STAGE_SAPLING; - protected function writeStateToMeta() : int{ - return $this->age; + protected function decodeState(BlockDataReader $r) : void{ + $this->age = $r->readBoundedInt(3, self::STAGE_SAPLING, self::STAGE_MATURE); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->age = BlockDataSerializer::readBoundedInt("stage", $stateMeta, self::STAGE_SAPLING, self::STAGE_MATURE); - } - - public function getStateBitmask() : int{ - return 0b111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeInt(3, $this->age); } public function getAge() : int{ return $this->age; } diff --git a/src/block/TNT.php b/src/block/TNT.php index 561e36e37..18dea8793 100644 --- a/src/block/TNT.php +++ b/src/block/TNT.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\entity\Entity; use pocketmine\entity\Location; use pocketmine\entity\object\PrimedTNT; @@ -40,25 +42,21 @@ use function sin; use const M_PI; class TNT extends Opaque{ - protected bool $unstable = false; //TODO: Usage unclear, seems to be a weird hack in vanilla protected bool $worksUnderwater = false; - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->unstable = ($stateMeta & BlockLegacyMetadata::TNT_FLAG_UNSTABLE) !== 0; - $this->worksUnderwater = ($stateMeta & BlockLegacyMetadata::TNT_FLAG_UNDERWATER) !== 0; - } - - protected function writeStateToMeta() : int{ - return ($this->unstable ? BlockLegacyMetadata::TNT_FLAG_UNSTABLE : 0) | ($this->worksUnderwater ? BlockLegacyMetadata::TNT_FLAG_UNDERWATER : 0); - } - protected function writeStateToItemMeta() : int{ return $this->worksUnderwater ? BlockLegacyMetadata::TNT_FLAG_UNDERWATER : 0; } - public function getStateBitmask() : int{ - return 0b11; + protected function decodeState(BlockDataReader $r) : void{ + $this->unstable = $r->readBool(); + $this->worksUnderwater = $r->readBool(); + } + + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeBool($this->unstable); + $w->writeBool($this->worksUnderwater); } public function isUnstable() : bool{ return $this->unstable; } diff --git a/src/block/Torch.php b/src/block/Torch.php index ded081bcc..d9e3ed95d 100644 --- a/src/block/Torch.php +++ b/src/block/Torch.php @@ -23,7 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; +use pocketmine\block\utils\InvalidBlockStateException; use pocketmine\block\utils\SupportType; use pocketmine\item\Item; use pocketmine\math\Axis; @@ -36,17 +38,16 @@ class Torch extends Flowable{ protected int $facing = Facing::UP; - protected function writeStateToMeta() : int{ - return $this->facing === Facing::UP ? 5 : 6 - BlockDataSerializer::writeHorizontalFacing($this->facing); + protected function decodeState(BlockDataReader $r) : void{ + $facing = $r->readFacing(); + if($facing === Facing::DOWN){ + throw new InvalidBlockStateException("Torch cannot have a DOWN facing"); + } + $this->facing = $facing; } - public function readStateFromData(int $id, int $stateMeta) : void{ - $facingMeta = $stateMeta & 0x7; - $this->facing = $facingMeta === 5 ? Facing::UP : BlockDataSerializer::readHorizontalFacing(6 - $facingMeta); - } - - public function getStateBitmask() : int{ - return 0b111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeFacing($this->facing); } public function getFacing() : int{ return $this->facing; } diff --git a/src/block/Trapdoor.php b/src/block/Trapdoor.php index 054737d74..61d4d58c9 100644 --- a/src/block/Trapdoor.php +++ b/src/block/Trapdoor.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\block\utils\SupportType; use pocketmine\item\Item; @@ -40,20 +41,16 @@ class Trapdoor extends Transparent{ protected bool $open = false; protected bool $top = false; - protected function writeStateToMeta() : int{ - return BlockDataSerializer::write5MinusHorizontalFacing($this->facing) | ($this->top ? BlockLegacyMetadata::TRAPDOOR_FLAG_UPPER : 0) | ($this->open ? BlockLegacyMetadata::TRAPDOOR_FLAG_OPEN : 0); + protected function decodeState(BlockDataReader $r) : void{ + $this->facing = $r->readHorizontalFacing(); + $this->top = $r->readBool(); + $this->open = $r->readBool(); } - public function readStateFromData(int $id, int $stateMeta) : void{ - //TODO: in PC the values are reversed (facing - 2) - - $this->facing = BlockDataSerializer::read5MinusHorizontalFacing($stateMeta); - $this->top = ($stateMeta & BlockLegacyMetadata::TRAPDOOR_FLAG_UPPER) !== 0; - $this->open = ($stateMeta & BlockLegacyMetadata::TRAPDOOR_FLAG_OPEN) !== 0; - } - - public function getStateBitmask() : int{ - return 0b1111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeHorizontalFacing($this->facing); + $w->writeBool($this->top); + $w->writeBool($this->open); } public function isOpen() : bool{ return $this->open; } diff --git a/src/block/Tripwire.php b/src/block/Tripwire.php index 504ae68eb..bb045c782 100644 --- a/src/block/Tripwire.php +++ b/src/block/Tripwire.php @@ -23,29 +23,27 @@ declare(strict_types=1); namespace pocketmine\block; -class Tripwire extends Flowable{ +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; +class Tripwire extends Flowable{ protected bool $triggered = false; protected bool $suspended = false; //unclear usage, makes hitbox bigger if set protected bool $connected = false; protected bool $disarmed = false; - protected function writeStateToMeta() : int{ - return ($this->triggered ? BlockLegacyMetadata::TRIPWIRE_FLAG_TRIGGERED : 0) | - ($this->suspended ? BlockLegacyMetadata::TRIPWIRE_FLAG_SUSPENDED : 0) | - ($this->connected ? BlockLegacyMetadata::TRIPWIRE_FLAG_CONNECTED : 0) | - ($this->disarmed ? BlockLegacyMetadata::TRIPWIRE_FLAG_DISARMED : 0); + protected function decodeState(BlockDataReader $r) : void{ + $this->triggered = $r->readBool(); + $this->suspended = $r->readBool(); + $this->connected = $r->readBool(); + $this->disarmed = $r->readBool(); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->triggered = ($stateMeta & BlockLegacyMetadata::TRIPWIRE_FLAG_TRIGGERED) !== 0; - $this->suspended = ($stateMeta & BlockLegacyMetadata::TRIPWIRE_FLAG_SUSPENDED) !== 0; - $this->connected = ($stateMeta & BlockLegacyMetadata::TRIPWIRE_FLAG_CONNECTED) !== 0; - $this->disarmed = ($stateMeta & BlockLegacyMetadata::TRIPWIRE_FLAG_DISARMED) !== 0; - } - - public function getStateBitmask() : int{ - return 0b1111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeBool($this->triggered); + $w->writeBool($this->suspended); + $w->writeBool($this->connected); + $w->writeBool($this->disarmed); } public function isTriggered() : bool{ return $this->triggered; } diff --git a/src/block/TripwireHook.php b/src/block/TripwireHook.php index 87490d732..b0fc4876f 100644 --- a/src/block/TripwireHook.php +++ b/src/block/TripwireHook.php @@ -23,7 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataSerializer; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\item\Item; use pocketmine\math\Axis; @@ -38,20 +39,16 @@ class TripwireHook extends Flowable{ protected bool $connected = false; protected bool $powered = false; - protected function writeStateToMeta() : int{ - return BlockDataSerializer::writeLegacyHorizontalFacing($this->facing) | - ($this->connected ? BlockLegacyMetadata::TRIPWIRE_HOOK_FLAG_CONNECTED : 0) | - ($this->powered ? BlockLegacyMetadata::TRIPWIRE_HOOK_FLAG_POWERED : 0); + protected function decodeState(BlockDataReader $r) : void{ + $this->facing = $r->readHorizontalFacing(); + $this->connected = $r->readBool(); + $this->powered = $r->readBool(); } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->facing = BlockDataSerializer::readLegacyHorizontalFacing($stateMeta & 0x03); - $this->connected = ($stateMeta & BlockLegacyMetadata::TRIPWIRE_HOOK_FLAG_CONNECTED) !== 0; - $this->powered = ($stateMeta & BlockLegacyMetadata::TRIPWIRE_HOOK_FLAG_POWERED) !== 0; - } - - public function getStateBitmask() : int{ - return 0b1111; + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeHorizontalFacing($this->facing); + $w->writeBool($this->connected); + $w->writeBool($this->powered); } public function isConnected() : bool{ return $this->connected; } diff --git a/src/block/VanillaBlocks.php b/src/block/VanillaBlocks.php index ec3c5a494..f5edfd905 100644 --- a/src/block/VanillaBlocks.php +++ b/src/block/VanillaBlocks.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\BlockLegacyIds as Ids; +use pocketmine\block\BlockTypeIds as Ids; use pocketmine\utils\CloningRegistryTrait; /** @@ -596,543 +596,543 @@ final class VanillaBlocks{ protected static function setup() : void{ $factory = BlockFactory::getInstance(); self::register("acacia_button", $factory->get(Ids::ACACIA_BUTTON, 0)); - self::register("acacia_door", $factory->get(Ids::ACACIA_DOOR_BLOCK, 0)); - self::register("acacia_fence", $factory->get(Ids::FENCE, 4)); + self::register("acacia_door", $factory->get(Ids::ACACIA_DOOR, 0)); + self::register("acacia_fence", $factory->get(Ids::ACACIA_FENCE, 0)); self::register("acacia_fence_gate", $factory->get(Ids::ACACIA_FENCE_GATE, 0)); - self::register("acacia_leaves", $factory->get(Ids::LEAVES2, 0)); - self::register("acacia_log", $factory->get(Ids::LOG2, 0)); - self::register("acacia_planks", $factory->get(Ids::PLANKS, 4)); + self::register("acacia_leaves", $factory->get(Ids::ACACIA_LEAVES, 0)); + self::register("acacia_log", $factory->get(Ids::ACACIA_LOG, 0)); + self::register("acacia_planks", $factory->get(Ids::ACACIA_PLANKS, 0)); self::register("acacia_pressure_plate", $factory->get(Ids::ACACIA_PRESSURE_PLATE, 0)); - self::register("acacia_sapling", $factory->get(Ids::SAPLING, 4)); - self::register("acacia_sign", $factory->get(Ids::ACACIA_STANDING_SIGN, 0)); - self::register("acacia_slab", $factory->get(Ids::WOODEN_SLAB, 4)); - self::register("acacia_stairs", $factory->get(Ids::ACACIA_STAIRS, 0)); - self::register("acacia_trapdoor", $factory->get(Ids::ACACIA_TRAPDOOR, 0)); + self::register("acacia_sapling", $factory->get(Ids::ACACIA_SAPLING, 0)); + self::register("acacia_sign", $factory->get(Ids::ACACIA_SIGN, 0)); + self::register("acacia_slab", $factory->get(Ids::ACACIA_SLAB, 0)); + self::register("acacia_stairs", $factory->get(Ids::ACACIA_STAIRS, 3)); + self::register("acacia_trapdoor", $factory->get(Ids::ACACIA_TRAPDOOR, 3)); self::register("acacia_wall_sign", $factory->get(Ids::ACACIA_WALL_SIGN, 2)); - self::register("acacia_wood", $factory->get(Ids::WOOD, 4)); + self::register("acacia_wood", $factory->get(Ids::ACACIA_WOOD, 0)); self::register("activator_rail", $factory->get(Ids::ACTIVATOR_RAIL, 0)); self::register("air", $factory->get(Ids::AIR, 0)); - self::register("all_sided_mushroom_stem", $factory->get(Ids::BROWN_MUSHROOM_BLOCK, 15)); - self::register("allium", $factory->get(Ids::POPPY, 2)); - self::register("andesite", $factory->get(Ids::STONE, 5)); - self::register("andesite_slab", $factory->get(Ids::STONE_SLAB3, 3)); - self::register("andesite_stairs", $factory->get(Ids::ANDESITE_STAIRS, 0)); - self::register("andesite_wall", $factory->get(Ids::COBBLESTONE_WALL, 4)); + self::register("all_sided_mushroom_stem", $factory->get(Ids::ALL_SIDED_MUSHROOM_STEM, 0)); + self::register("allium", $factory->get(Ids::ALLIUM, 0)); + self::register("andesite", $factory->get(Ids::ANDESITE, 0)); + self::register("andesite_slab", $factory->get(Ids::ANDESITE_SLAB, 0)); + self::register("andesite_stairs", $factory->get(Ids::ANDESITE_STAIRS, 3)); + self::register("andesite_wall", $factory->get(Ids::ANDESITE_WALL, 0)); self::register("anvil", $factory->get(Ids::ANVIL, 0)); - self::register("azure_bluet", $factory->get(Ids::POPPY, 3)); + self::register("azure_bluet", $factory->get(Ids::AZURE_BLUET, 0)); self::register("bamboo", $factory->get(Ids::BAMBOO, 0)); self::register("bamboo_sapling", $factory->get(Ids::BAMBOO_SAPLING, 0)); - self::register("banner", $factory->get(Ids::STANDING_BANNER, 0)); + self::register("banner", $factory->get(Ids::BANNER, 0)); self::register("barrel", $factory->get(Ids::BARREL, 0)); self::register("barrier", $factory->get(Ids::BARRIER, 0)); self::register("beacon", $factory->get(Ids::BEACON, 0)); - self::register("bed", $factory->get(Ids::BED_BLOCK, 0)); + self::register("bed", $factory->get(Ids::BED, 0)); self::register("bedrock", $factory->get(Ids::BEDROCK, 0)); - self::register("beetroots", $factory->get(Ids::BEETROOT_BLOCK, 0)); - self::register("bell", $factory->get(Ids::BELL, 0)); + self::register("beetroots", $factory->get(Ids::BEETROOTS, 0)); + self::register("bell", $factory->get(Ids::BELL, 1)); self::register("birch_button", $factory->get(Ids::BIRCH_BUTTON, 0)); - self::register("birch_door", $factory->get(Ids::BIRCH_DOOR_BLOCK, 0)); - self::register("birch_fence", $factory->get(Ids::FENCE, 2)); + self::register("birch_door", $factory->get(Ids::BIRCH_DOOR, 0)); + self::register("birch_fence", $factory->get(Ids::BIRCH_FENCE, 0)); self::register("birch_fence_gate", $factory->get(Ids::BIRCH_FENCE_GATE, 0)); - self::register("birch_leaves", $factory->get(Ids::LEAVES, 2)); - self::register("birch_log", $factory->get(Ids::LOG, 2)); - self::register("birch_planks", $factory->get(Ids::PLANKS, 2)); + self::register("birch_leaves", $factory->get(Ids::BIRCH_LEAVES, 0)); + self::register("birch_log", $factory->get(Ids::BIRCH_LOG, 0)); + self::register("birch_planks", $factory->get(Ids::BIRCH_PLANKS, 0)); self::register("birch_pressure_plate", $factory->get(Ids::BIRCH_PRESSURE_PLATE, 0)); - self::register("birch_sapling", $factory->get(Ids::SAPLING, 2)); - self::register("birch_sign", $factory->get(Ids::BIRCH_STANDING_SIGN, 0)); - self::register("birch_slab", $factory->get(Ids::WOODEN_SLAB, 2)); - self::register("birch_stairs", $factory->get(Ids::BIRCH_STAIRS, 0)); - self::register("birch_trapdoor", $factory->get(Ids::BIRCH_TRAPDOOR, 0)); + self::register("birch_sapling", $factory->get(Ids::BIRCH_SAPLING, 0)); + self::register("birch_sign", $factory->get(Ids::BIRCH_SIGN, 0)); + self::register("birch_slab", $factory->get(Ids::BIRCH_SLAB, 0)); + self::register("birch_stairs", $factory->get(Ids::BIRCH_STAIRS, 3)); + self::register("birch_trapdoor", $factory->get(Ids::BIRCH_TRAPDOOR, 3)); self::register("birch_wall_sign", $factory->get(Ids::BIRCH_WALL_SIGN, 2)); - self::register("birch_wood", $factory->get(Ids::WOOD, 2)); + self::register("birch_wood", $factory->get(Ids::BIRCH_WOOD, 0)); self::register("black_glazed_terracotta", $factory->get(Ids::BLACK_GLAZED_TERRACOTTA, 2)); - self::register("blast_furnace", $factory->get(Ids::BLAST_FURNACE, 2)); + self::register("blast_furnace", $factory->get(Ids::BLAST_FURNACE, 0)); self::register("blue_glazed_terracotta", $factory->get(Ids::BLUE_GLAZED_TERRACOTTA, 2)); self::register("blue_ice", $factory->get(Ids::BLUE_ICE, 0)); - self::register("blue_orchid", $factory->get(Ids::POPPY, 1)); - self::register("blue_torch", $factory->get(Ids::COLORED_TORCH_BP, 5)); + self::register("blue_orchid", $factory->get(Ids::BLUE_ORCHID, 0)); + self::register("blue_torch", $factory->get(Ids::BLUE_TORCH, 1)); self::register("bone_block", $factory->get(Ids::BONE_BLOCK, 0)); self::register("bookshelf", $factory->get(Ids::BOOKSHELF, 0)); - self::register("brewing_stand", $factory->get(Ids::BREWING_STAND_BLOCK, 0)); - self::register("brick_slab", $factory->get(Ids::STONE_SLAB, 4)); - self::register("brick_stairs", $factory->get(Ids::BRICK_STAIRS, 0)); - self::register("brick_wall", $factory->get(Ids::COBBLESTONE_WALL, 6)); - self::register("bricks", $factory->get(Ids::BRICK_BLOCK, 0)); + self::register("brewing_stand", $factory->get(Ids::BREWING_STAND, 0)); + self::register("brick_slab", $factory->get(Ids::BRICK_SLAB, 0)); + self::register("brick_stairs", $factory->get(Ids::BRICK_STAIRS, 3)); + self::register("brick_wall", $factory->get(Ids::BRICK_WALL, 0)); + self::register("bricks", $factory->get(Ids::BRICKS, 0)); self::register("brown_glazed_terracotta", $factory->get(Ids::BROWN_GLAZED_TERRACOTTA, 2)); self::register("brown_mushroom", $factory->get(Ids::BROWN_MUSHROOM, 0)); self::register("brown_mushroom_block", $factory->get(Ids::BROWN_MUSHROOM_BLOCK, 0)); self::register("cactus", $factory->get(Ids::CACTUS, 0)); - self::register("cake", $factory->get(Ids::CAKE_BLOCK, 0)); - self::register("carpet", $factory->get(Ids::CARPET, 0)); + self::register("cake", $factory->get(Ids::CAKE, 0)); + self::register("carpet", $factory->get(Ids::CARPET, 14)); self::register("carrots", $factory->get(Ids::CARROTS, 0)); self::register("carved_pumpkin", $factory->get(Ids::CARVED_PUMPKIN, 0)); self::register("chemical_heat", $factory->get(Ids::CHEMICAL_HEAT, 0)); self::register("chest", $factory->get(Ids::CHEST, 2)); - self::register("chiseled_quartz", $factory->get(Ids::QUARTZ_BLOCK, 1)); - self::register("chiseled_red_sandstone", $factory->get(Ids::RED_SANDSTONE, 1)); - self::register("chiseled_sandstone", $factory->get(Ids::SANDSTONE, 1)); - self::register("chiseled_stone_bricks", $factory->get(Ids::STONEBRICK, 3)); - self::register("clay", $factory->get(Ids::CLAY_BLOCK, 0)); - self::register("coal", $factory->get(Ids::COAL_BLOCK, 0)); + self::register("chiseled_quartz", $factory->get(Ids::CHISELED_QUARTZ, 0)); + self::register("chiseled_red_sandstone", $factory->get(Ids::CHISELED_RED_SANDSTONE, 0)); + self::register("chiseled_sandstone", $factory->get(Ids::CHISELED_SANDSTONE, 0)); + self::register("chiseled_stone_bricks", $factory->get(Ids::CHISELED_STONE_BRICKS, 0)); + self::register("clay", $factory->get(Ids::CLAY, 0)); + self::register("coal", $factory->get(Ids::COAL, 0)); self::register("coal_ore", $factory->get(Ids::COAL_ORE, 0)); self::register("cobblestone", $factory->get(Ids::COBBLESTONE, 0)); - self::register("cobblestone_slab", $factory->get(Ids::STONE_SLAB, 3)); - self::register("cobblestone_stairs", $factory->get(Ids::COBBLESTONE_STAIRS, 0)); + self::register("cobblestone_slab", $factory->get(Ids::COBBLESTONE_SLAB, 0)); + self::register("cobblestone_stairs", $factory->get(Ids::COBBLESTONE_STAIRS, 3)); self::register("cobblestone_wall", $factory->get(Ids::COBBLESTONE_WALL, 0)); self::register("cobweb", $factory->get(Ids::COBWEB, 0)); - self::register("cocoa_pod", $factory->get(Ids::COCOA, 0)); - self::register("compound_creator", $factory->get(Ids::CHEMISTRY_TABLE, 0)); - self::register("concrete", $factory->get(Ids::CONCRETE, 0)); - self::register("concrete_powder", $factory->get(Ids::CONCRETEPOWDER, 0)); - self::register("coral", $factory->get(Ids::CORAL, 0)); - self::register("coral_block", $factory->get(Ids::CORAL_BLOCK, 0)); - self::register("coral_fan", $factory->get(Ids::CORAL_FAN, 0)); - self::register("cornflower", $factory->get(Ids::POPPY, 9)); - self::register("cracked_stone_bricks", $factory->get(Ids::STONEBRICK, 2)); + self::register("cocoa_pod", $factory->get(Ids::COCOA_POD, 0)); + self::register("compound_creator", $factory->get(Ids::COMPOUND_CREATOR, 0)); + self::register("concrete", $factory->get(Ids::CONCRETE, 14)); + self::register("concrete_powder", $factory->get(Ids::CONCRETE_POWDER, 14)); + self::register("coral", $factory->get(Ids::CORAL, 4)); + self::register("coral_block", $factory->get(Ids::CORAL_BLOCK, 4)); + self::register("coral_fan", $factory->get(Ids::CORAL_FAN, 4)); + self::register("cornflower", $factory->get(Ids::CORNFLOWER, 0)); + self::register("cracked_stone_bricks", $factory->get(Ids::CRACKED_STONE_BRICKS, 0)); self::register("crafting_table", $factory->get(Ids::CRAFTING_TABLE, 0)); - self::register("cut_red_sandstone", $factory->get(Ids::RED_SANDSTONE, 2)); - self::register("cut_red_sandstone_slab", $factory->get(Ids::STONE_SLAB4, 4)); - self::register("cut_sandstone", $factory->get(Ids::SANDSTONE, 2)); - self::register("cut_sandstone_slab", $factory->get(Ids::STONE_SLAB4, 3)); + self::register("cut_red_sandstone", $factory->get(Ids::CUT_RED_SANDSTONE, 0)); + self::register("cut_red_sandstone_slab", $factory->get(Ids::CUT_RED_SANDSTONE_SLAB, 0)); + self::register("cut_sandstone", $factory->get(Ids::CUT_SANDSTONE, 0)); + self::register("cut_sandstone_slab", $factory->get(Ids::CUT_SANDSTONE_SLAB, 0)); self::register("cyan_glazed_terracotta", $factory->get(Ids::CYAN_GLAZED_TERRACOTTA, 2)); self::register("dandelion", $factory->get(Ids::DANDELION, 0)); self::register("dark_oak_button", $factory->get(Ids::DARK_OAK_BUTTON, 0)); - self::register("dark_oak_door", $factory->get(Ids::DARK_OAK_DOOR_BLOCK, 0)); - self::register("dark_oak_fence", $factory->get(Ids::FENCE, 5)); + self::register("dark_oak_door", $factory->get(Ids::DARK_OAK_DOOR, 0)); + self::register("dark_oak_fence", $factory->get(Ids::DARK_OAK_FENCE, 0)); self::register("dark_oak_fence_gate", $factory->get(Ids::DARK_OAK_FENCE_GATE, 0)); - self::register("dark_oak_leaves", $factory->get(Ids::LEAVES2, 1)); - self::register("dark_oak_log", $factory->get(Ids::LOG2, 1)); - self::register("dark_oak_planks", $factory->get(Ids::PLANKS, 5)); + self::register("dark_oak_leaves", $factory->get(Ids::DARK_OAK_LEAVES, 0)); + self::register("dark_oak_log", $factory->get(Ids::DARK_OAK_LOG, 0)); + self::register("dark_oak_planks", $factory->get(Ids::DARK_OAK_PLANKS, 0)); self::register("dark_oak_pressure_plate", $factory->get(Ids::DARK_OAK_PRESSURE_PLATE, 0)); - self::register("dark_oak_sapling", $factory->get(Ids::SAPLING, 5)); - self::register("dark_oak_sign", $factory->get(Ids::DARKOAK_STANDING_SIGN, 0)); - self::register("dark_oak_slab", $factory->get(Ids::WOODEN_SLAB, 5)); - self::register("dark_oak_stairs", $factory->get(Ids::DARK_OAK_STAIRS, 0)); - self::register("dark_oak_trapdoor", $factory->get(Ids::DARK_OAK_TRAPDOOR, 0)); - self::register("dark_oak_wall_sign", $factory->get(Ids::DARKOAK_WALL_SIGN, 2)); - self::register("dark_oak_wood", $factory->get(Ids::WOOD, 5)); - self::register("dark_prismarine", $factory->get(Ids::PRISMARINE, 1)); - self::register("dark_prismarine_slab", $factory->get(Ids::STONE_SLAB2, 3)); - self::register("dark_prismarine_stairs", $factory->get(Ids::DARK_PRISMARINE_STAIRS, 0)); - self::register("daylight_sensor", $factory->get(Ids::DAYLIGHT_DETECTOR, 0)); - self::register("dead_bush", $factory->get(Ids::DEADBUSH, 0)); + self::register("dark_oak_sapling", $factory->get(Ids::DARK_OAK_SAPLING, 0)); + self::register("dark_oak_sign", $factory->get(Ids::DARK_OAK_SIGN, 0)); + self::register("dark_oak_slab", $factory->get(Ids::DARK_OAK_SLAB, 0)); + self::register("dark_oak_stairs", $factory->get(Ids::DARK_OAK_STAIRS, 3)); + self::register("dark_oak_trapdoor", $factory->get(Ids::DARK_OAK_TRAPDOOR, 3)); + self::register("dark_oak_wall_sign", $factory->get(Ids::DARK_OAK_WALL_SIGN, 2)); + self::register("dark_oak_wood", $factory->get(Ids::DARK_OAK_WOOD, 0)); + self::register("dark_prismarine", $factory->get(Ids::DARK_PRISMARINE, 0)); + self::register("dark_prismarine_slab", $factory->get(Ids::DARK_PRISMARINE_SLAB, 0)); + self::register("dark_prismarine_stairs", $factory->get(Ids::DARK_PRISMARINE_STAIRS, 3)); + self::register("daylight_sensor", $factory->get(Ids::DAYLIGHT_SENSOR, 0)); + self::register("dead_bush", $factory->get(Ids::DEAD_BUSH, 0)); self::register("detector_rail", $factory->get(Ids::DETECTOR_RAIL, 0)); - self::register("diamond", $factory->get(Ids::DIAMOND_BLOCK, 0)); + self::register("diamond", $factory->get(Ids::DIAMOND, 0)); self::register("diamond_ore", $factory->get(Ids::DIAMOND_ORE, 0)); - self::register("diorite", $factory->get(Ids::STONE, 3)); - self::register("diorite_slab", $factory->get(Ids::STONE_SLAB3, 4)); - self::register("diorite_stairs", $factory->get(Ids::DIORITE_STAIRS, 0)); - self::register("diorite_wall", $factory->get(Ids::COBBLESTONE_WALL, 3)); + self::register("diorite", $factory->get(Ids::DIORITE, 0)); + self::register("diorite_slab", $factory->get(Ids::DIORITE_SLAB, 0)); + self::register("diorite_stairs", $factory->get(Ids::DIORITE_STAIRS, 3)); + self::register("diorite_wall", $factory->get(Ids::DIORITE_WALL, 0)); self::register("dirt", $factory->get(Ids::DIRT, 0)); - self::register("double_tallgrass", $factory->get(Ids::DOUBLE_PLANT, 2)); + self::register("double_tallgrass", $factory->get(Ids::DOUBLE_TALLGRASS, 0)); self::register("dragon_egg", $factory->get(Ids::DRAGON_EGG, 0)); - self::register("dried_kelp", $factory->get(Ids::DRIED_KELP_BLOCK, 0)); - self::register("dyed_shulker_box", $factory->get(Ids::SHULKER_BOX, 0)); - self::register("element_actinium", $factory->get(Ids::ELEMENT_89, 0)); - self::register("element_aluminum", $factory->get(Ids::ELEMENT_13, 0)); - self::register("element_americium", $factory->get(Ids::ELEMENT_95, 0)); - self::register("element_antimony", $factory->get(Ids::ELEMENT_51, 0)); - self::register("element_argon", $factory->get(Ids::ELEMENT_18, 0)); - self::register("element_arsenic", $factory->get(Ids::ELEMENT_33, 0)); - self::register("element_astatine", $factory->get(Ids::ELEMENT_85, 0)); - self::register("element_barium", $factory->get(Ids::ELEMENT_56, 0)); - self::register("element_berkelium", $factory->get(Ids::ELEMENT_97, 0)); - self::register("element_beryllium", $factory->get(Ids::ELEMENT_4, 0)); - self::register("element_bismuth", $factory->get(Ids::ELEMENT_83, 0)); - self::register("element_bohrium", $factory->get(Ids::ELEMENT_107, 0)); - self::register("element_boron", $factory->get(Ids::ELEMENT_5, 0)); - self::register("element_bromine", $factory->get(Ids::ELEMENT_35, 0)); - self::register("element_cadmium", $factory->get(Ids::ELEMENT_48, 0)); - self::register("element_calcium", $factory->get(Ids::ELEMENT_20, 0)); - self::register("element_californium", $factory->get(Ids::ELEMENT_98, 0)); - self::register("element_carbon", $factory->get(Ids::ELEMENT_6, 0)); - self::register("element_cerium", $factory->get(Ids::ELEMENT_58, 0)); - self::register("element_cesium", $factory->get(Ids::ELEMENT_55, 0)); - self::register("element_chlorine", $factory->get(Ids::ELEMENT_17, 0)); - self::register("element_chromium", $factory->get(Ids::ELEMENT_24, 0)); - self::register("element_cobalt", $factory->get(Ids::ELEMENT_27, 0)); - self::register("element_constructor", $factory->get(Ids::CHEMISTRY_TABLE, 8)); - self::register("element_copernicium", $factory->get(Ids::ELEMENT_112, 0)); - self::register("element_copper", $factory->get(Ids::ELEMENT_29, 0)); - self::register("element_curium", $factory->get(Ids::ELEMENT_96, 0)); - self::register("element_darmstadtium", $factory->get(Ids::ELEMENT_110, 0)); - self::register("element_dubnium", $factory->get(Ids::ELEMENT_105, 0)); - self::register("element_dysprosium", $factory->get(Ids::ELEMENT_66, 0)); - self::register("element_einsteinium", $factory->get(Ids::ELEMENT_99, 0)); - self::register("element_erbium", $factory->get(Ids::ELEMENT_68, 0)); - self::register("element_europium", $factory->get(Ids::ELEMENT_63, 0)); - self::register("element_fermium", $factory->get(Ids::ELEMENT_100, 0)); - self::register("element_flerovium", $factory->get(Ids::ELEMENT_114, 0)); - self::register("element_fluorine", $factory->get(Ids::ELEMENT_9, 0)); - self::register("element_francium", $factory->get(Ids::ELEMENT_87, 0)); - self::register("element_gadolinium", $factory->get(Ids::ELEMENT_64, 0)); - self::register("element_gallium", $factory->get(Ids::ELEMENT_31, 0)); - self::register("element_germanium", $factory->get(Ids::ELEMENT_32, 0)); - self::register("element_gold", $factory->get(Ids::ELEMENT_79, 0)); - self::register("element_hafnium", $factory->get(Ids::ELEMENT_72, 0)); - self::register("element_hassium", $factory->get(Ids::ELEMENT_108, 0)); - self::register("element_helium", $factory->get(Ids::ELEMENT_2, 0)); - self::register("element_holmium", $factory->get(Ids::ELEMENT_67, 0)); - self::register("element_hydrogen", $factory->get(Ids::ELEMENT_1, 0)); - self::register("element_indium", $factory->get(Ids::ELEMENT_49, 0)); - self::register("element_iodine", $factory->get(Ids::ELEMENT_53, 0)); - self::register("element_iridium", $factory->get(Ids::ELEMENT_77, 0)); - self::register("element_iron", $factory->get(Ids::ELEMENT_26, 0)); - self::register("element_krypton", $factory->get(Ids::ELEMENT_36, 0)); - self::register("element_lanthanum", $factory->get(Ids::ELEMENT_57, 0)); - self::register("element_lawrencium", $factory->get(Ids::ELEMENT_103, 0)); - self::register("element_lead", $factory->get(Ids::ELEMENT_82, 0)); - self::register("element_lithium", $factory->get(Ids::ELEMENT_3, 0)); - self::register("element_livermorium", $factory->get(Ids::ELEMENT_116, 0)); - self::register("element_lutetium", $factory->get(Ids::ELEMENT_71, 0)); - self::register("element_magnesium", $factory->get(Ids::ELEMENT_12, 0)); - self::register("element_manganese", $factory->get(Ids::ELEMENT_25, 0)); - self::register("element_meitnerium", $factory->get(Ids::ELEMENT_109, 0)); - self::register("element_mendelevium", $factory->get(Ids::ELEMENT_101, 0)); - self::register("element_mercury", $factory->get(Ids::ELEMENT_80, 0)); - self::register("element_molybdenum", $factory->get(Ids::ELEMENT_42, 0)); - self::register("element_moscovium", $factory->get(Ids::ELEMENT_115, 0)); - self::register("element_neodymium", $factory->get(Ids::ELEMENT_60, 0)); - self::register("element_neon", $factory->get(Ids::ELEMENT_10, 0)); - self::register("element_neptunium", $factory->get(Ids::ELEMENT_93, 0)); - self::register("element_nickel", $factory->get(Ids::ELEMENT_28, 0)); - self::register("element_nihonium", $factory->get(Ids::ELEMENT_113, 0)); - self::register("element_niobium", $factory->get(Ids::ELEMENT_41, 0)); - self::register("element_nitrogen", $factory->get(Ids::ELEMENT_7, 0)); - self::register("element_nobelium", $factory->get(Ids::ELEMENT_102, 0)); - self::register("element_oganesson", $factory->get(Ids::ELEMENT_118, 0)); - self::register("element_osmium", $factory->get(Ids::ELEMENT_76, 0)); - self::register("element_oxygen", $factory->get(Ids::ELEMENT_8, 0)); - self::register("element_palladium", $factory->get(Ids::ELEMENT_46, 0)); - self::register("element_phosphorus", $factory->get(Ids::ELEMENT_15, 0)); - self::register("element_platinum", $factory->get(Ids::ELEMENT_78, 0)); - self::register("element_plutonium", $factory->get(Ids::ELEMENT_94, 0)); - self::register("element_polonium", $factory->get(Ids::ELEMENT_84, 0)); - self::register("element_potassium", $factory->get(Ids::ELEMENT_19, 0)); - self::register("element_praseodymium", $factory->get(Ids::ELEMENT_59, 0)); - self::register("element_promethium", $factory->get(Ids::ELEMENT_61, 0)); - self::register("element_protactinium", $factory->get(Ids::ELEMENT_91, 0)); - self::register("element_radium", $factory->get(Ids::ELEMENT_88, 0)); - self::register("element_radon", $factory->get(Ids::ELEMENT_86, 0)); - self::register("element_rhenium", $factory->get(Ids::ELEMENT_75, 0)); - self::register("element_rhodium", $factory->get(Ids::ELEMENT_45, 0)); - self::register("element_roentgenium", $factory->get(Ids::ELEMENT_111, 0)); - self::register("element_rubidium", $factory->get(Ids::ELEMENT_37, 0)); - self::register("element_ruthenium", $factory->get(Ids::ELEMENT_44, 0)); - self::register("element_rutherfordium", $factory->get(Ids::ELEMENT_104, 0)); - self::register("element_samarium", $factory->get(Ids::ELEMENT_62, 0)); - self::register("element_scandium", $factory->get(Ids::ELEMENT_21, 0)); - self::register("element_seaborgium", $factory->get(Ids::ELEMENT_106, 0)); - self::register("element_selenium", $factory->get(Ids::ELEMENT_34, 0)); - self::register("element_silicon", $factory->get(Ids::ELEMENT_14, 0)); - self::register("element_silver", $factory->get(Ids::ELEMENT_47, 0)); - self::register("element_sodium", $factory->get(Ids::ELEMENT_11, 0)); - self::register("element_strontium", $factory->get(Ids::ELEMENT_38, 0)); - self::register("element_sulfur", $factory->get(Ids::ELEMENT_16, 0)); - self::register("element_tantalum", $factory->get(Ids::ELEMENT_73, 0)); - self::register("element_technetium", $factory->get(Ids::ELEMENT_43, 0)); - self::register("element_tellurium", $factory->get(Ids::ELEMENT_52, 0)); - self::register("element_tennessine", $factory->get(Ids::ELEMENT_117, 0)); - self::register("element_terbium", $factory->get(Ids::ELEMENT_65, 0)); - self::register("element_thallium", $factory->get(Ids::ELEMENT_81, 0)); - self::register("element_thorium", $factory->get(Ids::ELEMENT_90, 0)); - self::register("element_thulium", $factory->get(Ids::ELEMENT_69, 0)); - self::register("element_tin", $factory->get(Ids::ELEMENT_50, 0)); - self::register("element_titanium", $factory->get(Ids::ELEMENT_22, 0)); - self::register("element_tungsten", $factory->get(Ids::ELEMENT_74, 0)); - self::register("element_uranium", $factory->get(Ids::ELEMENT_92, 0)); - self::register("element_vanadium", $factory->get(Ids::ELEMENT_23, 0)); - self::register("element_xenon", $factory->get(Ids::ELEMENT_54, 0)); - self::register("element_ytterbium", $factory->get(Ids::ELEMENT_70, 0)); - self::register("element_yttrium", $factory->get(Ids::ELEMENT_39, 0)); - self::register("element_zero", $factory->get(Ids::ELEMENT_0, 0)); - self::register("element_zinc", $factory->get(Ids::ELEMENT_30, 0)); - self::register("element_zirconium", $factory->get(Ids::ELEMENT_40, 0)); - self::register("emerald", $factory->get(Ids::EMERALD_BLOCK, 0)); + self::register("dried_kelp", $factory->get(Ids::DRIED_KELP, 0)); + self::register("dyed_shulker_box", $factory->get(Ids::DYED_SHULKER_BOX, 14)); + self::register("element_actinium", $factory->get(Ids::ELEMENT_ACTINIUM, 0)); + self::register("element_aluminum", $factory->get(Ids::ELEMENT_ALUMINUM, 0)); + self::register("element_americium", $factory->get(Ids::ELEMENT_AMERICIUM, 0)); + self::register("element_antimony", $factory->get(Ids::ELEMENT_ANTIMONY, 0)); + self::register("element_argon", $factory->get(Ids::ELEMENT_ARGON, 0)); + self::register("element_arsenic", $factory->get(Ids::ELEMENT_ARSENIC, 0)); + self::register("element_astatine", $factory->get(Ids::ELEMENT_ASTATINE, 0)); + self::register("element_barium", $factory->get(Ids::ELEMENT_BARIUM, 0)); + self::register("element_berkelium", $factory->get(Ids::ELEMENT_BERKELIUM, 0)); + self::register("element_beryllium", $factory->get(Ids::ELEMENT_BERYLLIUM, 0)); + self::register("element_bismuth", $factory->get(Ids::ELEMENT_BISMUTH, 0)); + self::register("element_bohrium", $factory->get(Ids::ELEMENT_BOHRIUM, 0)); + self::register("element_boron", $factory->get(Ids::ELEMENT_BORON, 0)); + self::register("element_bromine", $factory->get(Ids::ELEMENT_BROMINE, 0)); + self::register("element_cadmium", $factory->get(Ids::ELEMENT_CADMIUM, 0)); + self::register("element_calcium", $factory->get(Ids::ELEMENT_CALCIUM, 0)); + self::register("element_californium", $factory->get(Ids::ELEMENT_CALIFORNIUM, 0)); + self::register("element_carbon", $factory->get(Ids::ELEMENT_CARBON, 0)); + self::register("element_cerium", $factory->get(Ids::ELEMENT_CERIUM, 0)); + self::register("element_cesium", $factory->get(Ids::ELEMENT_CESIUM, 0)); + self::register("element_chlorine", $factory->get(Ids::ELEMENT_CHLORINE, 0)); + self::register("element_chromium", $factory->get(Ids::ELEMENT_CHROMIUM, 0)); + self::register("element_cobalt", $factory->get(Ids::ELEMENT_COBALT, 0)); + self::register("element_constructor", $factory->get(Ids::ELEMENT_CONSTRUCTOR, 0)); + self::register("element_copernicium", $factory->get(Ids::ELEMENT_COPERNICIUM, 0)); + self::register("element_copper", $factory->get(Ids::ELEMENT_COPPER, 0)); + self::register("element_curium", $factory->get(Ids::ELEMENT_CURIUM, 0)); + self::register("element_darmstadtium", $factory->get(Ids::ELEMENT_DARMSTADTIUM, 0)); + self::register("element_dubnium", $factory->get(Ids::ELEMENT_DUBNIUM, 0)); + self::register("element_dysprosium", $factory->get(Ids::ELEMENT_DYSPROSIUM, 0)); + self::register("element_einsteinium", $factory->get(Ids::ELEMENT_EINSTEINIUM, 0)); + self::register("element_erbium", $factory->get(Ids::ELEMENT_ERBIUM, 0)); + self::register("element_europium", $factory->get(Ids::ELEMENT_EUROPIUM, 0)); + self::register("element_fermium", $factory->get(Ids::ELEMENT_FERMIUM, 0)); + self::register("element_flerovium", $factory->get(Ids::ELEMENT_FLEROVIUM, 0)); + self::register("element_fluorine", $factory->get(Ids::ELEMENT_FLUORINE, 0)); + self::register("element_francium", $factory->get(Ids::ELEMENT_FRANCIUM, 0)); + self::register("element_gadolinium", $factory->get(Ids::ELEMENT_GADOLINIUM, 0)); + self::register("element_gallium", $factory->get(Ids::ELEMENT_GALLIUM, 0)); + self::register("element_germanium", $factory->get(Ids::ELEMENT_GERMANIUM, 0)); + self::register("element_gold", $factory->get(Ids::ELEMENT_GOLD, 0)); + self::register("element_hafnium", $factory->get(Ids::ELEMENT_HAFNIUM, 0)); + self::register("element_hassium", $factory->get(Ids::ELEMENT_HASSIUM, 0)); + self::register("element_helium", $factory->get(Ids::ELEMENT_HELIUM, 0)); + self::register("element_holmium", $factory->get(Ids::ELEMENT_HOLMIUM, 0)); + self::register("element_hydrogen", $factory->get(Ids::ELEMENT_HYDROGEN, 0)); + self::register("element_indium", $factory->get(Ids::ELEMENT_INDIUM, 0)); + self::register("element_iodine", $factory->get(Ids::ELEMENT_IODINE, 0)); + self::register("element_iridium", $factory->get(Ids::ELEMENT_IRIDIUM, 0)); + self::register("element_iron", $factory->get(Ids::ELEMENT_IRON, 0)); + self::register("element_krypton", $factory->get(Ids::ELEMENT_KRYPTON, 0)); + self::register("element_lanthanum", $factory->get(Ids::ELEMENT_LANTHANUM, 0)); + self::register("element_lawrencium", $factory->get(Ids::ELEMENT_LAWRENCIUM, 0)); + self::register("element_lead", $factory->get(Ids::ELEMENT_LEAD, 0)); + self::register("element_lithium", $factory->get(Ids::ELEMENT_LITHIUM, 0)); + self::register("element_livermorium", $factory->get(Ids::ELEMENT_LIVERMORIUM, 0)); + self::register("element_lutetium", $factory->get(Ids::ELEMENT_LUTETIUM, 0)); + self::register("element_magnesium", $factory->get(Ids::ELEMENT_MAGNESIUM, 0)); + self::register("element_manganese", $factory->get(Ids::ELEMENT_MANGANESE, 0)); + self::register("element_meitnerium", $factory->get(Ids::ELEMENT_MEITNERIUM, 0)); + self::register("element_mendelevium", $factory->get(Ids::ELEMENT_MENDELEVIUM, 0)); + self::register("element_mercury", $factory->get(Ids::ELEMENT_MERCURY, 0)); + self::register("element_molybdenum", $factory->get(Ids::ELEMENT_MOLYBDENUM, 0)); + self::register("element_moscovium", $factory->get(Ids::ELEMENT_MOSCOVIUM, 0)); + self::register("element_neodymium", $factory->get(Ids::ELEMENT_NEODYMIUM, 0)); + self::register("element_neon", $factory->get(Ids::ELEMENT_NEON, 0)); + self::register("element_neptunium", $factory->get(Ids::ELEMENT_NEPTUNIUM, 0)); + self::register("element_nickel", $factory->get(Ids::ELEMENT_NICKEL, 0)); + self::register("element_nihonium", $factory->get(Ids::ELEMENT_NIHONIUM, 0)); + self::register("element_niobium", $factory->get(Ids::ELEMENT_NIOBIUM, 0)); + self::register("element_nitrogen", $factory->get(Ids::ELEMENT_NITROGEN, 0)); + self::register("element_nobelium", $factory->get(Ids::ELEMENT_NOBELIUM, 0)); + self::register("element_oganesson", $factory->get(Ids::ELEMENT_OGANESSON, 0)); + self::register("element_osmium", $factory->get(Ids::ELEMENT_OSMIUM, 0)); + self::register("element_oxygen", $factory->get(Ids::ELEMENT_OXYGEN, 0)); + self::register("element_palladium", $factory->get(Ids::ELEMENT_PALLADIUM, 0)); + self::register("element_phosphorus", $factory->get(Ids::ELEMENT_PHOSPHORUS, 0)); + self::register("element_platinum", $factory->get(Ids::ELEMENT_PLATINUM, 0)); + self::register("element_plutonium", $factory->get(Ids::ELEMENT_PLUTONIUM, 0)); + self::register("element_polonium", $factory->get(Ids::ELEMENT_POLONIUM, 0)); + self::register("element_potassium", $factory->get(Ids::ELEMENT_POTASSIUM, 0)); + self::register("element_praseodymium", $factory->get(Ids::ELEMENT_PRASEODYMIUM, 0)); + self::register("element_promethium", $factory->get(Ids::ELEMENT_PROMETHIUM, 0)); + self::register("element_protactinium", $factory->get(Ids::ELEMENT_PROTACTINIUM, 0)); + self::register("element_radium", $factory->get(Ids::ELEMENT_RADIUM, 0)); + self::register("element_radon", $factory->get(Ids::ELEMENT_RADON, 0)); + self::register("element_rhenium", $factory->get(Ids::ELEMENT_RHENIUM, 0)); + self::register("element_rhodium", $factory->get(Ids::ELEMENT_RHODIUM, 0)); + self::register("element_roentgenium", $factory->get(Ids::ELEMENT_ROENTGENIUM, 0)); + self::register("element_rubidium", $factory->get(Ids::ELEMENT_RUBIDIUM, 0)); + self::register("element_ruthenium", $factory->get(Ids::ELEMENT_RUTHENIUM, 0)); + self::register("element_rutherfordium", $factory->get(Ids::ELEMENT_RUTHERFORDIUM, 0)); + self::register("element_samarium", $factory->get(Ids::ELEMENT_SAMARIUM, 0)); + self::register("element_scandium", $factory->get(Ids::ELEMENT_SCANDIUM, 0)); + self::register("element_seaborgium", $factory->get(Ids::ELEMENT_SEABORGIUM, 0)); + self::register("element_selenium", $factory->get(Ids::ELEMENT_SELENIUM, 0)); + self::register("element_silicon", $factory->get(Ids::ELEMENT_SILICON, 0)); + self::register("element_silver", $factory->get(Ids::ELEMENT_SILVER, 0)); + self::register("element_sodium", $factory->get(Ids::ELEMENT_SODIUM, 0)); + self::register("element_strontium", $factory->get(Ids::ELEMENT_STRONTIUM, 0)); + self::register("element_sulfur", $factory->get(Ids::ELEMENT_SULFUR, 0)); + self::register("element_tantalum", $factory->get(Ids::ELEMENT_TANTALUM, 0)); + self::register("element_technetium", $factory->get(Ids::ELEMENT_TECHNETIUM, 0)); + self::register("element_tellurium", $factory->get(Ids::ELEMENT_TELLURIUM, 0)); + self::register("element_tennessine", $factory->get(Ids::ELEMENT_TENNESSINE, 0)); + self::register("element_terbium", $factory->get(Ids::ELEMENT_TERBIUM, 0)); + self::register("element_thallium", $factory->get(Ids::ELEMENT_THALLIUM, 0)); + self::register("element_thorium", $factory->get(Ids::ELEMENT_THORIUM, 0)); + self::register("element_thulium", $factory->get(Ids::ELEMENT_THULIUM, 0)); + self::register("element_tin", $factory->get(Ids::ELEMENT_TIN, 0)); + self::register("element_titanium", $factory->get(Ids::ELEMENT_TITANIUM, 0)); + self::register("element_tungsten", $factory->get(Ids::ELEMENT_TUNGSTEN, 0)); + self::register("element_uranium", $factory->get(Ids::ELEMENT_URANIUM, 0)); + self::register("element_vanadium", $factory->get(Ids::ELEMENT_VANADIUM, 0)); + self::register("element_xenon", $factory->get(Ids::ELEMENT_XENON, 0)); + self::register("element_ytterbium", $factory->get(Ids::ELEMENT_YTTERBIUM, 0)); + self::register("element_yttrium", $factory->get(Ids::ELEMENT_YTTRIUM, 0)); + self::register("element_zero", $factory->get(Ids::ELEMENT_ZERO, 0)); + self::register("element_zinc", $factory->get(Ids::ELEMENT_ZINC, 0)); + self::register("element_zirconium", $factory->get(Ids::ELEMENT_ZIRCONIUM, 0)); + self::register("emerald", $factory->get(Ids::EMERALD, 0)); self::register("emerald_ore", $factory->get(Ids::EMERALD_ORE, 0)); self::register("enchanting_table", $factory->get(Ids::ENCHANTING_TABLE, 0)); self::register("end_portal_frame", $factory->get(Ids::END_PORTAL_FRAME, 0)); self::register("end_rod", $factory->get(Ids::END_ROD, 0)); self::register("end_stone", $factory->get(Ids::END_STONE, 0)); - self::register("end_stone_brick_slab", $factory->get(Ids::STONE_SLAB3, 0)); - self::register("end_stone_brick_stairs", $factory->get(Ids::END_BRICK_STAIRS, 0)); - self::register("end_stone_brick_wall", $factory->get(Ids::COBBLESTONE_WALL, 10)); - self::register("end_stone_bricks", $factory->get(Ids::END_BRICKS, 0)); + self::register("end_stone_brick_slab", $factory->get(Ids::END_STONE_BRICK_SLAB, 0)); + self::register("end_stone_brick_stairs", $factory->get(Ids::END_STONE_BRICK_STAIRS, 3)); + self::register("end_stone_brick_wall", $factory->get(Ids::END_STONE_BRICK_WALL, 0)); + self::register("end_stone_bricks", $factory->get(Ids::END_STONE_BRICKS, 0)); self::register("ender_chest", $factory->get(Ids::ENDER_CHEST, 2)); - self::register("fake_wooden_slab", $factory->get(Ids::STONE_SLAB, 2)); + self::register("fake_wooden_slab", $factory->get(Ids::FAKE_WOODEN_SLAB, 0)); self::register("farmland", $factory->get(Ids::FARMLAND, 0)); - self::register("fern", $factory->get(Ids::TALLGRASS, 2)); + self::register("fern", $factory->get(Ids::FERN, 0)); self::register("fire", $factory->get(Ids::FIRE, 0)); self::register("fletching_table", $factory->get(Ids::FLETCHING_TABLE, 0)); - self::register("flower_pot", $factory->get(Ids::FLOWER_POT_BLOCK, 0)); + self::register("flower_pot", $factory->get(Ids::FLOWER_POT, 0)); self::register("frosted_ice", $factory->get(Ids::FROSTED_ICE, 0)); - self::register("furnace", $factory->get(Ids::FURNACE, 2)); + self::register("furnace", $factory->get(Ids::FURNACE, 0)); self::register("glass", $factory->get(Ids::GLASS, 0)); self::register("glass_pane", $factory->get(Ids::GLASS_PANE, 0)); - self::register("glowing_obsidian", $factory->get(Ids::GLOWINGOBSIDIAN, 0)); + self::register("glowing_obsidian", $factory->get(Ids::GLOWING_OBSIDIAN, 0)); self::register("glowstone", $factory->get(Ids::GLOWSTONE, 0)); - self::register("gold", $factory->get(Ids::GOLD_BLOCK, 0)); + self::register("gold", $factory->get(Ids::GOLD, 0)); self::register("gold_ore", $factory->get(Ids::GOLD_ORE, 0)); - self::register("granite", $factory->get(Ids::STONE, 1)); - self::register("granite_slab", $factory->get(Ids::STONE_SLAB3, 6)); - self::register("granite_stairs", $factory->get(Ids::GRANITE_STAIRS, 0)); - self::register("granite_wall", $factory->get(Ids::COBBLESTONE_WALL, 2)); + self::register("granite", $factory->get(Ids::GRANITE, 0)); + self::register("granite_slab", $factory->get(Ids::GRANITE_SLAB, 0)); + self::register("granite_stairs", $factory->get(Ids::GRANITE_STAIRS, 3)); + self::register("granite_wall", $factory->get(Ids::GRANITE_WALL, 0)); self::register("grass", $factory->get(Ids::GRASS, 0)); self::register("grass_path", $factory->get(Ids::GRASS_PATH, 0)); self::register("gravel", $factory->get(Ids::GRAVEL, 0)); self::register("gray_glazed_terracotta", $factory->get(Ids::GRAY_GLAZED_TERRACOTTA, 2)); self::register("green_glazed_terracotta", $factory->get(Ids::GREEN_GLAZED_TERRACOTTA, 2)); - self::register("green_torch", $factory->get(Ids::COLORED_TORCH_RG, 13)); + self::register("green_torch", $factory->get(Ids::GREEN_TORCH, 1)); self::register("hardened_clay", $factory->get(Ids::HARDENED_CLAY, 0)); - self::register("hardened_glass", $factory->get(Ids::HARD_GLASS, 0)); - self::register("hardened_glass_pane", $factory->get(Ids::HARD_GLASS_PANE, 0)); + self::register("hardened_glass", $factory->get(Ids::HARDENED_GLASS, 0)); + self::register("hardened_glass_pane", $factory->get(Ids::HARDENED_GLASS_PANE, 0)); self::register("hay_bale", $factory->get(Ids::HAY_BALE, 0)); - self::register("hopper", $factory->get(Ids::HOPPER_BLOCK, 0)); + self::register("hopper", $factory->get(Ids::HOPPER, 0)); self::register("ice", $factory->get(Ids::ICE, 0)); - self::register("infested_chiseled_stone_brick", $factory->get(Ids::MONSTER_EGG, 5)); - self::register("infested_cobblestone", $factory->get(Ids::MONSTER_EGG, 1)); - self::register("infested_cracked_stone_brick", $factory->get(Ids::MONSTER_EGG, 4)); - self::register("infested_mossy_stone_brick", $factory->get(Ids::MONSTER_EGG, 3)); - self::register("infested_stone", $factory->get(Ids::MONSTER_EGG, 0)); - self::register("infested_stone_brick", $factory->get(Ids::MONSTER_EGG, 2)); + self::register("infested_chiseled_stone_brick", $factory->get(Ids::INFESTED_CHISELED_STONE_BRICK, 0)); + self::register("infested_cobblestone", $factory->get(Ids::INFESTED_COBBLESTONE, 0)); + self::register("infested_cracked_stone_brick", $factory->get(Ids::INFESTED_CRACKED_STONE_BRICK, 0)); + self::register("infested_mossy_stone_brick", $factory->get(Ids::INFESTED_MOSSY_STONE_BRICK, 0)); + self::register("infested_stone", $factory->get(Ids::INFESTED_STONE, 0)); + self::register("infested_stone_brick", $factory->get(Ids::INFESTED_STONE_BRICK, 0)); self::register("info_update", $factory->get(Ids::INFO_UPDATE, 0)); self::register("info_update2", $factory->get(Ids::INFO_UPDATE2, 0)); - self::register("invisible_bedrock", $factory->get(Ids::INVISIBLEBEDROCK, 0)); - self::register("iron", $factory->get(Ids::IRON_BLOCK, 0)); + self::register("invisible_bedrock", $factory->get(Ids::INVISIBLE_BEDROCK, 0)); + self::register("iron", $factory->get(Ids::IRON, 0)); self::register("iron_bars", $factory->get(Ids::IRON_BARS, 0)); - self::register("iron_door", $factory->get(Ids::IRON_DOOR_BLOCK, 0)); + self::register("iron_door", $factory->get(Ids::IRON_DOOR, 0)); self::register("iron_ore", $factory->get(Ids::IRON_ORE, 0)); - self::register("iron_trapdoor", $factory->get(Ids::IRON_TRAPDOOR, 0)); - self::register("item_frame", $factory->get(Ids::FRAME_BLOCK, 0)); + self::register("iron_trapdoor", $factory->get(Ids::IRON_TRAPDOOR, 3)); + self::register("item_frame", $factory->get(Ids::ITEM_FRAME, 3)); self::register("jukebox", $factory->get(Ids::JUKEBOX, 0)); self::register("jungle_button", $factory->get(Ids::JUNGLE_BUTTON, 0)); - self::register("jungle_door", $factory->get(Ids::JUNGLE_DOOR_BLOCK, 0)); - self::register("jungle_fence", $factory->get(Ids::FENCE, 3)); + self::register("jungle_door", $factory->get(Ids::JUNGLE_DOOR, 0)); + self::register("jungle_fence", $factory->get(Ids::JUNGLE_FENCE, 0)); self::register("jungle_fence_gate", $factory->get(Ids::JUNGLE_FENCE_GATE, 0)); - self::register("jungle_leaves", $factory->get(Ids::LEAVES, 3)); - self::register("jungle_log", $factory->get(Ids::LOG, 3)); - self::register("jungle_planks", $factory->get(Ids::PLANKS, 3)); + self::register("jungle_leaves", $factory->get(Ids::JUNGLE_LEAVES, 0)); + self::register("jungle_log", $factory->get(Ids::JUNGLE_LOG, 0)); + self::register("jungle_planks", $factory->get(Ids::JUNGLE_PLANKS, 0)); self::register("jungle_pressure_plate", $factory->get(Ids::JUNGLE_PRESSURE_PLATE, 0)); - self::register("jungle_sapling", $factory->get(Ids::SAPLING, 3)); - self::register("jungle_sign", $factory->get(Ids::JUNGLE_STANDING_SIGN, 0)); - self::register("jungle_slab", $factory->get(Ids::WOODEN_SLAB, 3)); - self::register("jungle_stairs", $factory->get(Ids::JUNGLE_STAIRS, 0)); - self::register("jungle_trapdoor", $factory->get(Ids::JUNGLE_TRAPDOOR, 0)); + self::register("jungle_sapling", $factory->get(Ids::JUNGLE_SAPLING, 0)); + self::register("jungle_sign", $factory->get(Ids::JUNGLE_SIGN, 0)); + self::register("jungle_slab", $factory->get(Ids::JUNGLE_SLAB, 0)); + self::register("jungle_stairs", $factory->get(Ids::JUNGLE_STAIRS, 3)); + self::register("jungle_trapdoor", $factory->get(Ids::JUNGLE_TRAPDOOR, 3)); self::register("jungle_wall_sign", $factory->get(Ids::JUNGLE_WALL_SIGN, 2)); - self::register("jungle_wood", $factory->get(Ids::WOOD, 3)); - self::register("lab_table", $factory->get(Ids::CHEMISTRY_TABLE, 12)); + self::register("jungle_wood", $factory->get(Ids::JUNGLE_WOOD, 0)); + self::register("lab_table", $factory->get(Ids::LAB_TABLE, 0)); self::register("ladder", $factory->get(Ids::LADDER, 2)); self::register("lantern", $factory->get(Ids::LANTERN, 0)); - self::register("lapis_lazuli", $factory->get(Ids::LAPIS_BLOCK, 0)); - self::register("lapis_lazuli_ore", $factory->get(Ids::LAPIS_ORE, 0)); - self::register("large_fern", $factory->get(Ids::DOUBLE_PLANT, 3)); - self::register("lava", $factory->get(Ids::FLOWING_LAVA, 0)); - self::register("lectern", $factory->get(Ids::LECTERN, 0)); - self::register("legacy_stonecutter", $factory->get(Ids::STONECUTTER, 0)); - self::register("lever", $factory->get(Ids::LEVER, 0)); + self::register("lapis_lazuli", $factory->get(Ids::LAPIS_LAZULI, 0)); + self::register("lapis_lazuli_ore", $factory->get(Ids::LAPIS_LAZULI_ORE, 0)); + self::register("large_fern", $factory->get(Ids::LARGE_FERN, 0)); + self::register("lava", $factory->get(Ids::LAVA, 0)); + self::register("lectern", $factory->get(Ids::LECTERN, 2)); + self::register("legacy_stonecutter", $factory->get(Ids::LEGACY_STONECUTTER, 0)); + self::register("lever", $factory->get(Ids::LEVER, 6)); self::register("light_blue_glazed_terracotta", $factory->get(Ids::LIGHT_BLUE_GLAZED_TERRACOTTA, 2)); - self::register("light_gray_glazed_terracotta", $factory->get(Ids::SILVER_GLAZED_TERRACOTTA, 2)); - self::register("lilac", $factory->get(Ids::DOUBLE_PLANT, 1)); - self::register("lily_of_the_valley", $factory->get(Ids::POPPY, 10)); + self::register("light_gray_glazed_terracotta", $factory->get(Ids::LIGHT_GRAY_GLAZED_TERRACOTTA, 2)); + self::register("lilac", $factory->get(Ids::LILAC, 0)); + self::register("lily_of_the_valley", $factory->get(Ids::LILY_OF_THE_VALLEY, 0)); self::register("lily_pad", $factory->get(Ids::LILY_PAD, 0)); self::register("lime_glazed_terracotta", $factory->get(Ids::LIME_GLAZED_TERRACOTTA, 2)); - self::register("lit_pumpkin", $factory->get(Ids::JACK_O_LANTERN, 0)); - self::register("loom", $factory->get(Ids::LOOM, 0)); + self::register("lit_pumpkin", $factory->get(Ids::LIT_PUMPKIN, 0)); + self::register("loom", $factory->get(Ids::LOOM, 2)); self::register("magenta_glazed_terracotta", $factory->get(Ids::MAGENTA_GLAZED_TERRACOTTA, 2)); self::register("magma", $factory->get(Ids::MAGMA, 0)); - self::register("material_reducer", $factory->get(Ids::CHEMISTRY_TABLE, 4)); - self::register("melon", $factory->get(Ids::MELON_BLOCK, 0)); + self::register("material_reducer", $factory->get(Ids::MATERIAL_REDUCER, 0)); + self::register("melon", $factory->get(Ids::MELON, 0)); self::register("melon_stem", $factory->get(Ids::MELON_STEM, 0)); - self::register("mob_head", $factory->get(Ids::MOB_HEAD_BLOCK, 2)); - self::register("monster_spawner", $factory->get(Ids::MOB_SPAWNER, 0)); + self::register("mob_head", $factory->get(Ids::MOB_HEAD, 2)); + self::register("monster_spawner", $factory->get(Ids::MONSTER_SPAWNER, 0)); self::register("mossy_cobblestone", $factory->get(Ids::MOSSY_COBBLESTONE, 0)); - self::register("mossy_cobblestone_slab", $factory->get(Ids::STONE_SLAB2, 5)); - self::register("mossy_cobblestone_stairs", $factory->get(Ids::MOSSY_COBBLESTONE_STAIRS, 0)); - self::register("mossy_cobblestone_wall", $factory->get(Ids::COBBLESTONE_WALL, 1)); - self::register("mossy_stone_brick_slab", $factory->get(Ids::STONE_SLAB4, 0)); - self::register("mossy_stone_brick_stairs", $factory->get(Ids::MOSSY_STONE_BRICK_STAIRS, 0)); - self::register("mossy_stone_brick_wall", $factory->get(Ids::COBBLESTONE_WALL, 8)); - self::register("mossy_stone_bricks", $factory->get(Ids::STONEBRICK, 1)); - self::register("mushroom_stem", $factory->get(Ids::BROWN_MUSHROOM_BLOCK, 10)); + self::register("mossy_cobblestone_slab", $factory->get(Ids::MOSSY_COBBLESTONE_SLAB, 0)); + self::register("mossy_cobblestone_stairs", $factory->get(Ids::MOSSY_COBBLESTONE_STAIRS, 3)); + self::register("mossy_cobblestone_wall", $factory->get(Ids::MOSSY_COBBLESTONE_WALL, 0)); + self::register("mossy_stone_brick_slab", $factory->get(Ids::MOSSY_STONE_BRICK_SLAB, 0)); + self::register("mossy_stone_brick_stairs", $factory->get(Ids::MOSSY_STONE_BRICK_STAIRS, 3)); + self::register("mossy_stone_brick_wall", $factory->get(Ids::MOSSY_STONE_BRICK_WALL, 0)); + self::register("mossy_stone_bricks", $factory->get(Ids::MOSSY_STONE_BRICKS, 0)); + self::register("mushroom_stem", $factory->get(Ids::MUSHROOM_STEM, 0)); self::register("mycelium", $factory->get(Ids::MYCELIUM, 0)); self::register("nether_brick_fence", $factory->get(Ids::NETHER_BRICK_FENCE, 0)); - self::register("nether_brick_slab", $factory->get(Ids::STONE_SLAB, 7)); - self::register("nether_brick_stairs", $factory->get(Ids::NETHER_BRICK_STAIRS, 0)); - self::register("nether_brick_wall", $factory->get(Ids::COBBLESTONE_WALL, 9)); - self::register("nether_bricks", $factory->get(Ids::NETHER_BRICK_BLOCK, 0)); - self::register("nether_portal", $factory->get(Ids::PORTAL, 1)); + self::register("nether_brick_slab", $factory->get(Ids::NETHER_BRICK_SLAB, 0)); + self::register("nether_brick_stairs", $factory->get(Ids::NETHER_BRICK_STAIRS, 3)); + self::register("nether_brick_wall", $factory->get(Ids::NETHER_BRICK_WALL, 0)); + self::register("nether_bricks", $factory->get(Ids::NETHER_BRICKS, 0)); + self::register("nether_portal", $factory->get(Ids::NETHER_PORTAL, 1)); self::register("nether_quartz_ore", $factory->get(Ids::NETHER_QUARTZ_ORE, 0)); - self::register("nether_reactor_core", $factory->get(Ids::NETHERREACTOR, 0)); - self::register("nether_wart", $factory->get(Ids::NETHER_WART_PLANT, 0)); + self::register("nether_reactor_core", $factory->get(Ids::NETHER_REACTOR_CORE, 0)); + self::register("nether_wart", $factory->get(Ids::NETHER_WART, 0)); self::register("nether_wart_block", $factory->get(Ids::NETHER_WART_BLOCK, 0)); self::register("netherrack", $factory->get(Ids::NETHERRACK, 0)); - self::register("note_block", $factory->get(Ids::NOTEBLOCK, 0)); - self::register("oak_button", $factory->get(Ids::WOODEN_BUTTON, 0)); - self::register("oak_door", $factory->get(Ids::OAK_DOOR_BLOCK, 0)); - self::register("oak_fence", $factory->get(Ids::FENCE, 0)); - self::register("oak_fence_gate", $factory->get(Ids::FENCE_GATE, 0)); - self::register("oak_leaves", $factory->get(Ids::LEAVES, 0)); - self::register("oak_log", $factory->get(Ids::LOG, 0)); - self::register("oak_planks", $factory->get(Ids::PLANKS, 0)); - self::register("oak_pressure_plate", $factory->get(Ids::WOODEN_PRESSURE_PLATE, 0)); - self::register("oak_sapling", $factory->get(Ids::SAPLING, 0)); - self::register("oak_sign", $factory->get(Ids::SIGN_POST, 0)); - self::register("oak_slab", $factory->get(Ids::WOODEN_SLAB, 0)); - self::register("oak_stairs", $factory->get(Ids::OAK_STAIRS, 0)); - self::register("oak_trapdoor", $factory->get(Ids::TRAPDOOR, 0)); - self::register("oak_wall_sign", $factory->get(Ids::WALL_SIGN, 2)); - self::register("oak_wood", $factory->get(Ids::WOOD, 0)); + self::register("note_block", $factory->get(Ids::NOTE_BLOCK, 0)); + self::register("oak_button", $factory->get(Ids::OAK_BUTTON, 0)); + self::register("oak_door", $factory->get(Ids::OAK_DOOR, 0)); + self::register("oak_fence", $factory->get(Ids::OAK_FENCE, 0)); + self::register("oak_fence_gate", $factory->get(Ids::OAK_FENCE_GATE, 0)); + self::register("oak_leaves", $factory->get(Ids::OAK_LEAVES, 0)); + self::register("oak_log", $factory->get(Ids::OAK_LOG, 0)); + self::register("oak_planks", $factory->get(Ids::OAK_PLANKS, 0)); + self::register("oak_pressure_plate", $factory->get(Ids::OAK_PRESSURE_PLATE, 0)); + self::register("oak_sapling", $factory->get(Ids::OAK_SAPLING, 0)); + self::register("oak_sign", $factory->get(Ids::OAK_SIGN, 0)); + self::register("oak_slab", $factory->get(Ids::OAK_SLAB, 0)); + self::register("oak_stairs", $factory->get(Ids::OAK_STAIRS, 3)); + self::register("oak_trapdoor", $factory->get(Ids::OAK_TRAPDOOR, 3)); + self::register("oak_wall_sign", $factory->get(Ids::OAK_WALL_SIGN, 2)); + self::register("oak_wood", $factory->get(Ids::OAK_WOOD, 0)); self::register("obsidian", $factory->get(Ids::OBSIDIAN, 0)); self::register("orange_glazed_terracotta", $factory->get(Ids::ORANGE_GLAZED_TERRACOTTA, 2)); - self::register("orange_tulip", $factory->get(Ids::POPPY, 5)); - self::register("oxeye_daisy", $factory->get(Ids::POPPY, 8)); + self::register("orange_tulip", $factory->get(Ids::ORANGE_TULIP, 0)); + self::register("oxeye_daisy", $factory->get(Ids::OXEYE_DAISY, 0)); self::register("packed_ice", $factory->get(Ids::PACKED_ICE, 0)); - self::register("peony", $factory->get(Ids::DOUBLE_PLANT, 5)); + self::register("peony", $factory->get(Ids::PEONY, 0)); self::register("pink_glazed_terracotta", $factory->get(Ids::PINK_GLAZED_TERRACOTTA, 2)); - self::register("pink_tulip", $factory->get(Ids::POPPY, 7)); + self::register("pink_tulip", $factory->get(Ids::PINK_TULIP, 0)); self::register("podzol", $factory->get(Ids::PODZOL, 0)); - self::register("polished_andesite", $factory->get(Ids::STONE, 6)); - self::register("polished_andesite_slab", $factory->get(Ids::STONE_SLAB3, 2)); - self::register("polished_andesite_stairs", $factory->get(Ids::POLISHED_ANDESITE_STAIRS, 0)); - self::register("polished_diorite", $factory->get(Ids::STONE, 4)); - self::register("polished_diorite_slab", $factory->get(Ids::STONE_SLAB3, 5)); - self::register("polished_diorite_stairs", $factory->get(Ids::POLISHED_DIORITE_STAIRS, 0)); - self::register("polished_granite", $factory->get(Ids::STONE, 2)); - self::register("polished_granite_slab", $factory->get(Ids::STONE_SLAB3, 7)); - self::register("polished_granite_stairs", $factory->get(Ids::POLISHED_GRANITE_STAIRS, 0)); + self::register("polished_andesite", $factory->get(Ids::POLISHED_ANDESITE, 0)); + self::register("polished_andesite_slab", $factory->get(Ids::POLISHED_ANDESITE_SLAB, 0)); + self::register("polished_andesite_stairs", $factory->get(Ids::POLISHED_ANDESITE_STAIRS, 3)); + self::register("polished_diorite", $factory->get(Ids::POLISHED_DIORITE, 0)); + self::register("polished_diorite_slab", $factory->get(Ids::POLISHED_DIORITE_SLAB, 0)); + self::register("polished_diorite_stairs", $factory->get(Ids::POLISHED_DIORITE_STAIRS, 3)); + self::register("polished_granite", $factory->get(Ids::POLISHED_GRANITE, 0)); + self::register("polished_granite_slab", $factory->get(Ids::POLISHED_GRANITE_SLAB, 0)); + self::register("polished_granite_stairs", $factory->get(Ids::POLISHED_GRANITE_STAIRS, 3)); self::register("poppy", $factory->get(Ids::POPPY, 0)); self::register("potatoes", $factory->get(Ids::POTATOES, 0)); - self::register("powered_rail", $factory->get(Ids::GOLDEN_RAIL, 0)); + self::register("powered_rail", $factory->get(Ids::POWERED_RAIL, 0)); self::register("prismarine", $factory->get(Ids::PRISMARINE, 0)); - self::register("prismarine_bricks", $factory->get(Ids::PRISMARINE, 2)); - self::register("prismarine_bricks_slab", $factory->get(Ids::STONE_SLAB2, 4)); - self::register("prismarine_bricks_stairs", $factory->get(Ids::PRISMARINE_BRICKS_STAIRS, 0)); - self::register("prismarine_slab", $factory->get(Ids::STONE_SLAB2, 2)); - self::register("prismarine_stairs", $factory->get(Ids::PRISMARINE_STAIRS, 0)); - self::register("prismarine_wall", $factory->get(Ids::COBBLESTONE_WALL, 11)); + self::register("prismarine_bricks", $factory->get(Ids::PRISMARINE_BRICKS, 0)); + self::register("prismarine_bricks_slab", $factory->get(Ids::PRISMARINE_BRICKS_SLAB, 0)); + self::register("prismarine_bricks_stairs", $factory->get(Ids::PRISMARINE_BRICKS_STAIRS, 3)); + self::register("prismarine_slab", $factory->get(Ids::PRISMARINE_SLAB, 0)); + self::register("prismarine_stairs", $factory->get(Ids::PRISMARINE_STAIRS, 3)); + self::register("prismarine_wall", $factory->get(Ids::PRISMARINE_WALL, 0)); self::register("pumpkin", $factory->get(Ids::PUMPKIN, 0)); self::register("pumpkin_stem", $factory->get(Ids::PUMPKIN_STEM, 0)); self::register("purple_glazed_terracotta", $factory->get(Ids::PURPLE_GLAZED_TERRACOTTA, 2)); - self::register("purple_torch", $factory->get(Ids::COLORED_TORCH_BP, 13)); - self::register("purpur", $factory->get(Ids::PURPUR_BLOCK, 0)); - self::register("purpur_pillar", $factory->get(Ids::PURPUR_BLOCK, 2)); - self::register("purpur_slab", $factory->get(Ids::STONE_SLAB2, 1)); - self::register("purpur_stairs", $factory->get(Ids::PURPUR_STAIRS, 0)); - self::register("quartz", $factory->get(Ids::QUARTZ_BLOCK, 0)); - self::register("quartz_pillar", $factory->get(Ids::QUARTZ_BLOCK, 2)); - self::register("quartz_slab", $factory->get(Ids::STONE_SLAB, 6)); - self::register("quartz_stairs", $factory->get(Ids::QUARTZ_STAIRS, 0)); + self::register("purple_torch", $factory->get(Ids::PURPLE_TORCH, 1)); + self::register("purpur", $factory->get(Ids::PURPUR, 0)); + self::register("purpur_pillar", $factory->get(Ids::PURPUR_PILLAR, 0)); + self::register("purpur_slab", $factory->get(Ids::PURPUR_SLAB, 0)); + self::register("purpur_stairs", $factory->get(Ids::PURPUR_STAIRS, 3)); + self::register("quartz", $factory->get(Ids::QUARTZ, 0)); + self::register("quartz_pillar", $factory->get(Ids::QUARTZ_PILLAR, 0)); + self::register("quartz_slab", $factory->get(Ids::QUARTZ_SLAB, 0)); + self::register("quartz_stairs", $factory->get(Ids::QUARTZ_STAIRS, 3)); self::register("rail", $factory->get(Ids::RAIL, 0)); self::register("red_glazed_terracotta", $factory->get(Ids::RED_GLAZED_TERRACOTTA, 2)); self::register("red_mushroom", $factory->get(Ids::RED_MUSHROOM, 0)); self::register("red_mushroom_block", $factory->get(Ids::RED_MUSHROOM_BLOCK, 0)); - self::register("red_nether_brick_slab", $factory->get(Ids::STONE_SLAB2, 7)); - self::register("red_nether_brick_stairs", $factory->get(Ids::RED_NETHER_BRICK_STAIRS, 0)); - self::register("red_nether_brick_wall", $factory->get(Ids::COBBLESTONE_WALL, 13)); - self::register("red_nether_bricks", $factory->get(Ids::RED_NETHER_BRICK, 0)); - self::register("red_sand", $factory->get(Ids::SAND, 1)); + self::register("red_nether_brick_slab", $factory->get(Ids::RED_NETHER_BRICK_SLAB, 0)); + self::register("red_nether_brick_stairs", $factory->get(Ids::RED_NETHER_BRICK_STAIRS, 3)); + self::register("red_nether_brick_wall", $factory->get(Ids::RED_NETHER_BRICK_WALL, 0)); + self::register("red_nether_bricks", $factory->get(Ids::RED_NETHER_BRICKS, 0)); + self::register("red_sand", $factory->get(Ids::RED_SAND, 0)); self::register("red_sandstone", $factory->get(Ids::RED_SANDSTONE, 0)); - self::register("red_sandstone_slab", $factory->get(Ids::STONE_SLAB2, 0)); - self::register("red_sandstone_stairs", $factory->get(Ids::RED_SANDSTONE_STAIRS, 0)); - self::register("red_sandstone_wall", $factory->get(Ids::COBBLESTONE_WALL, 12)); - self::register("red_torch", $factory->get(Ids::COLORED_TORCH_RG, 5)); - self::register("red_tulip", $factory->get(Ids::POPPY, 4)); - self::register("redstone", $factory->get(Ids::REDSTONE_BLOCK, 0)); - self::register("redstone_comparator", $factory->get(Ids::COMPARATOR_BLOCK, 0)); + self::register("red_sandstone_slab", $factory->get(Ids::RED_SANDSTONE_SLAB, 0)); + self::register("red_sandstone_stairs", $factory->get(Ids::RED_SANDSTONE_STAIRS, 3)); + self::register("red_sandstone_wall", $factory->get(Ids::RED_SANDSTONE_WALL, 0)); + self::register("red_torch", $factory->get(Ids::RED_TORCH, 1)); + self::register("red_tulip", $factory->get(Ids::RED_TULIP, 0)); + self::register("redstone", $factory->get(Ids::REDSTONE, 0)); + self::register("redstone_comparator", $factory->get(Ids::REDSTONE_COMPARATOR, 2)); self::register("redstone_lamp", $factory->get(Ids::REDSTONE_LAMP, 0)); self::register("redstone_ore", $factory->get(Ids::REDSTONE_ORE, 0)); - self::register("redstone_repeater", $factory->get(Ids::REPEATER_BLOCK, 0)); - self::register("redstone_torch", $factory->get(Ids::LIT_REDSTONE_TORCH, 5)); + self::register("redstone_repeater", $factory->get(Ids::REDSTONE_REPEATER, 0)); + self::register("redstone_torch", $factory->get(Ids::REDSTONE_TORCH, 9)); self::register("redstone_wire", $factory->get(Ids::REDSTONE_WIRE, 0)); self::register("reserved6", $factory->get(Ids::RESERVED6, 0)); - self::register("rose_bush", $factory->get(Ids::DOUBLE_PLANT, 4)); + self::register("rose_bush", $factory->get(Ids::ROSE_BUSH, 0)); self::register("sand", $factory->get(Ids::SAND, 0)); self::register("sandstone", $factory->get(Ids::SANDSTONE, 0)); - self::register("sandstone_slab", $factory->get(Ids::STONE_SLAB, 1)); - self::register("sandstone_stairs", $factory->get(Ids::SANDSTONE_STAIRS, 0)); - self::register("sandstone_wall", $factory->get(Ids::COBBLESTONE_WALL, 5)); - self::register("sea_lantern", $factory->get(Ids::SEALANTERN, 0)); - self::register("sea_pickle", $factory->get(Ids::SEA_PICKLE, 0)); - self::register("shulker_box", $factory->get(Ids::UNDYED_SHULKER_BOX, 0)); + self::register("sandstone_slab", $factory->get(Ids::SANDSTONE_SLAB, 0)); + self::register("sandstone_stairs", $factory->get(Ids::SANDSTONE_STAIRS, 3)); + self::register("sandstone_wall", $factory->get(Ids::SANDSTONE_WALL, 0)); + self::register("sea_lantern", $factory->get(Ids::SEA_LANTERN, 0)); + self::register("sea_pickle", $factory->get(Ids::SEA_PICKLE, 4)); + self::register("shulker_box", $factory->get(Ids::SHULKER_BOX, 0)); self::register("slime", $factory->get(Ids::SLIME, 0)); - self::register("smoker", $factory->get(Ids::SMOKER, 2)); - self::register("smooth_quartz", $factory->get(Ids::QUARTZ_BLOCK, 3)); - self::register("smooth_quartz_slab", $factory->get(Ids::STONE_SLAB4, 1)); - self::register("smooth_quartz_stairs", $factory->get(Ids::SMOOTH_QUARTZ_STAIRS, 0)); - self::register("smooth_red_sandstone", $factory->get(Ids::RED_SANDSTONE, 3)); - self::register("smooth_red_sandstone_slab", $factory->get(Ids::STONE_SLAB3, 1)); - self::register("smooth_red_sandstone_stairs", $factory->get(Ids::SMOOTH_RED_SANDSTONE_STAIRS, 0)); - self::register("smooth_sandstone", $factory->get(Ids::SANDSTONE, 3)); - self::register("smooth_sandstone_slab", $factory->get(Ids::STONE_SLAB2, 6)); - self::register("smooth_sandstone_stairs", $factory->get(Ids::SMOOTH_SANDSTONE_STAIRS, 0)); + self::register("smoker", $factory->get(Ids::SMOKER, 0)); + self::register("smooth_quartz", $factory->get(Ids::SMOOTH_QUARTZ, 0)); + self::register("smooth_quartz_slab", $factory->get(Ids::SMOOTH_QUARTZ_SLAB, 0)); + self::register("smooth_quartz_stairs", $factory->get(Ids::SMOOTH_QUARTZ_STAIRS, 3)); + self::register("smooth_red_sandstone", $factory->get(Ids::SMOOTH_RED_SANDSTONE, 0)); + self::register("smooth_red_sandstone_slab", $factory->get(Ids::SMOOTH_RED_SANDSTONE_SLAB, 0)); + self::register("smooth_red_sandstone_stairs", $factory->get(Ids::SMOOTH_RED_SANDSTONE_STAIRS, 3)); + self::register("smooth_sandstone", $factory->get(Ids::SMOOTH_SANDSTONE, 0)); + self::register("smooth_sandstone_slab", $factory->get(Ids::SMOOTH_SANDSTONE_SLAB, 0)); + self::register("smooth_sandstone_stairs", $factory->get(Ids::SMOOTH_SANDSTONE_STAIRS, 3)); self::register("smooth_stone", $factory->get(Ids::SMOOTH_STONE, 0)); - self::register("smooth_stone_slab", $factory->get(Ids::STONE_SLAB, 0)); + self::register("smooth_stone_slab", $factory->get(Ids::SMOOTH_STONE_SLAB, 0)); self::register("snow", $factory->get(Ids::SNOW, 0)); self::register("snow_layer", $factory->get(Ids::SNOW_LAYER, 0)); self::register("soul_sand", $factory->get(Ids::SOUL_SAND, 0)); self::register("sponge", $factory->get(Ids::SPONGE, 0)); self::register("spruce_button", $factory->get(Ids::SPRUCE_BUTTON, 0)); - self::register("spruce_door", $factory->get(Ids::SPRUCE_DOOR_BLOCK, 0)); - self::register("spruce_fence", $factory->get(Ids::FENCE, 1)); + self::register("spruce_door", $factory->get(Ids::SPRUCE_DOOR, 0)); + self::register("spruce_fence", $factory->get(Ids::SPRUCE_FENCE, 0)); self::register("spruce_fence_gate", $factory->get(Ids::SPRUCE_FENCE_GATE, 0)); - self::register("spruce_leaves", $factory->get(Ids::LEAVES, 1)); - self::register("spruce_log", $factory->get(Ids::LOG, 1)); - self::register("spruce_planks", $factory->get(Ids::PLANKS, 1)); + self::register("spruce_leaves", $factory->get(Ids::SPRUCE_LEAVES, 0)); + self::register("spruce_log", $factory->get(Ids::SPRUCE_LOG, 0)); + self::register("spruce_planks", $factory->get(Ids::SPRUCE_PLANKS, 0)); self::register("spruce_pressure_plate", $factory->get(Ids::SPRUCE_PRESSURE_PLATE, 0)); - self::register("spruce_sapling", $factory->get(Ids::SAPLING, 1)); - self::register("spruce_sign", $factory->get(Ids::SPRUCE_STANDING_SIGN, 0)); - self::register("spruce_slab", $factory->get(Ids::WOODEN_SLAB, 1)); - self::register("spruce_stairs", $factory->get(Ids::SPRUCE_STAIRS, 0)); - self::register("spruce_trapdoor", $factory->get(Ids::SPRUCE_TRAPDOOR, 0)); + self::register("spruce_sapling", $factory->get(Ids::SPRUCE_SAPLING, 0)); + self::register("spruce_sign", $factory->get(Ids::SPRUCE_SIGN, 0)); + self::register("spruce_slab", $factory->get(Ids::SPRUCE_SLAB, 0)); + self::register("spruce_stairs", $factory->get(Ids::SPRUCE_STAIRS, 3)); + self::register("spruce_trapdoor", $factory->get(Ids::SPRUCE_TRAPDOOR, 3)); self::register("spruce_wall_sign", $factory->get(Ids::SPRUCE_WALL_SIGN, 2)); - self::register("spruce_wood", $factory->get(Ids::WOOD, 1)); - self::register("stained_clay", $factory->get(Ids::STAINED_CLAY, 0)); - self::register("stained_glass", $factory->get(Ids::STAINED_GLASS, 0)); - self::register("stained_glass_pane", $factory->get(Ids::STAINED_GLASS_PANE, 0)); - self::register("stained_hardened_glass", $factory->get(Ids::HARD_STAINED_GLASS, 0)); - self::register("stained_hardened_glass_pane", $factory->get(Ids::HARD_STAINED_GLASS_PANE, 0)); + self::register("spruce_wood", $factory->get(Ids::SPRUCE_WOOD, 0)); + self::register("stained_clay", $factory->get(Ids::STAINED_CLAY, 14)); + self::register("stained_glass", $factory->get(Ids::STAINED_GLASS, 14)); + self::register("stained_glass_pane", $factory->get(Ids::STAINED_GLASS_PANE, 14)); + self::register("stained_hardened_glass", $factory->get(Ids::STAINED_HARDENED_GLASS, 14)); + self::register("stained_hardened_glass_pane", $factory->get(Ids::STAINED_HARDENED_GLASS_PANE, 14)); self::register("stone", $factory->get(Ids::STONE, 0)); - self::register("stone_brick_slab", $factory->get(Ids::STONE_SLAB, 5)); - self::register("stone_brick_stairs", $factory->get(Ids::STONE_BRICK_STAIRS, 0)); - self::register("stone_brick_wall", $factory->get(Ids::COBBLESTONE_WALL, 7)); - self::register("stone_bricks", $factory->get(Ids::STONEBRICK, 0)); + self::register("stone_brick_slab", $factory->get(Ids::STONE_BRICK_SLAB, 0)); + self::register("stone_brick_stairs", $factory->get(Ids::STONE_BRICK_STAIRS, 3)); + self::register("stone_brick_wall", $factory->get(Ids::STONE_BRICK_WALL, 0)); + self::register("stone_bricks", $factory->get(Ids::STONE_BRICKS, 0)); self::register("stone_button", $factory->get(Ids::STONE_BUTTON, 0)); self::register("stone_pressure_plate", $factory->get(Ids::STONE_PRESSURE_PLATE, 0)); - self::register("stone_slab", $factory->get(Ids::STONE_SLAB4, 2)); - self::register("stone_stairs", $factory->get(Ids::NORMAL_STONE_STAIRS, 0)); - self::register("stonecutter", $factory->get(Ids::STONECUTTER_BLOCK, 2)); + self::register("stone_slab", $factory->get(Ids::STONE_SLAB, 0)); + self::register("stone_stairs", $factory->get(Ids::STONE_STAIRS, 3)); + self::register("stonecutter", $factory->get(Ids::STONECUTTER, 2)); self::register("stripped_acacia_log", $factory->get(Ids::STRIPPED_ACACIA_LOG, 0)); - self::register("stripped_acacia_wood", $factory->get(Ids::WOOD, 12)); + self::register("stripped_acacia_wood", $factory->get(Ids::STRIPPED_ACACIA_WOOD, 0)); self::register("stripped_birch_log", $factory->get(Ids::STRIPPED_BIRCH_LOG, 0)); - self::register("stripped_birch_wood", $factory->get(Ids::WOOD, 10)); + self::register("stripped_birch_wood", $factory->get(Ids::STRIPPED_BIRCH_WOOD, 0)); self::register("stripped_dark_oak_log", $factory->get(Ids::STRIPPED_DARK_OAK_LOG, 0)); - self::register("stripped_dark_oak_wood", $factory->get(Ids::WOOD, 13)); + self::register("stripped_dark_oak_wood", $factory->get(Ids::STRIPPED_DARK_OAK_WOOD, 0)); self::register("stripped_jungle_log", $factory->get(Ids::STRIPPED_JUNGLE_LOG, 0)); - self::register("stripped_jungle_wood", $factory->get(Ids::WOOD, 11)); + self::register("stripped_jungle_wood", $factory->get(Ids::STRIPPED_JUNGLE_WOOD, 0)); self::register("stripped_oak_log", $factory->get(Ids::STRIPPED_OAK_LOG, 0)); - self::register("stripped_oak_wood", $factory->get(Ids::WOOD, 8)); + self::register("stripped_oak_wood", $factory->get(Ids::STRIPPED_OAK_WOOD, 0)); self::register("stripped_spruce_log", $factory->get(Ids::STRIPPED_SPRUCE_LOG, 0)); - self::register("stripped_spruce_wood", $factory->get(Ids::WOOD, 9)); - self::register("sugarcane", $factory->get(Ids::REEDS_BLOCK, 0)); - self::register("sunflower", $factory->get(Ids::DOUBLE_PLANT, 0)); + self::register("stripped_spruce_wood", $factory->get(Ids::STRIPPED_SPRUCE_WOOD, 0)); + self::register("sugarcane", $factory->get(Ids::SUGARCANE, 0)); + self::register("sunflower", $factory->get(Ids::SUNFLOWER, 0)); self::register("sweet_berry_bush", $factory->get(Ids::SWEET_BERRY_BUSH, 0)); - self::register("tall_grass", $factory->get(Ids::TALLGRASS, 1)); + self::register("tall_grass", $factory->get(Ids::TALL_GRASS, 0)); self::register("tnt", $factory->get(Ids::TNT, 0)); - self::register("torch", $factory->get(Ids::TORCH, 5)); + self::register("torch", $factory->get(Ids::TORCH, 1)); self::register("trapped_chest", $factory->get(Ids::TRAPPED_CHEST, 2)); self::register("tripwire", $factory->get(Ids::TRIPWIRE, 0)); - self::register("tripwire_hook", $factory->get(Ids::TRIPWIRE_HOOK, 0)); - self::register("underwater_torch", $factory->get(Ids::UNDERWATER_TORCH, 5)); - self::register("vines", $factory->get(Ids::VINE, 0)); + self::register("tripwire_hook", $factory->get(Ids::TRIPWIRE_HOOK, 2)); + self::register("underwater_torch", $factory->get(Ids::UNDERWATER_TORCH, 1)); + self::register("vines", $factory->get(Ids::VINES, 0)); self::register("wall_banner", $factory->get(Ids::WALL_BANNER, 2)); - self::register("wall_coral_fan", $factory->get(Ids::CORAL_FAN_HANG, 0)); - self::register("water", $factory->get(Ids::FLOWING_WATER, 0)); - self::register("weighted_pressure_plate_heavy", $factory->get(Ids::HEAVY_WEIGHTED_PRESSURE_PLATE, 0)); - self::register("weighted_pressure_plate_light", $factory->get(Ids::LIGHT_WEIGHTED_PRESSURE_PLATE, 0)); - self::register("wheat", $factory->get(Ids::WHEAT_BLOCK, 0)); + self::register("wall_coral_fan", $factory->get(Ids::WALL_CORAL_FAN, 4)); + self::register("water", $factory->get(Ids::WATER, 0)); + self::register("weighted_pressure_plate_heavy", $factory->get(Ids::WEIGHTED_PRESSURE_PLATE_HEAVY, 0)); + self::register("weighted_pressure_plate_light", $factory->get(Ids::WEIGHTED_PRESSURE_PLATE_LIGHT, 0)); + self::register("wheat", $factory->get(Ids::WHEAT, 0)); self::register("white_glazed_terracotta", $factory->get(Ids::WHITE_GLAZED_TERRACOTTA, 2)); - self::register("white_tulip", $factory->get(Ids::POPPY, 6)); - self::register("wool", $factory->get(Ids::WOOL, 0)); + self::register("white_tulip", $factory->get(Ids::WHITE_TULIP, 0)); + self::register("wool", $factory->get(Ids::WOOL, 14)); self::register("yellow_glazed_terracotta", $factory->get(Ids::YELLOW_GLAZED_TERRACOTTA, 2)); } } diff --git a/src/block/Vine.php b/src/block/Vine.php index 921f96e22..4505bb366 100644 --- a/src/block/Vine.php +++ b/src/block/Vine.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace pocketmine\block; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\entity\Entity; use pocketmine\item\Item; use pocketmine\math\Axis; @@ -38,27 +40,16 @@ class Vine extends Flowable{ /** @var int[] */ protected array $faces = []; - protected function writeStateToMeta() : int{ - return - (isset($this->faces[Facing::SOUTH]) ? BlockLegacyMetadata::VINE_FLAG_SOUTH : 0) | - (isset($this->faces[Facing::WEST]) ? BlockLegacyMetadata::VINE_FLAG_WEST : 0) | - (isset($this->faces[Facing::NORTH]) ? BlockLegacyMetadata::VINE_FLAG_NORTH : 0) | - (isset($this->faces[Facing::EAST]) ? BlockLegacyMetadata::VINE_FLAG_EAST : 0); + protected function decodeState(BlockDataReader $r) : void{ + foreach(Facing::HORIZONTAL as $facing){ + $this->setFace($facing, $r->readBool()); + } } - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->setFaceFromMeta($stateMeta, BlockLegacyMetadata::VINE_FLAG_SOUTH, Facing::SOUTH); - $this->setFaceFromMeta($stateMeta, BlockLegacyMetadata::VINE_FLAG_WEST, Facing::WEST); - $this->setFaceFromMeta($stateMeta, BlockLegacyMetadata::VINE_FLAG_NORTH, Facing::NORTH); - $this->setFaceFromMeta($stateMeta, BlockLegacyMetadata::VINE_FLAG_EAST, Facing::EAST); - } - - public function getStateBitmask() : int{ - return 0b1111; - } - - private function setFaceFromMeta(int $meta, int $flag, int $face) : void{ - $this->setFace($face, ($meta & $flag) !== 0); + protected function encodeState(BlockDataWriter $w) : void{ + foreach(Facing::HORIZONTAL as $facing){ + $w->writeBool($this->hasFace($facing)); + } } /** @return int[] */ diff --git a/src/block/WallBanner.php b/src/block/WallBanner.php index c8c218256..f3e3b251d 100644 --- a/src/block/WallBanner.php +++ b/src/block/WallBanner.php @@ -23,7 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\NormalHorizontalFacingInMetadataTrait; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; +use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -32,7 +34,20 @@ use pocketmine\player\Player; use pocketmine\world\BlockTransaction; final class WallBanner extends BaseBanner{ - use NormalHorizontalFacingInMetadataTrait; + use HorizontalFacingTrait { + decodeState as decodeFacing; + encodeState as encodeFacing; + } + + protected function decodeState(BlockDataReader $r) : void{ + parent::decodeState($r); + $this->decodeFacing($r); + } + + protected function encodeState(BlockDataWriter $w) : void{ + parent::encodeState($w); + $this->encodeFacing($w); + } protected function getSupportingFace() : int{ return Facing::opposite($this->facing); diff --git a/src/block/WallCoralFan.php b/src/block/WallCoralFan.php index 67dd94714..5e95803e7 100644 --- a/src/block/WallCoralFan.php +++ b/src/block/WallCoralFan.php @@ -23,10 +23,9 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\BlockDataSerializer; -use pocketmine\block\utils\CoralType; +use pocketmine\block\utils\BlockDataReader; +use pocketmine\block\utils\BlockDataWriter; use pocketmine\block\utils\HorizontalFacingTrait; -use pocketmine\block\utils\InvalidBlockStateException; use pocketmine\data\bedrock\CoralTypeIdMap; use pocketmine\item\Item; use pocketmine\item\ItemFactory; @@ -35,73 +34,23 @@ use pocketmine\math\Axis; use pocketmine\math\Facing; use pocketmine\math\Vector3; use pocketmine\player\Player; -use pocketmine\utils\AssumptionFailedError; use pocketmine\world\BlockTransaction; final class WallCoralFan extends BaseCoral{ use HorizontalFacingTrait; - protected BlockIdentifierFlattened $idInfoFlattened; - - public function __construct(BlockIdentifierFlattened $idInfo, string $name, BlockBreakInfo $breakInfo){ - $this->idInfoFlattened = $idInfo; - parent::__construct($idInfo, $name, $breakInfo); - } - - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->facing = BlockDataSerializer::readCoralFacing($stateMeta >> 2); - $this->dead = ($stateMeta & BlockLegacyMetadata::CORAL_FAN_HANG_FLAG_DEAD) !== 0; - - $coralTypeFlag = $stateMeta & BlockLegacyMetadata::CORAL_FAN_HANG_TYPE_MASK; - switch($id){ - case $this->idInfoFlattened->getLegacyBlockId(): - $this->coralType = $coralTypeFlag === BlockLegacyMetadata::CORAL_FAN_HANG_TUBE ? CoralType::TUBE() : CoralType::BRAIN(); - break; - case $this->idInfoFlattened->getAdditionalId(0): - $this->coralType = $coralTypeFlag === BlockLegacyMetadata::CORAL_FAN_HANG2_BUBBLE ? CoralType::BUBBLE() : CoralType::FIRE(); - break; - case $this->idInfoFlattened->getAdditionalId(1): - if($coralTypeFlag !== BlockLegacyMetadata::CORAL_FAN_HANG3_HORN){ - throw new InvalidBlockStateException("Invalid CORAL_FAN_HANG3 type"); - } - $this->coralType = CoralType::HORN(); - break; - default: - throw new \LogicException("ID/meta doesn't match any CORAL_FAN_HANG type"); - } - } - - public function getId() : int{ - if($this->coralType->equals(CoralType::TUBE()) || $this->coralType->equals(CoralType::BRAIN())){ - return $this->idInfoFlattened->getLegacyBlockId(); - }elseif($this->coralType->equals(CoralType::BUBBLE()) || $this->coralType->equals(CoralType::FIRE())){ - return $this->idInfoFlattened->getAdditionalId(0); - }elseif($this->coralType->equals(CoralType::HORN())){ - return $this->idInfoFlattened->getAdditionalId(1); - } - throw new AssumptionFailedError("All types of coral should be covered"); - } - - public function writeStateToMeta() : int{ - $coralTypeFlag = (function() : int{ - switch($this->coralType->id()){ - case CoralType::TUBE()->id(): return BlockLegacyMetadata::CORAL_FAN_HANG_TUBE; - case CoralType::BRAIN()->id(): return BlockLegacyMetadata::CORAL_FAN_HANG_BRAIN; - case CoralType::BUBBLE()->id(): return BlockLegacyMetadata::CORAL_FAN_HANG2_BUBBLE; - case CoralType::FIRE()->id(): return BlockLegacyMetadata::CORAL_FAN_HANG2_FIRE; - case CoralType::HORN()->id(): return BlockLegacyMetadata::CORAL_FAN_HANG3_HORN; - default: throw new AssumptionFailedError("All types of coral should be covered"); - } - })(); - return (BlockDataSerializer::writeCoralFacing($this->facing) << 2) | ($this->dead ? BlockLegacyMetadata::CORAL_FAN_HANG_FLAG_DEAD : 0) | $coralTypeFlag; - } - protected function writeStateToItemMeta() : int{ return CoralTypeIdMap::getInstance()->toId($this->coralType); } - public function getStateBitmask() : int{ - return 0b1111; + protected function decodeState(BlockDataReader $r) : void{ + parent::decodeState($r); + $this->facing = $r->readHorizontalFacing(); + } + + protected function encodeState(BlockDataWriter $w) : void{ + parent::encodeState($w); + $w->writeHorizontalFacing($this->facing); } public function asItem() : Item{ diff --git a/src/block/WallSign.php b/src/block/WallSign.php index 014ad4db0..07826eae7 100644 --- a/src/block/WallSign.php +++ b/src/block/WallSign.php @@ -23,7 +23,7 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\NormalHorizontalFacingInMetadataTrait; +use pocketmine\block\utils\HorizontalFacingTrait; use pocketmine\item\Item; use pocketmine\math\Axis; use pocketmine\math\Facing; @@ -32,7 +32,7 @@ use pocketmine\player\Player; use pocketmine\world\BlockTransaction; final class WallSign extends BaseSign{ - use NormalHorizontalFacingInMetadataTrait; + use HorizontalFacingTrait; protected function getSupportingFace() : int{ return Facing::opposite($this->facing); diff --git a/src/block/WeightedPressurePlate.php b/src/block/WeightedPressurePlate.php index 3fce83b1c..bdfae5082 100644 --- a/src/block/WeightedPressurePlate.php +++ b/src/block/WeightedPressurePlate.php @@ -24,20 +24,7 @@ declare(strict_types=1); namespace pocketmine\block; use pocketmine\block\utils\AnalogRedstoneSignalEmitterTrait; -use pocketmine\block\utils\BlockDataSerializer; abstract class WeightedPressurePlate extends PressurePlate{ use AnalogRedstoneSignalEmitterTrait; - - protected function writeStateToMeta() : int{ - return $this->signalStrength; - } - - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->signalStrength = BlockDataSerializer::readBoundedInt("signalStrength", $stateMeta, 0, 15); - } - - public function getStateBitmask() : int{ - return 0b1111; - } } diff --git a/src/block/Wool.php b/src/block/Wool.php index 993f0a038..b3a563a2e 100644 --- a/src/block/Wool.php +++ b/src/block/Wool.php @@ -23,11 +23,11 @@ declare(strict_types=1); namespace pocketmine\block; -use pocketmine\block\utils\ColorInMetadataTrait; +use pocketmine\block\utils\ColoredTrait; use pocketmine\block\utils\DyeColor; class Wool extends Opaque{ - use ColorInMetadataTrait; + use ColoredTrait; public function __construct(BlockIdentifier $idInfo, string $name, BlockBreakInfo $breakInfo){ $this->color = DyeColor::WHITE(); diff --git a/src/block/tile/Bell.php b/src/block/tile/Bell.php index 64707c02d..7a1e784e3 100644 --- a/src/block/tile/Bell.php +++ b/src/block/tile/Bell.php @@ -23,12 +23,12 @@ declare(strict_types=1); namespace pocketmine\block\tile; -use pocketmine\block\utils\BlockDataSerializer; use pocketmine\math\Facing; use pocketmine\nbt\tag\CompoundTag; use pocketmine\network\mcpe\protocol\BlockActorDataPacket; use pocketmine\network\mcpe\protocol\types\BlockPosition; use pocketmine\network\mcpe\protocol\types\CacheableNbt; +use pocketmine\utils\AssumptionFailedError; final class Bell extends Spawnable{ public const TAG_DIRECTION = "Direction"; //TAG_Int @@ -80,7 +80,13 @@ final class Bell extends Spawnable{ public function createFakeUpdatePacket(int $bellHitFace) : BlockActorDataPacket{ $nbt = $this->getSpawnCompound(); $nbt->setByte(self::TAG_RINGING, 1); - $nbt->setInt(self::TAG_DIRECTION, BlockDataSerializer::writeLegacyHorizontalFacing($bellHitFace)); + $nbt->setInt(self::TAG_DIRECTION, match($bellHitFace){ + Facing::SOUTH => 0, + Facing::WEST => 1, + Facing::NORTH => 2, + Facing::EAST => 3, + default => throw new AssumptionFailedError("Unreachable") + }); $nbt->setInt(self::TAG_TICKS, 0); return BlockActorDataPacket::create(BlockPosition::fromVector3($this->position), new CacheableNbt($nbt)); } diff --git a/src/block/tile/FlowerPot.php b/src/block/tile/FlowerPot.php index 2b39731ed..ec5987346 100644 --- a/src/block/tile/FlowerPot.php +++ b/src/block/tile/FlowerPot.php @@ -70,7 +70,7 @@ class FlowerPot extends Spawnable{ protected function writeSaveData(CompoundTag $nbt) : void{ if($this->plant !== null){ - $nbt->setTag(self::TAG_PLANT_BLOCK, GlobalBlockStateHandlers::getSerializer()->serialize($this->plant->getFullId())->toNbt()); + $nbt->setTag(self::TAG_PLANT_BLOCK, GlobalBlockStateHandlers::getSerializer()->serialize($this->plant->getStateId())->toNbt()); } } @@ -88,7 +88,7 @@ class FlowerPot extends Spawnable{ protected function addAdditionalSpawnData(CompoundTag $nbt) : void{ if($this->plant !== null){ - $nbt->setTag(self::TAG_PLANT_BLOCK, GlobalBlockStateHandlers::getSerializer()->serialize($this->plant->getFullId())->toNbt()); + $nbt->setTag(self::TAG_PLANT_BLOCK, GlobalBlockStateHandlers::getSerializer()->serialize($this->plant->getStateId())->toNbt()); } } } diff --git a/src/block/utils/AnalogRedstoneSignalEmitterTrait.php b/src/block/utils/AnalogRedstoneSignalEmitterTrait.php index 5fb4a3da1..0089e5a02 100644 --- a/src/block/utils/AnalogRedstoneSignalEmitterTrait.php +++ b/src/block/utils/AnalogRedstoneSignalEmitterTrait.php @@ -26,6 +26,14 @@ namespace pocketmine\block\utils; trait AnalogRedstoneSignalEmitterTrait{ protected int $signalStrength = 0; + protected function decodeState(BlockDataReader $r) : void{ + $this->signalStrength = $r->readBoundedInt(4, 0, 15); + } + + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeInt(4, $this->signalStrength); + } + public function getOutputSignalStrength() : int{ return $this->signalStrength; } /** @return $this */ diff --git a/src/block/utils/AnyFacingTrait.php b/src/block/utils/AnyFacingTrait.php index 0358d2683..0394d60a4 100644 --- a/src/block/utils/AnyFacingTrait.php +++ b/src/block/utils/AnyFacingTrait.php @@ -28,6 +28,14 @@ use pocketmine\math\Facing; trait AnyFacingTrait{ protected int $facing = Facing::DOWN; + protected function decodeState(BlockDataReader $r) : void{ + $this->facing = $r->readFacing(); + } + + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeFacing($this->facing); + } + public function getFacing() : int{ return $this->facing; } /** @return $this */ diff --git a/src/block/utils/BlockDataReader.php b/src/block/utils/BlockDataReader.php new file mode 100644 index 000000000..e1e7bb689 --- /dev/null +++ b/src/block/utils/BlockDataReader.php @@ -0,0 +1,100 @@ +maxBits - $this->offset; + if($bits > $bitsLeft){ + throw new \InvalidArgumentException("No bits left in buffer (need $bits, have $bitsLeft"); + } + + $value = ($this->value >> $this->offset) & ~(~0 << $bits); + $this->offset += $bits; + return $value; + } + + public function readBoundedInt(int $bits, int $min, int $max) : int{ + $result = $this->readInt($bits); + if($result < $min || $result > $max){ + throw new InvalidBlockStateException("Value is outside the range $min - $max"); + } + return $result; + } + + public function readBool() : bool{ + return $this->readInt(1) === 1; + } + + public function readHorizontalFacing() : int{ + return match($this->readInt(2)){ + 0 => Facing::NORTH, + 1 => Facing::EAST, + 2 => Facing::SOUTH, + 3 => Facing::WEST, + default => throw new AssumptionFailedError("Unreachable") + }; + } + + public function readFacing() : int{ + return match($this->readInt(3)){ + 0 => Facing::DOWN, + 1 => Facing::UP, + 2 => Facing::NORTH, + 3 => Facing::SOUTH, + 4 => Facing::WEST, + 5 => Facing::EAST, + default => throw new InvalidBlockStateException("Invalid facing value") + }; + } + + public function readAxis() : int{ + return match($this->readInt(2)){ + 0 => Axis::X, + 1 => Axis::Z, + 2 => Axis::Y, + default => throw new InvalidBlockStateException("Invalid axis value") + }; + } + + public function readHorizontalAxis() : int{ + return match($this->readInt(1)){ + 0 => Axis::X, + 1 => Axis::Z, + default => throw new AssumptionFailedError("Unreachable") + }; + } +} diff --git a/src/block/utils/BlockDataReaderHelper.php b/src/block/utils/BlockDataReaderHelper.php new file mode 100644 index 000000000..c0dba20ef --- /dev/null +++ b/src/block/utils/BlockDataReaderHelper.php @@ -0,0 +1,164 @@ +readInt(2)){ + 0 => \pocketmine\block\utils\BellAttachmentType::CEILING(), + 1 => \pocketmine\block\utils\BellAttachmentType::FLOOR(), + 2 => \pocketmine\block\utils\BellAttachmentType::ONE_WALL(), + 3 => \pocketmine\block\utils\BellAttachmentType::TWO_WALLS(), + default => throw new \pocketmine\block\utils\InvalidBlockStateException("Invalid serialized value for BellAttachmentType") + }; + } + + /** + * @return \pocketmine\block\utils\BrewingStandSlot[] + * @phpstan-return array + */ + public static function readBrewingStandSlotKeySet(BlockDataReader $r) : array{ + $result = []; + foreach([ + \pocketmine\block\utils\BrewingStandSlot::EAST(), + \pocketmine\block\utils\BrewingStandSlot::NORTHWEST(), + \pocketmine\block\utils\BrewingStandSlot::SOUTHWEST(), + ] as $member){ + if($r->readBool()){ + $result[$member->id()] = $member; + } + } + return $result; + } + + public static function readCoralType(BlockDataReader $r) : CoralType{ + return match($r->readInt(3)){ + 0 => \pocketmine\block\utils\CoralType::BRAIN(), + 1 => \pocketmine\block\utils\CoralType::BUBBLE(), + 2 => \pocketmine\block\utils\CoralType::FIRE(), + 3 => \pocketmine\block\utils\CoralType::HORN(), + 4 => \pocketmine\block\utils\CoralType::TUBE(), + default => throw new \pocketmine\block\utils\InvalidBlockStateException("Invalid serialized value for CoralType") + }; + } + + public static function readDyeColor(BlockDataReader $r) : DyeColor{ + return match($r->readInt(4)){ + 0 => \pocketmine\block\utils\DyeColor::BLACK(), + 1 => \pocketmine\block\utils\DyeColor::BLUE(), + 2 => \pocketmine\block\utils\DyeColor::BROWN(), + 3 => \pocketmine\block\utils\DyeColor::CYAN(), + 4 => \pocketmine\block\utils\DyeColor::GRAY(), + 5 => \pocketmine\block\utils\DyeColor::GREEN(), + 6 => \pocketmine\block\utils\DyeColor::LIGHT_BLUE(), + 7 => \pocketmine\block\utils\DyeColor::LIGHT_GRAY(), + 8 => \pocketmine\block\utils\DyeColor::LIME(), + 9 => \pocketmine\block\utils\DyeColor::MAGENTA(), + 10 => \pocketmine\block\utils\DyeColor::ORANGE(), + 11 => \pocketmine\block\utils\DyeColor::PINK(), + 12 => \pocketmine\block\utils\DyeColor::PURPLE(), + 13 => \pocketmine\block\utils\DyeColor::RED(), + 14 => \pocketmine\block\utils\DyeColor::WHITE(), + 15 => \pocketmine\block\utils\DyeColor::YELLOW(), + default => throw new \pocketmine\block\utils\InvalidBlockStateException("Invalid serialized value for DyeColor") + }; + } + + public static function readLeverFacing(BlockDataReader $r) : LeverFacing{ + return match($r->readInt(3)){ + 0 => \pocketmine\block\utils\LeverFacing::DOWN_AXIS_X(), + 1 => \pocketmine\block\utils\LeverFacing::DOWN_AXIS_Z(), + 2 => \pocketmine\block\utils\LeverFacing::EAST(), + 3 => \pocketmine\block\utils\LeverFacing::NORTH(), + 4 => \pocketmine\block\utils\LeverFacing::SOUTH(), + 5 => \pocketmine\block\utils\LeverFacing::UP_AXIS_X(), + 6 => \pocketmine\block\utils\LeverFacing::UP_AXIS_Z(), + 7 => \pocketmine\block\utils\LeverFacing::WEST(), + default => throw new \pocketmine\block\utils\InvalidBlockStateException("Invalid serialized value for LeverFacing") + }; + } + + public static function readMushroomBlockType(BlockDataReader $r) : MushroomBlockType{ + return match($r->readInt(4)){ + 0 => \pocketmine\block\utils\MushroomBlockType::ALL_CAP(), + 1 => \pocketmine\block\utils\MushroomBlockType::CAP_EAST(), + 2 => \pocketmine\block\utils\MushroomBlockType::CAP_MIDDLE(), + 3 => \pocketmine\block\utils\MushroomBlockType::CAP_NORTH(), + 4 => \pocketmine\block\utils\MushroomBlockType::CAP_NORTHEAST(), + 5 => \pocketmine\block\utils\MushroomBlockType::CAP_NORTHWEST(), + 6 => \pocketmine\block\utils\MushroomBlockType::CAP_SOUTH(), + 7 => \pocketmine\block\utils\MushroomBlockType::CAP_SOUTHEAST(), + 8 => \pocketmine\block\utils\MushroomBlockType::CAP_SOUTHWEST(), + 9 => \pocketmine\block\utils\MushroomBlockType::CAP_WEST(), + 10 => \pocketmine\block\utils\MushroomBlockType::PORES(), + default => throw new \pocketmine\block\utils\InvalidBlockStateException("Invalid serialized value for MushroomBlockType") + }; + } + + public static function readSkullType(BlockDataReader $r) : SkullType{ + return match($r->readInt(3)){ + 0 => \pocketmine\block\utils\SkullType::CREEPER(), + 1 => \pocketmine\block\utils\SkullType::DRAGON(), + 2 => \pocketmine\block\utils\SkullType::PLAYER(), + 3 => \pocketmine\block\utils\SkullType::SKELETON(), + 4 => \pocketmine\block\utils\SkullType::WITHER_SKELETON(), + 5 => \pocketmine\block\utils\SkullType::ZOMBIE(), + default => throw new \pocketmine\block\utils\InvalidBlockStateException("Invalid serialized value for SkullType") + }; + } + + public static function readSlabType(BlockDataReader $r) : SlabType{ + return match($r->readInt(2)){ + 0 => \pocketmine\block\utils\SlabType::BOTTOM(), + 1 => \pocketmine\block\utils\SlabType::DOUBLE(), + 2 => \pocketmine\block\utils\SlabType::TOP(), + default => throw new \pocketmine\block\utils\InvalidBlockStateException("Invalid serialized value for SlabType") + }; + } + + public static function readStairShape(BlockDataReader $r) : StairShape{ + return match($r->readInt(3)){ + 0 => \pocketmine\block\utils\StairShape::INNER_LEFT(), + 1 => \pocketmine\block\utils\StairShape::INNER_RIGHT(), + 2 => \pocketmine\block\utils\StairShape::OUTER_LEFT(), + 3 => \pocketmine\block\utils\StairShape::OUTER_RIGHT(), + 4 => \pocketmine\block\utils\StairShape::STRAIGHT(), + default => throw new \pocketmine\block\utils\InvalidBlockStateException("Invalid serialized value for StairShape") + }; + } + + public static function readTreeType(BlockDataReader $r) : TreeType{ + return match($r->readInt(3)){ + 0 => \pocketmine\block\utils\TreeType::ACACIA(), + 1 => \pocketmine\block\utils\TreeType::BIRCH(), + 2 => \pocketmine\block\utils\TreeType::DARK_OAK(), + 3 => \pocketmine\block\utils\TreeType::JUNGLE(), + 4 => \pocketmine\block\utils\TreeType::OAK(), + 5 => \pocketmine\block\utils\TreeType::SPRUCE(), + default => throw new \pocketmine\block\utils\InvalidBlockStateException("Invalid serialized value for TreeType") + }; + } + +} diff --git a/src/block/utils/BlockDataSerializer.php b/src/block/utils/BlockDataSerializer.php deleted file mode 100644 index 1d7ae28fa..000000000 --- a/src/block/utils/BlockDataSerializer.php +++ /dev/null @@ -1,158 +0,0 @@ - Facing::DOWN, - 1 => Facing::UP, - 2 => Facing::NORTH, - 3 => Facing::SOUTH, - 4 => Facing::WEST, - 5 => Facing::EAST - ][$raw] ?? null; - if($result === null){ - throw new InvalidBlockStateException("Invalid facing $raw"); - } - return $result; - } - - public static function writeFacing(int $facing) : int{ - $result = [ //again, for redundancy - Facing::DOWN => 0, - Facing::UP => 1, - Facing::NORTH => 2, - Facing::SOUTH => 3, - Facing::WEST => 4, - Facing::EAST => 5 - ][$facing] ?? null; - if($result === null){ - throw new \InvalidArgumentException("Invalid facing $facing"); - } - return $result; - } - - /** - * @throws InvalidBlockStateException - */ - public static function readHorizontalFacing(int $facing) : int{ - $facing = self::readFacing($facing); - if(Facing::axis($facing) === Axis::Y){ - throw new InvalidBlockStateException("Invalid Y-axis facing $facing"); - } - return $facing; - } - - public static function writeHorizontalFacing(int $facing) : int{ - if(Facing::axis($facing) === Axis::Y){ - throw new \InvalidArgumentException("Invalid Y-axis facing"); - } - return self::writeFacing($facing); - } - - /** - * @throws InvalidBlockStateException - */ - public static function readLegacyHorizontalFacing(int $raw) : int{ - $result = [ //again, for redundancy - 0 => Facing::SOUTH, - 1 => Facing::WEST, - 2 => Facing::NORTH, - 3 => Facing::EAST - ][$raw] ?? null; - if($result === null){ - throw new InvalidBlockStateException("Invalid legacy facing $raw"); - } - return $result; - } - - public static function writeLegacyHorizontalFacing(int $facing) : int{ - $result = [ - Facing::SOUTH => 0, - Facing::WEST => 1, - Facing::NORTH => 2, - Facing::EAST => 3 - ][$facing] ?? null; - if($result === null){ - throw new \InvalidArgumentException("Invalid Y-axis facing"); - } - return $result; - } - - /** - * @throws InvalidBlockStateException - */ - public static function read5MinusHorizontalFacing(int $value) : int{ - return self::readHorizontalFacing(5 - ($value & 0x03)); - } - - public static function write5MinusHorizontalFacing(int $value) : int{ - return 5 - self::writeHorizontalFacing($value); - } - - public static function readCoralFacing(int $value) : int{ - $result = [ - 0 => Facing::WEST, - 1 => Facing::EAST, - 2 => Facing::NORTH, - 3 => Facing::SOUTH - ][$value] ?? null; - if($result === null){ - throw new InvalidBlockStateException("Invalid coral facing $value"); - } - return $result; - } - - public static function writeCoralFacing(int $value) : int{ - $result = [ - Facing::WEST => 0, - Facing::EAST => 1, - Facing::NORTH => 2, - Facing::SOUTH => 3 - ][$value] ?? null; - if($result === null){ - throw new \InvalidArgumentException("Invalid Y-axis facing $value"); - } - return $result; - } - - public static function readBoundedInt(string $name, int $v, int $min, int $max) : int{ - if($v < $min || $v > $max){ - throw new InvalidBlockStateException("$name should be in range $min - $max, got $v"); - } - return $v; - } -} diff --git a/src/block/utils/BlockDataWriter.php b/src/block/utils/BlockDataWriter.php new file mode 100644 index 000000000..9b37a8153 --- /dev/null +++ b/src/block/utils/BlockDataWriter.php @@ -0,0 +1,101 @@ +offset + $bits > $this->maxBits){ + throw new \InvalidArgumentException("Bit buffer cannot be larger than $this->maxBits bits (already have $this->offset bits)"); + } + if(($value & (~0 << $bits)) !== 0){ + throw new \InvalidArgumentException("Value $value does not fit into $bits bits"); + } + + $this->value |= ($value << $this->offset); + $this->offset += $bits; + + return $this; + } + + /** @return $this */ + public function writeBool(bool $value) : self{ + return $this->writeInt(1, $value ? 1 : 0); + } + + /** @return $this */ + public function writeHorizontalFacing(int $facing) : self{ + return $this->writeInt(2, match($facing){ + Facing::NORTH => 0, + Facing::EAST => 1, + Facing::SOUTH => 2, + Facing::WEST => 3, + default => throw new \InvalidArgumentException("Invalid horizontal facing $facing") + }); + } + + public function writeFacing(int $facing) : self{ + return $this->writeInt(3, match($facing){ + 0 => Facing::DOWN, + 1 => Facing::UP, + 2 => Facing::NORTH, + 3 => Facing::SOUTH, + 4 => Facing::WEST, + 5 => Facing::EAST, + default => throw new \InvalidArgumentException("Invalid facing $facing") + }); + } + + public function writeAxis(int $axis) : self{ + return $this->writeInt(2, match($axis){ + Axis::X => 0, + Axis::Z => 1, + Axis::Y => 2, + default => throw new \InvalidArgumentException("Invalid axis $axis") + }); + } + + public function writeHorizontalAxis(int $axis) : self{ + return $this->writeInt(1, match($axis){ + Axis::X => 0, + Axis::Z => 1, + default => throw new \InvalidArgumentException("Invalid horizontal axis $axis") + }); + } + + public function getValue() : int{ return $this->value; } + + public function getOffset() : int{ return $this->offset; } +} diff --git a/src/block/utils/BlockDataWriterHelper.php b/src/block/utils/BlockDataWriterHelper.php new file mode 100644 index 000000000..f8f00060d --- /dev/null +++ b/src/block/utils/BlockDataWriterHelper.php @@ -0,0 +1,160 @@ +writeInt(2, match($value){ + \pocketmine\block\utils\BellAttachmentType::CEILING() => 0, + \pocketmine\block\utils\BellAttachmentType::FLOOR() => 1, + \pocketmine\block\utils\BellAttachmentType::ONE_WALL() => 2, + \pocketmine\block\utils\BellAttachmentType::TWO_WALLS() => 3, + default => throw new \pocketmine\utils\AssumptionFailedError("All BellAttachmentType cases should be covered") + }); + } + + /** + * @param \pocketmine\block\utils\BrewingStandSlot[] $value + * @phpstan-param array $value + */ + public static function writeBrewingStandSlotKeySet(BlockDataWriter $w, array $value) : void{ + foreach([ + \pocketmine\block\utils\BrewingStandSlot::EAST(), + \pocketmine\block\utils\BrewingStandSlot::NORTHWEST(), + \pocketmine\block\utils\BrewingStandSlot::SOUTHWEST(), + ] as $member){ + $w->writeBool(isset($value[$member->id()])); + } + } + + public static function writeCoralType(BlockDataWriter $w, CoralType $value) : void{ + $w->writeInt(3, match($value){ + \pocketmine\block\utils\CoralType::BRAIN() => 0, + \pocketmine\block\utils\CoralType::BUBBLE() => 1, + \pocketmine\block\utils\CoralType::FIRE() => 2, + \pocketmine\block\utils\CoralType::HORN() => 3, + \pocketmine\block\utils\CoralType::TUBE() => 4, + default => throw new \pocketmine\utils\AssumptionFailedError("All CoralType cases should be covered") + }); + } + + public static function writeDyeColor(BlockDataWriter $w, DyeColor $value) : void{ + $w->writeInt(4, match($value){ + \pocketmine\block\utils\DyeColor::BLACK() => 0, + \pocketmine\block\utils\DyeColor::BLUE() => 1, + \pocketmine\block\utils\DyeColor::BROWN() => 2, + \pocketmine\block\utils\DyeColor::CYAN() => 3, + \pocketmine\block\utils\DyeColor::GRAY() => 4, + \pocketmine\block\utils\DyeColor::GREEN() => 5, + \pocketmine\block\utils\DyeColor::LIGHT_BLUE() => 6, + \pocketmine\block\utils\DyeColor::LIGHT_GRAY() => 7, + \pocketmine\block\utils\DyeColor::LIME() => 8, + \pocketmine\block\utils\DyeColor::MAGENTA() => 9, + \pocketmine\block\utils\DyeColor::ORANGE() => 10, + \pocketmine\block\utils\DyeColor::PINK() => 11, + \pocketmine\block\utils\DyeColor::PURPLE() => 12, + \pocketmine\block\utils\DyeColor::RED() => 13, + \pocketmine\block\utils\DyeColor::WHITE() => 14, + \pocketmine\block\utils\DyeColor::YELLOW() => 15, + default => throw new \pocketmine\utils\AssumptionFailedError("All DyeColor cases should be covered") + }); + } + + public static function writeLeverFacing(BlockDataWriter $w, LeverFacing $value) : void{ + $w->writeInt(3, match($value){ + \pocketmine\block\utils\LeverFacing::DOWN_AXIS_X() => 0, + \pocketmine\block\utils\LeverFacing::DOWN_AXIS_Z() => 1, + \pocketmine\block\utils\LeverFacing::EAST() => 2, + \pocketmine\block\utils\LeverFacing::NORTH() => 3, + \pocketmine\block\utils\LeverFacing::SOUTH() => 4, + \pocketmine\block\utils\LeverFacing::UP_AXIS_X() => 5, + \pocketmine\block\utils\LeverFacing::UP_AXIS_Z() => 6, + \pocketmine\block\utils\LeverFacing::WEST() => 7, + default => throw new \pocketmine\utils\AssumptionFailedError("All LeverFacing cases should be covered") + }); + } + + public static function writeMushroomBlockType(BlockDataWriter $w, MushroomBlockType $value) : void{ + $w->writeInt(4, match($value){ + \pocketmine\block\utils\MushroomBlockType::ALL_CAP() => 0, + \pocketmine\block\utils\MushroomBlockType::CAP_EAST() => 1, + \pocketmine\block\utils\MushroomBlockType::CAP_MIDDLE() => 2, + \pocketmine\block\utils\MushroomBlockType::CAP_NORTH() => 3, + \pocketmine\block\utils\MushroomBlockType::CAP_NORTHEAST() => 4, + \pocketmine\block\utils\MushroomBlockType::CAP_NORTHWEST() => 5, + \pocketmine\block\utils\MushroomBlockType::CAP_SOUTH() => 6, + \pocketmine\block\utils\MushroomBlockType::CAP_SOUTHEAST() => 7, + \pocketmine\block\utils\MushroomBlockType::CAP_SOUTHWEST() => 8, + \pocketmine\block\utils\MushroomBlockType::CAP_WEST() => 9, + \pocketmine\block\utils\MushroomBlockType::PORES() => 10, + default => throw new \pocketmine\utils\AssumptionFailedError("All MushroomBlockType cases should be covered") + }); + } + + public static function writeSkullType(BlockDataWriter $w, SkullType $value) : void{ + $w->writeInt(3, match($value){ + \pocketmine\block\utils\SkullType::CREEPER() => 0, + \pocketmine\block\utils\SkullType::DRAGON() => 1, + \pocketmine\block\utils\SkullType::PLAYER() => 2, + \pocketmine\block\utils\SkullType::SKELETON() => 3, + \pocketmine\block\utils\SkullType::WITHER_SKELETON() => 4, + \pocketmine\block\utils\SkullType::ZOMBIE() => 5, + default => throw new \pocketmine\utils\AssumptionFailedError("All SkullType cases should be covered") + }); + } + + public static function writeSlabType(BlockDataWriter $w, SlabType $value) : void{ + $w->writeInt(2, match($value){ + \pocketmine\block\utils\SlabType::BOTTOM() => 0, + \pocketmine\block\utils\SlabType::DOUBLE() => 1, + \pocketmine\block\utils\SlabType::TOP() => 2, + default => throw new \pocketmine\utils\AssumptionFailedError("All SlabType cases should be covered") + }); + } + + public static function writeStairShape(BlockDataWriter $w, StairShape $value) : void{ + $w->writeInt(3, match($value){ + \pocketmine\block\utils\StairShape::INNER_LEFT() => 0, + \pocketmine\block\utils\StairShape::INNER_RIGHT() => 1, + \pocketmine\block\utils\StairShape::OUTER_LEFT() => 2, + \pocketmine\block\utils\StairShape::OUTER_RIGHT() => 3, + \pocketmine\block\utils\StairShape::STRAIGHT() => 4, + default => throw new \pocketmine\utils\AssumptionFailedError("All StairShape cases should be covered") + }); + } + + public static function writeTreeType(BlockDataWriter $w, TreeType $value) : void{ + $w->writeInt(3, match($value){ + \pocketmine\block\utils\TreeType::ACACIA() => 0, + \pocketmine\block\utils\TreeType::BIRCH() => 1, + \pocketmine\block\utils\TreeType::DARK_OAK() => 2, + \pocketmine\block\utils\TreeType::JUNGLE() => 3, + \pocketmine\block\utils\TreeType::OAK() => 4, + \pocketmine\block\utils\TreeType::SPRUCE() => 5, + default => throw new \pocketmine\utils\AssumptionFailedError("All TreeType cases should be covered") + }); + } + +} diff --git a/src/block/utils/ColorInMetadataTrait.php b/src/block/utils/ColorInMetadataTrait.php deleted file mode 100644 index 232db837f..000000000 --- a/src/block/utils/ColorInMetadataTrait.php +++ /dev/null @@ -1,63 +0,0 @@ -fromId($stateMeta); - if($color === null){ - throw new InvalidBlockStateException("No dye colour corresponds to ID $stateMeta"); - } - $this->color = $color; - } - - /** - * @see Block::writeStateToMeta() - */ - protected function writeStateToMeta() : int{ - return DyeColorIdMap::getInstance()->toId($this->color); - } - - /** - * @see Block::writeStateToItemMeta() - */ - protected function writeStateToItemMeta() : int{ - return DyeColorIdMap::getInstance()->toId($this->color); - } - - /** - * @see Block::getStateBitmask() - */ - public function getStateBitmask() : int{ - return 0b1111; - } -} diff --git a/src/block/utils/ColoredTrait.php b/src/block/utils/ColoredTrait.php index 3ed323ca3..908f1bf6a 100644 --- a/src/block/utils/ColoredTrait.php +++ b/src/block/utils/ColoredTrait.php @@ -23,10 +23,30 @@ declare(strict_types=1); namespace pocketmine\block\utils; +use pocketmine\block\Block; +use pocketmine\data\bedrock\DyeColorIdMap; + trait ColoredTrait{ /** @var DyeColor */ private $color; + /** + * @see Block::writeStateToItemMeta() + */ + protected function writeStateToItemMeta() : int{ + return DyeColorIdMap::getInstance()->toId($this->color); + } + + /** @see Block::decodeState() */ + protected function decodeState(BlockDataReader $r) : void{ + $this->color = BlockDataReaderHelper::readDyeColor($r); + } + + /** @see Block::encodeState() */ + protected function encodeState(BlockDataWriter $w) : void{ + BlockDataWriterHelper::writeDyeColor($w, $this->color); + } + public function getColor() : DyeColor{ return $this->color; } /** @return $this */ diff --git a/src/block/utils/CoralTypeTrait.php b/src/block/utils/CoralTypeTrait.php index afeac309c..7f7f5be8f 100644 --- a/src/block/utils/CoralTypeTrait.php +++ b/src/block/utils/CoralTypeTrait.php @@ -24,10 +24,19 @@ declare(strict_types=1); namespace pocketmine\block\utils; trait CoralTypeTrait{ - protected CoralType $coralType; protected bool $dead = false; + protected function decodeState(BlockDataReader $r) : void{ + $this->coralType = BlockDataReaderHelper::readCoralType($r); + $this->dead = $r->readBool(); + } + + protected function encodeState(BlockDataWriter $w) : void{ + BlockDataWriterHelper::writeCoralType($w, $this->coralType); + $w->writeBool($this->dead); + } + public function getCoralType() : CoralType{ return $this->coralType; } /** @return $this */ diff --git a/src/block/utils/FallableTrait.php b/src/block/utils/FallableTrait.php index 2e5941f9c..446157739 100644 --- a/src/block/utils/FallableTrait.php +++ b/src/block/utils/FallableTrait.php @@ -43,10 +43,6 @@ trait FallableTrait{ abstract protected function getPosition() : Position; - abstract protected function getId() : int; - - abstract protected function getMeta() : int; - public function onNearbyBlockChange() : void{ $pos = $this->getPosition(); $down = $pos->getWorld()->getBlock($pos->getSide(Facing::DOWN)); diff --git a/src/block/utils/HorizontalFacingTrait.php b/src/block/utils/HorizontalFacingTrait.php index eefc3f427..13a3d913c 100644 --- a/src/block/utils/HorizontalFacingTrait.php +++ b/src/block/utils/HorizontalFacingTrait.php @@ -29,6 +29,14 @@ use pocketmine\math\Facing; trait HorizontalFacingTrait{ protected int $facing = Facing::NORTH; + protected function decodeState(BlockDataReader $r) : void{ + $this->facing = $r->readHorizontalFacing(); + } + + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeHorizontalFacing($this->facing); + } + public function getFacing() : int{ return $this->facing; } /** @return $this */ diff --git a/src/block/utils/NormalHorizontalFacingInMetadataTrait.php b/src/block/utils/NormalHorizontalFacingInMetadataTrait.php deleted file mode 100644 index f41efd98a..000000000 --- a/src/block/utils/NormalHorizontalFacingInMetadataTrait.php +++ /dev/null @@ -1,40 +0,0 @@ -facing); - } - - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->facing = BlockDataSerializer::readHorizontalFacing($stateMeta); - } - - public function getStateBitmask() : int{ - return 0b111; - } -} diff --git a/src/block/utils/PillarRotationInMetadataTrait.php b/src/block/utils/PillarRotationInMetadataTrait.php deleted file mode 100644 index 229ed9d0b..000000000 --- a/src/block/utils/PillarRotationInMetadataTrait.php +++ /dev/null @@ -1,76 +0,0 @@ -writeAxisToMeta(); - } - - /** - * @see Block::readStateFromData() - */ - public function readStateFromData(int $id, int $stateMeta) : void{ - $this->readAxisFromMeta($stateMeta); - } - - /** - * @see Block::getStateBitmask() - */ - public function getStateBitmask() : int{ - return 0b11 << $this->getAxisMetaShift(); - } - - protected function readAxisFromMeta(int $meta) : void{ - $axis = $meta >> $this->getAxisMetaShift(); - $mapped = [ - 0 => Axis::Y, - 1 => Axis::X, - 2 => Axis::Z - ][$axis] ?? null; - if($mapped === null){ - throw new InvalidBlockStateException("Invalid axis meta $axis"); - } - $this->axis = $mapped; - } - - protected function writeAxisToMeta() : int{ - return [ - Axis::Y => 0, - Axis::Z => 2, - Axis::X => 1 - ][$this->axis] << $this->getAxisMetaShift(); - } -} diff --git a/src/block/utils/PillarRotationTrait.php b/src/block/utils/PillarRotationTrait.php index b38c0ffe5..3da41373c 100644 --- a/src/block/utils/PillarRotationTrait.php +++ b/src/block/utils/PillarRotationTrait.php @@ -34,6 +34,14 @@ use pocketmine\world\BlockTransaction; trait PillarRotationTrait{ protected int $axis = Axis::Y; + protected function decodeState(BlockDataReader $r) : void{ + $this->axis = $r->readAxis(); + } + + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeAxis($this->axis); + } + /** @see Axis */ public function getAxis() : int{ return $this->axis; } diff --git a/src/block/utils/RailPoweredByRedstoneTrait.php b/src/block/utils/RailPoweredByRedstoneTrait.php index 044dd7a49..c65f0c8b9 100644 --- a/src/block/utils/RailPoweredByRedstoneTrait.php +++ b/src/block/utils/RailPoweredByRedstoneTrait.php @@ -23,22 +23,16 @@ declare(strict_types=1); namespace pocketmine\block\utils; -use pocketmine\block\BlockLegacyMetadata; - trait RailPoweredByRedstoneTrait{ use PoweredByRedstoneTrait; - public function readStateFromData(int $id, int $stateMeta) : void{ - parent::readStateFromData($id, $stateMeta & ~BlockLegacyMetadata::REDSTONE_RAIL_FLAG_POWERED); - $this->powered = ($stateMeta & BlockLegacyMetadata::REDSTONE_RAIL_FLAG_POWERED) !== 0; + protected function decodeState(BlockDataReader $r) : void{ + parent::decodeState($r); + $this->powered = $r->readBool(); } - protected function writeStateToMeta() : int{ - //TODO: railShape won't be plain metadata in the future - return parent::writeStateToMeta() | ($this->powered ? BlockLegacyMetadata::REDSTONE_RAIL_FLAG_POWERED : 0); - } - - public function getStateBitmask() : int{ - return 0b1111; + protected function encodeState(BlockDataWriter $w) : void{ + parent::encodeState($w); + $w->writeBool($this->powered); } } diff --git a/src/block/utils/SignLikeRotationTrait.php b/src/block/utils/SignLikeRotationTrait.php index d9b156895..e35bf3574 100644 --- a/src/block/utils/SignLikeRotationTrait.php +++ b/src/block/utils/SignLikeRotationTrait.php @@ -29,6 +29,14 @@ trait SignLikeRotationTrait{ /** @var int */ private $rotation = 0; + protected function decodeState(BlockDataReader $r) : void{ + $this->rotation = $r->readBoundedInt(4, 0, 15); + } + + protected function encodeState(BlockDataWriter $w) : void{ + $w->writeInt(4, $this->rotation); + } + public function getRotation() : int{ return $this->rotation; } /** @return $this */ diff --git a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php index 1cece6403..f210726c4 100644 --- a/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php +++ b/src/data/bedrock/block/convert/BlockStateToBlockObjectDeserializer.php @@ -58,7 +58,7 @@ final class BlockStateToBlockObjectDeserializer implements BlockStateDeserialize } public function deserialize(BlockStateData $stateData) : int{ - return $this->deserializeBlock($stateData)->getFullId(); + return $this->deserializeBlock($stateData)->getStateId(); } /** @phpstan-param \Closure(Reader) : Block $c */ diff --git a/src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php b/src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php index fc015b358..0822fe817 100644 --- a/src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php +++ b/src/data/bedrock/block/upgrade/LegacyBlockStateMapper.php @@ -52,7 +52,7 @@ final class LegacyBlockStateMapper{ return $this->fromStringIdMeta($stringId, $meta); } - public static function loadFromString(string $data, LegacyBlockIdToStringIdMap $idMap) : self{ + public static function loadFromString(string $data, LegacyBlockIdToStringIdMap $idMap, BlockStateUpgrader $blockStateUpgrader) : self{ $mappingTable = []; $legacyStateMapReader = new BinaryStream($data); @@ -64,7 +64,7 @@ final class LegacyBlockStateMapper{ $offset = $legacyStateMapReader->getOffset(); $state = $nbtReader->read($legacyStateMapReader->getBuffer(), $offset)->mustGetCompoundTag(); $legacyStateMapReader->setOffset($offset); - $mappingTable[$id][$meta] = BlockStateData::fromNbt($state); + $mappingTable[$id][$meta] = $blockStateUpgrader->upgrade(BlockStateData::fromNbt($state)); } return new self($mappingTable, $idMap); diff --git a/src/data/bedrock/item/ItemSerializer.php b/src/data/bedrock/item/ItemSerializer.php index 5613f85ec..0c704fe00 100644 --- a/src/data/bedrock/item/ItemSerializer.php +++ b/src/data/bedrock/item/ItemSerializer.php @@ -191,7 +191,7 @@ final class ItemSerializer{ */ private function standardBlock(Block $block) : Data{ try{ - $blockStateData = $this->blockStateSerializer->serialize($block->getFullId()); + $blockStateData = $this->blockStateSerializer->serialize($block->getStateId()); }catch(BlockStateSerializeException $e){ throw new ItemTypeSerializeException($e->getMessage(), 0, $e); } diff --git a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php index ba42e4039..905abb208 100644 --- a/src/data/bedrock/item/upgrade/ItemDataUpgrader.php +++ b/src/data/bedrock/item/upgrade/ItemDataUpgrader.php @@ -104,8 +104,6 @@ final class ItemDataUpgrader{ if($blockStateData === null){ throw new SavedDataLoadingException("Expected a blockstate to be associated with this block"); } - //the block data upgrader returns states from 1.18.10, which need to be updated to the current version the usual way - $blockStateData = $this->blockDataUpgrader->getBlockStateUpgrader()->upgrade($blockStateData); }else{ //probably a standard item $blockStateData = null; diff --git a/src/entity/object/FallingBlock.php b/src/entity/object/FallingBlock.php index 22f198167..a7e495a24 100644 --- a/src/entity/object/FallingBlock.php +++ b/src/entity/object/FallingBlock.php @@ -152,7 +152,7 @@ class FallingBlock extends Entity{ public function saveNBT() : CompoundTag{ $nbt = parent::saveNBT(); - $nbt->setTag(self::TAG_FALLING_BLOCK, GlobalBlockStateHandlers::getSerializer()->serialize($this->block->getFullId())->toNbt()); + $nbt->setTag(self::TAG_FALLING_BLOCK, GlobalBlockStateHandlers::getSerializer()->serialize($this->block->getStateId())->toNbt()); return $nbt; } @@ -160,7 +160,7 @@ class FallingBlock extends Entity{ protected function syncNetworkData(EntityMetadataCollection $properties) : void{ parent::syncNetworkData($properties); - $properties->setInt(EntityMetadataProperties::VARIANT, RuntimeBlockMapping::getInstance()->toRuntimeId($this->block->getFullId())); + $properties->setInt(EntityMetadataProperties::VARIANT, RuntimeBlockMapping::getInstance()->toRuntimeId($this->block->getStateId())); } public function getOffsetPosition(Vector3 $vector3) : Vector3{ diff --git a/src/item/ItemBlock.php b/src/item/ItemBlock.php index 9df23067a..7bb358fec 100644 --- a/src/item/ItemBlock.php +++ b/src/item/ItemBlock.php @@ -37,7 +37,7 @@ final class ItemBlock extends Item{ public function __construct(ItemIdentifier $identifier, Block $block){ parent::__construct($identifier, $block->getName()); - $this->blockFullId = $block->getFullId(); + $this->blockFullId = $block->getStateId(); } public function getBlock(?int $clickedFace = null) : Block{ diff --git a/src/item/ItemBlockWallOrFloor.php b/src/item/ItemBlockWallOrFloor.php index 4151d1d2f..cb706965a 100644 --- a/src/item/ItemBlockWallOrFloor.php +++ b/src/item/ItemBlockWallOrFloor.php @@ -34,8 +34,8 @@ class ItemBlockWallOrFloor extends Item{ public function __construct(ItemIdentifier $identifier, Block $floorVariant, Block $wallVariant){ parent::__construct($identifier, $floorVariant->getName()); - $this->floorVariant = $floorVariant->getFullId(); - $this->wallVariant = $wallVariant->getFullId(); + $this->floorVariant = $floorVariant->getStateId(); + $this->wallVariant = $wallVariant->getStateId(); } public function getBlock(?int $clickedFace = null) : Block{ diff --git a/src/item/ItemFactory.php b/src/item/ItemFactory.php index 678067c03..ed992133a 100644 --- a/src/item/ItemFactory.php +++ b/src/item/ItemFactory.php @@ -31,6 +31,7 @@ use pocketmine\block\utils\RecordType; use pocketmine\block\utils\SkullType; use pocketmine\block\utils\TreeType; use pocketmine\block\VanillaBlocks as Blocks; +use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\bedrock\CompoundTypeIds; use pocketmine\data\bedrock\DyeColorIdMap; use pocketmine\data\bedrock\EntityLegacyIds; @@ -47,6 +48,7 @@ use pocketmine\math\Vector3; use pocketmine\nbt\NbtException; use pocketmine\nbt\tag\CompoundTag; use pocketmine\utils\SingletonTrait; +use pocketmine\world\format\io\GlobalBlockStateHandlers; use pocketmine\world\World; /** @@ -467,7 +469,16 @@ class ItemFactory{ } }elseif($id < 256){ //intentionally includes negatives, for extended block IDs //TODO: do not assume that item IDs and block IDs are the same or related - $item = new ItemBlock(new IID($id, $meta), BlockFactory::getInstance()->get(self::itemToBlockId($id), $meta & 0xf)); + $blockStateData = GlobalBlockStateHandlers::getUpgrader()->upgradeIntIdMeta(self::itemToBlockId($id), $meta & 0xf); + if($blockStateData !== null){ + try{ + $blockStateId = GlobalBlockStateHandlers::getDeserializer()->deserialize($blockStateData); + $item = new ItemBlock(new IID($id, $meta), BlockFactory::getInstance()->fromFullBlock($blockStateId)); + }catch(BlockStateDeserializeException $e){ + \GlobalLogger::get()->logException($e); + //fallthru + } + } } } diff --git a/src/world/SimpleChunkManager.php b/src/world/SimpleChunkManager.php index d883a7cf3..e2ed3138e 100644 --- a/src/world/SimpleChunkManager.php +++ b/src/world/SimpleChunkManager.php @@ -48,7 +48,7 @@ class SimpleChunkManager implements ChunkManager{ public function setBlockAt(int $x, int $y, int $z, Block $block) : void{ if(($chunk = $this->getChunk($x >> Chunk::COORD_BIT_SIZE, $z >> Chunk::COORD_BIT_SIZE)) !== null){ - $chunk->setFullBlock($x & Chunk::COORD_MASK, $y, $z & Chunk::COORD_MASK, $block->getFullId()); + $chunk->setFullBlock($x & Chunk::COORD_MASK, $y, $z & Chunk::COORD_MASK, $block->getStateId()); }else{ throw new \InvalidArgumentException("Cannot set block at coordinates x=$x,y=$y,z=$z, terrain is not loaded or out of bounds"); } diff --git a/src/world/World.php b/src/world/World.php index 9b1143c95..2dfb00497 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -81,6 +81,7 @@ use pocketmine\world\biome\BiomeRegistry; use pocketmine\world\format\Chunk; use pocketmine\world\format\io\ChunkData; use pocketmine\world\format\io\exception\CorruptedChunkException; +use pocketmine\world\format\io\GlobalBlockStateHandlers; use pocketmine\world\format\io\WritableWorldProvider; use pocketmine\world\format\LightArray; use pocketmine\world\format\SubChunk; @@ -438,7 +439,12 @@ class World implements ChunkManager{ if($item !== null){ $block = $item->getBlock(); }elseif(preg_match("/^-?\d+$/", $name) === 1){ - $block = BlockFactory::getInstance()->get((int) $name, 0); + //TODO: this may throw if the ID/meta was invalid + $blockStateData = GlobalBlockStateHandlers::getUpgrader()->upgradeIntIdMeta((int) $name, 0); + if($blockStateData === null){ + continue; + } + $block = BlockFactory::getInstance()->fromFullBlock(GlobalBlockStateHandlers::getDeserializer()->deserialize($blockStateData)); }else{ //TODO: we probably ought to log an error here continue; @@ -452,7 +458,7 @@ class World implements ChunkManager{ foreach(BlockFactory::getInstance()->getAllKnownStates() as $state){ $dontTickName = $dontTickBlocks[$state->getTypeId()] ?? null; if($dontTickName === null && $state->ticksRandomly()){ - $this->randomTickBlocks[$state->getFullId()] = true; + $this->randomTickBlocks[$state->getStateId()] = true; } } } @@ -940,7 +946,7 @@ class World implements ChunkManager{ $blockPosition = BlockPosition::fromVector3($b); $packets[] = UpdateBlockPacket::create( $blockPosition, - $blockMapping->toRuntimeId($fullBlock->getFullId()), + $blockMapping->toRuntimeId($fullBlock->getStateId()), UpdateBlockPacket::FLAG_NETWORK, UpdateBlockPacket::DATA_LAYER_NORMAL ); @@ -980,11 +986,11 @@ class World implements ChunkManager{ if($block instanceof UnknownBlock){ throw new \InvalidArgumentException("Cannot do random-tick on unknown block"); } - $this->randomTickBlocks[$block->getFullId()] = true; + $this->randomTickBlocks[$block->getStateId()] = true; } public function removeRandomTickedBlock(Block $block) : void{ - unset($this->randomTickBlocks[$block->getFullId()]); + unset($this->randomTickBlocks[$block->getStateId()]); } private function tickChunks() : void{ @@ -2455,26 +2461,6 @@ class World implements ChunkManager{ private function initChunk(int $chunkX, int $chunkZ, ChunkData $chunkData) : void{ $logger = new \PrefixedLogger($this->logger, "Loading chunk $chunkX $chunkZ"); - $this->timings->syncChunkLoadFixInvalidBlocks->startTiming(); - $blockFactory = BlockFactory::getInstance(); - $invalidBlocks = 0; - foreach($chunkData->getChunk()->getSubChunks() as $subChunk){ - foreach($subChunk->getBlockLayers() as $blockLayer){ - foreach($blockLayer->getPalette() as $blockStateId){ - $mappedStateId = $blockFactory->getMappedStateId($blockStateId); - if($mappedStateId !== $blockStateId){ - $blockLayer->replaceAll($blockStateId, $mappedStateId); - $invalidBlocks++; - } - } - } - } - if($invalidBlocks > 0){ - $logger->debug("Fixed $invalidBlocks invalid blockstates"); - $chunkData->getChunk()->setTerrainDirtyFlag(Chunk::DIRTY_FLAG_BLOCKS, true); - } - $this->timings->syncChunkLoadFixInvalidBlocks->stopTiming(); - if(count($chunkData->getEntityNBT()) !== 0){ $this->timings->syncChunkLoadEntities->startTiming(); $entityFactory = EntityFactory::getInstance(); diff --git a/src/world/format/Chunk.php b/src/world/format/Chunk.php index f3367c885..423fe0bef 100644 --- a/src/world/format/Chunk.php +++ b/src/world/format/Chunk.php @@ -27,7 +27,7 @@ declare(strict_types=1); namespace pocketmine\world\format; use pocketmine\block\Block; -use pocketmine\block\BlockLegacyIds; +use pocketmine\block\BlockTypeIds; use pocketmine\block\tile\Tile; use function array_map; @@ -68,7 +68,7 @@ class Chunk{ $this->subChunks = new \SplFixedArray(Chunk::MAX_SUBCHUNKS); foreach($this->subChunks as $y => $null){ - $this->subChunks[$y] = $subChunks[$y + self::MIN_SUBCHUNK_INDEX] ?? new SubChunk(BlockLegacyIds::AIR << Block::INTERNAL_METADATA_BITS, []); + $this->subChunks[$y] = $subChunks[$y + self::MIN_SUBCHUNK_INDEX] ?? new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, []); } $val = (self::MAX_SUBCHUNK_INDEX + 1) * SubChunk::EDGE_LENGTH; @@ -291,7 +291,7 @@ class Chunk{ throw new \InvalidArgumentException("Invalid subchunk Y coordinate $y"); } - $this->subChunks[$y - self::MIN_SUBCHUNK_INDEX] = $subChunk ?? new SubChunk(BlockLegacyIds::AIR << Block::INTERNAL_METADATA_BITS, []); + $this->subChunks[$y - self::MIN_SUBCHUNK_INDEX] = $subChunk ?? new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, []); $this->setTerrainDirtyFlag(self::DIRTY_FLAG_BLOCKS, true); } diff --git a/src/world/format/io/GlobalBlockStateHandlers.php b/src/world/format/io/GlobalBlockStateHandlers.php index 42e4b9c26..4cbf645d6 100644 --- a/src/world/format/io/GlobalBlockStateHandlers.php +++ b/src/world/format/io/GlobalBlockStateHandlers.php @@ -48,11 +48,11 @@ use const pocketmine\BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH; */ final class GlobalBlockStateHandlers{ - private static ?BlockStateSerializer $blockStateSerializer; + private static ?BlockStateSerializer $blockStateSerializer = null; - private static ?BlockStateDeserializer $blockStateDeserializer; + private static ?BlockStateDeserializer $blockStateDeserializer = null; - private static ?BlockDataUpgrader $blockDataUpgrader; + private static ?BlockDataUpgrader $blockDataUpgrader = null; public static function getDeserializer() : BlockStateDeserializer{ return self::$blockStateDeserializer ??= new CachingBlockStateDeserializer(new BlockStateToBlockObjectDeserializer()); @@ -63,18 +63,24 @@ final class GlobalBlockStateHandlers{ } public static function getUpgrader() : BlockDataUpgrader{ - return self::$blockDataUpgrader ??= new BlockDataUpgrader( - LegacyBlockStateMapper::loadFromString( - ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents(Path::join( - BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH, - '1.12.0_to_1.18.10_blockstate_map.bin' - ))), - LegacyBlockIdToStringIdMap::getInstance() - ), - new BlockStateUpgrader(BlockStateUpgradeSchemaUtils::loadSchemas( + if(self::$blockDataUpgrader === null){ + $blockStateUpgrader = new BlockStateUpgrader(BlockStateUpgradeSchemaUtils::loadSchemas( Path::join(BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH, 'nbt_upgrade_schema'), BlockStateData::CURRENT_VERSION - )) - ); + )); + self::$blockDataUpgrader = new BlockDataUpgrader( + LegacyBlockStateMapper::loadFromString( + ErrorToExceptionHandler::trapAndRemoveFalse(fn() => file_get_contents(Path::join( + BEDROCK_BLOCK_UPGRADE_SCHEMA_PATH, + '1.12.0_to_1.18.10_blockstate_map.bin' + ))), + LegacyBlockIdToStringIdMap::getInstance(), + $blockStateUpgrader + ), + $blockStateUpgrader + ); + } + + return self::$blockDataUpgrader; } } diff --git a/src/world/format/io/leveldb/LevelDB.php b/src/world/format/io/leveldb/LevelDB.php index 263311413..421f657b3 100644 --- a/src/world/format/io/leveldb/LevelDB.php +++ b/src/world/format/io/leveldb/LevelDB.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\world\format\io\leveldb; use pocketmine\block\Block; -use pocketmine\block\BlockLegacyIds; +use pocketmine\block\BlockTypeIds; use pocketmine\data\bedrock\BiomeIds; use pocketmine\data\bedrock\block\BlockStateData; use pocketmine\data\bedrock\block\BlockStateDeserializeException; @@ -238,7 +238,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $blockStateId = $blockStateDeserializer->deserialize($blockStateData); if(!isset($extraDataLayers[$ySub])){ - $extraDataLayers[$ySub] = new PalettedBlockArray(BlockLegacyIds::AIR << Block::INTERNAL_METADATA_BITS); + $extraDataLayers[$ySub] = new PalettedBlockArray(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS); } $extraDataLayers[$ySub]->set($x, $y, $z, $blockStateId); } @@ -367,14 +367,14 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ $storages[] = $convertedLegacyExtraData[$y]; } - $subChunks[$y] = new SubChunk(BlockLegacyIds::AIR << Block::INTERNAL_METADATA_BITS, $storages); + $subChunks[$y] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, $storages); break; case SubChunkVersion::PALETTED_SINGLE: $storages = [$this->deserializePaletted($binaryStream)]; if(isset($convertedLegacyExtraData[$y])){ $storages[] = $convertedLegacyExtraData[$y]; } - $subChunks[$y] = new SubChunk(BlockLegacyIds::AIR << Block::INTERNAL_METADATA_BITS, $storages); + $subChunks[$y] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, $storages); break; case SubChunkVersion::PALETTED_MULTI: case SubChunkVersion::PALETTED_MULTI_WITH_OFFSET: @@ -390,7 +390,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ for($k = 0; $k < $storageCount; ++$k){ $storages[] = $this->deserializePaletted($binaryStream); } - $subChunks[$y] = new SubChunk(BlockLegacyIds::AIR << Block::INTERNAL_METADATA_BITS, $storages); + $subChunks[$y] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, $storages); } break; default: @@ -433,7 +433,7 @@ class LevelDB extends BaseWorldProvider implements WritableWorldProvider{ if(isset($convertedLegacyExtraData[$yy])){ $storages[] = $convertedLegacyExtraData[$yy]; } - $subChunks[$yy] = new SubChunk(BlockLegacyIds::AIR << Block::INTERNAL_METADATA_BITS, $storages); + $subChunks[$yy] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, $storages); } try{ diff --git a/src/world/format/io/region/Anvil.php b/src/world/format/io/region/Anvil.php index 5bf1cb487..8012facd9 100644 --- a/src/world/format/io/region/Anvil.php +++ b/src/world/format/io/region/Anvil.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\world\format\io\region; use pocketmine\block\Block; -use pocketmine\block\BlockLegacyIds; +use pocketmine\block\BlockTypeIds; use pocketmine\nbt\tag\CompoundTag; use pocketmine\world\format\SubChunk; @@ -32,7 +32,7 @@ class Anvil extends RegionWorldProvider{ use LegacyAnvilChunkTrait; protected function deserializeSubChunk(CompoundTag $subChunk) : SubChunk{ - return new SubChunk(BlockLegacyIds::AIR << Block::INTERNAL_METADATA_BITS, [$this->palettizeLegacySubChunkYZX( + return new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [$this->palettizeLegacySubChunkYZX( self::readFixedSizeByteArray($subChunk, "Blocks", 4096), self::readFixedSizeByteArray($subChunk, "Data", 2048) )]); diff --git a/src/world/format/io/region/McRegion.php b/src/world/format/io/region/McRegion.php index 5a46cf589..98e9f703e 100644 --- a/src/world/format/io/region/McRegion.php +++ b/src/world/format/io/region/McRegion.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\world\format\io\region; use pocketmine\block\Block; -use pocketmine\block\BlockLegacyIds; +use pocketmine\block\BlockTypeIds; use pocketmine\data\bedrock\BiomeIds; use pocketmine\nbt\BigEndianNbtSerializer; use pocketmine\nbt\NbtDataException; @@ -74,7 +74,7 @@ class McRegion extends RegionWorldProvider{ $fullData = self::readFixedSizeByteArray($chunk, "Data", 16384); for($y = 0; $y < 8; ++$y){ - $subChunks[$y] = new SubChunk(BlockLegacyIds::AIR << Block::INTERNAL_METADATA_BITS, [$this->palettizeLegacySubChunkFromColumn($fullIds, $fullData, $y)]); + $subChunks[$y] = new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [$this->palettizeLegacySubChunkFromColumn($fullIds, $fullData, $y)]); } $makeBiomeArray = function(string $biomeIds) : BiomeArray{ diff --git a/src/world/format/io/region/PMAnvil.php b/src/world/format/io/region/PMAnvil.php index 813550d4a..29b47b352 100644 --- a/src/world/format/io/region/PMAnvil.php +++ b/src/world/format/io/region/PMAnvil.php @@ -24,7 +24,7 @@ declare(strict_types=1); namespace pocketmine\world\format\io\region; use pocketmine\block\Block; -use pocketmine\block\BlockLegacyIds; +use pocketmine\block\BlockTypeIds; use pocketmine\nbt\tag\CompoundTag; use pocketmine\world\format\SubChunk; @@ -36,7 +36,7 @@ class PMAnvil extends RegionWorldProvider{ use LegacyAnvilChunkTrait; protected function deserializeSubChunk(CompoundTag $subChunk) : SubChunk{ - return new SubChunk(BlockLegacyIds::AIR << Block::INTERNAL_METADATA_BITS, [$this->palettizeLegacySubChunkXZY( + return new SubChunk(BlockTypeIds::AIR << Block::INTERNAL_STATE_DATA_BITS, [$this->palettizeLegacySubChunkXZY( self::readFixedSizeByteArray($subChunk, "Blocks", 4096), self::readFixedSizeByteArray($subChunk, "Data", 2048) )]); diff --git a/src/world/generator/FlatGeneratorOptions.php b/src/world/generator/FlatGeneratorOptions.php index b5b39a4b7..3cda876cd 100644 --- a/src/world/generator/FlatGeneratorOptions.php +++ b/src/world/generator/FlatGeneratorOptions.php @@ -87,7 +87,7 @@ final class FlatGeneratorOptions{ throw new InvalidGeneratorOptionsException("Invalid preset layer \"$line\": " . $e->getMessage(), 0, $e); } for($cY = $y, $y += $cnt; $cY < $y; ++$cY){ - $result[$cY] = $b->getFullId(); + $result[$cY] = $b->getStateId(); } } diff --git a/src/world/generator/hell/Nether.php b/src/world/generator/hell/Nether.php index 8e75b0d3b..61c8624a0 100644 --- a/src/world/generator/hell/Nether.php +++ b/src/world/generator/hell/Nether.php @@ -72,9 +72,9 @@ class Nether extends Generator{ $chunk = $world->getChunk($chunkX, $chunkZ); - $bedrock = VanillaBlocks::BEDROCK()->getFullId(); - $netherrack = VanillaBlocks::NETHERRACK()->getFullId(); - $stillLava = VanillaBlocks::LAVA()->getFullId(); + $bedrock = VanillaBlocks::BEDROCK()->getStateId(); + $netherrack = VanillaBlocks::NETHERRACK()->getStateId(); + $stillLava = VanillaBlocks::LAVA()->getStateId(); for($x = 0; $x < Chunk::EDGE_LENGTH; ++$x){ for($z = 0; $z < Chunk::EDGE_LENGTH; ++$z){ diff --git a/src/world/generator/normal/Normal.php b/src/world/generator/normal/Normal.php index 2a89d1e61..f48f8f4fa 100644 --- a/src/world/generator/normal/Normal.php +++ b/src/world/generator/normal/Normal.php @@ -144,9 +144,9 @@ class Normal extends Generator{ $biomeCache = []; - $bedrock = VanillaBlocks::BEDROCK()->getFullId(); - $stillWater = VanillaBlocks::WATER()->getFullId(); - $stone = VanillaBlocks::STONE()->getFullId(); + $bedrock = VanillaBlocks::BEDROCK()->getStateId(); + $stillWater = VanillaBlocks::WATER()->getStateId(); + $stone = VanillaBlocks::STONE()->getStateId(); $baseX = $chunkX * Chunk::EDGE_LENGTH; $baseZ = $chunkZ * Chunk::EDGE_LENGTH; diff --git a/src/world/generator/populator/GroundCover.php b/src/world/generator/populator/GroundCover.php index 8fe9c099f..193905cce 100644 --- a/src/world/generator/populator/GroundCover.php +++ b/src/world/generator/populator/GroundCover.php @@ -67,7 +67,7 @@ class GroundCover implements Populator{ continue; } - $chunk->setFullBlock($x, $y, $z, $b->getFullId()); + $chunk->setFullBlock($x, $y, $z, $b->getStateId()); } } } diff --git a/src/world/particle/BlockBreakParticle.php b/src/world/particle/BlockBreakParticle.php index 8801686e2..98b2eb9c8 100644 --- a/src/world/particle/BlockBreakParticle.php +++ b/src/world/particle/BlockBreakParticle.php @@ -34,6 +34,6 @@ class BlockBreakParticle implements Particle{ public function __construct(private Block $b){} public function encode(Vector3 $pos) : array{ - return [LevelEventPacket::create(LevelEvent::PARTICLE_DESTROY, RuntimeBlockMapping::getInstance()->toRuntimeId($this->b->getFullId()), $pos)]; + return [LevelEventPacket::create(LevelEvent::PARTICLE_DESTROY, RuntimeBlockMapping::getInstance()->toRuntimeId($this->b->getStateId()), $pos)]; } } diff --git a/src/world/particle/BlockPunchParticle.php b/src/world/particle/BlockPunchParticle.php index d9ddad209..fe754dc56 100644 --- a/src/world/particle/BlockPunchParticle.php +++ b/src/world/particle/BlockPunchParticle.php @@ -39,6 +39,6 @@ class BlockPunchParticle implements Particle{ ){} public function encode(Vector3 $pos) : array{ - return [LevelEventPacket::create(LevelEvent::PARTICLE_PUNCH_BLOCK, RuntimeBlockMapping::getInstance()->toRuntimeId($this->block->getFullId()) | ($this->face << 24), $pos)]; + return [LevelEventPacket::create(LevelEvent::PARTICLE_PUNCH_BLOCK, RuntimeBlockMapping::getInstance()->toRuntimeId($this->block->getStateId()) | ($this->face << 24), $pos)]; } } diff --git a/src/world/particle/TerrainParticle.php b/src/world/particle/TerrainParticle.php index 863b84401..27de04b14 100644 --- a/src/world/particle/TerrainParticle.php +++ b/src/world/particle/TerrainParticle.php @@ -33,6 +33,6 @@ class TerrainParticle implements Particle{ public function __construct(private Block $b){} public function encode(Vector3 $pos) : array{ - return [LevelEventPacket::standardParticle(ParticleIds::TERRAIN, RuntimeBlockMapping::getInstance()->toRuntimeId($this->b->getFullId()), $pos)]; + return [LevelEventPacket::standardParticle(ParticleIds::TERRAIN, RuntimeBlockMapping::getInstance()->toRuntimeId($this->b->getStateId()), $pos)]; } } diff --git a/src/world/sound/BlockBreakSound.php b/src/world/sound/BlockBreakSound.php index 2075518e0..4f919a396 100644 --- a/src/world/sound/BlockBreakSound.php +++ b/src/world/sound/BlockBreakSound.php @@ -33,6 +33,6 @@ class BlockBreakSound implements Sound{ public function __construct(private Block $block){} public function encode(Vector3 $pos) : array{ - return [LevelSoundEventPacket::nonActorSound(LevelSoundEvent::BREAK, $pos, false, RuntimeBlockMapping::getInstance()->toRuntimeId($this->block->getFullId()))]; + return [LevelSoundEventPacket::nonActorSound(LevelSoundEvent::BREAK, $pos, false, RuntimeBlockMapping::getInstance()->toRuntimeId($this->block->getStateId()))]; } } diff --git a/src/world/sound/BlockPlaceSound.php b/src/world/sound/BlockPlaceSound.php index 000dadd67..8440dbd47 100644 --- a/src/world/sound/BlockPlaceSound.php +++ b/src/world/sound/BlockPlaceSound.php @@ -33,6 +33,6 @@ class BlockPlaceSound implements Sound{ public function __construct(private Block $block){} public function encode(Vector3 $pos) : array{ - return [LevelSoundEventPacket::nonActorSound(LevelSoundEvent::PLACE, $pos, false, RuntimeBlockMapping::getInstance()->toRuntimeId($this->block->getFullId()))]; + return [LevelSoundEventPacket::nonActorSound(LevelSoundEvent::PLACE, $pos, false, RuntimeBlockMapping::getInstance()->toRuntimeId($this->block->getStateId()))]; } } diff --git a/src/world/sound/BlockPunchSound.php b/src/world/sound/BlockPunchSound.php index 28ab73c94..d3898b734 100644 --- a/src/world/sound/BlockPunchSound.php +++ b/src/world/sound/BlockPunchSound.php @@ -40,7 +40,7 @@ class BlockPunchSound implements Sound{ LevelSoundEvent::HIT, $pos, false, - RuntimeBlockMapping::getInstance()->toRuntimeId($this->block->getFullId()) + RuntimeBlockMapping::getInstance()->toRuntimeId($this->block->getStateId()) )]; } } diff --git a/src/world/sound/EntityLandSound.php b/src/world/sound/EntityLandSound.php index 6412e6ab0..545753367 100644 --- a/src/world/sound/EntityLandSound.php +++ b/src/world/sound/EntityLandSound.php @@ -43,7 +43,7 @@ class EntityLandSound implements Sound{ return [LevelSoundEventPacket::create( LevelSoundEvent::LAND, $pos, - RuntimeBlockMapping::getInstance()->toRuntimeId($this->blockLandedOn->getFullId()), + RuntimeBlockMapping::getInstance()->toRuntimeId($this->blockLandedOn->getStateId()), $this->entity::getNetworkTypeId(), false, //TODO: does isBaby have any relevance here? false diff --git a/src/world/sound/ItemUseOnBlockSound.php b/src/world/sound/ItemUseOnBlockSound.php index 3e090a905..d3483d36b 100644 --- a/src/world/sound/ItemUseOnBlockSound.php +++ b/src/world/sound/ItemUseOnBlockSound.php @@ -42,7 +42,7 @@ final class ItemUseOnBlockSound implements Sound{ LevelSoundEvent::ITEM_USE_ON, $pos, false, - RuntimeBlockMapping::getInstance()->toRuntimeId($this->block->getFullId()) + RuntimeBlockMapping::getInstance()->toRuntimeId($this->block->getStateId()) )]; } } diff --git a/tests/phpunit/block/BlockTest.php b/tests/phpunit/block/BlockTest.php index 0286788c2..d9bbbfae2 100644 --- a/tests/phpunit/block/BlockTest.php +++ b/tests/phpunit/block/BlockTest.php @@ -24,9 +24,11 @@ declare(strict_types=1); namespace pocketmine\block; use PHPUnit\Framework\TestCase; +use function asort; use function file_get_contents; use function is_array; use function json_decode; +use function print_r; class BlockTest extends TestCase{ @@ -52,7 +54,7 @@ class BlockTest extends TestCase{ public function testDeliberateOverrideBlock() : void{ $block = new MyCustomBlock(new BlockIdentifier(BlockTypeIds::COBBLESTONE, BlockLegacyIds::COBBLESTONE, 0), "Cobblestone", BlockBreakInfo::instant()); $this->blockFactory->register($block, true); - self::assertInstanceOf(MyCustomBlock::class, $this->blockFactory->get($block->getId(), 0)); + self::assertInstanceOf(MyCustomBlock::class, $this->blockFactory->get($block->getTypeId(), 0)); } /** @@ -63,7 +65,7 @@ class BlockTest extends TestCase{ if(!$this->blockFactory->isRegistered($i)){ $b = new StrangeNewBlock(new BlockIdentifier(BlockTypeIds::FIRST_UNUSED_BLOCK_ID, $i, 0), "Strange New Block", BlockBreakInfo::instant()); $this->blockFactory->register($b); - self::assertInstanceOf(StrangeNewBlock::class, $this->blockFactory->get($b->getId(), 0)); + self::assertInstanceOf(StrangeNewBlock::class, $this->blockFactory->get($b->getTypeId(), 0)); return; } } @@ -92,37 +94,6 @@ class BlockTest extends TestCase{ } } - /** - * @return int[][] - * @phpstan-return list - */ - public function blockGetProvider() : array{ - return [ - [BlockLegacyIds::STONE, 5], - [BlockLegacyIds::GOLD_BLOCK, 0], - [BlockLegacyIds::WOODEN_PLANKS, 5], - [BlockLegacyIds::SAND, 0], - [BlockLegacyIds::GOLD_BLOCK, 0] - ]; - } - - /** - * @dataProvider blockGetProvider - */ - public function testBlockGet(int $id, int $meta) : void{ - $block = $this->blockFactory->get($id, $meta); - - self::assertEquals($id, $block->getId()); - self::assertEquals($meta, $block->getMeta()); - } - - public function testBlockIds() : void{ - for($i = 0; $i < 256; ++$i){ - $b = $this->blockFactory->get($i, 0); - self::assertContains($i, $b->getIdInfo()->getAllLegacyBlockIds()); - } - } - /** * Test that light filters in the static arrays have valid values. Wrong values can cause lots of unpleasant bugs * (like freezes) when doing light population. @@ -137,33 +108,21 @@ class BlockTest extends TestCase{ public function testConsistency() : void{ $list = json_decode(file_get_contents(__DIR__ . '/block_factory_consistency_check.json'), true); if(!is_array($list)){ - throw new \pocketmine\utils\AssumptionFailedError("Old table should be array{knownStates: array, remaps: array}"); + throw new \pocketmine\utils\AssumptionFailedError("Old table should be array{knownStates: array, stateDataBits: int}"); } $knownStates = $list["knownStates"]; - $remaps = $list["remaps"]; + $oldStateDataSize = $list["stateDataBits"]; + self::assertSame($oldStateDataSize, Block::INTERNAL_STATE_DATA_BITS, "Changed number of state data bits - consistency check probably need regenerating"); - $states = []; - for($k = 0; $k < 1024 << Block::INTERNAL_METADATA_BITS; $k++){ - $state = $this->blockFactory->fromFullBlock($k); - if($state instanceof UnknownBlock){ - continue; - } - $states[$k] = $state; - if($state->getFullId() !== $k){ - self::assertArrayHasKey($k, $remaps, "New remap of state $k (" . $state->getName() . ") - consistency check may need regenerating"); - self::assertSame($state->getFullId(), $remaps[$k], "Mismatched full IDs of remapped state $k"); - }else{ - self::assertArrayHasKey($k, $knownStates, "New block state $k (" . $state->getName() . ") - consistency check may need regenerating"); - self::assertSame($knownStates[$k], $state->getName()); - } + $states = BlockFactory::getInstance()->getAllKnownStates(); + foreach(BlockFactory::getInstance()->getAllKnownStates() as $stateId => $state){ + self::assertArrayHasKey($stateId, $knownStates, "New block state $stateId (" . $state->getTypeId() . ":" . $state->computeStateData() . ", " . print_r($state, true) . ") - consistency check may need regenerating"); + self::assertSame($knownStates[$stateId], $state->getName()); } + asort($knownStates, SORT_STRING); foreach($knownStates as $k => $name){ - self::assertArrayHasKey($k, $states, "Missing previously-known block state $k ($name)"); + self::assertArrayHasKey($k, $states, "Missing previously-known block state $k " . ($k >> Block::INTERNAL_STATE_DATA_BITS) . ":" . ($k & Block::INTERNAL_STATE_DATA_MASK) . " ($name)"); self::assertSame($name, $states[$k]->getName()); } - foreach($remaps as $origin => $destination){ - self::assertArrayHasKey($origin, $states, "Missing previously-remapped state $origin"); - self::assertSame($destination, $states[$origin]->getFullId()); - } } } diff --git a/tests/phpunit/block/block_factory_consistency_check.json b/tests/phpunit/block/block_factory_consistency_check.json index f94081f22..a2dda4822 100644 --- a/tests/phpunit/block/block_factory_consistency_check.json +++ b/tests/phpunit/block/block_factory_consistency_check.json @@ -1 +1 @@ -{"knownStates":{"0":"Air","16":"Stone","17":"Granite","18":"Polished Granite","19":"Diorite","20":"Polished Diorite","21":"Andesite","22":"Polished Andesite","32":"Grass","48":"Dirt","49":"Dirt","64":"Cobblestone","80":"Oak Planks","81":"Spruce Planks","82":"Birch Planks","83":"Jungle Planks","84":"Acacia Planks","85":"Dark Oak Planks","96":"Oak Sapling","97":"Spruce Sapling","98":"Birch Sapling","99":"Jungle Sapling","100":"Acacia Sapling","101":"Dark Oak Sapling","104":"Oak Sapling","105":"Spruce Sapling","106":"Birch Sapling","107":"Jungle Sapling","108":"Acacia Sapling","109":"Dark Oak Sapling","112":"Bedrock","113":"Bedrock","128":"Water","129":"Water","130":"Water","131":"Water","132":"Water","133":"Water","134":"Water","135":"Water","136":"Water","137":"Water","138":"Water","139":"Water","140":"Water","141":"Water","142":"Water","143":"Water","144":"Water","145":"Water","146":"Water","147":"Water","148":"Water","149":"Water","150":"Water","151":"Water","152":"Water","153":"Water","154":"Water","155":"Water","156":"Water","157":"Water","158":"Water","159":"Water","160":"Lava","161":"Lava","162":"Lava","163":"Lava","164":"Lava","165":"Lava","166":"Lava","167":"Lava","168":"Lava","169":"Lava","170":"Lava","171":"Lava","172":"Lava","173":"Lava","174":"Lava","175":"Lava","176":"Lava","177":"Lava","178":"Lava","179":"Lava","180":"Lava","181":"Lava","182":"Lava","183":"Lava","184":"Lava","185":"Lava","186":"Lava","187":"Lava","188":"Lava","189":"Lava","190":"Lava","191":"Lava","192":"Sand","193":"Red Sand","208":"Gravel","224":"Gold Ore","240":"Iron Ore","256":"Coal Ore","272":"Oak Log","273":"Spruce Log","274":"Birch Log","275":"Jungle Log","276":"Oak Log","277":"Spruce Log","278":"Birch Log","279":"Jungle Log","280":"Oak Log","281":"Spruce Log","282":"Birch Log","283":"Jungle Log","288":"Oak Leaves","289":"Spruce Leaves","290":"Birch Leaves","291":"Jungle Leaves","292":"Oak Leaves","293":"Spruce Leaves","294":"Birch Leaves","295":"Jungle Leaves","296":"Oak Leaves","297":"Spruce Leaves","298":"Birch Leaves","299":"Jungle Leaves","300":"Oak Leaves","301":"Spruce Leaves","302":"Birch Leaves","303":"Jungle Leaves","304":"Sponge","305":"Sponge","320":"Glass","336":"Lapis Lazuli Ore","352":"Lapis Lazuli Block","384":"Sandstone","385":"Chiseled Sandstone","386":"Cut Sandstone","387":"Smooth Sandstone","400":"Note Block","416":"Bed Block","417":"Bed Block","418":"Bed Block","419":"Bed Block","420":"Bed Block","421":"Bed Block","422":"Bed Block","423":"Bed Block","424":"Bed Block","425":"Bed Block","426":"Bed Block","427":"Bed Block","428":"Bed Block","429":"Bed Block","430":"Bed Block","431":"Bed Block","432":"Powered Rail","433":"Powered Rail","434":"Powered Rail","435":"Powered Rail","436":"Powered Rail","437":"Powered Rail","440":"Powered Rail","441":"Powered Rail","442":"Powered Rail","443":"Powered Rail","444":"Powered Rail","445":"Powered Rail","448":"Detector Rail","449":"Detector Rail","450":"Detector Rail","451":"Detector Rail","452":"Detector Rail","453":"Detector Rail","456":"Detector Rail","457":"Detector Rail","458":"Detector Rail","459":"Detector Rail","460":"Detector Rail","461":"Detector Rail","480":"Cobweb","497":"Tall Grass","498":"Fern","512":"Dead Bush","560":"Wool","561":"Wool","562":"Wool","563":"Wool","564":"Wool","565":"Wool","566":"Wool","567":"Wool","568":"Wool","569":"Wool","570":"Wool","571":"Wool","572":"Wool","573":"Wool","574":"Wool","575":"Wool","576":"???","592":"Dandelion","608":"Poppy","609":"Blue Orchid","610":"Allium","611":"Azure Bluet","612":"Red Tulip","613":"Orange Tulip","614":"White Tulip","615":"Pink Tulip","616":"Oxeye Daisy","617":"Cornflower","618":"Lily of the Valley","624":"Brown Mushroom","640":"Red Mushroom","656":"Gold Block","672":"Iron Block","688":"Smooth Stone Slab","689":"Sandstone Slab","690":"Fake Wooden Slab","691":"Cobblestone Slab","692":"Brick Slab","693":"Stone Brick Slab","694":"Quartz Slab","695":"Nether Brick Slab","704":"Smooth Stone Slab","705":"Sandstone Slab","706":"Fake Wooden Slab","707":"Cobblestone Slab","708":"Brick Slab","709":"Stone Brick Slab","710":"Quartz Slab","711":"Nether Brick Slab","712":"Smooth Stone Slab","713":"Sandstone Slab","714":"Fake Wooden Slab","715":"Cobblestone Slab","716":"Brick Slab","717":"Stone Brick Slab","718":"Quartz Slab","719":"Nether Brick Slab","720":"Bricks","736":"TNT","737":"TNT","738":"TNT","739":"TNT","752":"Bookshelf","768":"Mossy Cobblestone","784":"Obsidian","801":"Torch","802":"Torch","803":"Torch","804":"Torch","805":"Torch","816":"Fire Block","817":"Fire Block","818":"Fire Block","819":"Fire Block","820":"Fire Block","821":"Fire Block","822":"Fire Block","823":"Fire Block","824":"Fire Block","825":"Fire Block","826":"Fire Block","827":"Fire Block","828":"Fire Block","829":"Fire Block","830":"Fire Block","831":"Fire Block","832":"Monster Spawner","848":"Oak Stairs","849":"Oak Stairs","850":"Oak Stairs","851":"Oak Stairs","852":"Oak Stairs","853":"Oak Stairs","854":"Oak Stairs","855":"Oak Stairs","866":"Chest","867":"Chest","868":"Chest","869":"Chest","880":"Redstone","881":"Redstone","882":"Redstone","883":"Redstone","884":"Redstone","885":"Redstone","886":"Redstone","887":"Redstone","888":"Redstone","889":"Redstone","890":"Redstone","891":"Redstone","892":"Redstone","893":"Redstone","894":"Redstone","895":"Redstone","896":"Diamond Ore","912":"Diamond Block","928":"Crafting Table","944":"Wheat Block","945":"Wheat Block","946":"Wheat Block","947":"Wheat Block","948":"Wheat Block","949":"Wheat Block","950":"Wheat Block","951":"Wheat Block","960":"Farmland","961":"Farmland","962":"Farmland","963":"Farmland","964":"Farmland","965":"Farmland","966":"Farmland","967":"Farmland","978":"Furnace","979":"Furnace","980":"Furnace","981":"Furnace","994":"Furnace","995":"Furnace","996":"Furnace","997":"Furnace","1008":"Oak Sign","1009":"Oak Sign","1010":"Oak Sign","1011":"Oak Sign","1012":"Oak Sign","1013":"Oak Sign","1014":"Oak Sign","1015":"Oak Sign","1016":"Oak Sign","1017":"Oak Sign","1018":"Oak Sign","1019":"Oak Sign","1020":"Oak Sign","1021":"Oak Sign","1022":"Oak Sign","1023":"Oak Sign","1024":"Oak Door","1025":"Oak Door","1026":"Oak Door","1027":"Oak Door","1028":"Oak Door","1029":"Oak Door","1030":"Oak Door","1031":"Oak Door","1032":"Oak Door","1033":"Oak Door","1042":"Ladder","1043":"Ladder","1044":"Ladder","1045":"Ladder","1056":"Rail","1057":"Rail","1058":"Rail","1059":"Rail","1060":"Rail","1061":"Rail","1062":"Rail","1063":"Rail","1064":"Rail","1065":"Rail","1072":"Cobblestone Stairs","1073":"Cobblestone Stairs","1074":"Cobblestone Stairs","1075":"Cobblestone Stairs","1076":"Cobblestone Stairs","1077":"Cobblestone Stairs","1078":"Cobblestone Stairs","1079":"Cobblestone Stairs","1090":"Oak Wall Sign","1091":"Oak Wall Sign","1092":"Oak Wall Sign","1093":"Oak Wall Sign","1104":"Lever","1105":"Lever","1106":"Lever","1107":"Lever","1108":"Lever","1109":"Lever","1110":"Lever","1111":"Lever","1112":"Lever","1113":"Lever","1114":"Lever","1115":"Lever","1116":"Lever","1117":"Lever","1118":"Lever","1119":"Lever","1120":"Stone Pressure Plate","1121":"Stone Pressure Plate","1136":"Iron Door","1137":"Iron Door","1138":"Iron Door","1139":"Iron Door","1140":"Iron Door","1141":"Iron Door","1142":"Iron Door","1143":"Iron Door","1144":"Iron Door","1145":"Iron Door","1152":"Oak Pressure Plate","1153":"Oak Pressure Plate","1168":"Redstone Ore","1184":"Redstone Ore","1201":"Redstone Torch","1202":"Redstone Torch","1203":"Redstone Torch","1204":"Redstone Torch","1205":"Redstone Torch","1217":"Redstone Torch","1218":"Redstone Torch","1219":"Redstone Torch","1220":"Redstone Torch","1221":"Redstone Torch","1232":"Stone Button","1233":"Stone Button","1234":"Stone Button","1235":"Stone Button","1236":"Stone Button","1237":"Stone Button","1240":"Stone Button","1241":"Stone Button","1242":"Stone Button","1243":"Stone Button","1244":"Stone Button","1245":"Stone Button","1248":"Snow Layer","1249":"Snow Layer","1250":"Snow Layer","1251":"Snow Layer","1252":"Snow Layer","1253":"Snow Layer","1254":"Snow Layer","1255":"Snow Layer","1264":"Ice","1280":"Snow Block","1296":"Cactus","1297":"Cactus","1298":"Cactus","1299":"Cactus","1300":"Cactus","1301":"Cactus","1302":"Cactus","1303":"Cactus","1304":"Cactus","1305":"Cactus","1306":"Cactus","1307":"Cactus","1308":"Cactus","1309":"Cactus","1310":"Cactus","1311":"Cactus","1312":"Clay Block","1328":"Sugarcane","1329":"Sugarcane","1330":"Sugarcane","1331":"Sugarcane","1332":"Sugarcane","1333":"Sugarcane","1334":"Sugarcane","1335":"Sugarcane","1336":"Sugarcane","1337":"Sugarcane","1338":"Sugarcane","1339":"Sugarcane","1340":"Sugarcane","1341":"Sugarcane","1342":"Sugarcane","1343":"Sugarcane","1344":"Jukebox","1360":"Oak Fence","1361":"Spruce Fence","1362":"Birch Fence","1363":"Jungle Fence","1364":"Acacia Fence","1365":"Dark Oak Fence","1376":"Pumpkin","1392":"Netherrack","1408":"Soul Sand","1424":"Glowstone","1441":"Nether Portal","1442":"Nether Portal","1456":"Jack o'Lantern","1457":"Jack o'Lantern","1458":"Jack o'Lantern","1459":"Jack o'Lantern","1472":"Cake","1473":"Cake","1474":"Cake","1475":"Cake","1476":"Cake","1477":"Cake","1478":"Cake","1488":"Redstone Repeater","1489":"Redstone Repeater","1490":"Redstone Repeater","1491":"Redstone Repeater","1492":"Redstone Repeater","1493":"Redstone Repeater","1494":"Redstone Repeater","1495":"Redstone Repeater","1496":"Redstone Repeater","1497":"Redstone Repeater","1498":"Redstone Repeater","1499":"Redstone Repeater","1500":"Redstone Repeater","1501":"Redstone Repeater","1502":"Redstone Repeater","1503":"Redstone Repeater","1504":"Redstone Repeater","1505":"Redstone Repeater","1506":"Redstone Repeater","1507":"Redstone Repeater","1508":"Redstone Repeater","1509":"Redstone Repeater","1510":"Redstone Repeater","1511":"Redstone Repeater","1512":"Redstone Repeater","1513":"Redstone Repeater","1514":"Redstone Repeater","1515":"Redstone Repeater","1516":"Redstone Repeater","1517":"Redstone Repeater","1518":"Redstone Repeater","1519":"Redstone Repeater","1520":"Invisible Bedrock","1536":"Oak Trapdoor","1537":"Oak Trapdoor","1538":"Oak Trapdoor","1539":"Oak Trapdoor","1540":"Oak Trapdoor","1541":"Oak Trapdoor","1542":"Oak Trapdoor","1543":"Oak Trapdoor","1544":"Oak Trapdoor","1545":"Oak Trapdoor","1546":"Oak Trapdoor","1547":"Oak Trapdoor","1548":"Oak Trapdoor","1549":"Oak Trapdoor","1550":"Oak Trapdoor","1551":"Oak Trapdoor","1552":"Infested Stone","1553":"Infested Cobblestone","1554":"Infested Stone Brick","1555":"Infested Mossy Stone Brick","1556":"Infested Cracked Stone Brick","1557":"Infested Chiseled Stone Brick","1568":"Stone Bricks","1569":"Mossy Stone Bricks","1570":"Cracked Stone Bricks","1571":"Chiseled Stone Bricks","1584":"Brown Mushroom Block","1585":"Brown Mushroom Block","1586":"Brown Mushroom Block","1587":"Brown Mushroom Block","1588":"Brown Mushroom Block","1589":"Brown Mushroom Block","1590":"Brown Mushroom Block","1591":"Brown Mushroom Block","1592":"Brown Mushroom Block","1593":"Brown Mushroom Block","1594":"Mushroom Stem","1598":"Brown Mushroom Block","1599":"All Sided Mushroom Stem","1600":"Red Mushroom Block","1601":"Red Mushroom Block","1602":"Red Mushroom Block","1603":"Red Mushroom Block","1604":"Red Mushroom Block","1605":"Red Mushroom Block","1606":"Red Mushroom Block","1607":"Red Mushroom Block","1608":"Red Mushroom Block","1609":"Red Mushroom Block","1614":"Red Mushroom Block","1616":"Iron Bars","1632":"Glass Pane","1648":"Melon Block","1664":"Pumpkin Stem","1665":"Pumpkin Stem","1666":"Pumpkin Stem","1667":"Pumpkin Stem","1668":"Pumpkin Stem","1669":"Pumpkin Stem","1670":"Pumpkin Stem","1671":"Pumpkin Stem","1680":"Melon Stem","1681":"Melon Stem","1682":"Melon Stem","1683":"Melon Stem","1684":"Melon Stem","1685":"Melon Stem","1686":"Melon Stem","1687":"Melon Stem","1696":"Vines","1697":"Vines","1698":"Vines","1699":"Vines","1700":"Vines","1701":"Vines","1702":"Vines","1703":"Vines","1704":"Vines","1705":"Vines","1706":"Vines","1707":"Vines","1708":"Vines","1709":"Vines","1710":"Vines","1711":"Vines","1712":"Oak Fence Gate","1713":"Oak Fence Gate","1714":"Oak Fence Gate","1715":"Oak Fence Gate","1716":"Oak Fence Gate","1717":"Oak Fence Gate","1718":"Oak Fence Gate","1719":"Oak Fence Gate","1720":"Oak Fence Gate","1721":"Oak Fence Gate","1722":"Oak Fence Gate","1723":"Oak Fence Gate","1724":"Oak Fence Gate","1725":"Oak Fence Gate","1726":"Oak Fence Gate","1727":"Oak Fence Gate","1728":"Brick Stairs","1729":"Brick Stairs","1730":"Brick Stairs","1731":"Brick Stairs","1732":"Brick Stairs","1733":"Brick Stairs","1734":"Brick Stairs","1735":"Brick Stairs","1744":"Stone Brick Stairs","1745":"Stone Brick Stairs","1746":"Stone Brick Stairs","1747":"Stone Brick Stairs","1748":"Stone Brick Stairs","1749":"Stone Brick Stairs","1750":"Stone Brick Stairs","1751":"Stone Brick Stairs","1760":"Mycelium","1776":"Lily Pad","1792":"Nether Bricks","1808":"Nether Brick Fence","1824":"Nether Brick Stairs","1825":"Nether Brick Stairs","1826":"Nether Brick Stairs","1827":"Nether Brick Stairs","1828":"Nether Brick Stairs","1829":"Nether Brick Stairs","1830":"Nether Brick Stairs","1831":"Nether Brick Stairs","1840":"Nether Wart","1841":"Nether Wart","1842":"Nether Wart","1843":"Nether Wart","1856":"Enchanting Table","1872":"Brewing Stand","1873":"Brewing Stand","1874":"Brewing Stand","1875":"Brewing Stand","1876":"Brewing Stand","1877":"Brewing Stand","1878":"Brewing Stand","1879":"Brewing Stand","1920":"End Portal Frame","1921":"End Portal Frame","1922":"End Portal Frame","1923":"End Portal Frame","1924":"End Portal Frame","1925":"End Portal Frame","1926":"End Portal Frame","1927":"End Portal Frame","1936":"End Stone","1952":"Dragon Egg","1968":"Redstone Lamp","1984":"Redstone Lamp","2016":"Activator Rail","2017":"Activator Rail","2018":"Activator Rail","2019":"Activator Rail","2020":"Activator Rail","2021":"Activator Rail","2024":"Activator Rail","2025":"Activator Rail","2026":"Activator Rail","2027":"Activator Rail","2028":"Activator Rail","2029":"Activator Rail","2032":"Cocoa Block","2033":"Cocoa Block","2034":"Cocoa Block","2035":"Cocoa Block","2036":"Cocoa Block","2037":"Cocoa Block","2038":"Cocoa Block","2039":"Cocoa Block","2040":"Cocoa Block","2041":"Cocoa Block","2042":"Cocoa Block","2043":"Cocoa Block","2048":"Sandstone Stairs","2049":"Sandstone Stairs","2050":"Sandstone Stairs","2051":"Sandstone Stairs","2052":"Sandstone Stairs","2053":"Sandstone Stairs","2054":"Sandstone Stairs","2055":"Sandstone Stairs","2064":"Emerald Ore","2082":"Ender Chest","2083":"Ender Chest","2084":"Ender Chest","2085":"Ender Chest","2096":"Tripwire Hook","2097":"Tripwire Hook","2098":"Tripwire Hook","2099":"Tripwire Hook","2100":"Tripwire Hook","2101":"Tripwire Hook","2102":"Tripwire Hook","2103":"Tripwire Hook","2104":"Tripwire Hook","2105":"Tripwire Hook","2106":"Tripwire Hook","2107":"Tripwire Hook","2108":"Tripwire Hook","2109":"Tripwire Hook","2110":"Tripwire Hook","2111":"Tripwire Hook","2112":"Tripwire","2113":"Tripwire","2114":"Tripwire","2115":"Tripwire","2116":"Tripwire","2117":"Tripwire","2118":"Tripwire","2119":"Tripwire","2120":"Tripwire","2121":"Tripwire","2122":"Tripwire","2123":"Tripwire","2124":"Tripwire","2125":"Tripwire","2126":"Tripwire","2127":"Tripwire","2128":"Emerald Block","2144":"Spruce Stairs","2145":"Spruce Stairs","2146":"Spruce Stairs","2147":"Spruce Stairs","2148":"Spruce Stairs","2149":"Spruce Stairs","2150":"Spruce Stairs","2151":"Spruce Stairs","2160":"Birch Stairs","2161":"Birch Stairs","2162":"Birch Stairs","2163":"Birch Stairs","2164":"Birch Stairs","2165":"Birch Stairs","2166":"Birch Stairs","2167":"Birch Stairs","2176":"Jungle Stairs","2177":"Jungle Stairs","2178":"Jungle Stairs","2179":"Jungle Stairs","2180":"Jungle Stairs","2181":"Jungle Stairs","2182":"Jungle Stairs","2183":"Jungle Stairs","2208":"Beacon","2224":"Cobblestone Wall","2225":"Mossy Cobblestone Wall","2226":"Granite Wall","2227":"Diorite Wall","2228":"Andesite Wall","2229":"Sandstone Wall","2230":"Brick Wall","2231":"Stone Brick Wall","2232":"Mossy Stone Brick Wall","2233":"Nether Brick Wall","2234":"End Stone Brick Wall","2235":"Prismarine Wall","2236":"Red Sandstone Wall","2237":"Red Nether Brick Wall","2240":"Flower Pot","2256":"Carrot Block","2257":"Carrot Block","2258":"Carrot Block","2259":"Carrot Block","2260":"Carrot Block","2261":"Carrot Block","2262":"Carrot Block","2263":"Carrot Block","2272":"Potato Block","2273":"Potato Block","2274":"Potato Block","2275":"Potato Block","2276":"Potato Block","2277":"Potato Block","2278":"Potato Block","2279":"Potato Block","2288":"Oak Button","2289":"Oak Button","2290":"Oak Button","2291":"Oak Button","2292":"Oak Button","2293":"Oak Button","2296":"Oak Button","2297":"Oak Button","2298":"Oak Button","2299":"Oak Button","2300":"Oak Button","2301":"Oak Button","2305":"Mob Head","2306":"Mob Head","2307":"Mob Head","2308":"Mob Head","2309":"Mob Head","2313":"Mob Head","2314":"Mob Head","2315":"Mob Head","2316":"Mob Head","2317":"Mob Head","2320":"Anvil","2321":"Anvil","2322":"Anvil","2323":"Anvil","2324":"Anvil","2325":"Anvil","2326":"Anvil","2327":"Anvil","2328":"Anvil","2329":"Anvil","2330":"Anvil","2331":"Anvil","2338":"Trapped Chest","2339":"Trapped Chest","2340":"Trapped Chest","2341":"Trapped Chest","2352":"Weighted Pressure Plate Light","2353":"Weighted Pressure Plate Light","2354":"Weighted Pressure Plate Light","2355":"Weighted Pressure Plate Light","2356":"Weighted Pressure Plate Light","2357":"Weighted Pressure Plate Light","2358":"Weighted Pressure Plate Light","2359":"Weighted Pressure Plate Light","2360":"Weighted Pressure Plate Light","2361":"Weighted Pressure Plate Light","2362":"Weighted Pressure Plate Light","2363":"Weighted Pressure Plate Light","2364":"Weighted Pressure Plate Light","2365":"Weighted Pressure Plate Light","2366":"Weighted Pressure Plate Light","2367":"Weighted Pressure Plate Light","2368":"Weighted Pressure Plate Heavy","2369":"Weighted Pressure Plate Heavy","2370":"Weighted Pressure Plate Heavy","2371":"Weighted Pressure Plate Heavy","2372":"Weighted Pressure Plate Heavy","2373":"Weighted Pressure Plate Heavy","2374":"Weighted Pressure Plate Heavy","2375":"Weighted Pressure Plate Heavy","2376":"Weighted Pressure Plate Heavy","2377":"Weighted Pressure Plate Heavy","2378":"Weighted Pressure Plate Heavy","2379":"Weighted Pressure Plate Heavy","2380":"Weighted Pressure Plate Heavy","2381":"Weighted Pressure Plate Heavy","2382":"Weighted Pressure Plate Heavy","2383":"Weighted Pressure Plate Heavy","2384":"Redstone Comparator","2385":"Redstone Comparator","2386":"Redstone Comparator","2387":"Redstone Comparator","2388":"Redstone Comparator","2389":"Redstone Comparator","2390":"Redstone Comparator","2391":"Redstone Comparator","2408":"Redstone Comparator","2409":"Redstone Comparator","2410":"Redstone Comparator","2411":"Redstone Comparator","2412":"Redstone Comparator","2413":"Redstone Comparator","2414":"Redstone Comparator","2415":"Redstone Comparator","2416":"Daylight Sensor","2417":"Daylight Sensor","2418":"Daylight Sensor","2419":"Daylight Sensor","2420":"Daylight Sensor","2421":"Daylight Sensor","2422":"Daylight Sensor","2423":"Daylight Sensor","2424":"Daylight Sensor","2425":"Daylight Sensor","2426":"Daylight Sensor","2427":"Daylight Sensor","2428":"Daylight Sensor","2429":"Daylight Sensor","2430":"Daylight Sensor","2431":"Daylight Sensor","2432":"Redstone Block","2448":"Nether Quartz Ore","2464":"Hopper","2466":"Hopper","2467":"Hopper","2468":"Hopper","2469":"Hopper","2472":"Hopper","2474":"Hopper","2475":"Hopper","2476":"Hopper","2477":"Hopper","2480":"Quartz Block","2481":"Chiseled Quartz Block","2482":"Quartz Pillar","2483":"Smooth Quartz Block","2485":"Chiseled Quartz Block","2486":"Quartz Pillar","2489":"Chiseled Quartz Block","2490":"Quartz Pillar","2496":"Quartz Stairs","2497":"Quartz Stairs","2498":"Quartz Stairs","2499":"Quartz Stairs","2500":"Quartz Stairs","2501":"Quartz Stairs","2502":"Quartz Stairs","2503":"Quartz Stairs","2512":"Oak Slab","2513":"Spruce Slab","2514":"Birch Slab","2515":"Jungle Slab","2516":"Acacia Slab","2517":"Dark Oak Slab","2528":"Oak Slab","2529":"Spruce Slab","2530":"Birch Slab","2531":"Jungle Slab","2532":"Acacia Slab","2533":"Dark Oak Slab","2536":"Oak Slab","2537":"Spruce Slab","2538":"Birch Slab","2539":"Jungle Slab","2540":"Acacia Slab","2541":"Dark Oak Slab","2544":"Stained Clay","2545":"Stained Clay","2546":"Stained Clay","2547":"Stained Clay","2548":"Stained Clay","2549":"Stained Clay","2550":"Stained Clay","2551":"Stained Clay","2552":"Stained Clay","2553":"Stained Clay","2554":"Stained Clay","2555":"Stained Clay","2556":"Stained Clay","2557":"Stained Clay","2558":"Stained Clay","2559":"Stained Clay","2560":"Stained Glass Pane","2561":"Stained Glass Pane","2562":"Stained Glass Pane","2563":"Stained Glass Pane","2564":"Stained Glass Pane","2565":"Stained Glass Pane","2566":"Stained Glass Pane","2567":"Stained Glass Pane","2568":"Stained Glass Pane","2569":"Stained Glass Pane","2570":"Stained Glass Pane","2571":"Stained Glass Pane","2572":"Stained Glass Pane","2573":"Stained Glass Pane","2574":"Stained Glass Pane","2575":"Stained Glass Pane","2576":"Acacia Leaves","2577":"Dark Oak Leaves","2580":"Acacia Leaves","2581":"Dark Oak Leaves","2584":"Acacia Leaves","2585":"Dark Oak Leaves","2588":"Acacia Leaves","2589":"Dark Oak Leaves","2592":"Acacia Log","2593":"Dark Oak Log","2596":"Acacia Log","2597":"Dark Oak Log","2600":"Acacia Log","2601":"Dark Oak Log","2608":"Acacia Stairs","2609":"Acacia Stairs","2610":"Acacia Stairs","2611":"Acacia Stairs","2612":"Acacia Stairs","2613":"Acacia Stairs","2614":"Acacia Stairs","2615":"Acacia Stairs","2624":"Dark Oak Stairs","2625":"Dark Oak Stairs","2626":"Dark Oak Stairs","2627":"Dark Oak Stairs","2628":"Dark Oak Stairs","2629":"Dark Oak Stairs","2630":"Dark Oak Stairs","2631":"Dark Oak Stairs","2640":"Slime Block","2672":"Iron Trapdoor","2673":"Iron Trapdoor","2674":"Iron Trapdoor","2675":"Iron Trapdoor","2676":"Iron Trapdoor","2677":"Iron Trapdoor","2678":"Iron Trapdoor","2679":"Iron Trapdoor","2680":"Iron Trapdoor","2681":"Iron Trapdoor","2682":"Iron Trapdoor","2683":"Iron Trapdoor","2684":"Iron Trapdoor","2685":"Iron Trapdoor","2686":"Iron Trapdoor","2687":"Iron Trapdoor","2688":"Prismarine","2689":"Dark Prismarine","2690":"Prismarine Bricks","2704":"Sea Lantern","2720":"Hay Bale","2724":"Hay Bale","2728":"Hay Bale","2736":"Carpet","2737":"Carpet","2738":"Carpet","2739":"Carpet","2740":"Carpet","2741":"Carpet","2742":"Carpet","2743":"Carpet","2744":"Carpet","2745":"Carpet","2746":"Carpet","2747":"Carpet","2748":"Carpet","2749":"Carpet","2750":"Carpet","2751":"Carpet","2752":"Hardened Clay","2768":"Coal Block","2784":"Packed Ice","2800":"Sunflower","2801":"Lilac","2802":"Double Tallgrass","2803":"Large Fern","2804":"Rose Bush","2805":"Peony","2808":"Sunflower","2809":"Lilac","2810":"Double Tallgrass","2811":"Large Fern","2812":"Rose Bush","2813":"Peony","2816":"Banner","2817":"Banner","2818":"Banner","2819":"Banner","2820":"Banner","2821":"Banner","2822":"Banner","2823":"Banner","2824":"Banner","2825":"Banner","2826":"Banner","2827":"Banner","2828":"Banner","2829":"Banner","2830":"Banner","2831":"Banner","2834":"Wall Banner","2835":"Wall Banner","2836":"Wall Banner","2837":"Wall Banner","2848":"Daylight Sensor","2849":"Daylight Sensor","2850":"Daylight Sensor","2851":"Daylight Sensor","2852":"Daylight Sensor","2853":"Daylight Sensor","2854":"Daylight Sensor","2855":"Daylight Sensor","2856":"Daylight Sensor","2857":"Daylight Sensor","2858":"Daylight Sensor","2859":"Daylight Sensor","2860":"Daylight Sensor","2861":"Daylight Sensor","2862":"Daylight Sensor","2863":"Daylight Sensor","2864":"Red Sandstone","2865":"Chiseled Red Sandstone","2866":"Cut Red Sandstone","2867":"Smooth Red Sandstone","2880":"Red Sandstone Stairs","2881":"Red Sandstone Stairs","2882":"Red Sandstone Stairs","2883":"Red Sandstone Stairs","2884":"Red Sandstone Stairs","2885":"Red Sandstone Stairs","2886":"Red Sandstone Stairs","2887":"Red Sandstone Stairs","2896":"Red Sandstone Slab","2897":"Purpur Slab","2898":"Prismarine Slab","2899":"Dark Prismarine Slab","2900":"Prismarine Bricks Slab","2901":"Mossy Cobblestone Slab","2902":"Smooth Sandstone Slab","2903":"Red Nether Brick Slab","2912":"Red Sandstone Slab","2913":"Purpur Slab","2914":"Prismarine Slab","2915":"Dark Prismarine Slab","2916":"Prismarine Bricks Slab","2917":"Mossy Cobblestone Slab","2918":"Smooth Sandstone Slab","2919":"Red Nether Brick Slab","2920":"Red Sandstone Slab","2921":"Purpur Slab","2922":"Prismarine Slab","2923":"Dark Prismarine Slab","2924":"Prismarine Bricks Slab","2925":"Mossy Cobblestone Slab","2926":"Smooth Sandstone Slab","2927":"Red Nether Brick Slab","2928":"Spruce Fence Gate","2929":"Spruce Fence Gate","2930":"Spruce Fence Gate","2931":"Spruce Fence Gate","2932":"Spruce Fence Gate","2933":"Spruce Fence Gate","2934":"Spruce Fence Gate","2935":"Spruce Fence Gate","2936":"Spruce Fence Gate","2937":"Spruce Fence Gate","2938":"Spruce Fence Gate","2939":"Spruce Fence Gate","2940":"Spruce Fence Gate","2941":"Spruce Fence Gate","2942":"Spruce Fence Gate","2943":"Spruce Fence Gate","2944":"Birch Fence Gate","2945":"Birch Fence Gate","2946":"Birch Fence Gate","2947":"Birch Fence Gate","2948":"Birch Fence Gate","2949":"Birch Fence Gate","2950":"Birch Fence Gate","2951":"Birch Fence Gate","2952":"Birch Fence Gate","2953":"Birch Fence Gate","2954":"Birch Fence Gate","2955":"Birch Fence Gate","2956":"Birch Fence Gate","2957":"Birch Fence Gate","2958":"Birch Fence Gate","2959":"Birch Fence Gate","2960":"Jungle Fence Gate","2961":"Jungle Fence Gate","2962":"Jungle Fence Gate","2963":"Jungle Fence Gate","2964":"Jungle Fence Gate","2965":"Jungle Fence Gate","2966":"Jungle Fence Gate","2967":"Jungle Fence Gate","2968":"Jungle Fence Gate","2969":"Jungle Fence Gate","2970":"Jungle Fence Gate","2971":"Jungle Fence Gate","2972":"Jungle Fence Gate","2973":"Jungle Fence Gate","2974":"Jungle Fence Gate","2975":"Jungle Fence Gate","2976":"Dark Oak Fence Gate","2977":"Dark Oak Fence Gate","2978":"Dark Oak Fence Gate","2979":"Dark Oak Fence Gate","2980":"Dark Oak Fence Gate","2981":"Dark Oak Fence Gate","2982":"Dark Oak Fence Gate","2983":"Dark Oak Fence Gate","2984":"Dark Oak Fence Gate","2985":"Dark Oak Fence Gate","2986":"Dark Oak Fence Gate","2987":"Dark Oak Fence Gate","2988":"Dark Oak Fence Gate","2989":"Dark Oak Fence Gate","2990":"Dark Oak Fence Gate","2991":"Dark Oak Fence Gate","2992":"Acacia Fence Gate","2993":"Acacia Fence Gate","2994":"Acacia Fence Gate","2995":"Acacia Fence Gate","2996":"Acacia Fence Gate","2997":"Acacia Fence Gate","2998":"Acacia Fence Gate","2999":"Acacia Fence Gate","3000":"Acacia Fence Gate","3001":"Acacia Fence Gate","3002":"Acacia Fence Gate","3003":"Acacia Fence Gate","3004":"Acacia Fence Gate","3005":"Acacia Fence Gate","3006":"Acacia Fence Gate","3007":"Acacia Fence Gate","3040":"Hardened Glass Pane","3056":"Stained Hardened Glass Pane","3057":"Stained Hardened Glass Pane","3058":"Stained Hardened Glass Pane","3059":"Stained Hardened Glass Pane","3060":"Stained Hardened Glass Pane","3061":"Stained Hardened Glass Pane","3062":"Stained Hardened Glass Pane","3063":"Stained Hardened Glass Pane","3064":"Stained Hardened Glass Pane","3065":"Stained Hardened Glass Pane","3066":"Stained Hardened Glass Pane","3067":"Stained Hardened Glass Pane","3068":"Stained Hardened Glass Pane","3069":"Stained Hardened Glass Pane","3070":"Stained Hardened Glass Pane","3071":"Stained Hardened Glass Pane","3072":"Heat Block","3088":"Spruce Door","3089":"Spruce Door","3090":"Spruce Door","3091":"Spruce Door","3092":"Spruce Door","3093":"Spruce Door","3094":"Spruce Door","3095":"Spruce Door","3096":"Spruce Door","3097":"Spruce Door","3104":"Birch Door","3105":"Birch Door","3106":"Birch Door","3107":"Birch Door","3108":"Birch Door","3109":"Birch Door","3110":"Birch Door","3111":"Birch Door","3112":"Birch Door","3113":"Birch Door","3120":"Jungle Door","3121":"Jungle Door","3122":"Jungle Door","3123":"Jungle Door","3124":"Jungle Door","3125":"Jungle Door","3126":"Jungle Door","3127":"Jungle Door","3128":"Jungle Door","3129":"Jungle Door","3136":"Acacia Door","3137":"Acacia Door","3138":"Acacia Door","3139":"Acacia Door","3140":"Acacia Door","3141":"Acacia Door","3142":"Acacia Door","3143":"Acacia Door","3144":"Acacia Door","3145":"Acacia Door","3152":"Dark Oak Door","3153":"Dark Oak Door","3154":"Dark Oak Door","3155":"Dark Oak Door","3156":"Dark Oak Door","3157":"Dark Oak Door","3158":"Dark Oak Door","3159":"Dark Oak Door","3160":"Dark Oak Door","3161":"Dark Oak Door","3168":"Grass Path","3184":"Item Frame","3185":"Item Frame","3186":"Item Frame","3187":"Item Frame","3188":"Item Frame","3189":"Item Frame","3190":"Item Frame","3191":"Item Frame","3216":"Purpur Block","3218":"Purpur Pillar","3222":"Purpur Pillar","3226":"Purpur Pillar","3233":"Red Torch","3234":"Red Torch","3235":"Red Torch","3236":"Red Torch","3237":"Red Torch","3241":"Green Torch","3242":"Green Torch","3243":"Green Torch","3244":"Green Torch","3245":"Green Torch","3248":"Purpur Stairs","3249":"Purpur Stairs","3250":"Purpur Stairs","3251":"Purpur Stairs","3252":"Purpur Stairs","3253":"Purpur Stairs","3254":"Purpur Stairs","3255":"Purpur Stairs","3265":"Blue Torch","3266":"Blue Torch","3267":"Blue Torch","3268":"Blue Torch","3269":"Blue Torch","3273":"Purple Torch","3274":"Purple Torch","3275":"Purple Torch","3276":"Purple Torch","3277":"Purple Torch","3280":"Shulker Box","3296":"End Stone Bricks","3312":"Frosted Ice","3313":"Frosted Ice","3314":"Frosted Ice","3315":"Frosted Ice","3328":"End Rod","3329":"End Rod","3330":"End Rod","3331":"End Rod","3332":"End Rod","3333":"End Rod","3408":"Magma Block","3424":"Nether Wart Block","3440":"Red Nether Bricks","3456":"Bone Block","3460":"Bone Block","3464":"Bone Block","3488":"Dyed Shulker Box","3489":"Dyed Shulker Box","3490":"Dyed Shulker Box","3491":"Dyed Shulker Box","3492":"Dyed Shulker Box","3493":"Dyed Shulker Box","3494":"Dyed Shulker Box","3495":"Dyed Shulker Box","3496":"Dyed Shulker Box","3497":"Dyed Shulker Box","3498":"Dyed Shulker Box","3499":"Dyed Shulker Box","3500":"Dyed Shulker Box","3501":"Dyed Shulker Box","3502":"Dyed Shulker Box","3503":"Dyed Shulker Box","3506":"Purple Glazed Terracotta","3507":"Purple Glazed Terracotta","3508":"Purple Glazed Terracotta","3509":"Purple Glazed Terracotta","3522":"White Glazed Terracotta","3523":"White Glazed Terracotta","3524":"White Glazed Terracotta","3525":"White Glazed Terracotta","3538":"Orange Glazed Terracotta","3539":"Orange Glazed Terracotta","3540":"Orange Glazed Terracotta","3541":"Orange Glazed Terracotta","3554":"Magenta Glazed Terracotta","3555":"Magenta Glazed Terracotta","3556":"Magenta Glazed Terracotta","3557":"Magenta Glazed Terracotta","3570":"Light Blue Glazed Terracotta","3571":"Light Blue Glazed Terracotta","3572":"Light Blue Glazed Terracotta","3573":"Light Blue Glazed Terracotta","3586":"Yellow Glazed Terracotta","3587":"Yellow Glazed Terracotta","3588":"Yellow Glazed Terracotta","3589":"Yellow Glazed Terracotta","3602":"Lime Glazed Terracotta","3603":"Lime Glazed Terracotta","3604":"Lime Glazed Terracotta","3605":"Lime Glazed Terracotta","3618":"Pink Glazed Terracotta","3619":"Pink Glazed Terracotta","3620":"Pink Glazed Terracotta","3621":"Pink Glazed Terracotta","3634":"Gray Glazed Terracotta","3635":"Gray Glazed Terracotta","3636":"Gray Glazed Terracotta","3637":"Gray Glazed Terracotta","3650":"Light Gray Glazed Terracotta","3651":"Light Gray Glazed Terracotta","3652":"Light Gray Glazed Terracotta","3653":"Light Gray Glazed Terracotta","3666":"Cyan Glazed Terracotta","3667":"Cyan Glazed Terracotta","3668":"Cyan Glazed Terracotta","3669":"Cyan Glazed Terracotta","3698":"Blue Glazed Terracotta","3699":"Blue Glazed Terracotta","3700":"Blue Glazed Terracotta","3701":"Blue Glazed Terracotta","3714":"Brown Glazed Terracotta","3715":"Brown Glazed Terracotta","3716":"Brown Glazed Terracotta","3717":"Brown Glazed Terracotta","3730":"Green Glazed Terracotta","3731":"Green Glazed Terracotta","3732":"Green Glazed Terracotta","3733":"Green Glazed Terracotta","3746":"Red Glazed Terracotta","3747":"Red Glazed Terracotta","3748":"Red Glazed Terracotta","3749":"Red Glazed Terracotta","3762":"Black Glazed Terracotta","3763":"Black Glazed Terracotta","3764":"Black Glazed Terracotta","3765":"Black Glazed Terracotta","3776":"Concrete","3777":"Concrete","3778":"Concrete","3779":"Concrete","3780":"Concrete","3781":"Concrete","3782":"Concrete","3783":"Concrete","3784":"Concrete","3785":"Concrete","3786":"Concrete","3787":"Concrete","3788":"Concrete","3789":"Concrete","3790":"Concrete","3791":"Concrete","3792":"Concrete Powder","3793":"Concrete Powder","3794":"Concrete Powder","3795":"Concrete Powder","3796":"Concrete Powder","3797":"Concrete Powder","3798":"Concrete Powder","3799":"Concrete Powder","3800":"Concrete Powder","3801":"Concrete Powder","3802":"Concrete Powder","3803":"Concrete Powder","3804":"Concrete Powder","3805":"Concrete Powder","3806":"Concrete Powder","3807":"Concrete Powder","3808":"Compound Creator","3809":"Compound Creator","3810":"Compound Creator","3811":"Compound Creator","3812":"Material Reducer","3813":"Material Reducer","3814":"Material Reducer","3815":"Material Reducer","3816":"Element Constructor","3817":"Element Constructor","3818":"Element Constructor","3819":"Element Constructor","3820":"Lab Table","3821":"Lab Table","3822":"Lab Table","3823":"Lab Table","3825":"Underwater Torch","3826":"Underwater Torch","3827":"Underwater Torch","3828":"Underwater Torch","3829":"Underwater Torch","3856":"Stained Glass","3857":"Stained Glass","3858":"Stained Glass","3859":"Stained Glass","3860":"Stained Glass","3861":"Stained Glass","3862":"Stained Glass","3863":"Stained Glass","3864":"Stained Glass","3865":"Stained Glass","3866":"Stained Glass","3867":"Stained Glass","3868":"Stained Glass","3869":"Stained Glass","3870":"Stained Glass","3871":"Stained Glass","3888":"Podzol","3904":"Beetroot Block","3905":"Beetroot Block","3906":"Beetroot Block","3907":"Beetroot Block","3908":"Beetroot Block","3909":"Beetroot Block","3910":"Beetroot Block","3911":"Beetroot Block","3920":"Legacy Stonecutter","3936":"Glowing Obsidian","3952":"Nether Reactor Core","3968":"update!","3984":"ate!upd","4048":"Hardened Glass","4064":"Stained Hardened Glass","4065":"Stained Hardened Glass","4066":"Stained Hardened Glass","4067":"Stained Hardened Glass","4068":"Stained Hardened Glass","4069":"Stained Hardened Glass","4070":"Stained Hardened Glass","4071":"Stained Hardened Glass","4072":"Stained Hardened Glass","4073":"Stained Hardened Glass","4074":"Stained Hardened Glass","4075":"Stained Hardened Glass","4076":"Stained Hardened Glass","4077":"Stained Hardened Glass","4078":"Stained Hardened Glass","4079":"Stained Hardened Glass","4080":"reserved6","4112":"Prismarine Stairs","4113":"Prismarine Stairs","4114":"Prismarine Stairs","4115":"Prismarine Stairs","4116":"Prismarine Stairs","4117":"Prismarine Stairs","4118":"Prismarine Stairs","4119":"Prismarine Stairs","4128":"Dark Prismarine Stairs","4129":"Dark Prismarine Stairs","4130":"Dark Prismarine Stairs","4131":"Dark Prismarine Stairs","4132":"Dark Prismarine Stairs","4133":"Dark Prismarine Stairs","4134":"Dark Prismarine Stairs","4135":"Dark Prismarine Stairs","4144":"Prismarine Bricks Stairs","4145":"Prismarine Bricks Stairs","4146":"Prismarine Bricks Stairs","4147":"Prismarine Bricks Stairs","4148":"Prismarine Bricks Stairs","4149":"Prismarine Bricks Stairs","4150":"Prismarine Bricks Stairs","4151":"Prismarine Bricks Stairs","4160":"Stripped Spruce Log","4161":"Stripped Spruce Log","4162":"Stripped Spruce Log","4176":"Stripped Birch Log","4177":"Stripped Birch Log","4178":"Stripped Birch Log","4192":"Stripped Jungle Log","4193":"Stripped Jungle Log","4194":"Stripped Jungle Log","4208":"Stripped Acacia Log","4209":"Stripped Acacia Log","4210":"Stripped Acacia Log","4224":"Stripped Dark Oak Log","4225":"Stripped Dark Oak Log","4226":"Stripped Dark Oak Log","4240":"Stripped Oak Log","4241":"Stripped Oak Log","4242":"Stripped Oak Log","4256":"Blue Ice","4272":"Hydrogen","4288":"Helium","4304":"Lithium","4320":"Beryllium","4336":"Boron","4352":"Carbon","4368":"Nitrogen","4384":"Oxygen","4400":"Fluorine","4416":"Neon","4432":"Sodium","4448":"Magnesium","4464":"Aluminum","4480":"Silicon","4496":"Phosphorus","4512":"Sulfur","4528":"Chlorine","4544":"Argon","4560":"Potassium","4576":"Calcium","4592":"Scandium","4608":"Titanium","4624":"Vanadium","4640":"Chromium","4656":"Manganese","4672":"Iron","4688":"Cobalt","4704":"Nickel","4720":"Copper","4736":"Zinc","4752":"Gallium","4768":"Germanium","4784":"Arsenic","4800":"Selenium","4816":"Bromine","4832":"Krypton","4848":"Rubidium","4864":"Strontium","4880":"Yttrium","4896":"Zirconium","4912":"Niobium","4928":"Molybdenum","4944":"Technetium","4960":"Ruthenium","4976":"Rhodium","4992":"Palladium","5008":"Silver","5024":"Cadmium","5040":"Indium","5056":"Tin","5072":"Antimony","5088":"Tellurium","5104":"Iodine","5120":"Xenon","5136":"Cesium","5152":"Barium","5168":"Lanthanum","5184":"Cerium","5200":"Praseodymium","5216":"Neodymium","5232":"Promethium","5248":"Samarium","5264":"Europium","5280":"Gadolinium","5296":"Terbium","5312":"Dysprosium","5328":"Holmium","5344":"Erbium","5360":"Thulium","5376":"Ytterbium","5392":"Lutetium","5408":"Hafnium","5424":"Tantalum","5440":"Tungsten","5456":"Rhenium","5472":"Osmium","5488":"Iridium","5504":"Platinum","5520":"Gold","5536":"Mercury","5552":"Thallium","5568":"Lead","5584":"Bismuth","5600":"Polonium","5616":"Astatine","5632":"Radon","5648":"Francium","5664":"Radium","5680":"Actinium","5696":"Thorium","5712":"Protactinium","5728":"Uranium","5744":"Neptunium","5760":"Plutonium","5776":"Americium","5792":"Curium","5808":"Berkelium","5824":"Californium","5840":"Einsteinium","5856":"Fermium","5872":"Mendelevium","5888":"Nobelium","5904":"Lawrencium","5920":"Rutherfordium","5936":"Dubnium","5952":"Seaborgium","5968":"Bohrium","5984":"Hassium","6000":"Meitnerium","6016":"Darmstadtium","6032":"Roentgenium","6048":"Copernicium","6064":"Nihonium","6080":"Flerovium","6096":"Moscovium","6112":"Livermorium","6128":"Tennessine","6144":"Oganesson","6176":"Coral","6177":"Coral","6178":"Coral","6179":"Coral","6180":"Coral","6192":"Coral Block","6193":"Coral Block","6194":"Coral Block","6195":"Coral Block","6196":"Coral Block","6200":"Coral Block","6201":"Coral Block","6202":"Coral Block","6203":"Coral Block","6204":"Coral Block","6208":"Coral Fan","6209":"Coral Fan","6210":"Coral Fan","6211":"Coral Fan","6212":"Coral Fan","6216":"Coral Fan","6217":"Coral Fan","6218":"Coral Fan","6219":"Coral Fan","6220":"Coral Fan","6224":"Coral Fan","6225":"Coral Fan","6226":"Coral Fan","6227":"Coral Fan","6228":"Coral Fan","6232":"Coral Fan","6233":"Coral Fan","6234":"Coral Fan","6235":"Coral Fan","6236":"Coral Fan","6240":"Wall Coral Fan","6241":"Wall Coral Fan","6242":"Wall Coral Fan","6243":"Wall Coral Fan","6244":"Wall Coral Fan","6245":"Wall Coral Fan","6246":"Wall Coral Fan","6247":"Wall Coral Fan","6248":"Wall Coral Fan","6249":"Wall Coral Fan","6250":"Wall Coral Fan","6251":"Wall Coral Fan","6252":"Wall Coral Fan","6253":"Wall Coral Fan","6254":"Wall Coral Fan","6255":"Wall Coral Fan","6256":"Wall Coral Fan","6257":"Wall Coral Fan","6258":"Wall Coral Fan","6259":"Wall Coral Fan","6260":"Wall Coral Fan","6261":"Wall Coral Fan","6262":"Wall Coral Fan","6263":"Wall Coral Fan","6264":"Wall Coral Fan","6265":"Wall Coral Fan","6266":"Wall Coral Fan","6267":"Wall Coral Fan","6268":"Wall Coral Fan","6269":"Wall Coral Fan","6270":"Wall Coral Fan","6271":"Wall Coral Fan","6272":"Wall Coral Fan","6274":"Wall Coral Fan","6276":"Wall Coral Fan","6278":"Wall Coral Fan","6280":"Wall Coral Fan","6282":"Wall Coral Fan","6284":"Wall Coral Fan","6286":"Wall Coral Fan","6304":"Dried Kelp Block","6320":"Acacia Button","6321":"Acacia Button","6322":"Acacia Button","6323":"Acacia Button","6324":"Acacia Button","6325":"Acacia Button","6328":"Acacia Button","6329":"Acacia Button","6330":"Acacia Button","6331":"Acacia Button","6332":"Acacia Button","6333":"Acacia Button","6336":"Birch Button","6337":"Birch Button","6338":"Birch Button","6339":"Birch Button","6340":"Birch Button","6341":"Birch Button","6344":"Birch Button","6345":"Birch Button","6346":"Birch Button","6347":"Birch Button","6348":"Birch Button","6349":"Birch Button","6352":"Dark Oak Button","6353":"Dark Oak Button","6354":"Dark Oak Button","6355":"Dark Oak Button","6356":"Dark Oak Button","6357":"Dark Oak Button","6360":"Dark Oak Button","6361":"Dark Oak Button","6362":"Dark Oak Button","6363":"Dark Oak Button","6364":"Dark Oak Button","6365":"Dark Oak Button","6368":"Jungle Button","6369":"Jungle Button","6370":"Jungle Button","6371":"Jungle Button","6372":"Jungle Button","6373":"Jungle Button","6376":"Jungle Button","6377":"Jungle Button","6378":"Jungle Button","6379":"Jungle Button","6380":"Jungle Button","6381":"Jungle Button","6384":"Spruce Button","6385":"Spruce Button","6386":"Spruce Button","6387":"Spruce Button","6388":"Spruce Button","6389":"Spruce Button","6392":"Spruce Button","6393":"Spruce Button","6394":"Spruce Button","6395":"Spruce Button","6396":"Spruce Button","6397":"Spruce Button","6400":"Acacia Trapdoor","6401":"Acacia Trapdoor","6402":"Acacia Trapdoor","6403":"Acacia Trapdoor","6404":"Acacia Trapdoor","6405":"Acacia Trapdoor","6406":"Acacia Trapdoor","6407":"Acacia Trapdoor","6408":"Acacia Trapdoor","6409":"Acacia Trapdoor","6410":"Acacia Trapdoor","6411":"Acacia Trapdoor","6412":"Acacia Trapdoor","6413":"Acacia Trapdoor","6414":"Acacia Trapdoor","6415":"Acacia Trapdoor","6416":"Birch Trapdoor","6417":"Birch Trapdoor","6418":"Birch Trapdoor","6419":"Birch Trapdoor","6420":"Birch Trapdoor","6421":"Birch Trapdoor","6422":"Birch Trapdoor","6423":"Birch Trapdoor","6424":"Birch Trapdoor","6425":"Birch Trapdoor","6426":"Birch Trapdoor","6427":"Birch Trapdoor","6428":"Birch Trapdoor","6429":"Birch Trapdoor","6430":"Birch Trapdoor","6431":"Birch Trapdoor","6432":"Dark Oak Trapdoor","6433":"Dark Oak Trapdoor","6434":"Dark Oak Trapdoor","6435":"Dark Oak Trapdoor","6436":"Dark Oak Trapdoor","6437":"Dark Oak Trapdoor","6438":"Dark Oak Trapdoor","6439":"Dark Oak Trapdoor","6440":"Dark Oak Trapdoor","6441":"Dark Oak Trapdoor","6442":"Dark Oak Trapdoor","6443":"Dark Oak Trapdoor","6444":"Dark Oak Trapdoor","6445":"Dark Oak Trapdoor","6446":"Dark Oak Trapdoor","6447":"Dark Oak Trapdoor","6448":"Jungle Trapdoor","6449":"Jungle Trapdoor","6450":"Jungle Trapdoor","6451":"Jungle Trapdoor","6452":"Jungle Trapdoor","6453":"Jungle Trapdoor","6454":"Jungle Trapdoor","6455":"Jungle Trapdoor","6456":"Jungle Trapdoor","6457":"Jungle Trapdoor","6458":"Jungle Trapdoor","6459":"Jungle Trapdoor","6460":"Jungle Trapdoor","6461":"Jungle Trapdoor","6462":"Jungle Trapdoor","6463":"Jungle Trapdoor","6464":"Spruce Trapdoor","6465":"Spruce Trapdoor","6466":"Spruce Trapdoor","6467":"Spruce Trapdoor","6468":"Spruce Trapdoor","6469":"Spruce Trapdoor","6470":"Spruce Trapdoor","6471":"Spruce Trapdoor","6472":"Spruce Trapdoor","6473":"Spruce Trapdoor","6474":"Spruce Trapdoor","6475":"Spruce Trapdoor","6476":"Spruce Trapdoor","6477":"Spruce Trapdoor","6478":"Spruce Trapdoor","6479":"Spruce Trapdoor","6480":"Acacia Pressure Plate","6481":"Acacia Pressure Plate","6496":"Birch Pressure Plate","6497":"Birch Pressure Plate","6512":"Dark Oak Pressure Plate","6513":"Dark Oak Pressure Plate","6528":"Jungle Pressure Plate","6529":"Jungle Pressure Plate","6544":"Spruce Pressure Plate","6545":"Spruce Pressure Plate","6560":"Carved Pumpkin","6561":"Carved Pumpkin","6562":"Carved Pumpkin","6563":"Carved Pumpkin","6576":"Sea Pickle","6577":"Sea Pickle","6578":"Sea Pickle","6579":"Sea Pickle","6580":"Sea Pickle","6581":"Sea Pickle","6582":"Sea Pickle","6583":"Sea Pickle","6656":"Barrier","6672":"End Stone Brick Slab","6673":"Smooth Red Sandstone Slab","6674":"Polished Andesite Slab","6675":"Andesite Slab","6676":"Diorite Slab","6677":"Polished Diorite Slab","6678":"Granite Slab","6679":"Polished Granite Slab","6680":"End Stone Brick Slab","6681":"Smooth Red Sandstone Slab","6682":"Polished Andesite Slab","6683":"Andesite Slab","6684":"Diorite Slab","6685":"Polished Diorite Slab","6686":"Granite Slab","6687":"Polished Granite Slab","6688":"Bamboo","6689":"Bamboo","6690":"Bamboo","6691":"Bamboo","6692":"Bamboo","6693":"Bamboo","6696":"Bamboo","6697":"Bamboo","6698":"Bamboo","6699":"Bamboo","6700":"Bamboo","6701":"Bamboo","6704":"Bamboo Sapling","6705":"Bamboo Sapling","6736":"Mossy Stone Brick Slab","6737":"Smooth Quartz Slab","6738":"Stone Slab","6739":"Cut Sandstone Slab","6740":"Cut Red Sandstone Slab","6744":"Mossy Stone Brick Slab","6745":"Smooth Quartz Slab","6746":"Stone Slab","6747":"Cut Sandstone Slab","6748":"Cut Red Sandstone Slab","6752":"End Stone Brick Slab","6753":"Smooth Red Sandstone Slab","6754":"Polished Andesite Slab","6755":"Andesite Slab","6756":"Diorite Slab","6757":"Polished Diorite Slab","6758":"Granite Slab","6759":"Polished Granite Slab","6768":"Mossy Stone Brick Slab","6769":"Smooth Quartz Slab","6770":"Stone Slab","6771":"Cut Sandstone Slab","6772":"Cut Red Sandstone Slab","6784":"Granite Stairs","6785":"Granite Stairs","6786":"Granite Stairs","6787":"Granite Stairs","6788":"Granite Stairs","6789":"Granite Stairs","6790":"Granite Stairs","6791":"Granite Stairs","6800":"Diorite Stairs","6801":"Diorite Stairs","6802":"Diorite Stairs","6803":"Diorite Stairs","6804":"Diorite Stairs","6805":"Diorite Stairs","6806":"Diorite Stairs","6807":"Diorite Stairs","6816":"Andesite Stairs","6817":"Andesite Stairs","6818":"Andesite Stairs","6819":"Andesite Stairs","6820":"Andesite Stairs","6821":"Andesite Stairs","6822":"Andesite Stairs","6823":"Andesite Stairs","6832":"Polished Granite Stairs","6833":"Polished Granite Stairs","6834":"Polished Granite Stairs","6835":"Polished Granite Stairs","6836":"Polished Granite Stairs","6837":"Polished Granite Stairs","6838":"Polished Granite Stairs","6839":"Polished Granite Stairs","6848":"Polished Diorite Stairs","6849":"Polished Diorite Stairs","6850":"Polished Diorite Stairs","6851":"Polished Diorite Stairs","6852":"Polished Diorite Stairs","6853":"Polished Diorite Stairs","6854":"Polished Diorite Stairs","6855":"Polished Diorite Stairs","6864":"Polished Andesite Stairs","6865":"Polished Andesite Stairs","6866":"Polished Andesite Stairs","6867":"Polished Andesite Stairs","6868":"Polished Andesite Stairs","6869":"Polished Andesite Stairs","6870":"Polished Andesite Stairs","6871":"Polished Andesite Stairs","6880":"Mossy Stone Brick Stairs","6881":"Mossy Stone Brick Stairs","6882":"Mossy Stone Brick Stairs","6883":"Mossy Stone Brick Stairs","6884":"Mossy Stone Brick Stairs","6885":"Mossy Stone Brick Stairs","6886":"Mossy Stone Brick Stairs","6887":"Mossy Stone Brick Stairs","6896":"Smooth Red Sandstone Stairs","6897":"Smooth Red Sandstone Stairs","6898":"Smooth Red Sandstone Stairs","6899":"Smooth Red Sandstone Stairs","6900":"Smooth Red Sandstone Stairs","6901":"Smooth Red Sandstone Stairs","6902":"Smooth Red Sandstone Stairs","6903":"Smooth Red Sandstone Stairs","6912":"Smooth Sandstone Stairs","6913":"Smooth Sandstone Stairs","6914":"Smooth Sandstone Stairs","6915":"Smooth Sandstone Stairs","6916":"Smooth Sandstone Stairs","6917":"Smooth Sandstone Stairs","6918":"Smooth Sandstone Stairs","6919":"Smooth Sandstone Stairs","6928":"End Stone Brick Stairs","6929":"End Stone Brick Stairs","6930":"End Stone Brick Stairs","6931":"End Stone Brick Stairs","6932":"End Stone Brick Stairs","6933":"End Stone Brick Stairs","6934":"End Stone Brick Stairs","6935":"End Stone Brick Stairs","6944":"Mossy Cobblestone Stairs","6945":"Mossy Cobblestone Stairs","6946":"Mossy Cobblestone Stairs","6947":"Mossy Cobblestone Stairs","6948":"Mossy Cobblestone Stairs","6949":"Mossy Cobblestone Stairs","6950":"Mossy Cobblestone Stairs","6951":"Mossy Cobblestone Stairs","6960":"Stone Stairs","6961":"Stone Stairs","6962":"Stone Stairs","6963":"Stone Stairs","6964":"Stone Stairs","6965":"Stone Stairs","6966":"Stone Stairs","6967":"Stone Stairs","6976":"Spruce Sign","6977":"Spruce Sign","6978":"Spruce Sign","6979":"Spruce Sign","6980":"Spruce Sign","6981":"Spruce Sign","6982":"Spruce Sign","6983":"Spruce Sign","6984":"Spruce Sign","6985":"Spruce Sign","6986":"Spruce Sign","6987":"Spruce Sign","6988":"Spruce Sign","6989":"Spruce Sign","6990":"Spruce Sign","6991":"Spruce Sign","6994":"Spruce Wall Sign","6995":"Spruce Wall Sign","6996":"Spruce Wall Sign","6997":"Spruce Wall Sign","7008":"Smooth Stone","7024":"Red Nether Brick Stairs","7025":"Red Nether Brick Stairs","7026":"Red Nether Brick Stairs","7027":"Red Nether Brick Stairs","7028":"Red Nether Brick Stairs","7029":"Red Nether Brick Stairs","7030":"Red Nether Brick Stairs","7031":"Red Nether Brick Stairs","7040":"Smooth Quartz Stairs","7041":"Smooth Quartz Stairs","7042":"Smooth Quartz Stairs","7043":"Smooth Quartz Stairs","7044":"Smooth Quartz Stairs","7045":"Smooth Quartz Stairs","7046":"Smooth Quartz Stairs","7047":"Smooth Quartz Stairs","7056":"Birch Sign","7057":"Birch Sign","7058":"Birch Sign","7059":"Birch Sign","7060":"Birch Sign","7061":"Birch Sign","7062":"Birch Sign","7063":"Birch Sign","7064":"Birch Sign","7065":"Birch Sign","7066":"Birch Sign","7067":"Birch Sign","7068":"Birch Sign","7069":"Birch Sign","7070":"Birch Sign","7071":"Birch Sign","7074":"Birch Wall Sign","7075":"Birch Wall Sign","7076":"Birch Wall Sign","7077":"Birch Wall Sign","7088":"Jungle Sign","7089":"Jungle Sign","7090":"Jungle Sign","7091":"Jungle Sign","7092":"Jungle Sign","7093":"Jungle Sign","7094":"Jungle Sign","7095":"Jungle Sign","7096":"Jungle Sign","7097":"Jungle Sign","7098":"Jungle Sign","7099":"Jungle Sign","7100":"Jungle Sign","7101":"Jungle Sign","7102":"Jungle Sign","7103":"Jungle Sign","7106":"Jungle Wall Sign","7107":"Jungle Wall Sign","7108":"Jungle Wall Sign","7109":"Jungle Wall Sign","7120":"Acacia Sign","7121":"Acacia Sign","7122":"Acacia Sign","7123":"Acacia Sign","7124":"Acacia Sign","7125":"Acacia Sign","7126":"Acacia Sign","7127":"Acacia Sign","7128":"Acacia Sign","7129":"Acacia Sign","7130":"Acacia Sign","7131":"Acacia Sign","7132":"Acacia Sign","7133":"Acacia Sign","7134":"Acacia Sign","7135":"Acacia Sign","7138":"Acacia Wall Sign","7139":"Acacia Wall Sign","7140":"Acacia Wall Sign","7141":"Acacia Wall Sign","7152":"Dark Oak Sign","7153":"Dark Oak Sign","7154":"Dark Oak Sign","7155":"Dark Oak Sign","7156":"Dark Oak Sign","7157":"Dark Oak Sign","7158":"Dark Oak Sign","7159":"Dark Oak Sign","7160":"Dark Oak Sign","7161":"Dark Oak Sign","7162":"Dark Oak Sign","7163":"Dark Oak Sign","7164":"Dark Oak Sign","7165":"Dark Oak Sign","7166":"Dark Oak Sign","7167":"Dark Oak Sign","7170":"Dark Oak Wall Sign","7171":"Dark Oak Wall Sign","7172":"Dark Oak Wall Sign","7173":"Dark Oak Wall Sign","7184":"Lectern","7185":"Lectern","7186":"Lectern","7187":"Lectern","7188":"Lectern","7189":"Lectern","7190":"Lectern","7191":"Lectern","7218":"Blast Furnace","7219":"Blast Furnace","7220":"Blast Furnace","7221":"Blast Furnace","7234":"Stonecutter","7235":"Stonecutter","7236":"Stonecutter","7237":"Stonecutter","7250":"Smoker","7251":"Smoker","7252":"Smoker","7253":"Smoker","7266":"Smoker","7267":"Smoker","7268":"Smoker","7269":"Smoker","7296":"Fletching Table","7328":"Barrel","7329":"Barrel","7330":"Barrel","7331":"Barrel","7332":"Barrel","7333":"Barrel","7336":"Barrel","7337":"Barrel","7338":"Barrel","7339":"Barrel","7340":"Barrel","7341":"Barrel","7344":"Loom","7345":"Loom","7346":"Loom","7347":"Loom","7376":"Bell","7377":"Bell","7378":"Bell","7379":"Bell","7380":"Bell","7381":"Bell","7382":"Bell","7383":"Bell","7384":"Bell","7385":"Bell","7386":"Bell","7387":"Bell","7388":"Bell","7389":"Bell","7390":"Bell","7391":"Bell","7392":"Sweet Berry Bush","7393":"Sweet Berry Bush","7394":"Sweet Berry Bush","7395":"Sweet Berry Bush","7408":"Lantern","7409":"Lantern","7472":"Oak Wood","7473":"Spruce Wood","7474":"Birch Wood","7475":"Jungle Wood","7476":"Acacia Wood","7477":"Dark Oak Wood","7480":"Stripped Oak Wood","7481":"Stripped Spruce Wood","7482":"Stripped Birch Wood","7483":"Stripped Jungle Wood","7484":"Stripped Acacia Wood","7485":"Stripped Dark Oak Wood","7506":"Blast Furnace","7507":"Blast Furnace","7508":"Blast Furnace","7509":"Blast Furnace"},"remaps":{"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"23":16,"24":16,"25":16,"26":16,"27":16,"28":16,"29":16,"30":16,"31":16,"33":32,"34":32,"35":32,"36":32,"37":32,"38":32,"39":32,"40":32,"41":32,"42":32,"43":32,"44":32,"45":32,"46":32,"47":32,"50":48,"51":48,"52":48,"53":48,"54":48,"55":48,"56":48,"57":48,"58":48,"59":48,"60":48,"61":48,"62":48,"63":48,"65":64,"66":64,"67":64,"68":64,"69":64,"70":64,"71":64,"72":64,"73":64,"74":64,"75":64,"76":64,"77":64,"78":64,"79":64,"86":80,"87":80,"88":80,"89":80,"90":80,"91":80,"92":80,"93":80,"94":80,"95":80,"102":96,"103":96,"110":96,"111":96,"114":112,"115":112,"116":112,"117":112,"118":112,"119":112,"120":112,"121":112,"122":112,"123":112,"124":112,"125":112,"126":112,"127":112,"194":192,"195":192,"196":192,"197":192,"198":192,"199":192,"200":192,"201":192,"202":192,"203":192,"204":192,"205":192,"206":192,"207":192,"209":208,"210":208,"211":208,"212":208,"213":208,"214":208,"215":208,"216":208,"217":208,"218":208,"219":208,"220":208,"221":208,"222":208,"223":208,"225":224,"226":224,"227":224,"228":224,"229":224,"230":224,"231":224,"232":224,"233":224,"234":224,"235":224,"236":224,"237":224,"238":224,"239":224,"241":240,"242":240,"243":240,"244":240,"245":240,"246":240,"247":240,"248":240,"249":240,"250":240,"251":240,"252":240,"253":240,"254":240,"255":240,"257":256,"258":256,"259":256,"260":256,"261":256,"262":256,"263":256,"264":256,"265":256,"266":256,"267":256,"268":256,"269":256,"270":256,"271":256,"284":7472,"285":7473,"286":7474,"287":7475,"306":304,"307":304,"308":304,"309":304,"310":304,"311":304,"312":304,"313":304,"314":304,"315":304,"316":304,"317":304,"318":304,"319":304,"321":320,"322":320,"323":320,"324":320,"325":320,"326":320,"327":320,"328":320,"329":320,"330":320,"331":320,"332":320,"333":320,"334":320,"335":320,"337":336,"338":336,"339":336,"340":336,"341":336,"342":336,"343":336,"344":336,"345":336,"346":336,"347":336,"348":336,"349":336,"350":336,"351":336,"353":352,"354":352,"355":352,"356":352,"357":352,"358":352,"359":352,"360":352,"361":352,"362":352,"363":352,"364":352,"365":352,"366":352,"367":352,"388":384,"389":384,"390":384,"391":384,"392":384,"393":384,"394":384,"395":384,"396":384,"397":384,"398":384,"399":384,"401":400,"402":400,"403":400,"404":400,"405":400,"406":400,"407":400,"408":400,"409":400,"410":400,"411":400,"412":400,"413":400,"414":400,"415":400,"438":432,"439":432,"446":432,"447":432,"454":448,"455":448,"462":448,"463":448,"481":480,"482":480,"483":480,"484":480,"485":480,"486":480,"487":480,"488":480,"489":480,"490":480,"491":480,"492":480,"493":480,"494":480,"495":480,"496":498,"499":498,"500":498,"501":498,"502":498,"503":498,"504":498,"505":498,"506":498,"507":498,"508":498,"509":498,"510":498,"511":498,"513":512,"514":512,"515":512,"516":512,"517":512,"518":512,"519":512,"520":512,"521":512,"522":512,"523":512,"524":512,"525":512,"526":512,"527":512,"577":576,"578":576,"579":576,"580":576,"581":576,"582":576,"583":576,"584":576,"585":576,"586":576,"587":576,"588":576,"589":576,"590":576,"591":576,"593":592,"594":592,"595":592,"596":592,"597":592,"598":592,"599":592,"600":592,"601":592,"602":592,"603":592,"604":592,"605":592,"606":592,"607":592,"619":608,"620":608,"621":608,"622":608,"623":608,"625":624,"626":624,"627":624,"628":624,"629":624,"630":624,"631":624,"632":624,"633":624,"634":624,"635":624,"636":624,"637":624,"638":624,"639":624,"641":640,"642":640,"643":640,"644":640,"645":640,"646":640,"647":640,"648":640,"649":640,"650":640,"651":640,"652":640,"653":640,"654":640,"655":640,"657":656,"658":656,"659":656,"660":656,"661":656,"662":656,"663":656,"664":656,"665":656,"666":656,"667":656,"668":656,"669":656,"670":656,"671":656,"673":672,"674":672,"675":672,"676":672,"677":672,"678":672,"679":672,"680":672,"681":672,"682":672,"683":672,"684":672,"685":672,"686":672,"687":672,"696":688,"697":689,"698":690,"699":691,"700":692,"701":693,"702":694,"703":695,"721":720,"722":720,"723":720,"724":720,"725":720,"726":720,"727":720,"728":720,"729":720,"730":720,"731":720,"732":720,"733":720,"734":720,"735":720,"740":736,"741":736,"742":736,"743":736,"744":736,"745":736,"746":736,"747":736,"748":736,"749":736,"750":736,"751":736,"753":752,"754":752,"755":752,"756":752,"757":752,"758":752,"759":752,"760":752,"761":752,"762":752,"763":752,"764":752,"765":752,"766":752,"767":752,"769":768,"770":768,"771":768,"772":768,"773":768,"774":768,"775":768,"776":768,"777":768,"778":768,"779":768,"780":768,"781":768,"782":768,"783":768,"785":784,"786":784,"787":784,"788":784,"789":784,"790":784,"791":784,"792":784,"793":784,"794":784,"795":784,"796":784,"797":784,"798":784,"799":784,"800":805,"806":805,"807":805,"808":805,"809":805,"810":805,"811":805,"812":805,"813":805,"814":805,"815":805,"833":832,"834":832,"835":832,"836":832,"837":832,"838":832,"839":832,"840":832,"841":832,"842":832,"843":832,"844":832,"845":832,"846":832,"847":832,"856":851,"857":851,"858":851,"859":851,"860":851,"861":851,"862":851,"863":851,"864":866,"865":866,"870":866,"871":866,"872":866,"873":866,"874":866,"875":866,"876":866,"877":866,"878":866,"879":866,"897":896,"898":896,"899":896,"900":896,"901":896,"902":896,"903":896,"904":896,"905":896,"906":896,"907":896,"908":896,"909":896,"910":896,"911":896,"913":912,"914":912,"915":912,"916":912,"917":912,"918":912,"919":912,"920":912,"921":912,"922":912,"923":912,"924":912,"925":912,"926":912,"927":912,"929":928,"930":928,"931":928,"932":928,"933":928,"934":928,"935":928,"936":928,"937":928,"938":928,"939":928,"940":928,"941":928,"942":928,"943":928,"952":944,"953":944,"954":944,"955":944,"956":944,"957":944,"958":944,"959":944,"968":960,"969":960,"970":960,"971":960,"972":960,"973":960,"974":960,"975":960,"976":978,"977":978,"982":978,"983":978,"984":978,"985":978,"986":978,"987":978,"988":978,"989":978,"990":978,"991":978,"992":978,"993":978,"998":978,"999":978,"1000":978,"1001":978,"1002":978,"1003":978,"1004":978,"1005":978,"1006":978,"1007":978,"1034":1027,"1035":1027,"1036":1027,"1037":1027,"1038":1027,"1039":1027,"1040":1042,"1041":1042,"1046":1042,"1047":1042,"1048":1042,"1049":1042,"1050":1042,"1051":1042,"1052":1042,"1053":1042,"1054":1042,"1055":1042,"1066":1056,"1067":1056,"1068":1056,"1069":1056,"1070":1056,"1071":1056,"1080":1075,"1081":1075,"1082":1075,"1083":1075,"1084":1075,"1085":1075,"1086":1075,"1087":1075,"1088":1090,"1089":1090,"1094":1090,"1095":1090,"1096":1090,"1097":1090,"1098":1090,"1099":1090,"1100":1090,"1101":1090,"1102":1090,"1103":1090,"1122":1120,"1123":1120,"1124":1120,"1125":1120,"1126":1120,"1127":1120,"1128":1120,"1129":1120,"1130":1120,"1131":1120,"1132":1120,"1133":1120,"1134":1120,"1135":1120,"1146":1139,"1147":1139,"1148":1139,"1149":1139,"1150":1139,"1151":1139,"1154":1152,"1155":1152,"1156":1152,"1157":1152,"1158":1152,"1159":1152,"1160":1152,"1161":1152,"1162":1152,"1163":1152,"1164":1152,"1165":1152,"1166":1152,"1167":1152,"1169":1168,"1170":1168,"1171":1168,"1172":1168,"1173":1168,"1174":1168,"1175":1168,"1176":1168,"1177":1168,"1178":1168,"1179":1168,"1180":1168,"1181":1168,"1182":1168,"1183":1168,"1185":1168,"1186":1168,"1187":1168,"1188":1168,"1189":1168,"1190":1168,"1191":1168,"1192":1168,"1193":1168,"1194":1168,"1195":1168,"1196":1168,"1197":1168,"1198":1168,"1199":1168,"1200":1221,"1206":1221,"1207":1221,"1208":1221,"1209":1221,"1210":1221,"1211":1221,"1212":1221,"1213":1221,"1214":1221,"1215":1221,"1216":1221,"1222":1221,"1223":1221,"1224":1221,"1225":1221,"1226":1221,"1227":1221,"1228":1221,"1229":1221,"1230":1221,"1231":1221,"1238":1232,"1239":1232,"1246":1232,"1247":1232,"1256":1248,"1257":1248,"1258":1248,"1259":1248,"1260":1248,"1261":1248,"1262":1248,"1263":1248,"1265":1264,"1266":1264,"1267":1264,"1268":1264,"1269":1264,"1270":1264,"1271":1264,"1272":1264,"1273":1264,"1274":1264,"1275":1264,"1276":1264,"1277":1264,"1278":1264,"1279":1264,"1281":1280,"1282":1280,"1283":1280,"1284":1280,"1285":1280,"1286":1280,"1287":1280,"1288":1280,"1289":1280,"1290":1280,"1291":1280,"1292":1280,"1293":1280,"1294":1280,"1295":1280,"1313":1312,"1314":1312,"1315":1312,"1316":1312,"1317":1312,"1318":1312,"1319":1312,"1320":1312,"1321":1312,"1322":1312,"1323":1312,"1324":1312,"1325":1312,"1326":1312,"1327":1312,"1345":1344,"1346":1344,"1347":1344,"1348":1344,"1349":1344,"1350":1344,"1351":1344,"1352":1344,"1353":1344,"1354":1344,"1355":1344,"1356":1344,"1357":1344,"1358":1344,"1359":1344,"1366":1360,"1367":1360,"1368":1360,"1369":1360,"1370":1360,"1371":1360,"1372":1360,"1373":1360,"1374":1360,"1375":1360,"1377":1376,"1378":1376,"1379":1376,"1380":1376,"1381":1376,"1382":1376,"1383":1376,"1384":1376,"1385":1376,"1386":1376,"1387":1376,"1388":1376,"1389":1376,"1390":1376,"1391":1376,"1393":1392,"1394":1392,"1395":1392,"1396":1392,"1397":1392,"1398":1392,"1399":1392,"1400":1392,"1401":1392,"1402":1392,"1403":1392,"1404":1392,"1405":1392,"1406":1392,"1407":1392,"1409":1408,"1410":1408,"1411":1408,"1412":1408,"1413":1408,"1414":1408,"1415":1408,"1416":1408,"1417":1408,"1418":1408,"1419":1408,"1420":1408,"1421":1408,"1422":1408,"1423":1408,"1425":1424,"1426":1424,"1427":1424,"1428":1424,"1429":1424,"1430":1424,"1431":1424,"1432":1424,"1433":1424,"1434":1424,"1435":1424,"1436":1424,"1437":1424,"1438":1424,"1439":1424,"1440":1441,"1443":1441,"1444":1441,"1445":1441,"1446":1441,"1447":1441,"1448":1441,"1449":1441,"1450":1441,"1451":1441,"1452":1441,"1453":1441,"1454":1441,"1455":1441,"1460":1458,"1461":1458,"1462":1458,"1463":1458,"1464":1458,"1465":1458,"1466":1458,"1467":1458,"1468":1458,"1469":1458,"1470":1458,"1471":1458,"1479":1472,"1480":1472,"1481":1472,"1482":1472,"1483":1472,"1484":1472,"1485":1472,"1486":1472,"1487":1472,"1521":1520,"1522":1520,"1523":1520,"1524":1520,"1525":1520,"1526":1520,"1527":1520,"1528":1520,"1529":1520,"1530":1520,"1531":1520,"1532":1520,"1533":1520,"1534":1520,"1535":1520,"1558":1552,"1559":1552,"1560":1552,"1561":1552,"1562":1552,"1563":1552,"1564":1552,"1565":1552,"1566":1552,"1567":1552,"1572":1568,"1573":1568,"1574":1568,"1575":1568,"1576":1568,"1577":1568,"1578":1568,"1579":1568,"1580":1568,"1581":1568,"1582":1568,"1583":1568,"1595":1598,"1596":1598,"1597":1598,"1610":1594,"1611":1614,"1612":1614,"1613":1614,"1615":1599,"1617":1616,"1618":1616,"1619":1616,"1620":1616,"1621":1616,"1622":1616,"1623":1616,"1624":1616,"1625":1616,"1626":1616,"1627":1616,"1628":1616,"1629":1616,"1630":1616,"1631":1616,"1633":1632,"1634":1632,"1635":1632,"1636":1632,"1637":1632,"1638":1632,"1639":1632,"1640":1632,"1641":1632,"1642":1632,"1643":1632,"1644":1632,"1645":1632,"1646":1632,"1647":1632,"1649":1648,"1650":1648,"1651":1648,"1652":1648,"1653":1648,"1654":1648,"1655":1648,"1656":1648,"1657":1648,"1658":1648,"1659":1648,"1660":1648,"1661":1648,"1662":1648,"1663":1648,"1672":1664,"1673":1664,"1674":1664,"1675":1664,"1676":1664,"1677":1664,"1678":1664,"1679":1664,"1688":1680,"1689":1680,"1690":1680,"1691":1680,"1692":1680,"1693":1680,"1694":1680,"1695":1680,"1736":1731,"1737":1731,"1738":1731,"1739":1731,"1740":1731,"1741":1731,"1742":1731,"1743":1731,"1752":1747,"1753":1747,"1754":1747,"1755":1747,"1756":1747,"1757":1747,"1758":1747,"1759":1747,"1761":1760,"1762":1760,"1763":1760,"1764":1760,"1765":1760,"1766":1760,"1767":1760,"1768":1760,"1769":1760,"1770":1760,"1771":1760,"1772":1760,"1773":1760,"1774":1760,"1775":1760,"1777":1776,"1778":1776,"1779":1776,"1780":1776,"1781":1776,"1782":1776,"1783":1776,"1784":1776,"1785":1776,"1786":1776,"1787":1776,"1788":1776,"1789":1776,"1790":1776,"1791":1776,"1793":1792,"1794":1792,"1795":1792,"1796":1792,"1797":1792,"1798":1792,"1799":1792,"1800":1792,"1801":1792,"1802":1792,"1803":1792,"1804":1792,"1805":1792,"1806":1792,"1807":1792,"1809":1808,"1810":1808,"1811":1808,"1812":1808,"1813":1808,"1814":1808,"1815":1808,"1816":1808,"1817":1808,"1818":1808,"1819":1808,"1820":1808,"1821":1808,"1822":1808,"1823":1808,"1832":1827,"1833":1827,"1834":1827,"1835":1827,"1836":1827,"1837":1827,"1838":1827,"1839":1827,"1844":1840,"1845":1840,"1846":1840,"1847":1840,"1848":1840,"1849":1840,"1850":1840,"1851":1840,"1852":1840,"1853":1840,"1854":1840,"1855":1840,"1857":1856,"1858":1856,"1859":1856,"1860":1856,"1861":1856,"1862":1856,"1863":1856,"1864":1856,"1865":1856,"1866":1856,"1867":1856,"1868":1856,"1869":1856,"1870":1856,"1871":1856,"1880":1872,"1881":1872,"1882":1872,"1883":1872,"1884":1872,"1885":1872,"1886":1872,"1887":1872,"1928":1922,"1929":1922,"1930":1922,"1931":1922,"1932":1922,"1933":1922,"1934":1922,"1935":1922,"1937":1936,"1938":1936,"1939":1936,"1940":1936,"1941":1936,"1942":1936,"1943":1936,"1944":1936,"1945":1936,"1946":1936,"1947":1936,"1948":1936,"1949":1936,"1950":1936,"1951":1936,"1953":1952,"1954":1952,"1955":1952,"1956":1952,"1957":1952,"1958":1952,"1959":1952,"1960":1952,"1961":1952,"1962":1952,"1963":1952,"1964":1952,"1965":1952,"1966":1952,"1967":1952,"1969":1968,"1970":1968,"1971":1968,"1972":1968,"1973":1968,"1974":1968,"1975":1968,"1976":1968,"1977":1968,"1978":1968,"1979":1968,"1980":1968,"1981":1968,"1982":1968,"1983":1968,"1985":1968,"1986":1968,"1987":1968,"1988":1968,"1989":1968,"1990":1968,"1991":1968,"1992":1968,"1993":1968,"1994":1968,"1995":1968,"1996":1968,"1997":1968,"1998":1968,"1999":1968,"2022":2016,"2023":2016,"2030":2016,"2031":2016,"2044":2032,"2045":2032,"2046":2032,"2047":2032,"2056":2051,"2057":2051,"2058":2051,"2059":2051,"2060":2051,"2061":2051,"2062":2051,"2063":2051,"2065":2064,"2066":2064,"2067":2064,"2068":2064,"2069":2064,"2070":2064,"2071":2064,"2072":2064,"2073":2064,"2074":2064,"2075":2064,"2076":2064,"2077":2064,"2078":2064,"2079":2064,"2080":2082,"2081":2082,"2086":2082,"2087":2082,"2088":2082,"2089":2082,"2090":2082,"2091":2082,"2092":2082,"2093":2082,"2094":2082,"2095":2082,"2129":2128,"2130":2128,"2131":2128,"2132":2128,"2133":2128,"2134":2128,"2135":2128,"2136":2128,"2137":2128,"2138":2128,"2139":2128,"2140":2128,"2141":2128,"2142":2128,"2143":2128,"2152":2147,"2153":2147,"2154":2147,"2155":2147,"2156":2147,"2157":2147,"2158":2147,"2159":2147,"2168":2163,"2169":2163,"2170":2163,"2171":2163,"2172":2163,"2173":2163,"2174":2163,"2175":2163,"2184":2179,"2185":2179,"2186":2179,"2187":2179,"2188":2179,"2189":2179,"2190":2179,"2191":2179,"2209":2208,"2210":2208,"2211":2208,"2212":2208,"2213":2208,"2214":2208,"2215":2208,"2216":2208,"2217":2208,"2218":2208,"2219":2208,"2220":2208,"2221":2208,"2222":2208,"2223":2208,"2238":2224,"2239":2224,"2241":2240,"2242":2240,"2243":2240,"2244":2240,"2245":2240,"2246":2240,"2247":2240,"2248":2240,"2249":2240,"2250":2240,"2251":2240,"2252":2240,"2253":2240,"2254":2240,"2255":2240,"2264":2256,"2265":2256,"2266":2256,"2267":2256,"2268":2256,"2269":2256,"2270":2256,"2271":2256,"2280":2272,"2281":2272,"2282":2272,"2283":2272,"2284":2272,"2285":2272,"2286":2272,"2287":2272,"2294":2288,"2295":2288,"2302":2288,"2303":2288,"2304":2306,"2310":2306,"2311":2306,"2312":2306,"2318":2306,"2319":2306,"2332":2322,"2333":2322,"2334":2322,"2335":2322,"2336":2338,"2337":2338,"2342":2338,"2343":2338,"2344":2338,"2345":2338,"2346":2338,"2347":2338,"2348":2338,"2349":2338,"2350":2338,"2351":2338,"2392":2386,"2393":2386,"2394":2386,"2395":2386,"2396":2386,"2397":2386,"2398":2386,"2399":2386,"2400":2386,"2401":2386,"2402":2386,"2403":2386,"2404":2386,"2405":2386,"2406":2386,"2407":2386,"2433":2432,"2434":2432,"2435":2432,"2436":2432,"2437":2432,"2438":2432,"2439":2432,"2440":2432,"2441":2432,"2442":2432,"2443":2432,"2444":2432,"2445":2432,"2446":2432,"2447":2432,"2449":2448,"2450":2448,"2451":2448,"2452":2448,"2453":2448,"2454":2448,"2455":2448,"2456":2448,"2457":2448,"2458":2448,"2459":2448,"2460":2448,"2461":2448,"2462":2448,"2463":2448,"2465":2464,"2470":2464,"2471":2464,"2473":2464,"2478":2464,"2479":2464,"2484":2480,"2487":2480,"2488":2480,"2491":2480,"2492":2480,"2493":2481,"2494":2482,"2495":2480,"2504":2499,"2505":2499,"2506":2499,"2507":2499,"2508":2499,"2509":2499,"2510":2499,"2511":2499,"2520":2512,"2521":2513,"2522":2514,"2523":2515,"2524":2516,"2525":2517,"2578":288,"2579":288,"2582":288,"2583":288,"2586":288,"2587":288,"2590":288,"2591":288,"2604":7476,"2605":7477,"2616":2611,"2617":2611,"2618":2611,"2619":2611,"2620":2611,"2621":2611,"2622":2611,"2623":2611,"2632":2627,"2633":2627,"2634":2627,"2635":2627,"2636":2627,"2637":2627,"2638":2627,"2639":2627,"2641":2640,"2642":2640,"2643":2640,"2644":2640,"2645":2640,"2646":2640,"2647":2640,"2648":2640,"2649":2640,"2650":2640,"2651":2640,"2652":2640,"2653":2640,"2654":2640,"2655":2640,"2691":2688,"2692":2688,"2693":2688,"2694":2688,"2695":2688,"2696":2688,"2697":2688,"2698":2688,"2699":2688,"2700":2688,"2701":2688,"2702":2688,"2703":2688,"2705":2704,"2706":2704,"2707":2704,"2708":2704,"2709":2704,"2710":2704,"2711":2704,"2712":2704,"2713":2704,"2714":2704,"2715":2704,"2716":2704,"2717":2704,"2718":2704,"2719":2704,"2721":2720,"2722":2720,"2723":2720,"2725":2720,"2726":2720,"2727":2720,"2729":2720,"2730":2720,"2731":2720,"2732":2720,"2733":2720,"2734":2720,"2735":2720,"2753":2752,"2754":2752,"2755":2752,"2756":2752,"2757":2752,"2758":2752,"2759":2752,"2760":2752,"2761":2752,"2762":2752,"2763":2752,"2764":2752,"2765":2752,"2766":2752,"2767":2752,"2769":2768,"2770":2768,"2771":2768,"2772":2768,"2773":2768,"2774":2768,"2775":2768,"2776":2768,"2777":2768,"2778":2768,"2779":2768,"2780":2768,"2781":2768,"2782":2768,"2783":2768,"2785":2784,"2786":2784,"2787":2784,"2788":2784,"2789":2784,"2790":2784,"2791":2784,"2792":2784,"2793":2784,"2794":2784,"2795":2784,"2796":2784,"2797":2784,"2798":2784,"2799":2784,"2806":2800,"2807":2800,"2814":2800,"2815":2800,"2832":2834,"2833":2834,"2838":2834,"2839":2834,"2840":2834,"2841":2834,"2842":2834,"2843":2834,"2844":2834,"2845":2834,"2846":2834,"2847":2834,"2868":2864,"2869":2864,"2870":2864,"2871":2864,"2872":2864,"2873":2864,"2874":2864,"2875":2864,"2876":2864,"2877":2864,"2878":2864,"2879":2864,"2888":2883,"2889":2883,"2890":2883,"2891":2883,"2892":2883,"2893":2883,"2894":2883,"2895":2883,"2904":2896,"2905":2897,"2906":2898,"2907":2899,"2908":2900,"2909":2901,"2910":2902,"2911":2903,"3041":3040,"3042":3040,"3043":3040,"3044":3040,"3045":3040,"3046":3040,"3047":3040,"3048":3040,"3049":3040,"3050":3040,"3051":3040,"3052":3040,"3053":3040,"3054":3040,"3055":3040,"3073":3072,"3074":3072,"3075":3072,"3076":3072,"3077":3072,"3078":3072,"3079":3072,"3080":3072,"3081":3072,"3082":3072,"3083":3072,"3084":3072,"3085":3072,"3086":3072,"3087":3072,"3098":3091,"3099":3091,"3100":3091,"3101":3091,"3102":3091,"3103":3091,"3114":3107,"3115":3107,"3116":3107,"3117":3107,"3118":3107,"3119":3107,"3130":3123,"3131":3123,"3132":3123,"3133":3123,"3134":3123,"3135":3123,"3146":3139,"3147":3139,"3148":3139,"3149":3139,"3150":3139,"3151":3139,"3162":3155,"3163":3155,"3164":3155,"3165":3155,"3166":3155,"3167":3155,"3169":3168,"3170":3168,"3171":3168,"3172":3168,"3173":3168,"3174":3168,"3175":3168,"3176":3168,"3177":3168,"3178":3168,"3179":3168,"3180":3168,"3181":3168,"3182":3168,"3183":3168,"3192":3187,"3193":3187,"3194":3187,"3195":3187,"3196":3187,"3197":3187,"3198":3187,"3199":3187,"3217":3216,"3219":3216,"3220":3216,"3221":3216,"3223":3216,"3224":3216,"3225":3216,"3227":3216,"3228":3216,"3229":3216,"3230":3218,"3231":3216,"3232":3237,"3238":3237,"3239":3237,"3240":3245,"3246":3245,"3247":3245,"3256":3251,"3257":3251,"3258":3251,"3259":3251,"3260":3251,"3261":3251,"3262":3251,"3263":3251,"3264":3269,"3270":3269,"3271":3269,"3272":3277,"3278":3277,"3279":3277,"3281":3280,"3282":3280,"3283":3280,"3284":3280,"3285":3280,"3286":3280,"3287":3280,"3288":3280,"3289":3280,"3290":3280,"3291":3280,"3292":3280,"3293":3280,"3294":3280,"3295":3280,"3297":3296,"3298":3296,"3299":3296,"3300":3296,"3301":3296,"3302":3296,"3303":3296,"3304":3296,"3305":3296,"3306":3296,"3307":3296,"3308":3296,"3309":3296,"3310":3296,"3311":3296,"3316":3312,"3317":3312,"3318":3312,"3319":3312,"3320":3312,"3321":3312,"3322":3312,"3323":3312,"3324":3312,"3325":3312,"3326":3312,"3327":3312,"3334":3328,"3335":3328,"3336":3328,"3337":3328,"3338":3328,"3339":3328,"3340":3328,"3341":3328,"3342":3328,"3343":3328,"3409":3408,"3410":3408,"3411":3408,"3412":3408,"3413":3408,"3414":3408,"3415":3408,"3416":3408,"3417":3408,"3418":3408,"3419":3408,"3420":3408,"3421":3408,"3422":3408,"3423":3408,"3425":3424,"3426":3424,"3427":3424,"3428":3424,"3429":3424,"3430":3424,"3431":3424,"3432":3424,"3433":3424,"3434":3424,"3435":3424,"3436":3424,"3437":3424,"3438":3424,"3439":3424,"3441":3440,"3442":3440,"3443":3440,"3444":3440,"3445":3440,"3446":3440,"3447":3440,"3448":3440,"3449":3440,"3450":3440,"3451":3440,"3452":3440,"3453":3440,"3454":3440,"3455":3440,"3457":3456,"3458":3456,"3459":3456,"3461":3456,"3462":3456,"3463":3456,"3465":3456,"3466":3456,"3467":3456,"3468":3456,"3469":3456,"3470":3456,"3471":3456,"3504":3506,"3505":3506,"3510":3506,"3511":3506,"3512":3506,"3513":3506,"3514":3506,"3515":3506,"3516":3506,"3517":3506,"3518":3506,"3519":3506,"3520":3522,"3521":3522,"3526":3522,"3527":3522,"3528":3522,"3529":3522,"3530":3522,"3531":3522,"3532":3522,"3533":3522,"3534":3522,"3535":3522,"3536":3538,"3537":3538,"3542":3538,"3543":3538,"3544":3538,"3545":3538,"3546":3538,"3547":3538,"3548":3538,"3549":3538,"3550":3538,"3551":3538,"3552":3554,"3553":3554,"3558":3554,"3559":3554,"3560":3554,"3561":3554,"3562":3554,"3563":3554,"3564":3554,"3565":3554,"3566":3554,"3567":3554,"3568":3570,"3569":3570,"3574":3570,"3575":3570,"3576":3570,"3577":3570,"3578":3570,"3579":3570,"3580":3570,"3581":3570,"3582":3570,"3583":3570,"3584":3586,"3585":3586,"3590":3586,"3591":3586,"3592":3586,"3593":3586,"3594":3586,"3595":3586,"3596":3586,"3597":3586,"3598":3586,"3599":3586,"3600":3602,"3601":3602,"3606":3602,"3607":3602,"3608":3602,"3609":3602,"3610":3602,"3611":3602,"3612":3602,"3613":3602,"3614":3602,"3615":3602,"3616":3618,"3617":3618,"3622":3618,"3623":3618,"3624":3618,"3625":3618,"3626":3618,"3627":3618,"3628":3618,"3629":3618,"3630":3618,"3631":3618,"3632":3634,"3633":3634,"3638":3634,"3639":3634,"3640":3634,"3641":3634,"3642":3634,"3643":3634,"3644":3634,"3645":3634,"3646":3634,"3647":3634,"3648":3650,"3649":3650,"3654":3650,"3655":3650,"3656":3650,"3657":3650,"3658":3650,"3659":3650,"3660":3650,"3661":3650,"3662":3650,"3663":3650,"3664":3666,"3665":3666,"3670":3666,"3671":3666,"3672":3666,"3673":3666,"3674":3666,"3675":3666,"3676":3666,"3677":3666,"3678":3666,"3679":3666,"3696":3698,"3697":3698,"3702":3698,"3703":3698,"3704":3698,"3705":3698,"3706":3698,"3707":3698,"3708":3698,"3709":3698,"3710":3698,"3711":3698,"3712":3714,"3713":3714,"3718":3714,"3719":3714,"3720":3714,"3721":3714,"3722":3714,"3723":3714,"3724":3714,"3725":3714,"3726":3714,"3727":3714,"3728":3730,"3729":3730,"3734":3730,"3735":3730,"3736":3730,"3737":3730,"3738":3730,"3739":3730,"3740":3730,"3741":3730,"3742":3730,"3743":3730,"3744":3746,"3745":3746,"3750":3746,"3751":3746,"3752":3746,"3753":3746,"3754":3746,"3755":3746,"3756":3746,"3757":3746,"3758":3746,"3759":3746,"3760":3762,"3761":3762,"3766":3762,"3767":3762,"3768":3762,"3769":3762,"3770":3762,"3771":3762,"3772":3762,"3773":3762,"3774":3762,"3775":3762,"3824":3829,"3830":3829,"3831":3829,"3832":3829,"3833":3829,"3834":3829,"3835":3829,"3836":3829,"3837":3829,"3838":3829,"3839":3829,"3889":3888,"3890":3888,"3891":3888,"3892":3888,"3893":3888,"3894":3888,"3895":3888,"3896":3888,"3897":3888,"3898":3888,"3899":3888,"3900":3888,"3901":3888,"3902":3888,"3903":3888,"3912":3904,"3913":3904,"3914":3904,"3915":3904,"3916":3904,"3917":3904,"3918":3904,"3919":3904,"3921":3920,"3922":3920,"3923":3920,"3924":3920,"3925":3920,"3926":3920,"3927":3920,"3928":3920,"3929":3920,"3930":3920,"3931":3920,"3932":3920,"3933":3920,"3934":3920,"3935":3920,"3937":3936,"3938":3936,"3939":3936,"3940":3936,"3941":3936,"3942":3936,"3943":3936,"3944":3936,"3945":3936,"3946":3936,"3947":3936,"3948":3936,"3949":3936,"3950":3936,"3951":3936,"3953":3952,"3954":3952,"3955":3952,"3956":3952,"3957":3952,"3958":3952,"3959":3952,"3960":3952,"3961":3952,"3962":3952,"3963":3952,"3964":3952,"3965":3952,"3966":3952,"3967":3952,"3969":3968,"3970":3968,"3971":3968,"3972":3968,"3973":3968,"3974":3968,"3975":3968,"3976":3968,"3977":3968,"3978":3968,"3979":3968,"3980":3968,"3981":3968,"3982":3968,"3983":3968,"3985":3984,"3986":3984,"3987":3984,"3988":3984,"3989":3984,"3990":3984,"3991":3984,"3992":3984,"3993":3984,"3994":3984,"3995":3984,"3996":3984,"3997":3984,"3998":3984,"3999":3984,"4049":4048,"4050":4048,"4051":4048,"4052":4048,"4053":4048,"4054":4048,"4055":4048,"4056":4048,"4057":4048,"4058":4048,"4059":4048,"4060":4048,"4061":4048,"4062":4048,"4063":4048,"4081":4080,"4082":4080,"4083":4080,"4084":4080,"4085":4080,"4086":4080,"4087":4080,"4088":4080,"4089":4080,"4090":4080,"4091":4080,"4092":4080,"4093":4080,"4094":4080,"4095":4080,"4120":4115,"4121":4115,"4122":4115,"4123":4115,"4124":4115,"4125":4115,"4126":4115,"4127":4115,"4136":4131,"4137":4131,"4138":4131,"4139":4131,"4140":4131,"4141":4131,"4142":4131,"4143":4131,"4152":4147,"4153":4147,"4154":4147,"4155":4147,"4156":4147,"4157":4147,"4158":4147,"4159":4147,"4163":4160,"4164":4160,"4165":4160,"4166":4160,"4167":4160,"4168":4160,"4169":4160,"4170":4160,"4171":4160,"4172":4160,"4173":4160,"4174":4160,"4175":4160,"4179":4176,"4180":4176,"4181":4176,"4182":4176,"4183":4176,"4184":4176,"4185":4176,"4186":4176,"4187":4176,"4188":4176,"4189":4176,"4190":4176,"4191":4176,"4195":4192,"4196":4192,"4197":4192,"4198":4192,"4199":4192,"4200":4192,"4201":4192,"4202":4192,"4203":4192,"4204":4192,"4205":4192,"4206":4192,"4207":4192,"4211":4208,"4212":4208,"4213":4208,"4214":4208,"4215":4208,"4216":4208,"4217":4208,"4218":4208,"4219":4208,"4220":4208,"4221":4208,"4222":4208,"4223":4208,"4227":4224,"4228":4224,"4229":4224,"4230":4224,"4231":4224,"4232":4224,"4233":4224,"4234":4224,"4235":4224,"4236":4224,"4237":4224,"4238":4224,"4239":4224,"4243":4240,"4244":4240,"4245":4240,"4246":4240,"4247":4240,"4248":4240,"4249":4240,"4250":4240,"4251":4240,"4252":4240,"4253":4240,"4254":4240,"4255":4240,"4257":4256,"4258":4256,"4259":4256,"4260":4256,"4261":4256,"4262":4256,"4263":4256,"4264":4256,"4265":4256,"4266":4256,"4267":4256,"4268":4256,"4269":4256,"4270":4256,"4271":4256,"4273":4272,"4274":4272,"4275":4272,"4276":4272,"4277":4272,"4278":4272,"4279":4272,"4280":4272,"4281":4272,"4282":4272,"4283":4272,"4284":4272,"4285":4272,"4286":4272,"4287":4272,"4289":4288,"4290":4288,"4291":4288,"4292":4288,"4293":4288,"4294":4288,"4295":4288,"4296":4288,"4297":4288,"4298":4288,"4299":4288,"4300":4288,"4301":4288,"4302":4288,"4303":4288,"4305":4304,"4306":4304,"4307":4304,"4308":4304,"4309":4304,"4310":4304,"4311":4304,"4312":4304,"4313":4304,"4314":4304,"4315":4304,"4316":4304,"4317":4304,"4318":4304,"4319":4304,"4321":4320,"4322":4320,"4323":4320,"4324":4320,"4325":4320,"4326":4320,"4327":4320,"4328":4320,"4329":4320,"4330":4320,"4331":4320,"4332":4320,"4333":4320,"4334":4320,"4335":4320,"4337":4336,"4338":4336,"4339":4336,"4340":4336,"4341":4336,"4342":4336,"4343":4336,"4344":4336,"4345":4336,"4346":4336,"4347":4336,"4348":4336,"4349":4336,"4350":4336,"4351":4336,"4353":4352,"4354":4352,"4355":4352,"4356":4352,"4357":4352,"4358":4352,"4359":4352,"4360":4352,"4361":4352,"4362":4352,"4363":4352,"4364":4352,"4365":4352,"4366":4352,"4367":4352,"4369":4368,"4370":4368,"4371":4368,"4372":4368,"4373":4368,"4374":4368,"4375":4368,"4376":4368,"4377":4368,"4378":4368,"4379":4368,"4380":4368,"4381":4368,"4382":4368,"4383":4368,"4385":4384,"4386":4384,"4387":4384,"4388":4384,"4389":4384,"4390":4384,"4391":4384,"4392":4384,"4393":4384,"4394":4384,"4395":4384,"4396":4384,"4397":4384,"4398":4384,"4399":4384,"4401":4400,"4402":4400,"4403":4400,"4404":4400,"4405":4400,"4406":4400,"4407":4400,"4408":4400,"4409":4400,"4410":4400,"4411":4400,"4412":4400,"4413":4400,"4414":4400,"4415":4400,"4417":4416,"4418":4416,"4419":4416,"4420":4416,"4421":4416,"4422":4416,"4423":4416,"4424":4416,"4425":4416,"4426":4416,"4427":4416,"4428":4416,"4429":4416,"4430":4416,"4431":4416,"4433":4432,"4434":4432,"4435":4432,"4436":4432,"4437":4432,"4438":4432,"4439":4432,"4440":4432,"4441":4432,"4442":4432,"4443":4432,"4444":4432,"4445":4432,"4446":4432,"4447":4432,"4449":4448,"4450":4448,"4451":4448,"4452":4448,"4453":4448,"4454":4448,"4455":4448,"4456":4448,"4457":4448,"4458":4448,"4459":4448,"4460":4448,"4461":4448,"4462":4448,"4463":4448,"4465":4464,"4466":4464,"4467":4464,"4468":4464,"4469":4464,"4470":4464,"4471":4464,"4472":4464,"4473":4464,"4474":4464,"4475":4464,"4476":4464,"4477":4464,"4478":4464,"4479":4464,"4481":4480,"4482":4480,"4483":4480,"4484":4480,"4485":4480,"4486":4480,"4487":4480,"4488":4480,"4489":4480,"4490":4480,"4491":4480,"4492":4480,"4493":4480,"4494":4480,"4495":4480,"4497":4496,"4498":4496,"4499":4496,"4500":4496,"4501":4496,"4502":4496,"4503":4496,"4504":4496,"4505":4496,"4506":4496,"4507":4496,"4508":4496,"4509":4496,"4510":4496,"4511":4496,"4513":4512,"4514":4512,"4515":4512,"4516":4512,"4517":4512,"4518":4512,"4519":4512,"4520":4512,"4521":4512,"4522":4512,"4523":4512,"4524":4512,"4525":4512,"4526":4512,"4527":4512,"4529":4528,"4530":4528,"4531":4528,"4532":4528,"4533":4528,"4534":4528,"4535":4528,"4536":4528,"4537":4528,"4538":4528,"4539":4528,"4540":4528,"4541":4528,"4542":4528,"4543":4528,"4545":4544,"4546":4544,"4547":4544,"4548":4544,"4549":4544,"4550":4544,"4551":4544,"4552":4544,"4553":4544,"4554":4544,"4555":4544,"4556":4544,"4557":4544,"4558":4544,"4559":4544,"4561":4560,"4562":4560,"4563":4560,"4564":4560,"4565":4560,"4566":4560,"4567":4560,"4568":4560,"4569":4560,"4570":4560,"4571":4560,"4572":4560,"4573":4560,"4574":4560,"4575":4560,"4577":4576,"4578":4576,"4579":4576,"4580":4576,"4581":4576,"4582":4576,"4583":4576,"4584":4576,"4585":4576,"4586":4576,"4587":4576,"4588":4576,"4589":4576,"4590":4576,"4591":4576,"4593":4592,"4594":4592,"4595":4592,"4596":4592,"4597":4592,"4598":4592,"4599":4592,"4600":4592,"4601":4592,"4602":4592,"4603":4592,"4604":4592,"4605":4592,"4606":4592,"4607":4592,"4609":4608,"4610":4608,"4611":4608,"4612":4608,"4613":4608,"4614":4608,"4615":4608,"4616":4608,"4617":4608,"4618":4608,"4619":4608,"4620":4608,"4621":4608,"4622":4608,"4623":4608,"4625":4624,"4626":4624,"4627":4624,"4628":4624,"4629":4624,"4630":4624,"4631":4624,"4632":4624,"4633":4624,"4634":4624,"4635":4624,"4636":4624,"4637":4624,"4638":4624,"4639":4624,"4641":4640,"4642":4640,"4643":4640,"4644":4640,"4645":4640,"4646":4640,"4647":4640,"4648":4640,"4649":4640,"4650":4640,"4651":4640,"4652":4640,"4653":4640,"4654":4640,"4655":4640,"4657":4656,"4658":4656,"4659":4656,"4660":4656,"4661":4656,"4662":4656,"4663":4656,"4664":4656,"4665":4656,"4666":4656,"4667":4656,"4668":4656,"4669":4656,"4670":4656,"4671":4656,"4673":4672,"4674":4672,"4675":4672,"4676":4672,"4677":4672,"4678":4672,"4679":4672,"4680":4672,"4681":4672,"4682":4672,"4683":4672,"4684":4672,"4685":4672,"4686":4672,"4687":4672,"4689":4688,"4690":4688,"4691":4688,"4692":4688,"4693":4688,"4694":4688,"4695":4688,"4696":4688,"4697":4688,"4698":4688,"4699":4688,"4700":4688,"4701":4688,"4702":4688,"4703":4688,"4705":4704,"4706":4704,"4707":4704,"4708":4704,"4709":4704,"4710":4704,"4711":4704,"4712":4704,"4713":4704,"4714":4704,"4715":4704,"4716":4704,"4717":4704,"4718":4704,"4719":4704,"4721":4720,"4722":4720,"4723":4720,"4724":4720,"4725":4720,"4726":4720,"4727":4720,"4728":4720,"4729":4720,"4730":4720,"4731":4720,"4732":4720,"4733":4720,"4734":4720,"4735":4720,"4737":4736,"4738":4736,"4739":4736,"4740":4736,"4741":4736,"4742":4736,"4743":4736,"4744":4736,"4745":4736,"4746":4736,"4747":4736,"4748":4736,"4749":4736,"4750":4736,"4751":4736,"4753":4752,"4754":4752,"4755":4752,"4756":4752,"4757":4752,"4758":4752,"4759":4752,"4760":4752,"4761":4752,"4762":4752,"4763":4752,"4764":4752,"4765":4752,"4766":4752,"4767":4752,"4769":4768,"4770":4768,"4771":4768,"4772":4768,"4773":4768,"4774":4768,"4775":4768,"4776":4768,"4777":4768,"4778":4768,"4779":4768,"4780":4768,"4781":4768,"4782":4768,"4783":4768,"4785":4784,"4786":4784,"4787":4784,"4788":4784,"4789":4784,"4790":4784,"4791":4784,"4792":4784,"4793":4784,"4794":4784,"4795":4784,"4796":4784,"4797":4784,"4798":4784,"4799":4784,"4801":4800,"4802":4800,"4803":4800,"4804":4800,"4805":4800,"4806":4800,"4807":4800,"4808":4800,"4809":4800,"4810":4800,"4811":4800,"4812":4800,"4813":4800,"4814":4800,"4815":4800,"4817":4816,"4818":4816,"4819":4816,"4820":4816,"4821":4816,"4822":4816,"4823":4816,"4824":4816,"4825":4816,"4826":4816,"4827":4816,"4828":4816,"4829":4816,"4830":4816,"4831":4816,"4833":4832,"4834":4832,"4835":4832,"4836":4832,"4837":4832,"4838":4832,"4839":4832,"4840":4832,"4841":4832,"4842":4832,"4843":4832,"4844":4832,"4845":4832,"4846":4832,"4847":4832,"4849":4848,"4850":4848,"4851":4848,"4852":4848,"4853":4848,"4854":4848,"4855":4848,"4856":4848,"4857":4848,"4858":4848,"4859":4848,"4860":4848,"4861":4848,"4862":4848,"4863":4848,"4865":4864,"4866":4864,"4867":4864,"4868":4864,"4869":4864,"4870":4864,"4871":4864,"4872":4864,"4873":4864,"4874":4864,"4875":4864,"4876":4864,"4877":4864,"4878":4864,"4879":4864,"4881":4880,"4882":4880,"4883":4880,"4884":4880,"4885":4880,"4886":4880,"4887":4880,"4888":4880,"4889":4880,"4890":4880,"4891":4880,"4892":4880,"4893":4880,"4894":4880,"4895":4880,"4897":4896,"4898":4896,"4899":4896,"4900":4896,"4901":4896,"4902":4896,"4903":4896,"4904":4896,"4905":4896,"4906":4896,"4907":4896,"4908":4896,"4909":4896,"4910":4896,"4911":4896,"4913":4912,"4914":4912,"4915":4912,"4916":4912,"4917":4912,"4918":4912,"4919":4912,"4920":4912,"4921":4912,"4922":4912,"4923":4912,"4924":4912,"4925":4912,"4926":4912,"4927":4912,"4929":4928,"4930":4928,"4931":4928,"4932":4928,"4933":4928,"4934":4928,"4935":4928,"4936":4928,"4937":4928,"4938":4928,"4939":4928,"4940":4928,"4941":4928,"4942":4928,"4943":4928,"4945":4944,"4946":4944,"4947":4944,"4948":4944,"4949":4944,"4950":4944,"4951":4944,"4952":4944,"4953":4944,"4954":4944,"4955":4944,"4956":4944,"4957":4944,"4958":4944,"4959":4944,"4961":4960,"4962":4960,"4963":4960,"4964":4960,"4965":4960,"4966":4960,"4967":4960,"4968":4960,"4969":4960,"4970":4960,"4971":4960,"4972":4960,"4973":4960,"4974":4960,"4975":4960,"4977":4976,"4978":4976,"4979":4976,"4980":4976,"4981":4976,"4982":4976,"4983":4976,"4984":4976,"4985":4976,"4986":4976,"4987":4976,"4988":4976,"4989":4976,"4990":4976,"4991":4976,"4993":4992,"4994":4992,"4995":4992,"4996":4992,"4997":4992,"4998":4992,"4999":4992,"5000":4992,"5001":4992,"5002":4992,"5003":4992,"5004":4992,"5005":4992,"5006":4992,"5007":4992,"5009":5008,"5010":5008,"5011":5008,"5012":5008,"5013":5008,"5014":5008,"5015":5008,"5016":5008,"5017":5008,"5018":5008,"5019":5008,"5020":5008,"5021":5008,"5022":5008,"5023":5008,"5025":5024,"5026":5024,"5027":5024,"5028":5024,"5029":5024,"5030":5024,"5031":5024,"5032":5024,"5033":5024,"5034":5024,"5035":5024,"5036":5024,"5037":5024,"5038":5024,"5039":5024,"5041":5040,"5042":5040,"5043":5040,"5044":5040,"5045":5040,"5046":5040,"5047":5040,"5048":5040,"5049":5040,"5050":5040,"5051":5040,"5052":5040,"5053":5040,"5054":5040,"5055":5040,"5057":5056,"5058":5056,"5059":5056,"5060":5056,"5061":5056,"5062":5056,"5063":5056,"5064":5056,"5065":5056,"5066":5056,"5067":5056,"5068":5056,"5069":5056,"5070":5056,"5071":5056,"5073":5072,"5074":5072,"5075":5072,"5076":5072,"5077":5072,"5078":5072,"5079":5072,"5080":5072,"5081":5072,"5082":5072,"5083":5072,"5084":5072,"5085":5072,"5086":5072,"5087":5072,"5089":5088,"5090":5088,"5091":5088,"5092":5088,"5093":5088,"5094":5088,"5095":5088,"5096":5088,"5097":5088,"5098":5088,"5099":5088,"5100":5088,"5101":5088,"5102":5088,"5103":5088,"5105":5104,"5106":5104,"5107":5104,"5108":5104,"5109":5104,"5110":5104,"5111":5104,"5112":5104,"5113":5104,"5114":5104,"5115":5104,"5116":5104,"5117":5104,"5118":5104,"5119":5104,"5121":5120,"5122":5120,"5123":5120,"5124":5120,"5125":5120,"5126":5120,"5127":5120,"5128":5120,"5129":5120,"5130":5120,"5131":5120,"5132":5120,"5133":5120,"5134":5120,"5135":5120,"5137":5136,"5138":5136,"5139":5136,"5140":5136,"5141":5136,"5142":5136,"5143":5136,"5144":5136,"5145":5136,"5146":5136,"5147":5136,"5148":5136,"5149":5136,"5150":5136,"5151":5136,"5153":5152,"5154":5152,"5155":5152,"5156":5152,"5157":5152,"5158":5152,"5159":5152,"5160":5152,"5161":5152,"5162":5152,"5163":5152,"5164":5152,"5165":5152,"5166":5152,"5167":5152,"5169":5168,"5170":5168,"5171":5168,"5172":5168,"5173":5168,"5174":5168,"5175":5168,"5176":5168,"5177":5168,"5178":5168,"5179":5168,"5180":5168,"5181":5168,"5182":5168,"5183":5168,"5185":5184,"5186":5184,"5187":5184,"5188":5184,"5189":5184,"5190":5184,"5191":5184,"5192":5184,"5193":5184,"5194":5184,"5195":5184,"5196":5184,"5197":5184,"5198":5184,"5199":5184,"5201":5200,"5202":5200,"5203":5200,"5204":5200,"5205":5200,"5206":5200,"5207":5200,"5208":5200,"5209":5200,"5210":5200,"5211":5200,"5212":5200,"5213":5200,"5214":5200,"5215":5200,"5217":5216,"5218":5216,"5219":5216,"5220":5216,"5221":5216,"5222":5216,"5223":5216,"5224":5216,"5225":5216,"5226":5216,"5227":5216,"5228":5216,"5229":5216,"5230":5216,"5231":5216,"5233":5232,"5234":5232,"5235":5232,"5236":5232,"5237":5232,"5238":5232,"5239":5232,"5240":5232,"5241":5232,"5242":5232,"5243":5232,"5244":5232,"5245":5232,"5246":5232,"5247":5232,"5249":5248,"5250":5248,"5251":5248,"5252":5248,"5253":5248,"5254":5248,"5255":5248,"5256":5248,"5257":5248,"5258":5248,"5259":5248,"5260":5248,"5261":5248,"5262":5248,"5263":5248,"5265":5264,"5266":5264,"5267":5264,"5268":5264,"5269":5264,"5270":5264,"5271":5264,"5272":5264,"5273":5264,"5274":5264,"5275":5264,"5276":5264,"5277":5264,"5278":5264,"5279":5264,"5281":5280,"5282":5280,"5283":5280,"5284":5280,"5285":5280,"5286":5280,"5287":5280,"5288":5280,"5289":5280,"5290":5280,"5291":5280,"5292":5280,"5293":5280,"5294":5280,"5295":5280,"5297":5296,"5298":5296,"5299":5296,"5300":5296,"5301":5296,"5302":5296,"5303":5296,"5304":5296,"5305":5296,"5306":5296,"5307":5296,"5308":5296,"5309":5296,"5310":5296,"5311":5296,"5313":5312,"5314":5312,"5315":5312,"5316":5312,"5317":5312,"5318":5312,"5319":5312,"5320":5312,"5321":5312,"5322":5312,"5323":5312,"5324":5312,"5325":5312,"5326":5312,"5327":5312,"5329":5328,"5330":5328,"5331":5328,"5332":5328,"5333":5328,"5334":5328,"5335":5328,"5336":5328,"5337":5328,"5338":5328,"5339":5328,"5340":5328,"5341":5328,"5342":5328,"5343":5328,"5345":5344,"5346":5344,"5347":5344,"5348":5344,"5349":5344,"5350":5344,"5351":5344,"5352":5344,"5353":5344,"5354":5344,"5355":5344,"5356":5344,"5357":5344,"5358":5344,"5359":5344,"5361":5360,"5362":5360,"5363":5360,"5364":5360,"5365":5360,"5366":5360,"5367":5360,"5368":5360,"5369":5360,"5370":5360,"5371":5360,"5372":5360,"5373":5360,"5374":5360,"5375":5360,"5377":5376,"5378":5376,"5379":5376,"5380":5376,"5381":5376,"5382":5376,"5383":5376,"5384":5376,"5385":5376,"5386":5376,"5387":5376,"5388":5376,"5389":5376,"5390":5376,"5391":5376,"5393":5392,"5394":5392,"5395":5392,"5396":5392,"5397":5392,"5398":5392,"5399":5392,"5400":5392,"5401":5392,"5402":5392,"5403":5392,"5404":5392,"5405":5392,"5406":5392,"5407":5392,"5409":5408,"5410":5408,"5411":5408,"5412":5408,"5413":5408,"5414":5408,"5415":5408,"5416":5408,"5417":5408,"5418":5408,"5419":5408,"5420":5408,"5421":5408,"5422":5408,"5423":5408,"5425":5424,"5426":5424,"5427":5424,"5428":5424,"5429":5424,"5430":5424,"5431":5424,"5432":5424,"5433":5424,"5434":5424,"5435":5424,"5436":5424,"5437":5424,"5438":5424,"5439":5424,"5441":5440,"5442":5440,"5443":5440,"5444":5440,"5445":5440,"5446":5440,"5447":5440,"5448":5440,"5449":5440,"5450":5440,"5451":5440,"5452":5440,"5453":5440,"5454":5440,"5455":5440,"5457":5456,"5458":5456,"5459":5456,"5460":5456,"5461":5456,"5462":5456,"5463":5456,"5464":5456,"5465":5456,"5466":5456,"5467":5456,"5468":5456,"5469":5456,"5470":5456,"5471":5456,"5473":5472,"5474":5472,"5475":5472,"5476":5472,"5477":5472,"5478":5472,"5479":5472,"5480":5472,"5481":5472,"5482":5472,"5483":5472,"5484":5472,"5485":5472,"5486":5472,"5487":5472,"5489":5488,"5490":5488,"5491":5488,"5492":5488,"5493":5488,"5494":5488,"5495":5488,"5496":5488,"5497":5488,"5498":5488,"5499":5488,"5500":5488,"5501":5488,"5502":5488,"5503":5488,"5505":5504,"5506":5504,"5507":5504,"5508":5504,"5509":5504,"5510":5504,"5511":5504,"5512":5504,"5513":5504,"5514":5504,"5515":5504,"5516":5504,"5517":5504,"5518":5504,"5519":5504,"5521":5520,"5522":5520,"5523":5520,"5524":5520,"5525":5520,"5526":5520,"5527":5520,"5528":5520,"5529":5520,"5530":5520,"5531":5520,"5532":5520,"5533":5520,"5534":5520,"5535":5520,"5537":5536,"5538":5536,"5539":5536,"5540":5536,"5541":5536,"5542":5536,"5543":5536,"5544":5536,"5545":5536,"5546":5536,"5547":5536,"5548":5536,"5549":5536,"5550":5536,"5551":5536,"5553":5552,"5554":5552,"5555":5552,"5556":5552,"5557":5552,"5558":5552,"5559":5552,"5560":5552,"5561":5552,"5562":5552,"5563":5552,"5564":5552,"5565":5552,"5566":5552,"5567":5552,"5569":5568,"5570":5568,"5571":5568,"5572":5568,"5573":5568,"5574":5568,"5575":5568,"5576":5568,"5577":5568,"5578":5568,"5579":5568,"5580":5568,"5581":5568,"5582":5568,"5583":5568,"5585":5584,"5586":5584,"5587":5584,"5588":5584,"5589":5584,"5590":5584,"5591":5584,"5592":5584,"5593":5584,"5594":5584,"5595":5584,"5596":5584,"5597":5584,"5598":5584,"5599":5584,"5601":5600,"5602":5600,"5603":5600,"5604":5600,"5605":5600,"5606":5600,"5607":5600,"5608":5600,"5609":5600,"5610":5600,"5611":5600,"5612":5600,"5613":5600,"5614":5600,"5615":5600,"5617":5616,"5618":5616,"5619":5616,"5620":5616,"5621":5616,"5622":5616,"5623":5616,"5624":5616,"5625":5616,"5626":5616,"5627":5616,"5628":5616,"5629":5616,"5630":5616,"5631":5616,"5633":5632,"5634":5632,"5635":5632,"5636":5632,"5637":5632,"5638":5632,"5639":5632,"5640":5632,"5641":5632,"5642":5632,"5643":5632,"5644":5632,"5645":5632,"5646":5632,"5647":5632,"5649":5648,"5650":5648,"5651":5648,"5652":5648,"5653":5648,"5654":5648,"5655":5648,"5656":5648,"5657":5648,"5658":5648,"5659":5648,"5660":5648,"5661":5648,"5662":5648,"5663":5648,"5665":5664,"5666":5664,"5667":5664,"5668":5664,"5669":5664,"5670":5664,"5671":5664,"5672":5664,"5673":5664,"5674":5664,"5675":5664,"5676":5664,"5677":5664,"5678":5664,"5679":5664,"5681":5680,"5682":5680,"5683":5680,"5684":5680,"5685":5680,"5686":5680,"5687":5680,"5688":5680,"5689":5680,"5690":5680,"5691":5680,"5692":5680,"5693":5680,"5694":5680,"5695":5680,"5697":5696,"5698":5696,"5699":5696,"5700":5696,"5701":5696,"5702":5696,"5703":5696,"5704":5696,"5705":5696,"5706":5696,"5707":5696,"5708":5696,"5709":5696,"5710":5696,"5711":5696,"5713":5712,"5714":5712,"5715":5712,"5716":5712,"5717":5712,"5718":5712,"5719":5712,"5720":5712,"5721":5712,"5722":5712,"5723":5712,"5724":5712,"5725":5712,"5726":5712,"5727":5712,"5729":5728,"5730":5728,"5731":5728,"5732":5728,"5733":5728,"5734":5728,"5735":5728,"5736":5728,"5737":5728,"5738":5728,"5739":5728,"5740":5728,"5741":5728,"5742":5728,"5743":5728,"5745":5744,"5746":5744,"5747":5744,"5748":5744,"5749":5744,"5750":5744,"5751":5744,"5752":5744,"5753":5744,"5754":5744,"5755":5744,"5756":5744,"5757":5744,"5758":5744,"5759":5744,"5761":5760,"5762":5760,"5763":5760,"5764":5760,"5765":5760,"5766":5760,"5767":5760,"5768":5760,"5769":5760,"5770":5760,"5771":5760,"5772":5760,"5773":5760,"5774":5760,"5775":5760,"5777":5776,"5778":5776,"5779":5776,"5780":5776,"5781":5776,"5782":5776,"5783":5776,"5784":5776,"5785":5776,"5786":5776,"5787":5776,"5788":5776,"5789":5776,"5790":5776,"5791":5776,"5793":5792,"5794":5792,"5795":5792,"5796":5792,"5797":5792,"5798":5792,"5799":5792,"5800":5792,"5801":5792,"5802":5792,"5803":5792,"5804":5792,"5805":5792,"5806":5792,"5807":5792,"5809":5808,"5810":5808,"5811":5808,"5812":5808,"5813":5808,"5814":5808,"5815":5808,"5816":5808,"5817":5808,"5818":5808,"5819":5808,"5820":5808,"5821":5808,"5822":5808,"5823":5808,"5825":5824,"5826":5824,"5827":5824,"5828":5824,"5829":5824,"5830":5824,"5831":5824,"5832":5824,"5833":5824,"5834":5824,"5835":5824,"5836":5824,"5837":5824,"5838":5824,"5839":5824,"5841":5840,"5842":5840,"5843":5840,"5844":5840,"5845":5840,"5846":5840,"5847":5840,"5848":5840,"5849":5840,"5850":5840,"5851":5840,"5852":5840,"5853":5840,"5854":5840,"5855":5840,"5857":5856,"5858":5856,"5859":5856,"5860":5856,"5861":5856,"5862":5856,"5863":5856,"5864":5856,"5865":5856,"5866":5856,"5867":5856,"5868":5856,"5869":5856,"5870":5856,"5871":5856,"5873":5872,"5874":5872,"5875":5872,"5876":5872,"5877":5872,"5878":5872,"5879":5872,"5880":5872,"5881":5872,"5882":5872,"5883":5872,"5884":5872,"5885":5872,"5886":5872,"5887":5872,"5889":5888,"5890":5888,"5891":5888,"5892":5888,"5893":5888,"5894":5888,"5895":5888,"5896":5888,"5897":5888,"5898":5888,"5899":5888,"5900":5888,"5901":5888,"5902":5888,"5903":5888,"5905":5904,"5906":5904,"5907":5904,"5908":5904,"5909":5904,"5910":5904,"5911":5904,"5912":5904,"5913":5904,"5914":5904,"5915":5904,"5916":5904,"5917":5904,"5918":5904,"5919":5904,"5921":5920,"5922":5920,"5923":5920,"5924":5920,"5925":5920,"5926":5920,"5927":5920,"5928":5920,"5929":5920,"5930":5920,"5931":5920,"5932":5920,"5933":5920,"5934":5920,"5935":5920,"5937":5936,"5938":5936,"5939":5936,"5940":5936,"5941":5936,"5942":5936,"5943":5936,"5944":5936,"5945":5936,"5946":5936,"5947":5936,"5948":5936,"5949":5936,"5950":5936,"5951":5936,"5953":5952,"5954":5952,"5955":5952,"5956":5952,"5957":5952,"5958":5952,"5959":5952,"5960":5952,"5961":5952,"5962":5952,"5963":5952,"5964":5952,"5965":5952,"5966":5952,"5967":5952,"5969":5968,"5970":5968,"5971":5968,"5972":5968,"5973":5968,"5974":5968,"5975":5968,"5976":5968,"5977":5968,"5978":5968,"5979":5968,"5980":5968,"5981":5968,"5982":5968,"5983":5968,"5985":5984,"5986":5984,"5987":5984,"5988":5984,"5989":5984,"5990":5984,"5991":5984,"5992":5984,"5993":5984,"5994":5984,"5995":5984,"5996":5984,"5997":5984,"5998":5984,"5999":5984,"6001":6000,"6002":6000,"6003":6000,"6004":6000,"6005":6000,"6006":6000,"6007":6000,"6008":6000,"6009":6000,"6010":6000,"6011":6000,"6012":6000,"6013":6000,"6014":6000,"6015":6000,"6017":6016,"6018":6016,"6019":6016,"6020":6016,"6021":6016,"6022":6016,"6023":6016,"6024":6016,"6025":6016,"6026":6016,"6027":6016,"6028":6016,"6029":6016,"6030":6016,"6031":6016,"6033":6032,"6034":6032,"6035":6032,"6036":6032,"6037":6032,"6038":6032,"6039":6032,"6040":6032,"6041":6032,"6042":6032,"6043":6032,"6044":6032,"6045":6032,"6046":6032,"6047":6032,"6049":6048,"6050":6048,"6051":6048,"6052":6048,"6053":6048,"6054":6048,"6055":6048,"6056":6048,"6057":6048,"6058":6048,"6059":6048,"6060":6048,"6061":6048,"6062":6048,"6063":6048,"6065":6064,"6066":6064,"6067":6064,"6068":6064,"6069":6064,"6070":6064,"6071":6064,"6072":6064,"6073":6064,"6074":6064,"6075":6064,"6076":6064,"6077":6064,"6078":6064,"6079":6064,"6081":6080,"6082":6080,"6083":6080,"6084":6080,"6085":6080,"6086":6080,"6087":6080,"6088":6080,"6089":6080,"6090":6080,"6091":6080,"6092":6080,"6093":6080,"6094":6080,"6095":6080,"6097":6096,"6098":6096,"6099":6096,"6100":6096,"6101":6096,"6102":6096,"6103":6096,"6104":6096,"6105":6096,"6106":6096,"6107":6096,"6108":6096,"6109":6096,"6110":6096,"6111":6096,"6113":6112,"6114":6112,"6115":6112,"6116":6112,"6117":6112,"6118":6112,"6119":6112,"6120":6112,"6121":6112,"6122":6112,"6123":6112,"6124":6112,"6125":6112,"6126":6112,"6127":6112,"6129":6128,"6130":6128,"6131":6128,"6132":6128,"6133":6128,"6134":6128,"6135":6128,"6136":6128,"6137":6128,"6138":6128,"6139":6128,"6140":6128,"6141":6128,"6142":6128,"6143":6128,"6145":6144,"6146":6144,"6147":6144,"6148":6144,"6149":6144,"6150":6144,"6151":6144,"6152":6144,"6153":6144,"6154":6144,"6155":6144,"6156":6144,"6157":6144,"6158":6144,"6159":6144,"6181":6176,"6182":6176,"6183":6176,"6184":6176,"6185":6176,"6186":6176,"6187":6176,"6188":6176,"6189":6176,"6190":6176,"6191":6176,"6197":6192,"6198":6192,"6199":6192,"6205":6192,"6206":6192,"6207":6192,"6213":6208,"6214":6208,"6215":6208,"6221":6208,"6222":6208,"6223":6208,"6229":6208,"6230":6208,"6231":6208,"6237":6208,"6238":6208,"6239":6208,"6273":6248,"6275":6248,"6277":6248,"6279":6248,"6281":6248,"6283":6248,"6285":6248,"6287":6248,"6305":6304,"6306":6304,"6307":6304,"6308":6304,"6309":6304,"6310":6304,"6311":6304,"6312":6304,"6313":6304,"6314":6304,"6315":6304,"6316":6304,"6317":6304,"6318":6304,"6319":6304,"6326":6320,"6327":6320,"6334":6320,"6335":6320,"6342":6336,"6343":6336,"6350":6336,"6351":6336,"6358":6352,"6359":6352,"6366":6352,"6367":6352,"6374":6368,"6375":6368,"6382":6368,"6383":6368,"6390":6384,"6391":6384,"6398":6384,"6399":6384,"6482":6480,"6483":6480,"6484":6480,"6485":6480,"6486":6480,"6487":6480,"6488":6480,"6489":6480,"6490":6480,"6491":6480,"6492":6480,"6493":6480,"6494":6480,"6495":6480,"6498":6496,"6499":6496,"6500":6496,"6501":6496,"6502":6496,"6503":6496,"6504":6496,"6505":6496,"6506":6496,"6507":6496,"6508":6496,"6509":6496,"6510":6496,"6511":6496,"6514":6512,"6515":6512,"6516":6512,"6517":6512,"6518":6512,"6519":6512,"6520":6512,"6521":6512,"6522":6512,"6523":6512,"6524":6512,"6525":6512,"6526":6512,"6527":6512,"6530":6528,"6531":6528,"6532":6528,"6533":6528,"6534":6528,"6535":6528,"6536":6528,"6537":6528,"6538":6528,"6539":6528,"6540":6528,"6541":6528,"6542":6528,"6543":6528,"6546":6544,"6547":6544,"6548":6544,"6549":6544,"6550":6544,"6551":6544,"6552":6544,"6553":6544,"6554":6544,"6555":6544,"6556":6544,"6557":6544,"6558":6544,"6559":6544,"6564":6562,"6565":6562,"6566":6562,"6567":6562,"6568":6562,"6569":6562,"6570":6562,"6571":6562,"6572":6562,"6573":6562,"6574":6562,"6575":6562,"6584":6580,"6585":6580,"6586":6580,"6587":6580,"6588":6580,"6589":6580,"6590":6580,"6591":6580,"6657":6656,"6658":6656,"6659":6656,"6660":6656,"6661":6656,"6662":6656,"6663":6656,"6664":6656,"6665":6656,"6666":6656,"6667":6656,"6668":6656,"6669":6656,"6670":6656,"6671":6656,"6694":6688,"6695":6688,"6702":6688,"6703":6688,"6706":6704,"6707":6704,"6708":6704,"6709":6704,"6710":6704,"6711":6704,"6712":6704,"6713":6704,"6714":6704,"6715":6704,"6716":6704,"6717":6704,"6718":6704,"6719":6704,"6760":6752,"6761":6753,"6762":6754,"6763":6755,"6764":6756,"6765":6757,"6766":6758,"6767":6759,"6776":6768,"6777":6769,"6778":6770,"6779":6771,"6780":6772,"6792":6787,"6793":6787,"6794":6787,"6795":6787,"6796":6787,"6797":6787,"6798":6787,"6799":6787,"6808":6803,"6809":6803,"6810":6803,"6811":6803,"6812":6803,"6813":6803,"6814":6803,"6815":6803,"6824":6819,"6825":6819,"6826":6819,"6827":6819,"6828":6819,"6829":6819,"6830":6819,"6831":6819,"6840":6835,"6841":6835,"6842":6835,"6843":6835,"6844":6835,"6845":6835,"6846":6835,"6847":6835,"6856":6851,"6857":6851,"6858":6851,"6859":6851,"6860":6851,"6861":6851,"6862":6851,"6863":6851,"6872":6867,"6873":6867,"6874":6867,"6875":6867,"6876":6867,"6877":6867,"6878":6867,"6879":6867,"6888":6883,"6889":6883,"6890":6883,"6891":6883,"6892":6883,"6893":6883,"6894":6883,"6895":6883,"6904":6899,"6905":6899,"6906":6899,"6907":6899,"6908":6899,"6909":6899,"6910":6899,"6911":6899,"6920":6915,"6921":6915,"6922":6915,"6923":6915,"6924":6915,"6925":6915,"6926":6915,"6927":6915,"6936":6931,"6937":6931,"6938":6931,"6939":6931,"6940":6931,"6941":6931,"6942":6931,"6943":6931,"6952":6947,"6953":6947,"6954":6947,"6955":6947,"6956":6947,"6957":6947,"6958":6947,"6959":6947,"6968":6963,"6969":6963,"6970":6963,"6971":6963,"6972":6963,"6973":6963,"6974":6963,"6975":6963,"6992":6994,"6993":6994,"6998":6994,"6999":6994,"7000":6994,"7001":6994,"7002":6994,"7003":6994,"7004":6994,"7005":6994,"7006":6994,"7007":6994,"7009":7008,"7010":7008,"7011":7008,"7012":7008,"7013":7008,"7014":7008,"7015":7008,"7016":7008,"7017":7008,"7018":7008,"7019":7008,"7020":7008,"7021":7008,"7022":7008,"7023":7008,"7032":7027,"7033":7027,"7034":7027,"7035":7027,"7036":7027,"7037":7027,"7038":7027,"7039":7027,"7048":7043,"7049":7043,"7050":7043,"7051":7043,"7052":7043,"7053":7043,"7054":7043,"7055":7043,"7072":7074,"7073":7074,"7078":7074,"7079":7074,"7080":7074,"7081":7074,"7082":7074,"7083":7074,"7084":7074,"7085":7074,"7086":7074,"7087":7074,"7104":7106,"7105":7106,"7110":7106,"7111":7106,"7112":7106,"7113":7106,"7114":7106,"7115":7106,"7116":7106,"7117":7106,"7118":7106,"7119":7106,"7136":7138,"7137":7138,"7142":7138,"7143":7138,"7144":7138,"7145":7138,"7146":7138,"7147":7138,"7148":7138,"7149":7138,"7150":7138,"7151":7138,"7168":7170,"7169":7170,"7174":7170,"7175":7170,"7176":7170,"7177":7170,"7178":7170,"7179":7170,"7180":7170,"7181":7170,"7182":7170,"7183":7170,"7192":7186,"7193":7186,"7194":7186,"7195":7186,"7196":7186,"7197":7186,"7198":7186,"7199":7186,"7216":7218,"7217":7218,"7222":7218,"7223":7218,"7224":7218,"7225":7218,"7226":7218,"7227":7218,"7228":7218,"7229":7218,"7230":7218,"7231":7218,"7232":7234,"7233":7234,"7238":7234,"7239":7234,"7240":7234,"7241":7234,"7242":7234,"7243":7234,"7244":7234,"7245":7234,"7246":7234,"7247":7234,"7248":7250,"7249":7250,"7254":7250,"7255":7250,"7256":7250,"7257":7250,"7258":7250,"7259":7250,"7260":7250,"7261":7250,"7262":7250,"7263":7250,"7264":7250,"7265":7250,"7270":7250,"7271":7250,"7272":7250,"7273":7250,"7274":7250,"7275":7250,"7276":7250,"7277":7250,"7278":7250,"7279":7250,"7297":7296,"7298":7296,"7299":7296,"7300":7296,"7301":7296,"7302":7296,"7303":7296,"7304":7296,"7305":7296,"7306":7296,"7307":7296,"7308":7296,"7309":7296,"7310":7296,"7311":7296,"7334":7328,"7335":7328,"7342":7328,"7343":7328,"7348":7346,"7349":7346,"7350":7346,"7351":7346,"7352":7346,"7353":7346,"7354":7346,"7355":7346,"7356":7346,"7357":7346,"7358":7346,"7359":7346,"7396":7392,"7397":7392,"7398":7392,"7399":7392,"7400":7392,"7401":7392,"7402":7392,"7403":7392,"7404":7392,"7405":7392,"7406":7392,"7407":7392,"7410":7408,"7411":7408,"7412":7408,"7413":7408,"7414":7408,"7415":7408,"7416":7408,"7417":7408,"7418":7408,"7419":7408,"7420":7408,"7421":7408,"7422":7408,"7423":7408,"7478":7472,"7479":7472,"7486":7472,"7487":7472,"7504":7218,"7505":7218,"7510":7218,"7511":7218,"7512":7218,"7513":7218,"7514":7218,"7515":7218,"7516":7218,"7517":7218,"7518":7218,"7519":7218}} \ No newline at end of file +{"knownStates":{"2564096":"Activator Rail","2564097":"Activator Rail","2564098":"Activator Rail","2564099":"Activator Rail","2564100":"Activator Rail","2564101":"Activator Rail","2564104":"Activator Rail","2564105":"Activator Rail","2564106":"Activator Rail","2564107":"Activator Rail","2564108":"Activator Rail","2564109":"Activator Rail","2560000":"Air","2565888":"Anvil","2565889":"Anvil","2565890":"Anvil","2565892":"Anvil","2565893":"Anvil","2565894":"Anvil","2565896":"Anvil","2565897":"Anvil","2565898":"Anvil","2565900":"Anvil","2565901":"Anvil","2565902":"Anvil","2566400":"Bamboo","2566401":"Bamboo","2566402":"Bamboo","2566404":"Bamboo","2566405":"Bamboo","2566406":"Bamboo","2566408":"Bamboo","2566409":"Bamboo","2566410":"Bamboo","2566412":"Bamboo","2566413":"Bamboo","2566414":"Bamboo","2566656":"Bamboo Sapling","2566657":"Bamboo Sapling","2566912":"Banner","2566913":"Banner","2566914":"Banner","2566915":"Banner","2566916":"Banner","2566917":"Banner","2566918":"Banner","2566919":"Banner","2566920":"Banner","2566921":"Banner","2566922":"Banner","2566923":"Banner","2566924":"Banner","2566925":"Banner","2566926":"Banner","2566927":"Banner","2695424":"Wall Banner","2695425":"Wall Banner","2695426":"Wall Banner","2695427":"Wall Banner","2567168":"Barrel","2567169":"Barrel","2567170":"Barrel","2567171":"Barrel","2567172":"Barrel","2567173":"Barrel","2567176":"Barrel","2567177":"Barrel","2567178":"Barrel","2567179":"Barrel","2567180":"Barrel","2567181":"Barrel","2567424":"Barrier","2567680":"Beacon","2567936":"Bed Block","2567937":"Bed Block","2567938":"Bed Block","2567939":"Bed Block","2567940":"Bed Block","2567941":"Bed Block","2567942":"Bed Block","2567943":"Bed Block","2567944":"Bed Block","2567945":"Bed Block","2567946":"Bed Block","2567947":"Bed Block","2567948":"Bed Block","2567949":"Bed Block","2567950":"Bed Block","2567951":"Bed Block","2568192":"Bedrock","2568193":"Bedrock","2568448":"Beetroot Block","2568449":"Beetroot Block","2568450":"Beetroot Block","2568451":"Beetroot Block","2568452":"Beetroot Block","2568453":"Beetroot Block","2568454":"Beetroot Block","2568455":"Beetroot Block","2568704":"Bell","2568705":"Bell","2568706":"Bell","2568707":"Bell","2568708":"Bell","2568709":"Bell","2568710":"Bell","2568711":"Bell","2568712":"Bell","2568713":"Bell","2568714":"Bell","2568715":"Bell","2568716":"Bell","2568717":"Bell","2568718":"Bell","2568719":"Bell","2573568":"Blue Ice","2574336":"Bone Block","2574337":"Bone Block","2574338":"Bone Block","2574592":"Bookshelf","2574848":"Brewing Stand","2574849":"Brewing Stand","2574850":"Brewing Stand","2574851":"Brewing Stand","2574852":"Brewing Stand","2574853":"Brewing Stand","2574854":"Brewing Stand","2574855":"Brewing Stand","2575360":"Brick Stairs","2575361":"Brick Stairs","2575362":"Brick Stairs","2575363":"Brick Stairs","2575364":"Brick Stairs","2575365":"Brick Stairs","2575366":"Brick Stairs","2575367":"Brick Stairs","2575872":"Bricks","2576384":"Brown Mushroom","2576896":"Cactus","2576897":"Cactus","2576898":"Cactus","2576899":"Cactus","2576900":"Cactus","2576901":"Cactus","2576902":"Cactus","2576903":"Cactus","2576904":"Cactus","2576905":"Cactus","2576906":"Cactus","2576907":"Cactus","2576908":"Cactus","2576909":"Cactus","2576910":"Cactus","2576911":"Cactus","2577152":"Cake","2577153":"Cake","2577154":"Cake","2577155":"Cake","2577156":"Cake","2577157":"Cake","2577158":"Cake","2577664":"Carrot Block","2577665":"Carrot Block","2577666":"Carrot Block","2577667":"Carrot Block","2577668":"Carrot Block","2577669":"Carrot Block","2577670":"Carrot Block","2577671":"Carrot Block","2578432":"Chest","2578433":"Chest","2578434":"Chest","2578435":"Chest","2579712":"Clay Block","2579968":"Coal Block","2580224":"Coal Ore","2580480":"Cobblestone","2649600":"Mossy Cobblestone","2580992":"Cobblestone Stairs","2580993":"Cobblestone Stairs","2580994":"Cobblestone Stairs","2580995":"Cobblestone Stairs","2580996":"Cobblestone Stairs","2580997":"Cobblestone Stairs","2580998":"Cobblestone Stairs","2580999":"Cobblestone Stairs","2650112":"Mossy Cobblestone Stairs","2650113":"Mossy Cobblestone Stairs","2650114":"Mossy Cobblestone Stairs","2650115":"Mossy Cobblestone Stairs","2650116":"Mossy Cobblestone Stairs","2650117":"Mossy Cobblestone Stairs","2650118":"Mossy Cobblestone Stairs","2650119":"Mossy Cobblestone Stairs","2581504":"Cobweb","2581760":"Cocoa Block","2581761":"Cocoa Block","2581762":"Cocoa Block","2581763":"Cocoa Block","2581764":"Cocoa Block","2581765":"Cocoa Block","2581766":"Cocoa Block","2581767":"Cocoa Block","2581768":"Cocoa Block","2581769":"Cocoa Block","2581770":"Cocoa Block","2581771":"Cocoa Block","2583040":"Coral Block","2583041":"Coral Block","2583042":"Coral Block","2583043":"Coral Block","2583044":"Coral Block","2583048":"Coral Block","2583049":"Coral Block","2583050":"Coral Block","2583051":"Coral Block","2583052":"Coral Block","2584064":"Crafting Table","2590464":"Daylight Sensor","2590465":"Daylight Sensor","2590466":"Daylight Sensor","2590467":"Daylight Sensor","2590468":"Daylight Sensor","2590469":"Daylight Sensor","2590470":"Daylight Sensor","2590471":"Daylight Sensor","2590472":"Daylight Sensor","2590473":"Daylight Sensor","2590474":"Daylight Sensor","2590475":"Daylight Sensor","2590476":"Daylight Sensor","2590477":"Daylight Sensor","2590478":"Daylight Sensor","2590479":"Daylight Sensor","2590480":"Daylight Sensor","2590481":"Daylight Sensor","2590482":"Daylight Sensor","2590483":"Daylight Sensor","2590484":"Daylight Sensor","2590485":"Daylight Sensor","2590486":"Daylight Sensor","2590487":"Daylight Sensor","2590488":"Daylight Sensor","2590489":"Daylight Sensor","2590490":"Daylight Sensor","2590491":"Daylight Sensor","2590492":"Daylight Sensor","2590493":"Daylight Sensor","2590494":"Daylight Sensor","2590495":"Daylight Sensor","2590720":"Dead Bush","2590976":"Detector Rail","2590977":"Detector Rail","2590978":"Detector Rail","2590979":"Detector Rail","2590980":"Detector Rail","2590981":"Detector Rail","2590984":"Detector Rail","2590985":"Detector Rail","2590986":"Detector Rail","2590987":"Detector Rail","2590988":"Detector Rail","2590989":"Detector Rail","2591232":"Diamond Block","2591488":"Diamond Ore","2592768":"Dirt","2592769":"Dirt","2692864":"Sunflower","2692865":"Sunflower","2646272":"Lilac","2646273":"Lilac","2675200":"Rose Bush","2675201":"Rose Bush","2660352":"Peony","2660353":"Peony","2593024":"Double Tallgrass","2593025":"Double Tallgrass","2644480":"Large Fern","2644481":"Large Fern","2593280":"Dragon Egg","2593536":"Dried Kelp Block","2624768":"Emerald Block","2625024":"Emerald Ore","2625280":"Enchanting Table","2625536":"End Portal Frame","2625537":"End Portal Frame","2625538":"End Portal Frame","2625539":"End Portal Frame","2625540":"End Portal Frame","2625541":"End Portal Frame","2625542":"End Portal Frame","2625543":"End Portal Frame","2625792":"End Rod","2625793":"End Rod","2625794":"End Rod","2625795":"End Rod","2625796":"End Rod","2625797":"End Rod","2626048":"End Stone","2627072":"End Stone Bricks","2626560":"End Stone Brick Stairs","2626561":"End Stone Brick Stairs","2626562":"End Stone Brick Stairs","2626563":"End Stone Brick Stairs","2626564":"End Stone Brick Stairs","2626565":"End Stone Brick Stairs","2626566":"End Stone Brick Stairs","2626567":"End Stone Brick Stairs","2627328":"Ender Chest","2627329":"Ender Chest","2627330":"Ender Chest","2627331":"Ender Chest","2627840":"Farmland","2627841":"Farmland","2627842":"Farmland","2627843":"Farmland","2627844":"Farmland","2627845":"Farmland","2627846":"Farmland","2627847":"Farmland","2628352":"Fire Block","2628353":"Fire Block","2628354":"Fire Block","2628355":"Fire Block","2628356":"Fire Block","2628357":"Fire Block","2628358":"Fire Block","2628359":"Fire Block","2628360":"Fire Block","2628361":"Fire Block","2628362":"Fire Block","2628363":"Fire Block","2628364":"Fire Block","2628365":"Fire Block","2628366":"Fire Block","2628367":"Fire Block","2628608":"Fletching Table","2585600":"Dandelion","2663680":"Poppy","2564608":"Allium","2566144":"Azure Bluet","2573824":"Blue Orchid","2583552":"Cornflower","2646528":"Lily of the Valley","2659584":"Orange Tulip","2659840":"Oxeye Daisy","2660864":"Pink Tulip","2672896":"Red Tulip","2697216":"White Tulip","2628864":"Flower Pot","2629120":"Frosted Ice","2629121":"Frosted Ice","2629122":"Frosted Ice","2629123":"Frosted Ice","2629376":"Furnace","2629377":"Furnace","2629378":"Furnace","2629379":"Furnace","2629380":"Furnace","2629381":"Furnace","2629382":"Furnace","2629383":"Furnace","2573056":"Blast Furnace","2573057":"Blast Furnace","2573058":"Blast Furnace","2573059":"Blast Furnace","2573060":"Blast Furnace","2573061":"Blast Furnace","2573062":"Blast Furnace","2573063":"Blast Furnace","2677760":"Smoker","2677761":"Smoker","2677762":"Smoker","2677763":"Smoker","2677764":"Smoker","2677765":"Smoker","2677766":"Smoker","2677767":"Smoker","2629632":"Glass","2629888":"Glass Pane","2630144":"Glowing Obsidian","2630400":"Glowstone","2630656":"Gold Block","2630912":"Gold Ore","2632192":"Grass","2632448":"Grass Path","2632704":"Gravel","2633728":"Hardened Clay","2633984":"Hardened Glass","2634240":"Hardened Glass Pane","2634496":"Hay Bale","2634497":"Hay Bale","2634498":"Hay Bale","2634752":"Hopper","2634754":"Hopper","2634755":"Hopper","2634756":"Hopper","2634757":"Hopper","2634760":"Hopper","2634762":"Hopper","2634763":"Hopper","2634764":"Hopper","2634765":"Hopper","2635008":"Ice","2636800":"update!","2637056":"ate!upd","2637312":"Invisible Bedrock","2637568":"Iron Block","2637824":"Iron Bars","2638080":"Iron Door","2638081":"Iron Door","2638082":"Iron Door","2638083":"Iron Door","2638084":"Iron Door","2638085":"Iron Door","2638086":"Iron Door","2638087":"Iron Door","2638088":"Iron Door","2638089":"Iron Door","2638090":"Iron Door","2638091":"Iron Door","2638092":"Iron Door","2638093":"Iron Door","2638094":"Iron Door","2638095":"Iron Door","2638096":"Iron Door","2638097":"Iron Door","2638098":"Iron Door","2638099":"Iron Door","2638100":"Iron Door","2638101":"Iron Door","2638102":"Iron Door","2638103":"Iron Door","2638104":"Iron Door","2638105":"Iron Door","2638106":"Iron Door","2638107":"Iron Door","2638108":"Iron Door","2638109":"Iron Door","2638110":"Iron Door","2638111":"Iron Door","2638592":"Iron Trapdoor","2638593":"Iron Trapdoor","2638594":"Iron Trapdoor","2638595":"Iron Trapdoor","2638596":"Iron Trapdoor","2638597":"Iron Trapdoor","2638598":"Iron Trapdoor","2638599":"Iron Trapdoor","2638600":"Iron Trapdoor","2638601":"Iron Trapdoor","2638602":"Iron Trapdoor","2638603":"Iron Trapdoor","2638604":"Iron Trapdoor","2638605":"Iron Trapdoor","2638606":"Iron Trapdoor","2638607":"Iron Trapdoor","2638336":"Iron Ore","2638848":"Item Frame","2638849":"Item Frame","2638850":"Item Frame","2638851":"Item Frame","2638852":"Item Frame","2638853":"Item Frame","2638854":"Item Frame","2638855":"Item Frame","2639104":"Jukebox","2643456":"Ladder","2643457":"Ladder","2643458":"Ladder","2643459":"Ladder","2643712":"Lantern","2643713":"Lantern","2643968":"Lapis Lazuli Block","2644224":"Lapis Lazuli Ore","2644736":"Lava","2644737":"Lava","2644738":"Lava","2644739":"Lava","2644740":"Lava","2644741":"Lava","2644742":"Lava","2644743":"Lava","2644744":"Lava","2644745":"Lava","2644746":"Lava","2644747":"Lava","2644748":"Lava","2644749":"Lava","2644750":"Lava","2644751":"Lava","2644752":"Lava","2644753":"Lava","2644754":"Lava","2644755":"Lava","2644756":"Lava","2644757":"Lava","2644758":"Lava","2644759":"Lava","2644760":"Lava","2644761":"Lava","2644762":"Lava","2644763":"Lava","2644764":"Lava","2644765":"Lava","2644766":"Lava","2644767":"Lava","2644992":"Lectern","2644993":"Lectern","2644994":"Lectern","2644995":"Lectern","2644996":"Lectern","2644997":"Lectern","2644998":"Lectern","2644999":"Lectern","2645504":"Lever","2645505":"Lever","2645506":"Lever","2645507":"Lever","2645508":"Lever","2645509":"Lever","2645510":"Lever","2645511":"Lever","2645512":"Lever","2645513":"Lever","2645514":"Lever","2645515":"Lever","2645516":"Lever","2645517":"Lever","2645518":"Lever","2645519":"Lever","2647552":"Loom","2647553":"Loom","2647554":"Loom","2647555":"Loom","2648064":"Magma Block","2648576":"Melon Block","2648832":"Melon Stem","2648833":"Melon Stem","2648834":"Melon Stem","2648835":"Melon Stem","2648836":"Melon Stem","2648837":"Melon Stem","2648838":"Melon Stem","2648839":"Melon Stem","2649344":"Monster Spawner","2651904":"Mycelium","2653184":"Nether Bricks","2671104":"Red Nether Bricks","2652160":"Nether Brick Fence","2652672":"Nether Brick Stairs","2652673":"Nether Brick Stairs","2652674":"Nether Brick Stairs","2652675":"Nether Brick Stairs","2652676":"Nether Brick Stairs","2652677":"Nether Brick Stairs","2652678":"Nether Brick Stairs","2652679":"Nether Brick Stairs","2670592":"Red Nether Brick Stairs","2670593":"Red Nether Brick Stairs","2670594":"Red Nether Brick Stairs","2670595":"Red Nether Brick Stairs","2670596":"Red Nether Brick Stairs","2670597":"Red Nether Brick Stairs","2670598":"Red Nether Brick Stairs","2670599":"Red Nether Brick Stairs","2653440":"Nether Portal","2653441":"Nether Portal","2653696":"Nether Quartz Ore","2653952":"Nether Reactor Core","2654464":"Nether Wart Block","2654208":"Nether Wart","2654209":"Nether Wart","2654210":"Nether Wart","2654211":"Nether Wart","2654720":"Netherrack","2654976":"Note Block","2659072":"Obsidian","2660096":"Packed Ice","2661120":"Podzol","2663936":"Potato Block","2663937":"Potato Block","2663938":"Potato Block","2663939":"Potato Block","2663940":"Potato Block","2663941":"Potato Block","2663942":"Potato Block","2663943":"Potato Block","2664192":"Powered Rail","2664193":"Powered Rail","2664194":"Powered Rail","2664195":"Powered Rail","2664196":"Powered Rail","2664197":"Powered Rail","2664200":"Powered Rail","2664201":"Powered Rail","2664202":"Powered Rail","2664203":"Powered Rail","2664204":"Powered Rail","2664205":"Powered Rail","2664448":"Prismarine","2589696":"Dark Prismarine","2664704":"Prismarine Bricks","2665216":"Prismarine Bricks Stairs","2665217":"Prismarine Bricks Stairs","2665218":"Prismarine Bricks Stairs","2665219":"Prismarine Bricks Stairs","2665220":"Prismarine Bricks Stairs","2665221":"Prismarine Bricks Stairs","2665222":"Prismarine Bricks Stairs","2665223":"Prismarine Bricks Stairs","2590208":"Dark Prismarine Stairs","2590209":"Dark Prismarine Stairs","2590210":"Dark Prismarine Stairs","2590211":"Dark Prismarine Stairs","2590212":"Dark Prismarine Stairs","2590213":"Dark Prismarine Stairs","2590214":"Dark Prismarine Stairs","2590215":"Dark Prismarine Stairs","2665728":"Prismarine Stairs","2665729":"Prismarine Stairs","2665730":"Prismarine Stairs","2665731":"Prismarine Stairs","2665732":"Prismarine Stairs","2665733":"Prismarine Stairs","2665734":"Prismarine Stairs","2665735":"Prismarine Stairs","2666240":"Pumpkin","2577920":"Carved Pumpkin","2577921":"Carved Pumpkin","2577922":"Carved Pumpkin","2577923":"Carved Pumpkin","2647296":"Jack o'Lantern","2647297":"Jack o'Lantern","2647298":"Jack o'Lantern","2647299":"Jack o'Lantern","2666496":"Pumpkin Stem","2666497":"Pumpkin Stem","2666498":"Pumpkin Stem","2666499":"Pumpkin Stem","2666500":"Pumpkin Stem","2666501":"Pumpkin Stem","2666502":"Pumpkin Stem","2666503":"Pumpkin Stem","2667264":"Purpur Block","2667520":"Purpur Pillar","2667521":"Purpur Pillar","2667522":"Purpur Pillar","2668032":"Purpur Stairs","2668033":"Purpur Stairs","2668034":"Purpur Stairs","2668035":"Purpur Stairs","2668036":"Purpur Stairs","2668037":"Purpur Stairs","2668038":"Purpur Stairs","2668039":"Purpur Stairs","2668288":"Quartz Block","2578688":"Chiseled Quartz Block","2578689":"Chiseled Quartz Block","2578690":"Chiseled Quartz Block","2668544":"Quartz Pillar","2668545":"Quartz Pillar","2668546":"Quartz Pillar","2678016":"Smooth Quartz Block","2669056":"Quartz Stairs","2669057":"Quartz Stairs","2669058":"Quartz Stairs","2669059":"Quartz Stairs","2669060":"Quartz Stairs","2669061":"Quartz Stairs","2669062":"Quartz Stairs","2669063":"Quartz Stairs","2678528":"Smooth Quartz Stairs","2678529":"Smooth Quartz Stairs","2678530":"Smooth Quartz Stairs","2678531":"Smooth Quartz Stairs","2678532":"Smooth Quartz Stairs","2678533":"Smooth Quartz Stairs","2678534":"Smooth Quartz Stairs","2678535":"Smooth Quartz Stairs","2669312":"Rail","2669313":"Rail","2669314":"Rail","2669315":"Rail","2669316":"Rail","2669317":"Rail","2669318":"Rail","2669319":"Rail","2669320":"Rail","2669321":"Rail","2669824":"Red Mushroom","2673152":"Redstone Block","2673408":"Redstone Comparator","2673409":"Redstone Comparator","2673410":"Redstone Comparator","2673411":"Redstone Comparator","2673412":"Redstone Comparator","2673413":"Redstone Comparator","2673414":"Redstone Comparator","2673415":"Redstone Comparator","2673416":"Redstone Comparator","2673417":"Redstone Comparator","2673418":"Redstone Comparator","2673419":"Redstone Comparator","2673420":"Redstone Comparator","2673421":"Redstone Comparator","2673422":"Redstone Comparator","2673423":"Redstone Comparator","2673664":"Redstone Lamp","2673665":"Redstone Lamp","2673920":"Redstone Ore","2673921":"Redstone Ore","2674176":"Redstone Repeater","2674177":"Redstone Repeater","2674178":"Redstone Repeater","2674179":"Redstone Repeater","2674180":"Redstone Repeater","2674181":"Redstone Repeater","2674182":"Redstone Repeater","2674183":"Redstone Repeater","2674184":"Redstone Repeater","2674185":"Redstone Repeater","2674186":"Redstone Repeater","2674187":"Redstone Repeater","2674188":"Redstone Repeater","2674189":"Redstone Repeater","2674190":"Redstone Repeater","2674191":"Redstone Repeater","2674192":"Redstone Repeater","2674193":"Redstone Repeater","2674194":"Redstone Repeater","2674195":"Redstone Repeater","2674196":"Redstone Repeater","2674197":"Redstone Repeater","2674198":"Redstone Repeater","2674199":"Redstone Repeater","2674200":"Redstone Repeater","2674201":"Redstone Repeater","2674202":"Redstone Repeater","2674203":"Redstone Repeater","2674204":"Redstone Repeater","2674205":"Redstone Repeater","2674206":"Redstone Repeater","2674207":"Redstone Repeater","2674433":"Redstone Torch","2674434":"Redstone Torch","2674435":"Redstone Torch","2674436":"Redstone Torch","2674437":"Redstone Torch","2674441":"Redstone Torch","2674442":"Redstone Torch","2674443":"Redstone Torch","2674444":"Redstone Torch","2674445":"Redstone Torch","2674688":"Redstone","2674689":"Redstone","2674690":"Redstone","2674691":"Redstone","2674692":"Redstone","2674693":"Redstone","2674694":"Redstone","2674695":"Redstone","2674696":"Redstone","2674697":"Redstone","2674698":"Redstone","2674699":"Redstone","2674700":"Redstone","2674701":"Redstone","2674702":"Redstone","2674703":"Redstone","2674944":"reserved6","2675456":"Sand","2671360":"Red Sand","2676736":"Sea Lantern","2676992":"Sea Pickle","2676993":"Sea Pickle","2676994":"Sea Pickle","2676995":"Sea Pickle","2676996":"Sea Pickle","2676997":"Sea Pickle","2676998":"Sea Pickle","2676999":"Sea Pickle","2649089":"Mob Head","2649090":"Mob Head","2649091":"Mob Head","2649092":"Mob Head","2649093":"Mob Head","2677504":"Slime Block","2680832":"Snow Block","2681088":"Snow Layer","2681089":"Snow Layer","2681090":"Snow Layer","2681091":"Snow Layer","2681092":"Snow Layer","2681093":"Snow Layer","2681094":"Snow Layer","2681095":"Snow Layer","2681344":"Soul Sand","2681600":"Sponge","2681601":"Sponge","2677248":"Shulker Box","2686976":"Stone","2564864":"Andesite","2591744":"Diorite","2631168":"Granite","2661376":"Polished Andesite","2662144":"Polished Diorite","2662912":"Polished Granite","2688000":"Stone Bricks","2651392":"Mossy Stone Bricks","2583808":"Cracked Stone Bricks","2579456":"Chiseled Stone Bricks","2636288":"Infested Stone","2636544":"Infested Stone Brick","2635520":"Infested Cobblestone","2636032":"Infested Mossy Stone Brick","2635776":"Infested Cracked Stone Brick","2635264":"Infested Chiseled Stone Brick","2689024":"Stone Stairs","2689025":"Stone Stairs","2689026":"Stone Stairs","2689027":"Stone Stairs","2689028":"Stone Stairs","2689029":"Stone Stairs","2689030":"Stone Stairs","2689031":"Stone Stairs","2680320":"Smooth Stone","2565376":"Andesite Stairs","2565377":"Andesite Stairs","2565378":"Andesite Stairs","2565379":"Andesite Stairs","2565380":"Andesite Stairs","2565381":"Andesite Stairs","2565382":"Andesite Stairs","2565383":"Andesite Stairs","2592256":"Diorite Stairs","2592257":"Diorite Stairs","2592258":"Diorite Stairs","2592259":"Diorite Stairs","2592260":"Diorite Stairs","2592261":"Diorite Stairs","2592262":"Diorite Stairs","2592263":"Diorite Stairs","2631680":"Granite Stairs","2631681":"Granite Stairs","2631682":"Granite Stairs","2631683":"Granite Stairs","2631684":"Granite Stairs","2631685":"Granite Stairs","2631686":"Granite Stairs","2631687":"Granite Stairs","2661888":"Polished Andesite Stairs","2661889":"Polished Andesite Stairs","2661890":"Polished Andesite Stairs","2661891":"Polished Andesite Stairs","2661892":"Polished Andesite Stairs","2661893":"Polished Andesite Stairs","2661894":"Polished Andesite Stairs","2661895":"Polished Andesite Stairs","2662656":"Polished Diorite Stairs","2662657":"Polished Diorite Stairs","2662658":"Polished Diorite Stairs","2662659":"Polished Diorite Stairs","2662660":"Polished Diorite Stairs","2662661":"Polished Diorite Stairs","2662662":"Polished Diorite Stairs","2662663":"Polished Diorite Stairs","2663424":"Polished Granite Stairs","2663425":"Polished Granite Stairs","2663426":"Polished Granite Stairs","2663427":"Polished Granite Stairs","2663428":"Polished Granite Stairs","2663429":"Polished Granite Stairs","2663430":"Polished Granite Stairs","2663431":"Polished Granite Stairs","2687488":"Stone Brick Stairs","2687489":"Stone Brick Stairs","2687490":"Stone Brick Stairs","2687491":"Stone Brick Stairs","2687492":"Stone Brick Stairs","2687493":"Stone Brick Stairs","2687494":"Stone Brick Stairs","2687495":"Stone Brick Stairs","2650880":"Mossy Stone Brick Stairs","2650881":"Mossy Stone Brick Stairs","2650882":"Mossy Stone Brick Stairs","2650883":"Mossy Stone Brick Stairs","2650884":"Mossy Stone Brick Stairs","2650885":"Mossy Stone Brick Stairs","2650886":"Mossy Stone Brick Stairs","2650887":"Mossy Stone Brick Stairs","2688256":"Stone Button","2688257":"Stone Button","2688258":"Stone Button","2688259":"Stone Button","2688260":"Stone Button","2688261":"Stone Button","2688264":"Stone Button","2688265":"Stone Button","2688266":"Stone Button","2688267":"Stone Button","2688268":"Stone Button","2688269":"Stone Button","2689280":"Stonecutter","2689281":"Stonecutter","2689282":"Stonecutter","2689283":"Stonecutter","2688512":"Stone Pressure Plate","2688513":"Stone Pressure Plate","2575104":"Brick Slab","2575105":"Brick Slab","2575106":"Brick Slab","2580736":"Cobblestone Slab","2580737":"Cobblestone Slab","2580738":"Cobblestone Slab","2627584":"Fake Wooden Slab","2627585":"Fake Wooden Slab","2627586":"Fake Wooden Slab","2652416":"Nether Brick Slab","2652417":"Nether Brick Slab","2652418":"Nether Brick Slab","2668800":"Quartz Slab","2668801":"Quartz Slab","2668802":"Quartz Slab","2675968":"Sandstone Slab","2675969":"Sandstone Slab","2675970":"Sandstone Slab","2680576":"Smooth Stone Slab","2680577":"Smooth Stone Slab","2680578":"Smooth Stone Slab","2687232":"Stone Brick Slab","2687233":"Stone Brick Slab","2687234":"Stone Brick Slab","2589952":"Dark Prismarine Slab","2589953":"Dark Prismarine Slab","2589954":"Dark Prismarine Slab","2649856":"Mossy Cobblestone Slab","2649857":"Mossy Cobblestone Slab","2649858":"Mossy Cobblestone Slab","2665472":"Prismarine Slab","2665473":"Prismarine Slab","2665474":"Prismarine Slab","2664960":"Prismarine Bricks Slab","2664961":"Prismarine Bricks Slab","2664962":"Prismarine Bricks Slab","2667776":"Purpur Slab","2667777":"Purpur Slab","2667778":"Purpur Slab","2670336":"Red Nether Brick Slab","2670337":"Red Nether Brick Slab","2670338":"Red Nether Brick Slab","2671872":"Red Sandstone Slab","2671873":"Red Sandstone Slab","2671874":"Red Sandstone Slab","2679808":"Smooth Sandstone Slab","2679809":"Smooth Sandstone Slab","2679810":"Smooth Sandstone Slab","2565120":"Andesite Slab","2565121":"Andesite Slab","2565122":"Andesite Slab","2592000":"Diorite Slab","2592001":"Diorite Slab","2592002":"Diorite Slab","2626304":"End Stone Brick Slab","2626305":"End Stone Brick Slab","2626306":"End Stone Brick Slab","2631424":"Granite Slab","2631425":"Granite Slab","2631426":"Granite Slab","2661632":"Polished Andesite Slab","2661633":"Polished Andesite Slab","2661634":"Polished Andesite Slab","2662400":"Polished Diorite Slab","2662401":"Polished Diorite Slab","2662402":"Polished Diorite Slab","2663168":"Polished Granite Slab","2663169":"Polished Granite Slab","2663170":"Polished Granite Slab","2679040":"Smooth Red Sandstone Slab","2679041":"Smooth Red Sandstone Slab","2679042":"Smooth Red Sandstone Slab","2584576":"Cut Red Sandstone Slab","2584577":"Cut Red Sandstone Slab","2584578":"Cut Red Sandstone Slab","2585088":"Cut Sandstone Slab","2585089":"Cut Sandstone Slab","2585090":"Cut Sandstone Slab","2650624":"Mossy Stone Brick Slab","2650625":"Mossy Stone Brick Slab","2650626":"Mossy Stone Brick Slab","2678272":"Smooth Quartz Slab","2678273":"Smooth Quartz Slab","2678274":"Smooth Quartz Slab","2688768":"Stone Slab","2688769":"Stone Slab","2688770":"Stone Slab","2645248":"Legacy Stonecutter","2692608":"Sugarcane","2692609":"Sugarcane","2692610":"Sugarcane","2692611":"Sugarcane","2692612":"Sugarcane","2692613":"Sugarcane","2692614":"Sugarcane","2692615":"Sugarcane","2692616":"Sugarcane","2692617":"Sugarcane","2692618":"Sugarcane","2692619":"Sugarcane","2692620":"Sugarcane","2692621":"Sugarcane","2692622":"Sugarcane","2692623":"Sugarcane","2693120":"Sweet Berry Bush","2693121":"Sweet Berry Bush","2693122":"Sweet Berry Bush","2693123":"Sweet Berry Bush","2693632":"TNT","2693633":"TNT","2693634":"TNT","2693635":"TNT","2628096":"Fern","2693376":"Tall Grass","2574081":"Blue Torch","2574082":"Blue Torch","2574083":"Blue Torch","2574084":"Blue Torch","2574085":"Blue Torch","2667009":"Purple Torch","2667010":"Purple Torch","2667011":"Purple Torch","2667012":"Purple Torch","2667013":"Purple Torch","2672641":"Red Torch","2672642":"Red Torch","2672643":"Red Torch","2672644":"Red Torch","2672645":"Red Torch","2633473":"Green Torch","2633474":"Green Torch","2633475":"Green Torch","2633476":"Green Torch","2633477":"Green Torch","2693889":"Torch","2693890":"Torch","2693891":"Torch","2693892":"Torch","2693893":"Torch","2694144":"Trapped Chest","2694145":"Trapped Chest","2694146":"Trapped Chest","2694147":"Trapped Chest","2694400":"Tripwire","2694401":"Tripwire","2694402":"Tripwire","2694403":"Tripwire","2694404":"Tripwire","2694405":"Tripwire","2694406":"Tripwire","2694407":"Tripwire","2694408":"Tripwire","2694409":"Tripwire","2694410":"Tripwire","2694411":"Tripwire","2694412":"Tripwire","2694413":"Tripwire","2694414":"Tripwire","2694415":"Tripwire","2694656":"Tripwire Hook","2694657":"Tripwire Hook","2694658":"Tripwire Hook","2694659":"Tripwire Hook","2694660":"Tripwire Hook","2694661":"Tripwire Hook","2694662":"Tripwire Hook","2694663":"Tripwire Hook","2694664":"Tripwire Hook","2694665":"Tripwire Hook","2694666":"Tripwire Hook","2694667":"Tripwire Hook","2694668":"Tripwire Hook","2694669":"Tripwire Hook","2694670":"Tripwire Hook","2694671":"Tripwire Hook","2694913":"Underwater Torch","2694914":"Underwater Torch","2694915":"Underwater Torch","2694916":"Underwater Torch","2694917":"Underwater Torch","2695168":"Vines","2695169":"Vines","2695170":"Vines","2695171":"Vines","2695172":"Vines","2695173":"Vines","2695174":"Vines","2695175":"Vines","2695176":"Vines","2695177":"Vines","2695178":"Vines","2695179":"Vines","2695180":"Vines","2695181":"Vines","2695182":"Vines","2695183":"Vines","2695936":"Water","2695937":"Water","2695938":"Water","2695939":"Water","2695940":"Water","2695941":"Water","2695942":"Water","2695943":"Water","2695944":"Water","2695945":"Water","2695946":"Water","2695947":"Water","2695948":"Water","2695949":"Water","2695950":"Water","2695951":"Water","2695952":"Water","2695953":"Water","2695954":"Water","2695955":"Water","2695956":"Water","2695957":"Water","2695958":"Water","2695959":"Water","2695960":"Water","2695961":"Water","2695962":"Water","2695963":"Water","2695964":"Water","2695965":"Water","2695966":"Water","2695967":"Water","2646784":"Lily Pad","2696192":"Weighted Pressure Plate Heavy","2696193":"Weighted Pressure Plate Heavy","2696194":"Weighted Pressure Plate Heavy","2696195":"Weighted Pressure Plate Heavy","2696196":"Weighted Pressure Plate Heavy","2696197":"Weighted Pressure Plate Heavy","2696198":"Weighted Pressure Plate Heavy","2696199":"Weighted Pressure Plate Heavy","2696200":"Weighted Pressure Plate Heavy","2696201":"Weighted Pressure Plate Heavy","2696202":"Weighted Pressure Plate Heavy","2696203":"Weighted Pressure Plate Heavy","2696204":"Weighted Pressure Plate Heavy","2696205":"Weighted Pressure Plate Heavy","2696206":"Weighted Pressure Plate Heavy","2696207":"Weighted Pressure Plate Heavy","2696448":"Weighted Pressure Plate Light","2696449":"Weighted Pressure Plate Light","2696450":"Weighted Pressure Plate Light","2696451":"Weighted Pressure Plate Light","2696452":"Weighted Pressure Plate Light","2696453":"Weighted Pressure Plate Light","2696454":"Weighted Pressure Plate Light","2696455":"Weighted Pressure Plate Light","2696456":"Weighted Pressure Plate Light","2696457":"Weighted Pressure Plate Light","2696458":"Weighted Pressure Plate Light","2696459":"Weighted Pressure Plate Light","2696460":"Weighted Pressure Plate Light","2696461":"Weighted Pressure Plate Light","2696462":"Weighted Pressure Plate Light","2696463":"Weighted Pressure Plate Light","2696704":"Wheat Block","2696705":"Wheat Block","2696706":"Wheat Block","2696707":"Wheat Block","2696708":"Wheat Block","2696709":"Wheat Block","2696710":"Wheat Block","2696711":"Wheat Block","2656768":"Oak Planks","2657280":"Oak Sapling","2657281":"Oak Sapling","2655744":"Oak Fence","2657792":"Oak Slab","2657793":"Oak Slab","2657794":"Oak Slab","2656256":"Oak Leaves","2656257":"Oak Leaves","2656258":"Oak Leaves","2656259":"Oak Leaves","2656512":"Oak Log","2656513":"Oak Log","2656514":"Oak Log","2691584":"Stripped Oak Log","2691585":"Stripped Oak Log","2691586":"Stripped Oak Log","2658816":"Oak Wood","2691840":"Stripped Oak Wood","2656000":"Oak Fence Gate","2656001":"Oak Fence Gate","2656002":"Oak Fence Gate","2656003":"Oak Fence Gate","2656004":"Oak Fence Gate","2656005":"Oak Fence Gate","2656006":"Oak Fence Gate","2656007":"Oak Fence Gate","2656008":"Oak Fence Gate","2656009":"Oak Fence Gate","2656010":"Oak Fence Gate","2656011":"Oak Fence Gate","2656012":"Oak Fence Gate","2656013":"Oak Fence Gate","2656014":"Oak Fence Gate","2656015":"Oak Fence Gate","2658048":"Oak Stairs","2658049":"Oak Stairs","2658050":"Oak Stairs","2658051":"Oak Stairs","2658052":"Oak Stairs","2658053":"Oak Stairs","2658054":"Oak Stairs","2658055":"Oak Stairs","2655488":"Oak Door","2655489":"Oak Door","2655490":"Oak Door","2655491":"Oak Door","2655492":"Oak Door","2655493":"Oak Door","2655494":"Oak Door","2655495":"Oak Door","2655496":"Oak Door","2655497":"Oak Door","2655498":"Oak Door","2655499":"Oak Door","2655500":"Oak Door","2655501":"Oak Door","2655502":"Oak Door","2655503":"Oak Door","2655504":"Oak Door","2655505":"Oak Door","2655506":"Oak Door","2655507":"Oak Door","2655508":"Oak Door","2655509":"Oak Door","2655510":"Oak Door","2655511":"Oak Door","2655512":"Oak Door","2655513":"Oak Door","2655514":"Oak Door","2655515":"Oak Door","2655516":"Oak Door","2655517":"Oak Door","2655518":"Oak Door","2655519":"Oak Door","2655232":"Oak Button","2655233":"Oak Button","2655234":"Oak Button","2655235":"Oak Button","2655236":"Oak Button","2655237":"Oak Button","2655240":"Oak Button","2655241":"Oak Button","2655242":"Oak Button","2655243":"Oak Button","2655244":"Oak Button","2655245":"Oak Button","2657024":"Oak Pressure Plate","2657025":"Oak Pressure Plate","2658304":"Oak Trapdoor","2658305":"Oak Trapdoor","2658306":"Oak Trapdoor","2658307":"Oak Trapdoor","2658308":"Oak Trapdoor","2658309":"Oak Trapdoor","2658310":"Oak Trapdoor","2658311":"Oak Trapdoor","2658312":"Oak Trapdoor","2658313":"Oak Trapdoor","2658314":"Oak Trapdoor","2658315":"Oak Trapdoor","2658316":"Oak Trapdoor","2658317":"Oak Trapdoor","2658318":"Oak Trapdoor","2658319":"Oak Trapdoor","2657536":"Oak Sign","2657537":"Oak Sign","2657538":"Oak Sign","2657539":"Oak Sign","2657540":"Oak Sign","2657541":"Oak Sign","2657542":"Oak Sign","2657543":"Oak Sign","2657544":"Oak Sign","2657545":"Oak Sign","2657546":"Oak Sign","2657547":"Oak Sign","2657548":"Oak Sign","2657549":"Oak Sign","2657550":"Oak Sign","2657551":"Oak Sign","2658560":"Oak Wall Sign","2658561":"Oak Wall Sign","2658562":"Oak Wall Sign","2658563":"Oak Wall Sign","2683392":"Spruce Planks","2683904":"Spruce Sapling","2683905":"Spruce Sapling","2682368":"Spruce Fence","2684416":"Spruce Slab","2684417":"Spruce Slab","2684418":"Spruce Slab","2682880":"Spruce Leaves","2682881":"Spruce Leaves","2682882":"Spruce Leaves","2682883":"Spruce Leaves","2683136":"Spruce Log","2683137":"Spruce Log","2683138":"Spruce Log","2692096":"Stripped Spruce Log","2692097":"Stripped Spruce Log","2692098":"Stripped Spruce Log","2685440":"Spruce Wood","2692352":"Stripped Spruce Wood","2682624":"Spruce Fence Gate","2682625":"Spruce Fence Gate","2682626":"Spruce Fence Gate","2682627":"Spruce Fence Gate","2682628":"Spruce Fence Gate","2682629":"Spruce Fence Gate","2682630":"Spruce Fence Gate","2682631":"Spruce Fence Gate","2682632":"Spruce Fence Gate","2682633":"Spruce Fence Gate","2682634":"Spruce Fence Gate","2682635":"Spruce Fence Gate","2682636":"Spruce Fence Gate","2682637":"Spruce Fence Gate","2682638":"Spruce Fence Gate","2682639":"Spruce Fence Gate","2684672":"Spruce Stairs","2684673":"Spruce Stairs","2684674":"Spruce Stairs","2684675":"Spruce Stairs","2684676":"Spruce Stairs","2684677":"Spruce Stairs","2684678":"Spruce Stairs","2684679":"Spruce Stairs","2682112":"Spruce Door","2682113":"Spruce Door","2682114":"Spruce Door","2682115":"Spruce Door","2682116":"Spruce Door","2682117":"Spruce Door","2682118":"Spruce Door","2682119":"Spruce Door","2682120":"Spruce Door","2682121":"Spruce Door","2682122":"Spruce Door","2682123":"Spruce Door","2682124":"Spruce Door","2682125":"Spruce Door","2682126":"Spruce Door","2682127":"Spruce Door","2682128":"Spruce Door","2682129":"Spruce Door","2682130":"Spruce Door","2682131":"Spruce Door","2682132":"Spruce Door","2682133":"Spruce Door","2682134":"Spruce Door","2682135":"Spruce Door","2682136":"Spruce Door","2682137":"Spruce Door","2682138":"Spruce Door","2682139":"Spruce Door","2682140":"Spruce Door","2682141":"Spruce Door","2682142":"Spruce Door","2682143":"Spruce Door","2681856":"Spruce Button","2681857":"Spruce Button","2681858":"Spruce Button","2681859":"Spruce Button","2681860":"Spruce Button","2681861":"Spruce Button","2681864":"Spruce Button","2681865":"Spruce Button","2681866":"Spruce Button","2681867":"Spruce Button","2681868":"Spruce Button","2681869":"Spruce Button","2683648":"Spruce Pressure Plate","2683649":"Spruce Pressure Plate","2684928":"Spruce Trapdoor","2684929":"Spruce Trapdoor","2684930":"Spruce Trapdoor","2684931":"Spruce Trapdoor","2684932":"Spruce Trapdoor","2684933":"Spruce Trapdoor","2684934":"Spruce Trapdoor","2684935":"Spruce Trapdoor","2684936":"Spruce Trapdoor","2684937":"Spruce Trapdoor","2684938":"Spruce Trapdoor","2684939":"Spruce Trapdoor","2684940":"Spruce Trapdoor","2684941":"Spruce Trapdoor","2684942":"Spruce Trapdoor","2684943":"Spruce Trapdoor","2684160":"Spruce Sign","2684161":"Spruce Sign","2684162":"Spruce Sign","2684163":"Spruce Sign","2684164":"Spruce Sign","2684165":"Spruce Sign","2684166":"Spruce Sign","2684167":"Spruce Sign","2684168":"Spruce Sign","2684169":"Spruce Sign","2684170":"Spruce Sign","2684171":"Spruce Sign","2684172":"Spruce Sign","2684173":"Spruce Sign","2684174":"Spruce Sign","2684175":"Spruce Sign","2685184":"Spruce Wall Sign","2685185":"Spruce Wall Sign","2685186":"Spruce Wall Sign","2685187":"Spruce Wall Sign","2570496":"Birch Planks","2571008":"Birch Sapling","2571009":"Birch Sapling","2569472":"Birch Fence","2571520":"Birch Slab","2571521":"Birch Slab","2571522":"Birch Slab","2569984":"Birch Leaves","2569985":"Birch Leaves","2569986":"Birch Leaves","2569987":"Birch Leaves","2570240":"Birch Log","2570241":"Birch Log","2570242":"Birch Log","2690048":"Stripped Birch Log","2690049":"Stripped Birch Log","2690050":"Stripped Birch Log","2572544":"Birch Wood","2690304":"Stripped Birch Wood","2569728":"Birch Fence Gate","2569729":"Birch Fence Gate","2569730":"Birch Fence Gate","2569731":"Birch Fence Gate","2569732":"Birch Fence Gate","2569733":"Birch Fence Gate","2569734":"Birch Fence Gate","2569735":"Birch Fence Gate","2569736":"Birch Fence Gate","2569737":"Birch Fence Gate","2569738":"Birch Fence Gate","2569739":"Birch Fence Gate","2569740":"Birch Fence Gate","2569741":"Birch Fence Gate","2569742":"Birch Fence Gate","2569743":"Birch Fence Gate","2571776":"Birch Stairs","2571777":"Birch Stairs","2571778":"Birch Stairs","2571779":"Birch Stairs","2571780":"Birch Stairs","2571781":"Birch Stairs","2571782":"Birch Stairs","2571783":"Birch Stairs","2569216":"Birch Door","2569217":"Birch Door","2569218":"Birch Door","2569219":"Birch Door","2569220":"Birch Door","2569221":"Birch Door","2569222":"Birch Door","2569223":"Birch Door","2569224":"Birch Door","2569225":"Birch Door","2569226":"Birch Door","2569227":"Birch Door","2569228":"Birch Door","2569229":"Birch Door","2569230":"Birch Door","2569231":"Birch Door","2569232":"Birch Door","2569233":"Birch Door","2569234":"Birch Door","2569235":"Birch Door","2569236":"Birch Door","2569237":"Birch Door","2569238":"Birch Door","2569239":"Birch Door","2569240":"Birch Door","2569241":"Birch Door","2569242":"Birch Door","2569243":"Birch Door","2569244":"Birch Door","2569245":"Birch Door","2569246":"Birch Door","2569247":"Birch Door","2568960":"Birch Button","2568961":"Birch Button","2568962":"Birch Button","2568963":"Birch Button","2568964":"Birch Button","2568965":"Birch Button","2568968":"Birch Button","2568969":"Birch Button","2568970":"Birch Button","2568971":"Birch Button","2568972":"Birch Button","2568973":"Birch Button","2570752":"Birch Pressure Plate","2570753":"Birch Pressure Plate","2572032":"Birch Trapdoor","2572033":"Birch Trapdoor","2572034":"Birch Trapdoor","2572035":"Birch Trapdoor","2572036":"Birch Trapdoor","2572037":"Birch Trapdoor","2572038":"Birch Trapdoor","2572039":"Birch Trapdoor","2572040":"Birch Trapdoor","2572041":"Birch Trapdoor","2572042":"Birch Trapdoor","2572043":"Birch Trapdoor","2572044":"Birch Trapdoor","2572045":"Birch Trapdoor","2572046":"Birch Trapdoor","2572047":"Birch Trapdoor","2571264":"Birch Sign","2571265":"Birch Sign","2571266":"Birch Sign","2571267":"Birch Sign","2571268":"Birch Sign","2571269":"Birch Sign","2571270":"Birch Sign","2571271":"Birch Sign","2571272":"Birch Sign","2571273":"Birch Sign","2571274":"Birch Sign","2571275":"Birch Sign","2571276":"Birch Sign","2571277":"Birch Sign","2571278":"Birch Sign","2571279":"Birch Sign","2572288":"Birch Wall Sign","2572289":"Birch Wall Sign","2572290":"Birch Wall Sign","2572291":"Birch Wall Sign","2640896":"Jungle Planks","2641408":"Jungle Sapling","2641409":"Jungle Sapling","2639872":"Jungle Fence","2641920":"Jungle Slab","2641921":"Jungle Slab","2641922":"Jungle Slab","2640384":"Jungle Leaves","2640385":"Jungle Leaves","2640386":"Jungle Leaves","2640387":"Jungle Leaves","2640640":"Jungle Log","2640641":"Jungle Log","2640642":"Jungle Log","2691072":"Stripped Jungle Log","2691073":"Stripped Jungle Log","2691074":"Stripped Jungle Log","2642944":"Jungle Wood","2691328":"Stripped Jungle Wood","2640128":"Jungle Fence Gate","2640129":"Jungle Fence Gate","2640130":"Jungle Fence Gate","2640131":"Jungle Fence Gate","2640132":"Jungle Fence Gate","2640133":"Jungle Fence Gate","2640134":"Jungle Fence Gate","2640135":"Jungle Fence Gate","2640136":"Jungle Fence Gate","2640137":"Jungle Fence Gate","2640138":"Jungle Fence Gate","2640139":"Jungle Fence Gate","2640140":"Jungle Fence Gate","2640141":"Jungle Fence Gate","2640142":"Jungle Fence Gate","2640143":"Jungle Fence Gate","2642176":"Jungle Stairs","2642177":"Jungle Stairs","2642178":"Jungle Stairs","2642179":"Jungle Stairs","2642180":"Jungle Stairs","2642181":"Jungle Stairs","2642182":"Jungle Stairs","2642183":"Jungle Stairs","2639616":"Jungle Door","2639617":"Jungle Door","2639618":"Jungle Door","2639619":"Jungle Door","2639620":"Jungle Door","2639621":"Jungle Door","2639622":"Jungle Door","2639623":"Jungle Door","2639624":"Jungle Door","2639625":"Jungle Door","2639626":"Jungle Door","2639627":"Jungle Door","2639628":"Jungle Door","2639629":"Jungle Door","2639630":"Jungle Door","2639631":"Jungle Door","2639632":"Jungle Door","2639633":"Jungle Door","2639634":"Jungle Door","2639635":"Jungle Door","2639636":"Jungle Door","2639637":"Jungle Door","2639638":"Jungle Door","2639639":"Jungle Door","2639640":"Jungle Door","2639641":"Jungle Door","2639642":"Jungle Door","2639643":"Jungle Door","2639644":"Jungle Door","2639645":"Jungle Door","2639646":"Jungle Door","2639647":"Jungle Door","2639360":"Jungle Button","2639361":"Jungle Button","2639362":"Jungle Button","2639363":"Jungle Button","2639364":"Jungle Button","2639365":"Jungle Button","2639368":"Jungle Button","2639369":"Jungle Button","2639370":"Jungle Button","2639371":"Jungle Button","2639372":"Jungle Button","2639373":"Jungle Button","2641152":"Jungle Pressure Plate","2641153":"Jungle Pressure Plate","2642432":"Jungle Trapdoor","2642433":"Jungle Trapdoor","2642434":"Jungle Trapdoor","2642435":"Jungle Trapdoor","2642436":"Jungle Trapdoor","2642437":"Jungle Trapdoor","2642438":"Jungle Trapdoor","2642439":"Jungle Trapdoor","2642440":"Jungle Trapdoor","2642441":"Jungle Trapdoor","2642442":"Jungle Trapdoor","2642443":"Jungle Trapdoor","2642444":"Jungle Trapdoor","2642445":"Jungle Trapdoor","2642446":"Jungle Trapdoor","2642447":"Jungle Trapdoor","2641664":"Jungle Sign","2641665":"Jungle Sign","2641666":"Jungle Sign","2641667":"Jungle Sign","2641668":"Jungle Sign","2641669":"Jungle Sign","2641670":"Jungle Sign","2641671":"Jungle Sign","2641672":"Jungle Sign","2641673":"Jungle Sign","2641674":"Jungle Sign","2641675":"Jungle Sign","2641676":"Jungle Sign","2641677":"Jungle Sign","2641678":"Jungle Sign","2641679":"Jungle Sign","2642688":"Jungle Wall Sign","2642689":"Jungle Wall Sign","2642690":"Jungle Wall Sign","2642691":"Jungle Wall Sign","2561792":"Acacia Planks","2562304":"Acacia Sapling","2562305":"Acacia Sapling","2560768":"Acacia Fence","2562816":"Acacia Slab","2562817":"Acacia Slab","2562818":"Acacia Slab","2561280":"Acacia Leaves","2561281":"Acacia Leaves","2561282":"Acacia Leaves","2561283":"Acacia Leaves","2561536":"Acacia Log","2561537":"Acacia Log","2561538":"Acacia Log","2689536":"Stripped Acacia Log","2689537":"Stripped Acacia Log","2689538":"Stripped Acacia Log","2563840":"Acacia Wood","2689792":"Stripped Acacia Wood","2561024":"Acacia Fence Gate","2561025":"Acacia Fence Gate","2561026":"Acacia Fence Gate","2561027":"Acacia Fence Gate","2561028":"Acacia Fence Gate","2561029":"Acacia Fence Gate","2561030":"Acacia Fence Gate","2561031":"Acacia Fence Gate","2561032":"Acacia Fence Gate","2561033":"Acacia Fence Gate","2561034":"Acacia Fence Gate","2561035":"Acacia Fence Gate","2561036":"Acacia Fence Gate","2561037":"Acacia Fence Gate","2561038":"Acacia Fence Gate","2561039":"Acacia Fence Gate","2563072":"Acacia Stairs","2563073":"Acacia Stairs","2563074":"Acacia Stairs","2563075":"Acacia Stairs","2563076":"Acacia Stairs","2563077":"Acacia Stairs","2563078":"Acacia Stairs","2563079":"Acacia Stairs","2560512":"Acacia Door","2560513":"Acacia Door","2560514":"Acacia Door","2560515":"Acacia Door","2560516":"Acacia Door","2560517":"Acacia Door","2560518":"Acacia Door","2560519":"Acacia Door","2560520":"Acacia Door","2560521":"Acacia Door","2560522":"Acacia Door","2560523":"Acacia Door","2560524":"Acacia Door","2560525":"Acacia Door","2560526":"Acacia Door","2560527":"Acacia Door","2560528":"Acacia Door","2560529":"Acacia Door","2560530":"Acacia Door","2560531":"Acacia Door","2560532":"Acacia Door","2560533":"Acacia Door","2560534":"Acacia Door","2560535":"Acacia Door","2560536":"Acacia Door","2560537":"Acacia Door","2560538":"Acacia Door","2560539":"Acacia Door","2560540":"Acacia Door","2560541":"Acacia Door","2560542":"Acacia Door","2560543":"Acacia Door","2560256":"Acacia Button","2560257":"Acacia Button","2560258":"Acacia Button","2560259":"Acacia Button","2560260":"Acacia Button","2560261":"Acacia Button","2560264":"Acacia Button","2560265":"Acacia Button","2560266":"Acacia Button","2560267":"Acacia Button","2560268":"Acacia Button","2560269":"Acacia Button","2562048":"Acacia Pressure Plate","2562049":"Acacia Pressure Plate","2563328":"Acacia Trapdoor","2563329":"Acacia Trapdoor","2563330":"Acacia Trapdoor","2563331":"Acacia Trapdoor","2563332":"Acacia Trapdoor","2563333":"Acacia Trapdoor","2563334":"Acacia Trapdoor","2563335":"Acacia Trapdoor","2563336":"Acacia Trapdoor","2563337":"Acacia Trapdoor","2563338":"Acacia Trapdoor","2563339":"Acacia Trapdoor","2563340":"Acacia Trapdoor","2563341":"Acacia Trapdoor","2563342":"Acacia Trapdoor","2563343":"Acacia Trapdoor","2562560":"Acacia Sign","2562561":"Acacia Sign","2562562":"Acacia Sign","2562563":"Acacia Sign","2562564":"Acacia Sign","2562565":"Acacia Sign","2562566":"Acacia Sign","2562567":"Acacia Sign","2562568":"Acacia Sign","2562569":"Acacia Sign","2562570":"Acacia Sign","2562571":"Acacia Sign","2562572":"Acacia Sign","2562573":"Acacia Sign","2562574":"Acacia Sign","2562575":"Acacia Sign","2563584":"Acacia Wall Sign","2563585":"Acacia Wall Sign","2563586":"Acacia Wall Sign","2563587":"Acacia Wall Sign","2587392":"Dark Oak Planks","2587904":"Dark Oak Sapling","2587905":"Dark Oak Sapling","2586368":"Dark Oak Fence","2588416":"Dark Oak Slab","2588417":"Dark Oak Slab","2588418":"Dark Oak Slab","2586880":"Dark Oak Leaves","2586881":"Dark Oak Leaves","2586882":"Dark Oak Leaves","2586883":"Dark Oak Leaves","2587136":"Dark Oak Log","2587137":"Dark Oak Log","2587138":"Dark Oak Log","2690560":"Stripped Dark Oak Log","2690561":"Stripped Dark Oak Log","2690562":"Stripped Dark Oak Log","2589440":"Dark Oak Wood","2690816":"Stripped Dark Oak Wood","2586624":"Dark Oak Fence Gate","2586625":"Dark Oak Fence Gate","2586626":"Dark Oak Fence Gate","2586627":"Dark Oak Fence Gate","2586628":"Dark Oak Fence Gate","2586629":"Dark Oak Fence Gate","2586630":"Dark Oak Fence Gate","2586631":"Dark Oak Fence Gate","2586632":"Dark Oak Fence Gate","2586633":"Dark Oak Fence Gate","2586634":"Dark Oak Fence Gate","2586635":"Dark Oak Fence Gate","2586636":"Dark Oak Fence Gate","2586637":"Dark Oak Fence Gate","2586638":"Dark Oak Fence Gate","2586639":"Dark Oak Fence Gate","2588672":"Dark Oak Stairs","2588673":"Dark Oak Stairs","2588674":"Dark Oak Stairs","2588675":"Dark Oak Stairs","2588676":"Dark Oak Stairs","2588677":"Dark Oak Stairs","2588678":"Dark Oak Stairs","2588679":"Dark Oak Stairs","2586112":"Dark Oak Door","2586113":"Dark Oak Door","2586114":"Dark Oak Door","2586115":"Dark Oak Door","2586116":"Dark Oak Door","2586117":"Dark Oak Door","2586118":"Dark Oak Door","2586119":"Dark Oak Door","2586120":"Dark Oak Door","2586121":"Dark Oak Door","2586122":"Dark Oak Door","2586123":"Dark Oak Door","2586124":"Dark Oak Door","2586125":"Dark Oak Door","2586126":"Dark Oak Door","2586127":"Dark Oak Door","2586128":"Dark Oak Door","2586129":"Dark Oak Door","2586130":"Dark Oak Door","2586131":"Dark Oak Door","2586132":"Dark Oak Door","2586133":"Dark Oak Door","2586134":"Dark Oak Door","2586135":"Dark Oak Door","2586136":"Dark Oak Door","2586137":"Dark Oak Door","2586138":"Dark Oak Door","2586139":"Dark Oak Door","2586140":"Dark Oak Door","2586141":"Dark Oak Door","2586142":"Dark Oak Door","2586143":"Dark Oak Door","2585856":"Dark Oak Button","2585857":"Dark Oak Button","2585858":"Dark Oak Button","2585859":"Dark Oak Button","2585860":"Dark Oak Button","2585861":"Dark Oak Button","2585864":"Dark Oak Button","2585865":"Dark Oak Button","2585866":"Dark Oak Button","2585867":"Dark Oak Button","2585868":"Dark Oak Button","2585869":"Dark Oak Button","2587648":"Dark Oak Pressure Plate","2587649":"Dark Oak Pressure Plate","2588928":"Dark Oak Trapdoor","2588929":"Dark Oak Trapdoor","2588930":"Dark Oak Trapdoor","2588931":"Dark Oak Trapdoor","2588932":"Dark Oak Trapdoor","2588933":"Dark Oak Trapdoor","2588934":"Dark Oak Trapdoor","2588935":"Dark Oak Trapdoor","2588936":"Dark Oak Trapdoor","2588937":"Dark Oak Trapdoor","2588938":"Dark Oak Trapdoor","2588939":"Dark Oak Trapdoor","2588940":"Dark Oak Trapdoor","2588941":"Dark Oak Trapdoor","2588942":"Dark Oak Trapdoor","2588943":"Dark Oak Trapdoor","2588160":"Dark Oak Sign","2588161":"Dark Oak Sign","2588162":"Dark Oak Sign","2588163":"Dark Oak Sign","2588164":"Dark Oak Sign","2588165":"Dark Oak Sign","2588166":"Dark Oak Sign","2588167":"Dark Oak Sign","2588168":"Dark Oak Sign","2588169":"Dark Oak Sign","2588170":"Dark Oak Sign","2588171":"Dark Oak Sign","2588172":"Dark Oak Sign","2588173":"Dark Oak Sign","2588174":"Dark Oak Sign","2588175":"Dark Oak Sign","2589184":"Dark Oak Wall Sign","2589185":"Dark Oak Wall Sign","2589186":"Dark Oak Wall Sign","2589187":"Dark Oak Wall Sign","2672128":"Red Sandstone Stairs","2672129":"Red Sandstone Stairs","2672130":"Red Sandstone Stairs","2672131":"Red Sandstone Stairs","2672132":"Red Sandstone Stairs","2672133":"Red Sandstone Stairs","2672134":"Red Sandstone Stairs","2672135":"Red Sandstone Stairs","2679296":"Smooth Red Sandstone Stairs","2679297":"Smooth Red Sandstone Stairs","2679298":"Smooth Red Sandstone Stairs","2679299":"Smooth Red Sandstone Stairs","2679300":"Smooth Red Sandstone Stairs","2679301":"Smooth Red Sandstone Stairs","2679302":"Smooth Red Sandstone Stairs","2679303":"Smooth Red Sandstone Stairs","2671616":"Red Sandstone","2578944":"Chiseled Red Sandstone","2584320":"Cut Red Sandstone","2678784":"Smooth Red Sandstone","2676224":"Sandstone Stairs","2676225":"Sandstone Stairs","2676226":"Sandstone Stairs","2676227":"Sandstone Stairs","2676228":"Sandstone Stairs","2676229":"Sandstone Stairs","2676230":"Sandstone Stairs","2676231":"Sandstone Stairs","2680064":"Smooth Sandstone Stairs","2680065":"Smooth Sandstone Stairs","2680066":"Smooth Sandstone Stairs","2680067":"Smooth Sandstone Stairs","2680068":"Smooth Sandstone Stairs","2680069":"Smooth Sandstone Stairs","2680070":"Smooth Sandstone Stairs","2680071":"Smooth Sandstone Stairs","2675712":"Sandstone","2579200":"Chiseled Sandstone","2584832":"Cut Sandstone","2679552":"Smooth Sandstone","2696960":"White Glazed Terracotta","2696961":"White Glazed Terracotta","2696962":"White Glazed Terracotta","2696963":"White Glazed Terracotta","2659328":"Orange Glazed Terracotta","2659329":"Orange Glazed Terracotta","2659330":"Orange Glazed Terracotta","2659331":"Orange Glazed Terracotta","2647808":"Magenta Glazed Terracotta","2647809":"Magenta Glazed Terracotta","2647810":"Magenta Glazed Terracotta","2647811":"Magenta Glazed Terracotta","2645760":"Light Blue Glazed Terracotta","2645761":"Light Blue Glazed Terracotta","2645762":"Light Blue Glazed Terracotta","2645763":"Light Blue Glazed Terracotta","2697728":"Yellow Glazed Terracotta","2697729":"Yellow Glazed Terracotta","2697730":"Yellow Glazed Terracotta","2697731":"Yellow Glazed Terracotta","2647040":"Lime Glazed Terracotta","2647041":"Lime Glazed Terracotta","2647042":"Lime Glazed Terracotta","2647043":"Lime Glazed Terracotta","2660608":"Pink Glazed Terracotta","2660609":"Pink Glazed Terracotta","2660610":"Pink Glazed Terracotta","2660611":"Pink Glazed Terracotta","2632960":"Gray Glazed Terracotta","2632961":"Gray Glazed Terracotta","2632962":"Gray Glazed Terracotta","2632963":"Gray Glazed Terracotta","2646016":"Light Gray Glazed Terracotta","2646017":"Light Gray Glazed Terracotta","2646018":"Light Gray Glazed Terracotta","2646019":"Light Gray Glazed Terracotta","2585344":"Cyan Glazed Terracotta","2585345":"Cyan Glazed Terracotta","2585346":"Cyan Glazed Terracotta","2585347":"Cyan Glazed Terracotta","2666752":"Purple Glazed Terracotta","2666753":"Purple Glazed Terracotta","2666754":"Purple Glazed Terracotta","2666755":"Purple Glazed Terracotta","2573312":"Blue Glazed Terracotta","2573313":"Blue Glazed Terracotta","2573314":"Blue Glazed Terracotta","2573315":"Blue Glazed Terracotta","2576128":"Brown Glazed Terracotta","2576129":"Brown Glazed Terracotta","2576130":"Brown Glazed Terracotta","2576131":"Brown Glazed Terracotta","2633216":"Green Glazed Terracotta","2633217":"Green Glazed Terracotta","2633218":"Green Glazed Terracotta","2633219":"Green Glazed Terracotta","2669568":"Red Glazed Terracotta","2669569":"Red Glazed Terracotta","2669570":"Red Glazed Terracotta","2669571":"Red Glazed Terracotta","2572800":"Black Glazed Terracotta","2572801":"Black Glazed Terracotta","2572802":"Black Glazed Terracotta","2572803":"Black Glazed Terracotta","2593792":"Dyed Shulker Box","2593793":"Dyed Shulker Box","2593794":"Dyed Shulker Box","2593795":"Dyed Shulker Box","2593796":"Dyed Shulker Box","2593797":"Dyed Shulker Box","2593798":"Dyed Shulker Box","2593799":"Dyed Shulker Box","2593800":"Dyed Shulker Box","2593801":"Dyed Shulker Box","2593802":"Dyed Shulker Box","2593803":"Dyed Shulker Box","2593804":"Dyed Shulker Box","2593805":"Dyed Shulker Box","2593806":"Dyed Shulker Box","2593807":"Dyed Shulker Box","2685952":"Stained Glass","2685953":"Stained Glass","2685954":"Stained Glass","2685955":"Stained Glass","2685956":"Stained Glass","2685957":"Stained Glass","2685958":"Stained Glass","2685959":"Stained Glass","2685960":"Stained Glass","2685961":"Stained Glass","2685962":"Stained Glass","2685963":"Stained Glass","2685964":"Stained Glass","2685965":"Stained Glass","2685966":"Stained Glass","2685967":"Stained Glass","2686208":"Stained Glass Pane","2686209":"Stained Glass Pane","2686210":"Stained Glass Pane","2686211":"Stained Glass Pane","2686212":"Stained Glass Pane","2686213":"Stained Glass Pane","2686214":"Stained Glass Pane","2686215":"Stained Glass Pane","2686216":"Stained Glass Pane","2686217":"Stained Glass Pane","2686218":"Stained Glass Pane","2686219":"Stained Glass Pane","2686220":"Stained Glass Pane","2686221":"Stained Glass Pane","2686222":"Stained Glass Pane","2686223":"Stained Glass Pane","2685696":"Stained Clay","2685697":"Stained Clay","2685698":"Stained Clay","2685699":"Stained Clay","2685700":"Stained Clay","2685701":"Stained Clay","2685702":"Stained Clay","2685703":"Stained Clay","2685704":"Stained Clay","2685705":"Stained Clay","2685706":"Stained Clay","2685707":"Stained Clay","2685708":"Stained Clay","2685709":"Stained Clay","2685710":"Stained Clay","2685711":"Stained Clay","2686464":"Stained Hardened Glass","2686465":"Stained Hardened Glass","2686466":"Stained Hardened Glass","2686467":"Stained Hardened Glass","2686468":"Stained Hardened Glass","2686469":"Stained Hardened Glass","2686470":"Stained Hardened Glass","2686471":"Stained Hardened Glass","2686472":"Stained Hardened Glass","2686473":"Stained Hardened Glass","2686474":"Stained Hardened Glass","2686475":"Stained Hardened Glass","2686476":"Stained Hardened Glass","2686477":"Stained Hardened Glass","2686478":"Stained Hardened Glass","2686479":"Stained Hardened Glass","2686720":"Stained Hardened Glass Pane","2686721":"Stained Hardened Glass Pane","2686722":"Stained Hardened Glass Pane","2686723":"Stained Hardened Glass Pane","2686724":"Stained Hardened Glass Pane","2686725":"Stained Hardened Glass Pane","2686726":"Stained Hardened Glass Pane","2686727":"Stained Hardened Glass Pane","2686728":"Stained Hardened Glass Pane","2686729":"Stained Hardened Glass Pane","2686730":"Stained Hardened Glass Pane","2686731":"Stained Hardened Glass Pane","2686732":"Stained Hardened Glass Pane","2686733":"Stained Hardened Glass Pane","2686734":"Stained Hardened Glass Pane","2686735":"Stained Hardened Glass Pane","2577408":"Carpet","2577409":"Carpet","2577410":"Carpet","2577411":"Carpet","2577412":"Carpet","2577413":"Carpet","2577414":"Carpet","2577415":"Carpet","2577416":"Carpet","2577417":"Carpet","2577418":"Carpet","2577419":"Carpet","2577420":"Carpet","2577421":"Carpet","2577422":"Carpet","2577423":"Carpet","2582272":"Concrete","2582273":"Concrete","2582274":"Concrete","2582275":"Concrete","2582276":"Concrete","2582277":"Concrete","2582278":"Concrete","2582279":"Concrete","2582280":"Concrete","2582281":"Concrete","2582282":"Concrete","2582283":"Concrete","2582284":"Concrete","2582285":"Concrete","2582286":"Concrete","2582287":"Concrete","2582528":"Concrete Powder","2582529":"Concrete Powder","2582530":"Concrete Powder","2582531":"Concrete Powder","2582532":"Concrete Powder","2582533":"Concrete Powder","2582534":"Concrete Powder","2582535":"Concrete Powder","2582536":"Concrete Powder","2582537":"Concrete Powder","2582538":"Concrete Powder","2582539":"Concrete Powder","2582540":"Concrete Powder","2582541":"Concrete Powder","2582542":"Concrete Powder","2582543":"Concrete Powder","2697472":"Wool","2697473":"Wool","2697474":"Wool","2697475":"Wool","2697476":"Wool","2697477":"Wool","2697478":"Wool","2697479":"Wool","2697480":"Wool","2697481":"Wool","2697482":"Wool","2697483":"Wool","2697484":"Wool","2697485":"Wool","2697486":"Wool","2697487":"Wool","2581248":"Cobblestone Wall","2565632":"Andesite Wall","2575616":"Brick Wall","2592512":"Diorite Wall","2626816":"End Stone Brick Wall","2631936":"Granite Wall","2651136":"Mossy Stone Brick Wall","2650368":"Mossy Cobblestone Wall","2652928":"Nether Brick Wall","2665984":"Prismarine Wall","2670848":"Red Nether Brick Wall","2672384":"Red Sandstone Wall","2676480":"Sandstone Wall","2687744":"Stone Brick Wall","2624000":"???","2605568":"Hydrogen","2605056":"Helium","2607872":"Lithium","2596352":"Beryllium","2597120":"Boron","2598400":"Carbon","2611968":"Nitrogen","2612992":"Oxygen","2603008":"Fluorine","2610688":"Neon","2619136":"Sodium","2608640":"Magnesium","2594304":"Aluminum","2618624":"Silicon","2613504":"Phosphorus","2619648":"Sulfur","2599168":"Chlorine","2595072":"Argon","2614528":"Potassium","2597888":"Calcium","2617856":"Scandium","2622208":"Titanium","2622976":"Vanadium","2599424":"Chromium","2608896":"Manganese","2606592":"Iron","2599680":"Cobalt","2611200":"Nickel","2600448":"Copper","2624256":"Zinc","2603776":"Gallium","2604032":"Germanium","2595328":"Arsenic","2618368":"Selenium","2597376":"Bromine","2606848":"Krypton","2616832":"Rubidium","2619392":"Strontium","2623744":"Yttrium","2624512":"Zirconium","2611712":"Niobium","2609920":"Molybdenum","2620160":"Technetium","2617088":"Ruthenium","2616320":"Rhodium","2613248":"Palladium","2618880":"Silver","2597632":"Cadmium","2605824":"Indium","2621952":"Tin","2594816":"Antimony","2620416":"Tellurium","2606080":"Iodine","2623232":"Xenon","2598912":"Cesium","2595840":"Barium","2607104":"Lanthanum","2598656":"Cerium","2614784":"Praseodymium","2610432":"Neodymium","2615040":"Promethium","2617600":"Samarium","2602240":"Europium","2603520":"Gadolinium","2620928":"Terbium","2601472":"Dysprosium","2605312":"Holmium","2601984":"Erbium","2621696":"Thulium","2623488":"Ytterbium","2608384":"Lutetium","2604544":"Hafnium","2619904":"Tantalum","2622464":"Tungsten","2616064":"Rhenium","2612736":"Osmium","2606336":"Iridium","2613760":"Platinum","2604288":"Gold","2609664":"Mercury","2621184":"Thallium","2607616":"Lead","2596608":"Bismuth","2614272":"Polonium","2595584":"Astatine","2615808":"Radon","2603264":"Francium","2615552":"Radium","2594048":"Actinium","2621440":"Thorium","2615296":"Protactinium","2622720":"Uranium","2610944":"Neptunium","2614016":"Plutonium","2594560":"Americium","2600704":"Curium","2596096":"Berkelium","2598144":"Californium","2601728":"Einsteinium","2602496":"Fermium","2609408":"Mendelevium","2612224":"Nobelium","2607360":"Lawrencium","2617344":"Rutherfordium","2601216":"Dubnium","2618112":"Seaborgium","2596864":"Bohrium","2604800":"Hassium","2609152":"Meitnerium","2600960":"Darmstadtium","2616576":"Roentgenium","2600192":"Copernicium","2611456":"Nihonium","2602752":"Flerovium","2610176":"Moscovium","2608128":"Livermorium","2620672":"Tennessine","2612480":"Oganesson","2582016":"Compound Creator","2582017":"Compound Creator","2582018":"Compound Creator","2582019":"Compound Creator","2599936":"Element Constructor","2599937":"Element Constructor","2599938":"Element Constructor","2599939":"Element Constructor","2643200":"Lab Table","2643201":"Lab Table","2643202":"Lab Table","2643203":"Lab Table","2648320":"Material Reducer","2648321":"Material Reducer","2648322":"Material Reducer","2648323":"Material Reducer","2578176":"Heat Block","2576640":"Brown Mushroom Block","2576641":"Brown Mushroom Block","2576642":"Brown Mushroom Block","2576643":"Brown Mushroom Block","2576644":"Brown Mushroom Block","2576645":"Brown Mushroom Block","2576646":"Brown Mushroom Block","2576647":"Brown Mushroom Block","2576648":"Brown Mushroom Block","2576649":"Brown Mushroom Block","2576650":"Brown Mushroom Block","2670080":"Red Mushroom Block","2670081":"Red Mushroom Block","2670082":"Red Mushroom Block","2670083":"Red Mushroom Block","2670084":"Red Mushroom Block","2670085":"Red Mushroom Block","2670086":"Red Mushroom Block","2670087":"Red Mushroom Block","2670088":"Red Mushroom Block","2670089":"Red Mushroom Block","2670090":"Red Mushroom Block","2651648":"Mushroom Stem","2564352":"All Sided Mushroom Stem","2582784":"Coral","2582785":"Coral","2582786":"Coral","2582787":"Coral","2582788":"Coral","2582792":"Coral","2582793":"Coral","2582794":"Coral","2582795":"Coral","2582796":"Coral","2583296":"Coral Fan","2583297":"Coral Fan","2583298":"Coral Fan","2583299":"Coral Fan","2583300":"Coral Fan","2583304":"Coral Fan","2583305":"Coral Fan","2583306":"Coral Fan","2583307":"Coral Fan","2583308":"Coral Fan","2583312":"Coral Fan","2583313":"Coral Fan","2583314":"Coral Fan","2583315":"Coral Fan","2583316":"Coral Fan","2583320":"Coral Fan","2583321":"Coral Fan","2583322":"Coral Fan","2583323":"Coral Fan","2583324":"Coral Fan","2695680":"Wall Coral Fan","2695681":"Wall Coral Fan","2695682":"Wall Coral Fan","2695683":"Wall Coral Fan","2695684":"Wall Coral Fan","2695688":"Wall Coral Fan","2695689":"Wall Coral Fan","2695690":"Wall Coral Fan","2695691":"Wall Coral Fan","2695692":"Wall Coral Fan","2695696":"Wall Coral Fan","2695697":"Wall Coral Fan","2695698":"Wall Coral Fan","2695699":"Wall Coral Fan","2695700":"Wall Coral Fan","2695704":"Wall Coral Fan","2695705":"Wall Coral Fan","2695706":"Wall Coral Fan","2695707":"Wall Coral Fan","2695708":"Wall Coral Fan","2695712":"Wall Coral Fan","2695713":"Wall Coral Fan","2695714":"Wall Coral Fan","2695715":"Wall Coral Fan","2695716":"Wall Coral Fan","2695720":"Wall Coral Fan","2695721":"Wall Coral Fan","2695722":"Wall Coral Fan","2695723":"Wall Coral Fan","2695724":"Wall Coral Fan","2695728":"Wall Coral Fan","2695729":"Wall Coral Fan","2695730":"Wall Coral Fan","2695731":"Wall Coral Fan","2695732":"Wall Coral Fan","2695736":"Wall Coral Fan","2695737":"Wall Coral Fan","2695738":"Wall Coral Fan","2695739":"Wall Coral Fan","2695740":"Wall Coral Fan"},"stateDataBits":8} \ No newline at end of file diff --git a/tests/phpunit/block/regenerate_consistency_check.php b/tests/phpunit/block/regenerate_consistency_check.php index 5e0e84ef6..edff9f792 100644 --- a/tests/phpunit/block/regenerate_consistency_check.php +++ b/tests/phpunit/block/regenerate_consistency_check.php @@ -22,7 +22,8 @@ declare(strict_types=1); use pocketmine\block\Block; -use pocketmine\block\UnknownBlock; +use pocketmine\block\BlockFactory; +use pocketmine\utils\AssumptionFailedError; require dirname(__DIR__, 3) . '/vendor/autoload.php'; @@ -31,53 +32,56 @@ require dirname(__DIR__, 3) . '/vendor/autoload.php'; $factory = new \pocketmine\block\BlockFactory(); $remaps = []; $new = []; -for($index = 0; $index < 1024 << Block::INTERNAL_METADATA_BITS; $index++){ - $block = $factory->fromFullBlock($index); - if($block instanceof UnknownBlock){ - continue; - } - if($block->getFullId() !== $index){ - $remaps[$index] = $block->getFullId(); - }else{ - $new[$index] = $block->getName(); - } -} -$oldTable = json_decode(file_get_contents(__DIR__ . '/block_factory_consistency_check.json'), true); -if(!is_array($oldTable)){ - throw new \pocketmine\utils\AssumptionFailedError("Old table should be array{knownStates: array, remaps: array}"); -} -$old = $oldTable["knownStates"]; -$oldRemaps = $oldTable["remaps"]; - -foreach($old as $k => $name){ - if(!isset($new[$k])){ - echo "Removed state for $name (" . ($k >> \pocketmine\block\Block::INTERNAL_METADATA_BITS) . ":" . ($k & \pocketmine\block\Block::INTERNAL_METADATA_MASK) . ")\n"; - } -} -foreach($new as $k => $name){ - if(!isset($old[$k])){ - echo "Added state for $name (" . ($k >> \pocketmine\block\Block::INTERNAL_METADATA_BITS) . ":" . ($k & \pocketmine\block\Block::INTERNAL_METADATA_MASK) . ")\n"; - }elseif($old[$k] !== $name){ - echo "Name changed (" . ($k >> \pocketmine\block\Block::INTERNAL_METADATA_BITS) . ":" . ($k & \pocketmine\block\Block::INTERNAL_METADATA_MASK) . "): " . $old[$k] . " -> " . $name . "\n"; +foreach(BlockFactory::getInstance()->getAllKnownStates() as $index => $block){ + if($index !== $block->getStateId()){ + throw new AssumptionFailedError("State index should always match state ID"); } + $new[$index] = $block->getName(); } -foreach($oldRemaps as $index => $mapped){ - if(!isset($remaps[$index])){ - echo "Removed remap of " . ($index >> 4) . ":" . ($index & 0xf) . "\n"; +$oldTablePath = __DIR__ . '/block_factory_consistency_check.json'; +if(file_exists($oldTablePath)){ + $oldTable = json_decode(file_get_contents($oldTablePath), true); + if(!is_array($oldTable)){ + throw new \pocketmine\utils\AssumptionFailedError("Old table should be array{knownStates: array, stateDataBits: int}"); } -} -foreach($remaps as $index => $mapped){ - if(!isset($oldRemaps[$index])){ - echo "New remap of " . ($index >> 4) . ":" . ($index & 0xf) . " (" . ($mapped >> 4) . ":" . ($mapped & 0xf) . ") (" . $new[$mapped] . ")\n"; - }elseif($oldRemaps[$index] !== $mapped){ - echo "Remap changed for " . ($index >> 4) . ":" . ($index & 0xf) . " (" . ($oldRemaps[$index] >> 4) . ":" . ($oldRemaps[$index] & 0xf) . " (" . $old[$oldRemaps[$index]] . ") -> " . ($mapped >> 4) . ":" . ($mapped & 0xf) . " (" . $new[$mapped] . "))\n"; + $old = $oldTable["knownStates"]; + $oldStateDataSize = $oldTable["stateDataBits"]; + $oldStateDataMask = ~(~0 << $oldStateDataSize); + + if($oldStateDataSize !== Block::INTERNAL_STATE_DATA_BITS){ + echo "State data bits changed from $oldStateDataSize to " . Block::INTERNAL_STATE_DATA_BITS . "\n"; } + + foreach($old as $k => $name){ + [$oldId, $oldStateData] = [$k >> $oldStateDataSize, $k & $oldStateDataMask]; + $reconstructedK = ($oldId << Block::INTERNAL_STATE_DATA_BITS) | $oldStateData; + if(!isset($new[$reconstructedK])){ + echo "Removed state for $name ($oldId:$oldStateData)\n"; + } + } + foreach($new as $k => $name){ + [$newId, $newStateData] = [$k >> Block::INTERNAL_STATE_DATA_BITS, $k & Block::INTERNAL_STATE_DATA_MASK]; + if($newStateData > $oldStateDataMask){ + echo "Added state for $name ($newId, $newStateData)\n"; + }else{ + $reconstructedK = ($newId << $oldStateDataSize) | $newStateData; + if(!isset($old[$reconstructedK])){ + echo "Added state for $name ($newId:$newStateData)\n"; + }elseif($old[$reconstructedK] !== $name){ + echo "Name changed ($newId:$newStateData) " . $old[$reconstructedK] . " -> " . $name . "\n"; + } + } + + } +}else{ + echo "WARNING: Unable to calculate diff, no previous consistency check file found\n"; } + file_put_contents(__DIR__ . '/block_factory_consistency_check.json', json_encode( [ "knownStates" => $new, - "remaps" => $remaps + "stateDataBits" => Block::INTERNAL_STATE_DATA_BITS ], JSON_THROW_ON_ERROR )); diff --git a/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php b/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php index 3d171bd04..33232f553 100644 --- a/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php +++ b/tests/phpunit/data/bedrock/block/convert/BlockSerializerDeserializerTest.php @@ -27,6 +27,7 @@ use PHPUnit\Framework\TestCase; use pocketmine\block\BlockFactory; use pocketmine\data\bedrock\block\BlockStateDeserializeException; use pocketmine\data\bedrock\block\BlockStateSerializeException; +use function print_r; final class BlockSerializerDeserializerTest extends TestCase{ private BlockStateToBlockObjectDeserializer $deserializer; @@ -50,7 +51,7 @@ final class BlockSerializerDeserializerTest extends TestCase{ self::fail($e->getMessage()); } - self::assertSame($block->getFullId(), $newBlock->getFullId(), "Mismatch of blockstate for " . $block->getName()); + self::assertSame($block->getStateId(), $newBlock->getStateId(), "Mismatch of blockstate for " . $block->getName() . ", " . print_r($block, true) . " vs " . print_r($newBlock, true)); } } } diff --git a/tests/phpunit/network/mcpe/convert/RuntimeBlockMappingTest.php b/tests/phpunit/network/mcpe/convert/RuntimeBlockMappingTest.php index f191670c0..581735503 100644 --- a/tests/phpunit/network/mcpe/convert/RuntimeBlockMappingTest.php +++ b/tests/phpunit/network/mcpe/convert/RuntimeBlockMappingTest.php @@ -33,7 +33,7 @@ class RuntimeBlockMappingTest extends TestCase{ */ public function testAllBlockStatesSerialize() : void{ foreach(BlockFactory::getInstance()->getAllKnownStates() as $state){ - RuntimeBlockMapping::getInstance()->toRuntimeId($state->getFullId()); + RuntimeBlockMapping::getInstance()->toRuntimeId($state->getStateId()); } } }