From f24f2d9ca9efec495a652bf8d440c06a465c93d2 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Fri, 24 Jun 2022 23:19:37 +0100 Subject: [PATCH] Hit block legacy metadata with the biggest nuke you've ever seen This commit completely revamps the way that blocks are represented in memory at runtime. Instead of being represented by legacy Mojang block IDs and metadata, which are dated, limited and unchangeable, we now use custom PM block IDs, which are generated from VanillaBlocks. This means we have full control of how they are assigned, which opens the doors to finally addressing inconsistencies like glazed terracotta, stripped logs handling, etc. To represent state, BlockDataReader and BlockDataWriter have been introduced, and are used by blocks with state information to pack said information into a binary form that can be stored on a chunk at runtime. Conceptually it's pretty similar to legacy metadata, but the actual format shares no resemblance whatsoever to legacy metadata, and is fully controlled by PM. This means that the 'state data' may change in serialization format at any time, so it should **NOT** be stored on disk or in a config. In the future, this will be improved using more auto-generated code and attributes, instead of hand-baked decodeState() and encodeState(). For now, this opens the gateway to a significant expansion of features. It's not ideal, but it's a big step forwards. --- src/block/Anvil.php | 26 +- src/block/Bamboo.php | 21 +- src/block/BambooSapling.php | 13 +- src/block/Barrel.php | 18 +- src/block/BaseBanner.php | 10 + src/block/Bed.php | 30 +- src/block/Bedrock.php | 16 +- src/block/Bell.php | 41 +- src/block/Block.php | 60 +- src/block/BlockFactory.php | 1085 +++++++---------- src/block/BoneBlock.php | 4 +- src/block/BrewingStand.php | 33 +- src/block/Button.php | 19 +- src/block/Cactus.php | 15 +- src/block/Cake.php | 15 +- src/block/Carpet.php | 4 +- src/block/CarvedPumpkin.php | 13 - src/block/ChemistryTable.php | 14 - src/block/Chest.php | 4 +- src/block/CocoaBlock.php | 18 +- src/block/Concrete.php | 4 +- src/block/ConcretePowder.php | 4 +- src/block/Coral.php | 19 +- src/block/CoralBlock.php | 20 +- src/block/Crops.php | 15 +- src/block/DaylightSensor.php | 29 +- src/block/DetectorRail.php | 27 +- src/block/Dirt.php | 17 +- src/block/Door.php | 32 +- src/block/DoublePlant.php | 15 +- src/block/DyedShulkerBox.php | 4 +- src/block/EndPortalFrame.php | 18 +- src/block/EndRod.php | 22 - src/block/EnderChest.php | 4 +- src/block/Farmland.php | 15 +- src/block/FenceGate.php | 23 +- src/block/Fire.php | 15 +- src/block/FloorBanner.php | 19 +- src/block/FloorCoralFan.php | 40 +- src/block/FloorSign.php | 12 - src/block/FlowerPot.php | 9 - src/block/FrostedIce.php | 15 +- src/block/Furnace.php | 32 +- src/block/GlazedTerracotta.php | 4 +- src/block/HayBale.php | 4 +- src/block/Hopper.php | 18 +- src/block/InfestedStone.php | 2 +- src/block/ItemFrame.php | 18 +- src/block/Ladder.php | 4 +- src/block/Lantern.php | 15 +- src/block/Leaves.php | 18 +- src/block/Lectern.php | 19 +- src/block/Lever.php | 42 +- src/block/Liquid.php | 32 +- src/block/Log.php | 4 +- src/block/Loom.php | 13 - src/block/NetherPortal.php | 14 +- src/block/NetherWartPlant.php | 15 +- src/block/Rail.php | 20 +- src/block/RedMushroomBlock.php | 23 +- src/block/RedstoneComparator.php | 35 +- src/block/RedstoneLamp.php | 17 +- src/block/RedstoneOre.php | 18 +- src/block/RedstoneRepeater.php | 32 +- src/block/RedstoneTorch.php | 22 +- src/block/RedstoneWire.php | 13 - src/block/Sapling.php | 15 +- src/block/SeaPickle.php | 17 +- src/block/ShulkerBox.php | 10 + src/block/SimplePillar.php | 4 +- src/block/SimplePressurePlate.php | 16 +- src/block/Skull.php | 32 +- src/block/Slab.php | 33 +- src/block/SnowLayer.php | 15 +- src/block/Sponge.php | 18 +- src/block/StainedGlass.php | 4 +- src/block/StainedGlassPane.php | 4 +- src/block/StainedHardenedClay.php | 4 +- src/block/StainedHardenedGlass.php | 4 +- src/block/StainedHardenedGlassPane.php | 4 +- src/block/Stair.php | 18 +- src/block/Stonecutter.php | 13 - src/block/StraightOnlyRail.php | 17 +- src/block/Sugarcane.php | 15 +- src/block/SweetBerryBush.php | 15 +- src/block/TNT.php | 22 +- src/block/Torch.php | 21 +- src/block/Trapdoor.php | 23 +- src/block/Tripwire.php | 28 +- src/block/TripwireHook.php | 23 +- src/block/VanillaBlocks.php | 806 ++++++------ src/block/Vine.php | 29 +- src/block/WallBanner.php | 19 +- src/block/WallCoralFan.php | 71 +- src/block/WallSign.php | 4 +- src/block/WeightedPressurePlate.php | 13 - src/block/Wool.php | 4 +- src/block/tile/Bell.php | 10 +- src/block/tile/FlowerPot.php | 4 +- .../AnalogRedstoneSignalEmitterTrait.php | 8 + src/block/utils/AnyFacingTrait.php | 8 + src/block/utils/BlockDataReader.php | 100 ++ src/block/utils/BlockDataReaderHelper.php | 164 +++ src/block/utils/BlockDataSerializer.php | 158 --- src/block/utils/BlockDataWriter.php | 101 ++ src/block/utils/BlockDataWriterHelper.php | 160 +++ src/block/utils/ColorInMetadataTrait.php | 63 - src/block/utils/ColoredTrait.php | 20 + src/block/utils/CoralTypeTrait.php | 11 +- src/block/utils/FallableTrait.php | 4 - src/block/utils/HorizontalFacingTrait.php | 8 + .../NormalHorizontalFacingInMetadataTrait.php | 40 - .../utils/PillarRotationInMetadataTrait.php | 76 -- src/block/utils/PillarRotationTrait.php | 8 + .../utils/RailPoweredByRedstoneTrait.php | 18 +- src/block/utils/SignLikeRotationTrait.php | 8 + .../BlockStateToBlockObjectDeserializer.php | 2 +- .../block/upgrade/LegacyBlockStateMapper.php | 4 +- src/data/bedrock/item/ItemSerializer.php | 2 +- .../bedrock/item/upgrade/ItemDataUpgrader.php | 2 - src/entity/object/FallingBlock.php | 4 +- src/item/ItemBlock.php | 2 +- src/item/ItemBlockWallOrFloor.php | 4 +- src/item/ItemFactory.php | 13 +- src/world/SimpleChunkManager.php | 2 +- src/world/World.php | 36 +- src/world/format/Chunk.php | 6 +- .../format/io/GlobalBlockStateHandlers.php | 34 +- src/world/format/io/leveldb/LevelDB.php | 12 +- src/world/format/io/region/Anvil.php | 4 +- src/world/format/io/region/McRegion.php | 4 +- src/world/format/io/region/PMAnvil.php | 4 +- src/world/generator/FlatGeneratorOptions.php | 2 +- src/world/generator/hell/Nether.php | 6 +- src/world/generator/normal/Normal.php | 6 +- src/world/generator/populator/GroundCover.php | 2 +- src/world/particle/BlockBreakParticle.php | 2 +- src/world/particle/BlockPunchParticle.php | 2 +- src/world/particle/TerrainParticle.php | 2 +- src/world/sound/BlockBreakSound.php | 2 +- src/world/sound/BlockPlaceSound.php | 2 +- src/world/sound/BlockPunchSound.php | 2 +- src/world/sound/EntityLandSound.php | 2 +- src/world/sound/ItemUseOnBlockSound.php | 2 +- tests/phpunit/block/BlockTest.php | 67 +- .../block_factory_consistency_check.json | 2 +- .../block/regenerate_consistency_check.php | 82 +- .../BlockSerializerDeserializerTest.php | 3 +- .../mcpe/convert/RuntimeBlockMappingTest.php | 2 +- 149 files changed, 2234 insertions(+), 2650 deletions(-) create mode 100644 src/block/utils/BlockDataReader.php create mode 100644 src/block/utils/BlockDataReaderHelper.php delete mode 100644 src/block/utils/BlockDataSerializer.php create mode 100644 src/block/utils/BlockDataWriter.php create mode 100644 src/block/utils/BlockDataWriterHelper.php delete mode 100644 src/block/utils/ColorInMetadataTrait.php delete mode 100644 src/block/utils/NormalHorizontalFacingInMetadataTrait.php delete mode 100644 src/block/utils/PillarRotationInMetadataTrait.php 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()); } } }